将回归结果输出到R中的数据框

时间:2013-12-30 11:27:43

标签: r sas output lm

我想知道是否有任何命令可以将lm模型的结果输出到R中的数据框中,就像SAS中的outest一样。 有任何想法吗?我正在运行多个模型,我希望结果如下所示 -

Model  |  alpha   | Beta | Rsquared | F |  df |
model0 |  8.4     | ...  | ....     | ..|  .. |
model1 |  ...     | ...  | ....     | ..|  .. |
model2 |  ...     | ...  | ....     | ..|  .. |

我拥有的数据是'ds',即 -

X1 | X2 | Y1 |
.. | .. | .. |
.. | .. | .. |
.. | .. | .. |
.. | .. | .. |

我的代码是一个简单的lm代码 -

model0 <- lm(Y1 ~ X1, ds)
model1 <- lm(Y1 ~ 1, ds)
model2 <- lm(Y1 ~ X1 + X2, ds)

2 个答案:

答案 0 :(得分:4)

我做同样的事情。这里的困难当然是如果模型具有不同数量的系数 - 那么你将拥有不同数量的列,这在data.frame中是不可能的。每个模型需要具有相同数量的列。

我通常将其用于glm(这些代码段被注释掉了)但我为lm修改了它:

models <- c()

for (i in 1:10) {

    y <- rnorm(100) # generate some example data for lm
    x <- rnorm(100)
    m <- lm(y ~ x)

    # in case of glm:
    #m <- glm(y ~ x, data = data, family = "quasipoisson")
    #overdispersion <- 1/m$df.residual*sum((data$count-fitted(m))^2/fitted(m))

    coef <- summary(m)$coef
    v.coef <- c(t(coef))
    names(v.coef) <- paste(rep(rownames(coef), each = 4), c("coef", "stderr", "t", "p-value"))
    v.model_info <- c(r.squared = summary(m)$r.squared, F = summary(m)$fstatistic[1], df.res = summary(m)$df[2])

    # in case of glm:
    #v.model_info <- c(overdisp = summary(m)$dispersion, res.deviance = m$deviance, df.res = m$df.residual, null.deviance = m$null.deviance, df.null = m$df.null)

    v.all <- c(v.coef, v.model_info)    
    models <- rbind(models, cbind(data.frame(model = paste("model", i, sep = "")), t(v.all)))

}

我更喜欢从summary(m)获取数据。要将数据捆绑到data.frame,请使用cbind(列绑定)和rbind(行绑定)函数。

答案 1 :(得分:2)

您可以使用coefficients功能:

out = coefficients(lm(mpg ~ wt, mtcars))
out
# (Intercept)          wt 
#   37.285126   -5.344472 
out[1]
# (Intercept) 
#    37.28513 

或lm对象组:

library(plyr)
out = ldply(list(model0, model1, model2), coefficients)
rownames(out) = sprintf('model%d', 0:2)
       (Intercept)        wt
model0    37.28513 -5.344472
model1    37.28513 -5.344472
model2    37.28513 -5.344472

要将我的解决方案扩展到您需要的,您需要:

  1. 了解如何从lm对象中提取所需的其他信息。
  2. 编写一个自定义函数,该函数返回包含所有信息的单行data.frame
  3. 使用我展示的ldply语法运行它。