我有一个数据帧,其中包含100个值用于6个回归变量x1-x6和100个值用于独立变量y。我的目标是在2个回归变量上估计y的多元线性回归,并选择具有最高R平方的模型。我需要检查x的所有可能组合。例如,估计x1,x2上的模型y; y在x1,x3上; y在x2,x3上,依此类推。 如何检查所有这些可能的组合,然后运行所有回归?可能我需要以某种方式使用combn()函数,但我不知道如何与回归估计一起使用
答案 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
循环中的问题。
可以按照以下步骤进行。
"x"
开头。lapply
循环中运行所有可能的回归。该公式与paste
放在一起,然后被强制为类"formula"
。summary
,其中R ^ 2的th值是用另一个lapply
计算的。'[['
)可以提取的所有信息。
sapply
提取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