如何在 R 中进行所有可能的回归还包括变量的指数和对数?

问题描述 投票:0回答:1

在尝试使用所有可能的回归来比较尽可能多的模型规范时,我正在使用

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) 等,但考虑到我的数据大小,这是不切实际的。

r statistics
1个回答
0
投票

以下是有关如何自动化该过程的建议:

您没有提供任何示例数据,所以我将使用

mtcars
:

df <- mtcars[, c(1,5:7)];

这里,响应是第

1
列,我考虑第
5-7
列中的 3 个预测变量。

目标是自动构建所有相关术语并使用它们构建

formula
,然后我们在
lm
中使用它。

  1. 构建所有预测项:

    # 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)"
    
  2. 将公式表达式构造为字符串。

    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)"
    
  3. 运行线性模型。

    model <- lm(as.formula(exprs), data = df);
    
  4. 使用预测变量的所有组合重新拟合模型。

    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
    

一些评论:

  1. 这很快就会变得非常计算密集。

  2. y ~ .
    公式语法非常简洁,但我还没有找到一种方法来包含例如二次项。一方面,
    y ~ . + (.)^2
    适用于包含所有交互项;另一方面,
    y ~ . + I(.^2)
    不适用于二次项。这就是为什么我认为手动构建术语是可行的方法。

© www.soinside.com 2019 - 2024. All rights reserved.