被迫用SAS不能用R。。。

问题背景如下:

需要做多个linear reg,区别仅仅在于response不一样。response的命名无规律(如不能是v1-v10这样的,也不希望改成这样的),但independent变量相同。写了个宏执行单个reg并抽取需要的output如下(其中的hormone是response,有12个不同的hormone需要单独分析):

%macro glm_model(hormone, target_var, mylibname, mydata);

ods output LSMeanCL = &mylibname..lsmeans;

proc glm data = &mylibname..&mydata;

class &target_var;

model &hormone = &target_var AGE;

lsmeans &target_var / CL STDERR;

run;

PROC EXPORT DATA= &mylibname..lsmeans

OUTFILE= ".\result\&target_var\lsmeans\lsmeans_(&hormone)_adj4_(&target_var).csv"

DBMS=CSV REPLACE;

PUTNAMES=YES;

RUN;

ods output ParameterEstimates = &mylibname..pvalues;

proc glm data = &mylibname..&mydata;

model &hormone = &target_var AGE;

run;

PROC EXPORT DATA= &mylibname..pvalues

OUTFILE= ".\result\&target_var\pvalues\pvalues_(&hormone)_adj4_(&target_var).csv"

DBMS=CSV REPLACE;

PUTNAMES=YES;

RUN;

quit;

%mend glm_model;

现在只能手动调用12次:

%glm_model(DHEA, smoke, mylib, mydata)

... ...

%glm_model(TESTO, smoke, mylib, mydata)

有没有办法用类似于do over之类的statement完成调用过程(把hormone存成包含12个值的array)

看过很多文档,在data step造出array后用do over调用%glm_model(...),总是得到类似这样的错误:

There was one unclosed DO block

据说是在data step里面调用某些proc step造成的,例如proc glm需要调用quit才会结束。有谁碰到过这类问题并且有解决方案么?感激不尽!

把所有response变量名放在一个宏变量里面,然后在另外一个宏里面parse这个变量就可以了,比如%index什么的;最后的loop不能是data step的loop,应该是宏的loop。

SAS臭名昭著的不支持intermixing data steps with procs.

回复 第2楼 的 Dexim Corp:完全新手不知所云中,等下试试,再问个问题,背景如前。

宏glm_model中的model statement有一个变量叫AGE,我其实是想把它也做成一个宏参数other_adj_var,但要求有一点点特殊:有时候调用者希望other_adj_var是一个或多个变量,有时候则为空,怎么实现呢?

回复 第3楼 的 bootstrap:答案同前

回复 第4楼 的 Dexim Corp beats Proc Mixed:啊,因为宏编译器只是做字符串替换且最早被执行,对么?类似于这个:

下面讲一个重要的概念,就是SAS宏编译时的时间顺序

1. Macro compile time 宏编译时间

2. Macro execution time 宏执行时间

3. SAS compile time SAS过程步编译时间

4. SAS execution time SAS过程步执行时间

from http://hi.baidu.com/spss%CD%F5%D7%D3/blog/item/31abdd071128a1793912bb97.html

回复 第5楼 的 bootstrap:宏编译器其实是逗你玩儿的东东,因为很多字符在运行之前根本不知道是什么,所以编译之后还是原样,稍微复杂一点的宏最主要的编译时间都是在运行中交错进行的。

回复 第6楼 的 Dexim Corp beats Proc Mixed:受教了

回复 第2楼 的 Dexim Corp deled Proc Mixed:那个啥%index貌似是返回查询位置的??

回复 第8楼 的 bootstrap:It finds the position of your seperator (e.g., from using select into in proc sql). Then you can use the position to get a substring.

回复 第9楼 的 Dexim Corp deleveled proC mixeD:但要通过%index找到这个position,需要知道需要匹配的子串,貌似不行啊

回复 第10楼 的 bootstrap:You only need to know the "seperator".