检查回归组合

时间:2018-11-08 16:26:36

标签: r dataframe linear-regression

我有一个数据帧,其中包含100个值用于6个回归变量x1-x6和100个值用于独立变量y。我的目标是在2个回归变量上估计y的多元线性回归,并选择具有最高R平方的模型。我需要检查x的所有可能组合。例如,估计x1,x2上的模型y; y在x1,x3上; y在x2,x3上,依此类推。 如何检查所有这些可能的组合,然后运行所有回归?可能我需要以某种方式使用combn()函数,但我不知道如何与回归估计一起使用

1 个答案:

答案 0 :(得分:0)

首先,由于您没有发布任何数据集,因此我将创建一个可复制的数据集。

set.seed(1)    # make the results reproducible
n <- 100
X <- matrix(rnorm(6*n), ncol = 6)
y <- X %*% sample(6) + rnorm(n)

X <- as.data.frame(X)
names(X) <- paste0("x", 1:6)

data <- cbind(X, y)
head(data)

以下解决了连续*apply循环中的问题。 可以按照以下步骤进行。

  1. 获取回归器的全名,仅知道它们以"x"开头。
  2. 创建一个矩阵,将所有可能的组合二乘二。
  3. 在第一个lapply循环中运行所有可能的回归。该公式与paste放在一起,然后被强制为类"formula"
  4. 获取summary,其中R ^ 2的th值是用另一个lapply计算的。
  5. 就是这样。现在,这两个列表具有标准子集运算符(例如'[[')可以提取的所有信息。
    1. 首先使用sapply提取R ^ 2,因为它们将形成值的向量
    2. 提取最大R ^ 2的模型系数和模型摘要。

让我们开始吧。

regress <- grep("^x", names(data), value = TRUE)

regress_mat <- combn(regress, 2)

lm_list <- apply(regress_mat, 2, function(reg){
  fmla <- paste("y", paste(reg, collapse = "+"), sep = "~")
  fmla <- as.formula(fmla)
  lm(fmla, data)
})

smry_list <- lapply(lm_list, summary)
rsq <- sapply(smry_list, '[[', "r.squared")

coef(lm_list[[which.max(rsq)]])
#(Intercept)          x3          x4 
# -0.1400852   5.0556334   5.7352798

smry_list[[which.max(rsq)]]

#Call:
#  lm(formula = fmla, data = data)
#
#Residuals:
#     Min       1Q   Median       3Q      Max 
#-11.6529  -4.6230   0.1127   3.7821  11.9342 
#
#Coefficients:
#              Estimate Std. Error t value Pr(>|t|)    
#  (Intercept)  -0.1401     0.5763  -0.243    0.808    
#  x3            5.0556     0.5626   8.987 2.07e-14 ***
#  x4            5.7353     0.5867   9.775 4.11e-16 ***
#  ---
#  Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#
#Residual standard error: 5.754 on 97 degrees of freedom
#Multiple R-squared:  0.6714,   Adjusted R-squared:  0.6646 
#F-statistic:  99.1 on 2 and 97 DF,  p-value: < 2.2e-16