これは疫学プロジェクト用です。私は、1961 年から 2013 年までのさまざまな集団における疾患頻度率を計算したいと考えていました。すべての年齢の男性、50 歳以上の男性、および女性の同じ 2 つのケースです。
最初に、'pop_compl' という人口テーブルをインポートしました。このテーブルには、前述の期間における男性 (性別 = 1) と女性 (性別 = 0、違反なし) のさまざまな年齢クラスの人口数が含まれています。
次に、PROC SQL を使用して SAS に空のテーブルを作成しました。
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));
ここで、上記の各テーブルの最初の 2 つの列、年と人口 (および後で 3 番目の「ケース」) に値を入力して、後でテーブル内で必要な率を計算できるようにしたいと考えました。年列には 1961 年から 2013 年の値が入力され、人口列には 1961 年から 2013 年までの各年の「pop_compl」からの人口数が入力されます。
マクロと 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 32ビットを使用しています。現時点では、これを修正する方法がわかりません。また、同じことを行う別の簡単な方法も思いつきませんでした。