Вопросы, касающиеся SAS

Я работал над домашним заданием, касающимся использования массивов и циклов для создания новой переменной для определения даты, когда максимальное значение свинца в крови было получено, но застряло. Для контекста вот домашнее задание:

В 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 для каждого из трех образцов крови и обращения к недостающим данным в соответствии с решениями исследователей. Подсказка: используйте один массив и цикл do, чтобы отдельно перекодировать недостающие значения для дня и месяца, и цикл array / 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;

Есть ли у кого-нибудь какие-нибудь подсказки по этому поводу? Что я сделал не так? Должен ли я создать дополнительный массив для даты, когда было собрано максимальное значение образца крови? Спасибо!

** Я застрял на № 4 части A, но я включил другие части для контекста. Спасибо! ** Редактирование: я включил данные, которые мне нужно было прочитать в SAS, и имя файла, из которого он был получен.


person JackJackAttack0214    schedule 03.06.2018    source источник
comment
Если вы можете указать некоторые данные как cards или datelines, это поможет нам решить проблему. Лично я считаю, что разделение ввода и обработки данных очень помогает. Это облегчает отладку для одного.   -  person Reeza    schedule 03.06.2018
comment
Привет, @Reeza! Мне так жаль! Я забыл указать введенные мной данные и имя файла, из которого он был получен. Я включил указанную информацию.   -  person JackJackAttack0214    schedule 03.06.2018
comment
Я видел это на community.sas.com и отвечал на него там.   -  person Reeza    schedule 03.06.2018


Ответы (2)


Просто взглянув на код непосредственно перед ошибкой, вы обнаружите проблему в этой строке:

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

Вы получаете сообщение об ошибке, потому что пытаетесь присвоить значение массиву maxdte. Массивам нельзя присваивать такие значения (если вы не используете устаревший синтаксис do over ...). Вместо этого выберите элемент массива и присвойте ему значение. Например. вы могли бы сделать:

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

Или вместо буквального 1 вы можете использовать переменную, содержащую соответствующий индекс массива.

person user667489    schedule 03.06.2018

Вы неправильно обрабатываете поле идентификатора из строк №2–4.

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

Например, вам нужно пропустить поле 1 в строке 2-3 или прочитать идентификаторы в массиве, возможно, чтобы проверить, что они все одинаковы.

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

В этом примере показано, как проверить, что у вас есть 4 строки с одинаковым идентификатором, и читаете ли вы остальные переменные или выполняете 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;
person data _null_    schedule 03.06.2018
comment
Спасибо, @data null! Нужно ли называть id разными именами? Например, мне нужно называть их id, id2, id3 и id4, или я могу называть их все id? Спасибо! - person JackJackAttack0214; 03.06.2018