在尝试使用所有可能的回归来比较尽可能多的模型规范时,我正在使用
olsrr
包进行统计分析。
我的代码:
model <- lm(y ~ ., data = "mydata"
k <- ols_all_subset(model)
这为我提供了一个表格,其中包含每个变量组合的 R2、调整后的 R2、AIC、SIC 等原样(线性)。例如,如果变量是 x1、x2 和 x3,它会为我提供一个包含 R2、AIC、SIC 等的表格,用于表示每种可能的线性-线性规格的规格:以 x1 x2 和 x3 作为回归量,以 x1 和 x2 为回归量,以x1 和 x3,以及 x2 和 x3,并且每个都只是 x1、x2 和 x3。
但是,我也想获得变量的平方和对数的所有可能,以查看每个可能的主要规格,例如 x1^2、log(x1)、log(x3) 等。
我知道我可以单独创建一个新列并单独生成每个 x1^2、log(x1) 等,但考虑到我的数据大小,这是不切实际的。
以下是有关如何自动化该过程的建议:
您没有提供任何示例数据,所以我将使用
mtcars
:
df <- mtcars[, c(1,5:7)];
这里,响应是第
1
列,我考虑第 5-7
列中的 3 个预测变量。
目标是自动构建所有相关术语并使用它们构建
formula
,然后我们在 lm
中使用它。
构建所有预测项:
# All but the first column are predictors
terms <- sapply(colnames(df)[-1], function(x)
c(x, sprintf("I(%s^2)", x), sprintf("log(%s)", x)));
terms;
# drat wt qsec
#[1,] "drat" "wt" "qsec"
#[2,] "I(drat^2)" "I(wt^2)" "I(qsec^2)"
#[3,] "log(drat)" "log(wt)" "log(qsec)"
将公式表达式构造为字符串。
exprs <- sprintf("%s ~ %s", colnames(df)[1], paste(terms, collapse = "+"));
exprs;
[1] "mpg ~ drat+I(drat^2)+log(drat)+wt+I(wt^2)+log(wt)+qsec+I(qsec^2)+log(qsec)"
运行线性模型。
model <- lm(as.formula(exprs), data = df);
使用预测变量的所有组合重新拟合模型。
require(olsrr);
k <- ols_all_subset(model);
k;
# # A tibble: 511 x 6
# Index N Predictors `R-Square` `Adj. R-Square` `Mallow's Cp`
# <int> <int> <chr> <chr> <chr> <chr>
# 1 1 1 log(wt) 0.81015 0.80382 9.73408
# 2 2 1 wt 0.75283 0.74459 21.12525
# 3 3 1 I(wt^2) 0.64232 0.63040 43.08976
# 4 4 1 I(drat^2) 0.46694 0.44917 77.94664
# 5 5 1 drat 0.46400 0.44613 78.53263
# 6 6 1 log(drat) 0.45406 0.43587 80.50653
# 7 7 1 log(qsec) 0.17774 0.15033 135.42760
# 8 8 1 qsec 0.17530 0.14781 135.91242
# 9 9 1 I(qsec^2) 0.17005 0.14239 136.95476
#10 10 2 log(wt) log(qsec) 0.87935 0.87103 -2.02118
## ... with 501 more rows
一些评论:
这很快就会变得非常计算密集。
y ~ .
公式语法非常简洁,但我还没有找到一种方法来包含例如二次项。一方面,y ~ . + (.)^2
适用于包含所有交互项;另一方面,y ~ . + I(.^2)
不适用于二次项。这就是为什么我认为手动构建术语是可行的方法。