【问题标题】:Linear models in R with different combinations of variablesR中具有不同变量组合的线性模型
【发布时间】:2014-05-22 05:54:15
【问题描述】:

我是 R 新手,遇到了一个问题。我正在尝试读取表中的一组数据,并且我想执行线性建模。以下是我读取数据和变量名称的方式:

>data =read.table(datafilename,header=TRUE)
>names(data)
[1] "price"     "model"     "size"   "year"   "color"

我想要做的是使用变量的不同组合(价格是目标)创建几个线性模型,例如:

> attach(data)
> model1 = lm(price~model+size)
> model2 = lm(price~model+year)
> model3 = lm(price~model+color)
> model4 = lm(price~model+size)
> model4 = lm(price~size+year+color)
#... and so on for all different combination...

我的主要目的是比较不同的模型。有没有更聪明的方法来生成这些模型而不是对变量进行硬编码,尤其是在某些情况下我的变量数量会增加到 13 个左右。

【问题讨论】:

    标签: r variables automation lm


    【解决方案1】:

    如果您的目标是模型选择,那么 R 中有几个工具可以尝试自动化这个过程。在MuMIn package 中阅读有关dredge(...) 的文档。

    # dredge: example of use
    library(MuMIn)
    df <- mtcars[,c("mpg","cyl","disp","hp","wt")]  # subset of mtcars
    full.model <- lm(mpg ~ cyl+disp+hp+wt,df)       # model for predicting mpg
    dredge(full.model)
    # Global model call: lm(formula = mpg ~ cyl + disp + hp + wt, data = df)
    # ---
    # Model selection table 
    #    (Intrc)     cyl      disp       hp     wt df   logLik  AICc delta weight
    # 10   39.69 -1.5080                    -3.191  4  -74.005 157.5  0.00  0.291
    # 14   38.75 -0.9416           -0.01804 -3.167  5  -72.738 157.8  0.29  0.251
    # 13   37.23                   -0.03177 -3.878  4  -74.326 158.1  0.64  0.211
    # 16   40.83 -1.2930  0.011600 -0.02054 -3.854  6  -72.169 159.7  2.21  0.096
    # 12   41.11 -1.7850  0.007473          -3.636  5  -73.779 159.9  2.37  0.089
    # 15   37.11         -0.000937 -0.03116 -3.801  5  -74.321 161.0  3.46  0.052
    # 11   34.96         -0.017720          -3.351  4  -78.084 165.6  8.16  0.005
    # 9    37.29                            -5.344  3  -80.015 166.9  9.40  0.003
    # 4    34.66 -1.5870 -0.020580                  4  -79.573 168.6 11.14  0.001
    # 7    30.74         -0.030350 -0.02484         4  -80.309 170.1 12.61  0.001
    # 2    37.88 -2.8760                            3  -81.653 170.2 12.67  0.001
    # 8    34.18 -1.2270 -0.018840 -0.01468         5  -79.009 170.3 12.83  0.000
    # 6    36.91 -2.2650           -0.01912         4  -80.781 171.0 13.55  0.000
    # 3    29.60         -0.041220                  3  -82.105 171.1 13.57  0.000
    # 5    30.10                   -0.06823         3  -87.619 182.1 24.60  0.000
    # 1    20.09                                    2 -102.378 209.2 51.68  0.000
    

    您应该考虑使用这些工具来帮助您做出明智的决定。 不要让工具替你做决定!!!

    例如,在这种情况下,dredge(...) 建议基于 AICc 标准预测mpg 的“最佳”模型包括cylwt。但请注意,此模型的 AICc 为 157.7,而第二好的模型的 AICc 为 157.8,因此这些基本相同。事实上,这个列表中的前 5 个模型在预测mpg 的能力上并没有显着差异。但是,它确实缩小了一些范围。在这 5 个中,在选择“最佳”模型之前,我想查看残差分布(应该是正常的)、残差趋势(应该没有)和杠杆(某些点是否有不当影响)。

    【讨论】:

    • 这是否适用于非线性模型,例如full.model &lt;- lm(log(mpg) ~ cyl+disp+hp+wt,df)
    【解决方案2】:

    这是使用combn 函数获取所有变量组合的一种方法。有点乱,而且使用了循环(也许有人可以用mapply对此进行改进):

    vars <- c("price","model","size","year","color")
    N <- list(1,2,3,4)
    COMB <- sapply(N, function(m) combn(x=vars[2:5], m))
    COMB2 <- list()
    k=0
    for(i in seq(COMB)){
        tmp <- COMB[[i]]
        for(j in seq(ncol(tmp))){
            k <- k + 1
            COMB2[[k]] <- formula(paste("price", "~", paste(tmp[,j], collapse=" + ")))
        }
    }
    

    然后,您可以调用这些公式并使用 list 存储模型对象,或者可能使用 assign 函数提供唯一名称:

    res <- vector(mode="list", length(COMB2))
    for(i in seq(COMB2)){
        res[[i]] <- lm(COMB2[[i]], data=data)
    }
    

    【讨论】:

      【解决方案3】:

      您可以使用stepwise multiple regression 来确定包含哪些变量是有意义的。要开始此操作,您需要编写一个包含所有变量的 lm() 语句,例如:

      library(MASS)
      fit <- lm(price ~ model + size + year + color)
      

      然后你继续:

      step <- stepAIC(model, direction="both")
      

      最后,您可以使用以下来显示结果:

      step$anova
      

      希望这能为您推进剧本提供一些灵感。

      【讨论】:

      • step 不保证所有模型组合都适合。
      • MASS::stepAIC 比内置的stats::step 有优势吗?
      猜你喜欢
      • 1970-01-01
      • 2020-12-21
      • 2015-07-21
      • 2017-03-04
      • 2021-08-09
      • 1970-01-01
      • 1970-01-01
      • 2021-07-29
      • 1970-01-01
      相关资源
      最近更新 更多