【问题标题】:How to add specific conditions to stepAIC如何向 stepAIC 添加特定条件
【发布时间】:2014-06-12 21:42:47
【问题描述】:

我正在运行一个包含 37 个变量的回归,并且我正在使用 stepAIC 来执行模型选择。我不想要一个预测模型。我只是想找出哪些变量具有最好的解释力。

我当前的代码如下:

fitObject <- lm(mydata)
DEP.select <- stepAIC(fitObject, direction = 'both', scope= list(lower = ~AUC), trace = F, k = log(obs))
# DEP is my dependent variable, and AUC is an independent variable I was want to have in my model.

问题是我的很多变量都具有高度相关性,而stepAIC 给我的结果包含其中几个高度相关的变量。请注意,我在模型中强制了 AUC,多重共线性是一个问题,尤其是在模型中选择与 AUC 高度相关的变量时。

有没有办法在函数中指定一些相关阈值或系数的 p 值?

或者欢迎任何可以解决我的问题的其他方法的 cmets。

谢谢!

【问题讨论】:

  • 你还没有在 lm 中指定模型?
  • 这是对数据框第一个变量的所有变量进行回归。同fitObject &lt;- lm(mydata[,1]~., data=mydata)
  • 我明白这一点,但它很容易出现各种不需要的东西。但要回答您的问题,不,您使用 AIC 作为模型选择,因此 pvalues 无关紧要。并且仅仅因为一些变量是共线的并不意味着它们是无用的。你的目标是什么?你想找到一个预测模型吗?您是否知道模型中应该包含哪些变量,即使它们的 p 值“不够好”?这些力学模型选择算法一般都不是很好
  • 我了解模型选择的问题,这不是我的最终模型。我只想挑选出可以解释我的因变量的变量。所有变量都是相关的(有些是相似的),这就是为什么存在如此多的相关性。我已经更新了一些关于我的目标的问题。也感谢任何有关解决问题的其他方法的建议。

标签: r regression lm


【解决方案1】:

也许方差通胀因子更适合您。这篇文章解释了一些逻辑。 http://en.wikipedia.org/wiki/Variance_inflation_factor

使用示例:

v=ezvif(df,yvar ='columnNameOfWhichYouAreTryingToPredict')

这是我编写的将 VIF::vif 与交叉验证相结合的函数。

require(VIF)
require(cvTools);
#returns selected variables using VIF and kfolds cross validation 
ezvif=function(df,yvar,folds=5,trace=F){
  f=cvFolds(nrow(df),K=folds);
  findings=list();
  for(v in names(df)){
    if(v==yvar)next;
    findings[[v]]=0; 
  }
  for(i in 1:folds){   
    rows=f$subsets[f$which!=i]
    y=df[rows,yvar];
    xdf=df[rows,names(df) != yvar]; #remove output var    
    vifResult=vif(y,xdf,trace=trace,subsize=min(200,floor(nrow(xdf))))
    for(v in names(xdf)[vifResult$select]){
      findings[[v]]=findings[[v]]+1; #vote
    }
  }
  findings=(sort(unlist(findings),decreasing = T))    
  if(trace) print(findings[findings>0]); 
  return( c(yvar,names(findings[findings==findings[1]])) )  
}

【讨论】:

    【解决方案2】:

    我建议删除具有高相关性的变量。库 caret 和 corrplot 可以提供帮助:

    library(corrplot)
    library(caret)
    dm = data.matrix(mydata[,names(mydata) != 'DEP'] #without your outcome var
    

    可视化您的相关性聚集在一起高度相关

    corrplot(cor(dm), order = 'hclust')
    

    并找到由于高 (>0.75) 相关性而可以删除的变量索引

    findCorrelations(cor(dm), 0.75)
    

    删除这些变量可以改进您的模型。删除变量后,按照问题中的描述继续执行 stepAIC。

    【讨论】:

      【解决方案3】:

      要在运行疏通函数(MuMIn 包)时评估预测变量之间的多重共线性,请包含以下 max.r 函数作为“额外”参数:

      max.r <- function(x){
        corm <- cov2cor(vcov(x))
        corm <- as.matrix(corm)
        if (length(corm)==1){
          corm <- 0
          max(abs(corm))
        } else if (length(corm)==4){
        cormf <- corm[2:nrow(corm),2:ncol(corm)]
        cormf <- 0
        max(abs(cormf))
        } else {
          cormf <- corm[2:nrow(corm),2:ncol(corm)]
          diag(cormf) <- 0
          max(abs(cormf))
        }
      }
      

      然后简单地运行 dredge 指定预测变量的数量并包括 max.r 函数:

      options(na.action = na.fail)
      Allmodels <- dredge(Fullmodel, rank = "AIC", m.lim=c(0, 3), extra= max.r) 
      Allmodels[Allmodels$max.r<=0.6, ] ##Subset models with max.r <=0.6 (not collinear)
      NCM <- get.models(Allmodels, subset = max.r<=0.6) ##Retrieve models with max.r <=0.6 (not collinear)
      model.sel(NCM) ##Final model selection table
      

      这适用于 lme4 模型。对于 nlme 模型,请参阅:https://github.com/rojaff/dredge_mc

      【讨论】:

      • 请解释更多,不仅要链接到外部资源,还要在这里解释。
      猜你喜欢
      • 1970-01-01
      • 2019-08-25
      • 1970-01-01
      • 2011-08-02
      • 1970-01-01
      • 2023-02-09
      • 2015-11-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多