总体思路是(1)通过分层创建子集(2)使用子集运行模型(3)获得模型结果(4)循环执行(1)-(3)并将它们绑定在一起。我知道如何在 R 中产生这个想法,但不知道如何在 SAS 中得到它。
R代码如下:
dd<-data.frame(y=seq(0.1:1,by=0.1),
base=rep(3,10),
treat=c(0,0,0,0,0,1,1,1,1,1),
group1=rep(1:0,5),
group2=rep(0:1,5),
group3=c(0,0,1,1,0,0,1,1,0,1))
names<-colnames(dd)[4:6] #group1,group2,group3
result<-NULL
for (i in 1:length(names)){
group_num=names(table(dd[names[i]])) #get how many categories in each group
for(j in 1:length(group_num)){
subset=dd[which(dd[names[i]]==group_num[j]),] #generate a subgroup of each category in each group
model=lm(y~base+treat,data=subset) #use the subgroup to run a linear model
line=c(names[i],group_num[j],model$coefficients) #get the result from the model for each category in each group
result=rbind(result,line) #finally rbind the result together
}
}
我想弄清楚的主要部分是: (1)如何通过
names=colnames(dd)[x1:xn]
选择分层的组名,然后执行循环(即for(i in 1:length(names)
)来创建子集。真实的数据集包含超过20个组,所以我更喜欢通过类似names=colnames(dd)[x1:xn]
之类的方式获取组名称,而不是在SAS中一一列出。
(2)如何在SAS中循环建模后绑定line
结果。
我不知道足够的 R 来理解您的示例代码,但是如果您尝试在多个子组上运行相同的模型,您通常会在 SAS 中使用一个回归 PROC 来执行此操作,并使用一个 BY 语句来标识子组- 团体。因此,给定一个包含变量 Sales、Inventory 和 Region 的数据集 SASHELP.CLASS,下面的代码将运行以 Sales 作为因变量、Inventory 作为自变量的线性模型,并将针对数据中的每个区域子集运行该模型。 OUTEST 选项将估计值写入新表 MyEst。根据您的需要,有不同的方法可以收集不同的估算值。
proc reg data=sashelp.shoes outest=myest ;
model Sales=inventory;
by region ;
run ;