我有一个包含多个变量的大型数据集,其中一个是状态变量,每个状态编码1-50。我想在数据集的其余27个变量上运行28个变量的回归(总共有55个变量),并且对每个状态都是特定的。
换句话说,在covariate1,covariate2,...,covariate27上运行variable1的回归,用于状态== 1的观察。然后,我想为状态2-50的变量1重复此操作,并重复变量2,变量3,...,变量28的整个过程。
我认为我已经编写了正确的R代码来完成这项工作,但接下来我要做的是将系数提取到系数矩阵中。有人可以帮我这个吗?这是我到目前为止编写的代码:
for (num in 1:50) {
#PUF is the data set I'm using
#Subset the data by states
PUFnum <- subset(PUF, state==num)
#Attach data set with state specific data
attach(PUFnum)
#Run our prediction regression
#the variables class1 through e19700 are the 27 covariates I want to use
regression <- lapply(PUFnum, function(z) lm(z ~ class1+class2+class3+class4+class5+class6+class7+
xtot+e00200+e00300+e00600+e00900+e01000+p04470+e04800+
e09600+e07180+e07220+e07260+e06500+e10300+
e59720+e11900+e18425+e18450+e18500+e19700))
Beta <- lapply(regression, function(d) d<- coef(regression$d))
detach(PUFnum)
}
答案 0 :(得分:5)
这是经典Split-Apply-Combine
问题的另一个例子,可以使用@hadley的plyr
包来解决。在你的问题中,你想要
我将使用Cars93
库中提供的MASS
数据集来说明它。我们有兴趣根据国家horsepower
确定enginesize
和origin
之间的关系。
# LOAD LIBRARIES
require(MASS); require(plyr)
# SPLIT-APPLY-COMBINE
regressions <- dlply(Cars93, .(Origin), lm, formula = Horsepower ~ EngineSize)
coefs <- ldply(regressions, coef)
Origin (Intercept) EngineSize
1 USA 33.13666 37.29919
2 non-USA 15.68747 55.39211
EDIT。对于您的示例,请将PUF
替换为Cars93
,将state
替换为Origin
,将fm
替换为公式
答案 1 :(得分:1)
我稍微清理了你的代码:
fm <- z ~ class1+class2+class3+class4+class5+class6+class7+
xtot+e00200+e00300+e00600+e00900+e01000+p04470+e04800+
e09600+e07180+e07220+e07260+e06500+e10300+
e59720+e11900+e18425+e18450+e18500+e19700
PUFsplit <- split(PUF, PUF$state)
mod <- lapply(PUFsplit, function(z) lm(fm, data=z))
Beta <- sapply(mod, coef)
如果你愿意,你甚至可以把这一切都放在一行:
Beta <- sapply(lapply(split(PUF, PUF$state), function(z) lm(fm, data=z)), coef)