【问题标题】:Command for finding the best linear model in R在 R 中寻找最佳线性模型的命令
【发布时间】:2016-02-17 19:47:49
【问题描述】:

有没有办法让 R 运行所有可能的模型(包含数据集中的所有变量组合)以生成最佳/最准确的线性模型,然后输出该模型?

我觉得有办法做到这一点,但我很难找到信息。

【问题讨论】:

  • 您如何定义最佳/最准确的线性模型?
  • library(leaps) allmods = regsubsets(y~x1+x2+x3+x4, nbest=2, data=mydata) summary(allmods) 我认为是这样的,但我想无需输入 x1+x2+...
  • 请给我们dput(mydata)
  • 运行所有可能的模型并不是一种非常科学的方法。您应该通过仅包含您认为会对响应变量产生影响的解释变量来构建模型。仅仅因为您拥有大量数据,并不意味着您应该包含所有数据。运行一些模型lm1 = lm(y ~x1)lm2 = lm(y~x2)等等,然后使用AIC(lm1,lm2)比较你的模型
  • 运行所有可能的模型是探索性数据分析的一种形式。它还可以通过提取每个回归中所有变量的显着性值来用作验证性数据分析,以确保变量在罕见/有限情况下不显着。

标签: r model linear-regression lm


【解决方案1】:

有很多方法可以实现这一点,但对于一个简单的方法,我建议您查看glmulti 包,本文对此进行了详细描述:

另外,Quick-R 网站上提供的非常简单的模型选择示例:

# Stepwise Regression
library(MASS)
fit <- lm(y~x1+x2+x3,data=mydata)
step <- stepAIC(fit, direction="both")
step$anova # display results 

或者为了更简化,你可以做更多的手动模型比较:

fit1 <- lm(y ~ x1 + x2 + x3 + x4, data=mydata)
fit2 <- lm(y ~ x1 + x2, data=mydata)
anova(fit1, fit2) 

【讨论】:

  • 我认为需要的是能够比较所有可能的模型,而不是启发式找到的“最佳”模型。
【解决方案2】:

这应该可以帮助您入门。尽管您应该从上面阅读我的评论。这应该根据数据集中的所有数据为您构建一个模型,然后将所有模型与 AIC 和 BIC 进行比较。

# create a NULL vector called model so we have something to add our layers to
model=NULL

# create a vector of the dataframe column names used to build the formula
vars = names(data)
# remove variable names you don’t want to use (at least
# the response variable (if its in the first column)
vars = vars[-1]

# the combn function will run every different combination of variables and then run the glm
for(i in 1:length(vars)){
  xx = combn(vars,i)
  if(is.null(dim(xx))){
    fla = paste("y ~", paste(xx, collapse="+"))
    model[[length(model)+1]]=glm(as.formula(fla),data=data)
  } else {
    for(j in 1:dim(xx)[2]){
      fla = paste("y ~", paste(xx[1:dim(xx)[1],j], collapse="+"))
      model[[length(model)+1]]=glm(as.formula(fla),data=data) 
    }
  }
}

# see how many models were build using the loop above
length(model)

# create a vector to extract AIC and BIC values from the model variable
AICs = NULL
BICs = NULL
for(i in 1:length(model)){
  AICs[i] = AIC(model[[i]])
  BICs[i] = BIC(model[[i]])
}

#see which models were chosen as best by both methods
which(AICs==min(AICs))
which(BICs==min(BICs))

【讨论】:

  • 我发现 for 循环很难理解。以上是否有 *apply 或 function(x) 实现?
  • 对于 BIC,您可以使用 Konrad 的建议,将参数 k 设置为 log(n),例如 step
【解决方案3】:

我最终对数据运行了前向、后向和逐步过程来选择模型,然后根据 AIC、BIC 和 adj 对它们进行比较。 R平方这种方法似乎最有效。但是,当我收到要使用的实际数据时(我正在编写的程序是出于商业目的),我被告知仅针对响应对每个解释变量进行建模,因此我可以为每个变量调用 lm(response ~ explanatory)问题,因为我们最终使用它进行的分析并不担心它们如何相互作用。

【讨论】:

    【解决方案4】:

    这是一个非常古老的问题,但对于那些仍在讨论这个问题的人 - 包 olsrr ,特别是函数 ols_step_all_possible 详尽地为所有可能的变量子集生成了一个 ols 模型,基于一个 lm 对象(例如通过喂使用完整模型,您将获得所有可能的组合),并为所有模型返回一个包含 R 平方、调整后的 R 平方、aic、bic 等的数据框。这对于找到最佳预测变量非常有帮助,但也非常耗时。

    https://olsrr.rsquaredacademy.com/reference/ols_step_all_possible.html

    我不建议只“挑选”性能最好的模型,而是我会实际查看输出并仔细选择最合理的结果。如果您想立即获得性能最佳的模型(根据某些标准,例如预测变量的数量和 R2),您可以编写一个函数来保存数据帧,按预测变量的数量对其进行排列,并按 R2 的降序对其进行排序并吐出最佳结果。

    【讨论】:

      【解决方案5】:

      R 中的 dredge() 函数也可以完成此操作。

      【讨论】:

      • 嗨@Christina。而不是简单地发布声明作为答案,表明您的解决方案有效。否则这并没有真正的帮助。
      猜你喜欢
      • 2022-06-30
      • 2014-12-24
      • 1970-01-01
      • 2016-07-08
      • 2016-07-25
      • 2014-11-25
      • 1970-01-01
      • 2019-06-26
      • 1970-01-01
      相关资源
      最近更新 更多