首页 > 解决方案 > 关于 SAS 的问题

问题描述

我正在研究一个关于使用数组和循环创建一个新变量来确定获得最大血铅值但被卡住的日期的家庭作业问题。对于上下文,这是作业问题:

1990 年对波士顿儿童的血铅水平进行了一项研究。在文件 Lead_sum2018.txt 中以列表格式在每个受试者的多行中输入了该研究中 25 名儿童的以下变量:

第 1 行 ID 编号(数字,值 1-25) 出生日期(mmddyy8. 格式) 血液样本 1 的日期(数字,初始可能范围:-9 到 31) 血液样本 1 月份(数字,初始可能范围:- 9 至 12)

第 2 行 ID 编号(数字,值 1-25) 血液样本 2 的日期(数字,初始可能范围:-9 到 31) 血液样本 2 月份(数字,初始可能范围:-9 到 12)

第 3 行 ID 编号(数字,值 1-25) 血液样本 3 的日期(数字,初始可能范围:-9 到 31) 血液样本 3 月份(数字,初始可能范围:-9 到 12)

第 4 行 ID 编号(数字,值 1-25)血铅水平样品 1(数字,可能范围:0.01 – 20.00)血铅水平样品 2(数字,可能范围:0.01 – 20.00)血铅水平样品 3(数字,可能的范围:0.01 – 20.00) 性别(字符,'M' 或 'F')

所有的血样都是在 1990 年抽取的。但是,在数据输入过程中,血样的顺序被打乱了,因此数据文件中的第一个血样(血样 1)可能与在受试者身上采集的第一个血样不对应,它可能成为第一、第二或第三。此外,有些采血的月份、日期和日期没有写在表格上。在数据输入时,缺失的月份和缺失的日期值分别编码为 -9。

该项目的调查人员团队对缺失值做出了以下决定。任何缺失的天数都设置为 15,任何缺失的月份都设置为 6。对此数据集进行的任何分析都需要遵循这些决定。确保按照每个问题的指示实施 SAS 语法。例如,如果项目声明必须使用 SAS 数组和循环,则使用这些数组和循环。

这是硬件引用的数据(它是列表格式,包含在一个名为lead_sum2018.txt的单独文件中):

1 04/30/78 6 10
1 -9 7
1 14 1
1 1.62 1.35 1.47 F
2 05/19/79 27 11
2 20 -9
2 5 6
2 1.71 1.31 1.76 F
3 01/03/80 11 7
3 6 6
3 27 2
3 3.24 3.4 3.83 M
4 08/01/80 5 12
4 28 -9
4 3 4
4 3.1 3.69 3.27 M
5 12/26/80 21 5
5 3 7
5 -9 12
5 4.35 4.79 5.14 M
6 06/20/81 7 10
6 11 3
6 22 1
6 1.24 1.16 0.71 F
7 06/22/81 19 6
7 3 12
7 29 8
7 3.1 3.21 3.58 F
8 05/24/82 26 7
8 31 1
8 9 10
8 2.99 2.37 2.4 M
9 10/11/82 2 7
9 25 5
9 28 3
9 2.4 1.96 2.71 F
10 . 10 8
10 30 12
10 28 2
10 2.72 2.87 1.97 F
11 11/16/83 19 4
11 15 11
11 7 -9
11 4.8 4.5 4.96 M
12 03/02/84 17 6
12 11 2
12 17 11
12 2.38 2.6 2.88 F
13 04/19/84 2 12
13 -9 6
13 1 7
13 1.99 1.20 1.21 M
14 02/07/85 4 5
14 17 5
14 21 11
14 1.61 1.93 2.32 F
15 07/06/85 5 2
15 16 1
15 14 6
15 3.93 4 4.08 M
16 09/10/85 12 10
16 11 -9
16 23 6
16 3.29 2.88 2.97 M
17 11/05/85 12 7
17 18 1
17 11 11
17 1.31 0.98 1.04 F
18 12/07/85 16 2
18 18 4
18 -9 6
18 2.56 2.78 2.88 M
19 03/02/86 19 4
19 11 3
19 19 2
19 0.79 0.68 0.72 M
20 08/19/86 21 5
20 15 12
20 -9 4
20 0.66 1.15 1.42 F
21 02/22/87 16 12
21 17 9
21 13 4
21 2.92 3.27 3.23 M
22 10/11/87 7 6
22 1 12
22 -9 3
22 1.43 1.42 1.78 F
23 05/12/88 12 2
23 21 4
23 17 12
23 0.55 0.89 1.38 M
24 08/07/88 17 6
24 27 11
24 6 2
24 0.31 0.42 0.15 F
25 01/12/89 4 7
25 15 -9
25 23 1
25 1.69 1.58 1.53 M

A)输入数据并在数据步骤中:

1) 确保 Date of Birth 变量被记录为 SAS 日期;

2) 使用 SAS 数组和循环为三个血样中的每一个创建一个 SAS 日期变量,并根据研究人员的决定处理缺失的数据。提示:使用单个数组和 do 循环分别重新编码日和月的缺失值,并使用数组/do 循环来创建 SAS 日期变量;

3)使用SAS函数为每个孩子的最高血铅值创建一个变量,即最大血铅值;

4) 使用 SAS 数组和循环来识别获得该最大值的日期,并为最大血铅值的日期创建一个新变量;

5) 确定获得最大血铅值的孩子的年龄(四舍五入到小数点后两位);

6) 根据获得最大领先值的孩子的年龄创建一个新变量(称为“agecat”),它具有三个级别:对于 4 岁以下的孩子,agecat 应该等于 1;对于至少 4 岁但小于 8 岁的儿童,agecat 应等于 2;对于至少 8 岁的儿童,agecat 应为 3。

7) 打印出出生日期、最大铅水平日期、最大血铅水平的血样年龄、年龄、性别和最大血铅水平的变量(仅打印出这些要求的变量)。所有日期都应格式化为使用 mmddyy10。输出格式。

我用来回应这个问题的代码是:

libname HW3 'C:\Users\johns\Desktop\SAS';
filename HW3new 'C:\Users\johns\Desktop\SAS\lead_sum2018.txt';
data one; 
    infile HW3new;
    informat dob mmddyy8.; 
    input #1 id dob dbs1 mbs1 
          #2 dbs2 mbs2
          #3 dbs3 mbs3
          #4 bls1 bls2 bls3 sex;  
          array dbs{3} dbs1 dbs2 dbs3;
          array mbs{3} mbs1 mbs2 mbs3;
          do i=1 to 3; 
            if dbs{i}=-9 then dbs{i}=15;
          end; 
          do i=4 to 6;
            if mbs{i}=-9 then mbs{i}=6;
          end; 
          array date{3} mdy1 mdy2 mdy3;
          do i=1 to 3;
            date{i}=mdy(mbs{i}, dbs{i}, 1990);
          end; 
          maxbls=max(of bls1-bls3); 
          array bls{3} bls1 bls2 bls3;
          array maxdte{3} maxdte1 maxdte2 maxdte3;
          do i=1 to i=3;
            if bls{i}=maxbls then maxdte=i;
            end;
          agemax=maxdte-dob; 
          ageest=round(agemax/365.25,2);
          if agemax=. then agecat=.;
          else if agemax < 4 then agecat=1; 
          else if 4 <= agemax < 8 then agecat=2;
          else if agemax ge 8 then agecat=3; 
run; 

我收到了这个错误:

22             maxbls=max(of bls1-bls3);
23             array bls{3} bls1 bls2 bls3;
24             array maxdte{3} maxdte1 maxdte2 maxdte3;
25             do i=1 to i=3;
26               if bls{i}=maxbls then maxdte=i;
ERROR: Illegal reference to the array maxdte.
27               end;

有人对此问题有任何提示吗?我做错了什么?我是否应该为收集最大血铅样本值的日期创建一个额外的数组?谢谢!

**我坚持 A 部分的第 4 部分,但我将其他部分包括在内以作为上下文。谢谢!**编辑:我包含了我必须读入 SAS 的数据以及它来自的文件的文件名

标签: arraysloopssasdo-loops

解决方案


仅查看错误之前的代码,您就在这一行遇到了问题:

26               if bls{i}=maxbls then maxdte=i;

您收到错误是因为您试图为数组分配一个值maxdte。不能为数组分配这样的值(除非您使用不推荐使用的do over语法......)相反,选择数组的一个元素并将值分配给该元素。例如,您可以这样做:

26               if bls{i}=maxbls then maxdte{1}=i;

1或者,您可以使用包含相关数组索引的变量来代替文字。


推荐阅读