Проблемы, связанные с SAS - PullRequest
0 голосов
/ 03 июня 2018

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

В 1990 году было проведено исследование уровня свинца в крови у детей в Бостоне.Следующие переменные для двадцати пяти детей из исследования были введены в несколько строк для каждого субъекта в файле lead_sum2018.txt в формате списка:

Идентификационный номер строки 1 (числовой, значения 1-25) ДатаРождение (mmddyy8. Format) Образец дня крови 1 (числовой, начальный возможный диапазон: от -9 до 31) Образец месяца крови 1 (числовой, начальный возможный диапазон: от -9 до 12)

Номер строки ID 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,0120.00) Пол (символ, «М» или «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 лет, возраст кошки должен быть равен 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 и имя файла, из которого он пришел

Ответы [ 2 ]

0 голосов
/ 03 июня 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;
0 голосов
/ 03 июня 2018

При просмотре кода непосредственно перед ошибкой у вас есть проблема в этой строке:

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

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

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

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

...