2014-06-12 41 views
0

我正在使用37个变量运行回归,并且我使用stepAIC来执行模型选择。我不想要一个预测模型。我只想找出哪些变数具有最好的解释力。如何将具体条件添加到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值?

或者其他可以解决我的问题的方法的任何意见都是值得欢迎的。

谢谢!

+0

你甚至没有在lm中指定一个模型? – rawr

+0

这是为了回归数据框第一个变量上的所有变量。与fitObject < - lm(mydata [,1]〜。,data = mydata)相同' – lareven

+0

我明白,但它很容易出现各种不需要的东西。但要回答你的问题,不,你正在使用AIC作为模型选择,所以pvalues是无关紧要的。仅仅因为一些变量是共线的并不意味着它们是无用的。你的目标是什么?你是否在寻找预测模型?你是否知道模型中应该包含哪些变量,即使它们的p值不够“够好”?这些机械模型选择算法通常不是很好 – rawr

回答

0

也许差异通胀因子对你来说会更好。本文解释了一些逻辑。 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]]))) 
} 
-1

要在运行疏通功能时(牧民包),评估预测之间的多重共线性包括以下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)) 
    } 
} 

然后只需运行疏通指定数包括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

+1

请解释更多,不仅链接到外部来源,但在这里解释它们。 – mitchken

0

我建议删除高相关性的变量。库加字符和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。

相关问题