有关SAS

时间:2018-06-03 02:14:46

标签: arrays loops sas do-loops

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

1990年,对波士顿儿童的血铅水平进行了一项研究。以列表格式在文件lead_sum2018.txt中的每个主题的多个行中输入了来自该研究的二十五个孩子的以下变量:

第1行 身份证号码(数字,值1-25) 出生日期(mmddyy8。格式) 血样1天(数字,初始可能范围:-9到31) 血样1月(数字,初始可能范围:-9至12)

第2行 身份证号码(数字,值1-25) 血样2日(数字,初始可能范围:-9至31) 血样2月(数字,初始可能范围:-9至12)

第3行 身份证号码(数字,值1-25) 血样3日(数字,初始可能范围:-9至31) 血样3个月(数字,初始可能范围:-9到12)

第4行 身份证号码(数字,值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数组和循环。

这是HW引用的数据(它是列表格式并包含在名为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)确保将出生日期变量记录为SAS日期;

2)使用SAS阵列和循环为三个血液样本中的每一个创建SAS日期变量,并根据研究者的决定解决缺失的数据。提示:使用单个数组并执行循环以分别重新编码日期和月份的缺失值,以及用于创建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中,以及来自

的文件的文件名

2 个答案:

答案 0 :(得分:0)

只是在错误发生之前查看代码,就会出现问题:

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

您收到错误是因为您正在尝试为数组maxdte分配值。不能为数组赋值(除非您使用不推荐的do over语法...)而是选择数组的元素并将值赋给元素。例如。你可以这样做:

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

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

答案 1 :(得分:0)

您没有正确处理第2-4行

中的ID字段
input #1 id dob dbs1 mbs1 
          #2 dbs2 mbs2
          #3 dbs3 mbs3
          #4 bls1 bls2 bls3 sex; 

例如,您需要跳过第2-3行的第1个字段,或者将ID读入数组,或者检查它们是否完全相同。

input #1 id dob dbs1 mbs1 
          #2 id2 dbs2 mbs2
          #3 id3 dbs3 mbs3
          #4 id4 bls1 bls2 bls3 sex; 

此示例显示如何检查您是否有4行具有相同ID,如果您确实读取了其余变量或执行LOSTCARD。 ID 3缺少记录;

353  data ex;
354     infile cards n=4 stopover;
355     input #1 id #2 id2 #3 id3 #4 id4 @;
356     if id eq id2 eq id3 eq id4
357        then input #1 id dob:mmddyy. dbs1 mbs1
358                   #2 id2 dbs2 mbs2
359                   #3 id3 dbs3 mbs3
360                   #4 id4 bls1 bls2 bls3 sex :$1.;
361     else lostcard;
362     format dob mmddyy.;
363  cards;

NOTE: LOST CARD.
RULE:      ----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0
372        3 01/03/80 11 7
373        3 27 2
374        3 3.24 3.4 3.83 M
375        4 08/01/80 5 12
NOTE: LOST CARD.
376        4 28 -9
NOTE: LOST CARD.
377        4 3 4
NOTE: The data set WORK.EX has 3 observations and 15 variables.


data ex;
   infile cards n=4 stopover;
   input #1 id #2 id2 #3 id3 #4 id4 @;
   if id eq id2 eq id3 eq id4 
      then input #1 id dob:mmddyy. dbs1 mbs1 
                 #2 id2 dbs2 mbs2
                 #3 id3 dbs3 mbs3
                 #4 id4 bls1 bls2 bls3 sex :$1.;
   else lostcard;
   format dob mmddyy.;
cards;
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 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
;;;;
   run;
proc print;
   run;