子集数据并将相同模型拟合到子集

时间:2018-03-27 20:36:42

标签: r sas

我有一个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等等。

3 个答案:

答案 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);