【问题标题】:Outputting Regression results into a data frame in R将回归结果输出到 R 中的数据框中
【发布时间】:2014-01-17 06:47:27
【问题描述】:

我想知道是否有任何命令可以将 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)

【问题讨论】:

    标签: r sas output lm


    【解决方案1】:

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

    我通常将它用于glm(这些代码sn-ps已被注释掉)但我为您修改它为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(行绑定)函数。

    【讨论】:

    • 太棒了! :) 谢谢!我会试试这个!
    【解决方案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 语法运行它。

    【讨论】:

    • 我应该详细说明。我正在运行 5 个模型,我想要上表中提到的结果。我的坏。
    • 请扩展您的问题,包括测试代码和测试数据。
    • 我已经编辑了我的问题。很抱歉给您带来困惑这有帮助吗?
    • 我更喜欢可以简单地复制粘贴到 R 中的代码,请参阅 stackoverflow.com/questions/5963269/…。我添加了一些您可以用来回答问题的详细信息。
    猜你喜欢
    • 1970-01-01
    • 2018-01-02
    • 1970-01-01
    • 1970-01-01
    • 2020-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-21
    相关资源
    最近更新 更多