将来自多个样本的回归摘要输出组合到R

时间:2018-02-12 19:26:59

标签: r

我尝试将多个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()来获取拟合值。我正在努力解决如何使用保存的系数将它们带入数据框架。

2 个答案:

答案 0 :(得分:0)

以下应该

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

答案 1 :(得分:-1)

你非常接近:

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()变体来使模拟速度更快。

另一条评论:我使用crossv_mc()包中的modelr::函数创建一个测试和培训分区。但是,我本可以在函数外部使用n = 1000;这会在我的工作环境中创建一个重采样数据框,让我apply()一个函数。有关详细信息,请参阅modelr:: GitHub page

相关问题