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

时间:2018-02-01 22:13:40

标签: r statistics

我主要从事研究和统计工作,因此对编程并不熟悉。当我尝试使用所有可能的回归来比较尽可能多的模型规范时,我正在使用OLSRR软件包进行统计分析。

我使用代码:

model <- lm(y ~ ., data = "mydata" k <- ols_all_subset(model) k

到目前为止,它为我提供了一个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)等单独生成为一个新列,但有时我会有几十个变量和大量数据,所以每次单独执行每个变量每个新数据集都很痛苦。

1 个答案:

答案 0 :(得分: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
    
  5. 一些评论:

    1. 这很快就会计算量很大。

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