Я работал над домашним заданием, касающимся использования массивов и циклов для создания новой переменной для определения даты, когда максимальное значение свинца в крови было получено, но застряло. Для контекста вот домашнее задание:
В 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, и имя файла, из которого он был получен.
cards
илиdatelines
, это поможет нам решить проблему. Лично я считаю, что разделение ввода и обработки данных очень помогает. Это облегчает отладку для одного. - person Reeza   schedule 03.06.2018