Это для эпидемиологического проекта. Я хотел рассчитать частоту заболеваемости в период с 1961 по 2013 год среди разных групп населения: мужчин всех возрастов, мужчин старше 50 лет и тех же двух случаев для женщин.SAS Заполнение таблицы с помощью инструкции PROC SQL INSERT и цикла do
Во-первых, я импортировал таблицу населения, названную «pop_compl», которая содержит числа населения в разных возрастных классах для мужчин (пол = 1) и женщин (секс = 0, без нарушения) в указанный промежуток времени.
Затем я создал пустые таблицы в SAS с PROC SQL:
proc sql;
create table m_rates (year num(10), population num(10), cases num(10), crude_incidence num(10), esr num(10), esr_95CI_ll num(10), esr_95CI_ul num(10));
create table m_rates_50plus (year num(10), population num(10), cases num(10), crude_incidence num(10), esr num(10), esr_95CI_ll num(10), esr_95CI_ul num(10));
create table w_rates (year num(10), population num(10), cases num(10), crude_incidence num(10), esr num(10), esr_95CI_ll num(10), esr_95CI_ul num(10));
create table w_rates_50plus (year num(10), population num(10), cases num(10), crude_incidence num(10), esr num(10), esr_95CI_ll num(10), esr_95CI_ul num(10));
Теперь я хотел, чтобы заполнить первые две колонки, год и население каждой из этих таблиц выше (а затем и третий «случаи») со значениями, чтобы иметь возможность рассчитать необходимые ставки в таблицах позже. Колонны лет должны заполняться значениями 1961-2013 гг., Численность столбцов с соответствующими числами населения от «pop_compl» за каждый год между 1961 и 2013 годами.
Я хотел сделать это, используя инструкцию insert в пределах макро и цикл do. Похоже, это:
%macro fill(table, sex, age_class);
insert into &table (year, population)
%do year=1961 %to 2013;
VALUES(&year, (select _&year from pop_compl where sex = &sex and age_class like "&age_class"))
%end;
;
%mend;
%fill(m_rates, 1, total);
%fill(m_rates_50plus, 1, > 50);
%fill(w_rates, 0, total);
%fill(w_rates_50plus, 0, > 50);
Хотя кажется, что это логически правильно, SAS жалуется с помощью запроса в отчете значения - отрывок:
1037 %fill(m_rates_50plus, 1, > 50);
NOTE: No rows were updated in WORK.M_RATES_50PLUS.
NOTE: Line generated by the invoked macro "FILL".
3 VALUES(&year, (select _&year from pop_compl where sex = &sex and age_class like
-
22
76
3 ! "&age_class"))
ERROR 22-322: Syntax error, expecting one of the following: a quoted string,
a numeric constant, a datetime constant, a missing value,), +, ',', -, MISSING,
NULL, USER.
ERROR 76-322: Syntax error, statement will be ignored.
Я попробовал несколько вещей, изменились типы переменных и т.д. на. Ничего не помогло, я действительно думаю, что это ограничение SAS SQL. Я использую SAS 9.2 32bit. На данный момент я не знаю, как это исправить, и я не придумал другой быстрый метод, который делает то же самое.
Используете ли вы SQL в SAS, потому что вы не знаете SAS, или вы делаете это, потому что y Вы думаете, что это лучший подход здесь? Это не похоже на то, что мне хорошо подходит для SQL. Шаг данных будет намного проще. – Joe
Не рекомендуемый способ сделать это, возможно, опубликовать то, что у вас есть, и то, что вам нужно. Этот форум может и не соответствовать этому типу вопросов, но вы можете публиковать сообщения на community.sas.com. – Reeza
Я знаю как SAS, так и SQL в определенной степени - как вы можете видеть, я далеко не называю себя профессионалом. Все еще учусь. Я использую SQL в SAS, потому что в этом случае мне было удобнее сначала создавать статические кадры как пустые таблицы и заполнять их, чем делать все на шаге данных. После заполнения таблиц я буду использовать инструкцию UPDATE для вычисления ставок в таблицах с использованием простых формул. Я сделал это раньше, так что, по крайней мере, я знаю, что это работает. Может быть, я еще раз подумаю о других методах. Как и тот, который предлагается в качестве ответа ... –