【问题标题】:Combining regression summary outputs from multiple samples into a single dataframe in R将来自多个样本的回归汇总输出组合到 R 中的单个数据帧中
【发布时间】:2018-02-12 19:26:58
【问题描述】:

我正在尝试将多个 lm 输出组合到一个数据框中,以进行进一步计算。我有一个包含 1000 个观察值和 62 个变量的数据集。该项目是随机拆分数据集 63/37,训练模型,重复 1000 次并保存所有 1000 次运行的系数、拟合值和 r2。所以我在这里做了大部分工作(使用mtcars):

data("mtcars")
f <- function () {
  fit <- lm(mpg ~ ., data = mtcars, subset = sample <- sample.int(n = nrow(mtcars), size = floor(.63*nrow(mtcars)), replace = F))
  coef(fit)
}
output <- t(replicate(1000, f()))

我知道我可以使用 summary(fit)$r.squared 获得 rsq 值,我可以使用 predict() 获得拟合值。我只是在苦苦思索如何使用保存的系数将它们放入数据框中。

【问题讨论】:

  • 如果您刚刚保存了系数,则无法获得 r 平方值。相反,您需要自己保存模型或从函数返回 r 平方值。
  • 感谢视频链接。它看起来对我现在使用 R 的位置很有帮助。

标签: r


【解决方案1】:

下面应该做的

get_model <- function (input_data) {
    fit <- lm(mpg ~ ., 
              data = mtcars, 
              subset = sample <- sample.int(n = nrow(mtcars), 
                     size = floor(.63*nrow(mtcars)), replace = F)
             )      
    return(fit)
}

get_results <- function(lm_model){
    data <- data.frame()
    data <- rbind(data, coef(lm_model))
    data <- cbind(data, summary(lm_model)$r.squared)
    colnames(data) <- c(names(mtcars), "rsquared")
    return(data)
}


# running the above
input_data <- mtcars
general_df <- data.frame()

for(i in 1:1000){
    my_model   <- get_model(input_data)
    final_data <- get_results(my_model)
    general_df <- rbind(general_df, final_data)
}

【讨论】:

    【解决方案2】:

    你很亲密:

    library(tidyverse)
    library(modelr)
    data("mtcars")
    
    get_data_lm <- function(data_df, testPCT = 0.37){
    
        data_resample <- modelr::crossv_mc(data_df, n = 1, test = testPCT)
        fit <- lm(mpg ~ ., data = as.data.frame(data_resample$train))
    
        stats <- c(coef(fit),
                   "R2" = summary(fit)$r.squared,
                   "AdjR2" = summary(fit)$adj.r.squared)
        pred_vals <- predict(fit, newdata = as.data.frame(data_resample$test))
    
        c(stats, pred_vals)
    
    }
    
    output <- t(replicate(1000, get_data_lm(mtcars)))
    

    您唯一需要做的就是连接您想要的其他统计数据和预测值。或者,您可以使用并行的sapply() 变体来使您的模拟速度大大加快。

    另一条评论:我使用 modelr:: 包中的 crossv_mc() 函数来创建一个测试和训练分区。但是,我可以在函数之外使用n = 1000;这将在我的工作环境中为我创建一个重新采样数据框,以便apply() 一个函数结束。请参阅modelr::GitHub page 了解更多信息。

    【讨论】:

    • 是的,这行得通。我将不得不尝试您建议的其他功能。谢谢!
    • @Paul,如果您正在寻找解决方案,请接受它(单击答案旁边的复选标记)。谢谢:)
    • 请广大观众简要说明为什么您选择否决这个答案。
    猜你喜欢
    • 2016-06-08
    • 2017-12-20
    • 1970-01-01
    • 2017-06-09
    • 2020-07-26
    • 1970-01-01
    • 2016-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多