Я работал над проблемой домашней работы, связанной с использованием массивов и циклических заданий для создания новой переменной, чтобы определить дату, когда было получено максимальное значение содержания свинца в крови, но оно застряло.Для контекста, вот проблема домашней работы:
В 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 и имя файла, из которого он пришел