从多个回归中提取系数,标准误差,R2等

时间:2017-12-01 16:47:05

标签: r linear-regression

我有以下回归模型;

models <- lapply(1:25, function(x) lm(Y_df[,x] ~ X1))

Y_df数据框中的25列上运行25次回归。

其中一个输出可以显示为;

models[15] # Gives me the coefficients for model 15

Call:
lm(formula = Y_df[, x] ~ X1)

Coefficients:
(Intercept)         X1 
  0.1296812    1.0585835  

我可以将其存放在单独的df中。我遇到的问题是关于Std。错误,R2,残留等。

我想将这些也存储在一个单独的数据框中。

我可以运行单个回归并提取摘要,因为正常的R回归输出看起来像。

ls_1 <- summary(models[[1]])
ls_1
ls_1$sigma

但是我希望直接从运行25次回归的代码行中获取值。

此代码有效

> (models[[15]]$coefficients)
  (Intercept)          X1 
-0.3643446787  1.0789369642

然而;这段代码没有。

> (models[[15]]$sigma)
NULL

我尝试了各种不同的组合,试图在没有运气的情况下提取这些结果。

以下完全符合我的要求。我曾希望有一种方法可以将coef替换为Std ErrorR2等,但这不起作用。

models <- lapply(1:25, function(x) lm(Y_df[,x] ~ X1))
# extract just coefficients
coefficients <- sapply(Y_df, coef)

理想情况下,我想存储上述模型中的Std Error

1 个答案:

答案 0 :(得分:0)

如果模型名为mod,则可以使用与系数相同的方式获取所有残差:

mod$residuals

还有一些函数可以提取系数和残差:

coef(mod)
resid(mod)

其他输出,您可以通过summary提取:

summary(mod)$coef[,"Std. Error"]  # standard errors
summary(mod)$r.squared            # r squared
summary(mod)$adj.r.squared        # adjusted r squared

因此,您可以创建一个列表,其中包含每个模型的每个结果:

outputList <- lapply(models, function(x){
  coefs <- coef(mod)
  stdErr <- summary(mod)$coef[,"Std. Error"]
  rsq <- summary(mod)$r.squared
  rsq_adj <- summary(mod)$adj.r.squared
  rsd <- resid(mod)
  list(coefs = coefs, 
       stdErr = stdErr, 
       rsq = rsq, 
       rsq_adj = rsq_adj, 
       rsd = rsd)
})

然后,您可以通过outputList$mod1$rsq来获取mod1的rsq,例如。

或者您可以为每个数据框创建单独的数据框:

library(tidyverse)

# coefficients
coefs <- lapply(models, coef) %>%
  do.call(rbind, .) %>%
  as.data.frame() %>% # convert from matrix to dataframe
  rownames_to_column("model") # add original model name as a column in the dataframe

# standard errors
stdErr <- lapply(models, function(x){
  summary(mod)$coef[,"Std. Error"]
}) %>%
  do.call(rbind, .) %>%
  as.data.frame() %>% 
  rownames_to_column("model") 

# r squareds
rsq <- sapply(models, function(x){
  summary(mod)$r.squared
}) %>%
  as.data.frame() %>% 
  rownames_to_column("model")

# adjusted r squareds
rsq_adj <- sapply(models, function(x){
  summary(mod)$adj.r.squared
})%>%
  as.data.frame() %>% 
  rownames_to_column("model")

# residuals
rsd <- lapply(models, resid) %>%
  do.call(rbind, .) %>%
  as.data.frame() %>% 
  rownames_to_column("model") 

值得注意的是,如果你在RStudio并且你将摘要分配给某个东西(即temp <- summary(mod)),你可以输入对象的名称,然后输入“$”和所有其他对象的下拉列表可以从摘要中提取出来。