R通过lapply命令从多元回归中提取回归系数

时间:2012-01-26 05:34:38

标签: r linear-regression lapply

我有一个包含多个变量的大型数据集,其中一个是状态变量,每个状态编码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)
}

2 个答案:

答案 0 :(得分:5)

这是经典Split-Apply-Combine问题的另一个例子,可以使用@hadley的plyr包来解决。在你的问题中,你想要

  1. 按州分割数据
  2. 为每个子集应用回归
  3. 将系数组合到数据框中。
  4. 我将使用Cars93库中提供的MASS数据集来说明它。我们有兴趣根据国家horsepower确定enginesizeorigin之间的关系。

    # 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)