我有一个1300行的数据集,我想把它分成10个子集,每个子集有130行。我想写一个适合proc nlmixed
模型的循环到10个子集中的每一个,即我有10个模型,每个子集1个。
在R中,一个简单的算法应该是这样的:
for(i in 1:10){
data_i <- data[130 * (i - 1) + 1:130 * i, ]
#fit model to data_i...
#obtain summary of model fit...
}
在SAS中,有没有办法将数据子集化(可能在数据步骤中),然后在该数据步骤中调用proc nlmixed
?...
我知道我可以在(nobs = ...)
语句中使用(firstobs = ...)
或proc nlmixed
的第一次观察指数来指定观察次数。这可以工作,只要我可以迭代地将参数更改为firstobs,循环超过1,131,261等等。
答案 0 :(得分:1)
使用BY组处理。创建一个分组变量,如果它是随机的,这很容易。然后在NLMIXED proc中添加一个BY语句,它将适合您的BY变量中的每个级别。假设它是随机的,不确定你想如何拆分数据?或者您可以查看SURVEYSELECT以选择10个随机样本。
data heart;
set sashelp.heart;
call streaminit(25);
rand = rand('normal', 100, 20);
run;
proc rank data=heart groups=10 out=heart_rank;
var rand;
ranks groups;
run;
proc sort data=heart_rank;
by groups;
run;
proc nlmixed data=heart_rank;
by groups;
...
这是一个扩展的分析,取决于您的组的创建方式,前三个步骤可以是一个步骤,如果您只是将它分成相等的组,以便例如这将是微不足道的,更类似于R溶液
答案 1 :(得分:0)
您必须:
proc nlmix
包含在宏功能中并传递firstobs
作为参数。拆分代码示例:
data ds1 ds2 ds3 ds4 ds5 ds6 ds7 ds8 ds9 ds10;
set have;
n=130;
/* Nested if else with increments of 130 records for each table */
if _N_ <= n*1 then output ds1;
else if _N_ <= n*2 then output ds2;
else if _N_ <= n*3 then output ds3;
else if _N_ <= n*4 then output ds4;
else if _N_ <= n*5 then output ds5;
else if _N_ <= n*6 then output ds6;
else if _N_ <= n*7 then output ds7;
else if _N_ <= n*8 then output ds8;
else if _N_ <= n*9 then output ds9;
else if _N_ <= n*10 then output ds10;
run;
答案 2 :(得分:0)
尝试使用宏来组合数据的子集并且同时处理nlmixed。像这样:
%macro split_data(data,group, range);
%do i=1 %to &group;
%let firstobs=%eval(&range.*(&i-1)+1);
data data_&i;
set &data(firstobs=&firstobs);
j+1;
if j=&range.+1 then stop;
run;
proc nlmixed data=data_&i;
.....;
run;
%end;
%mend;
%split_data(sashelp.class,3,5);