我正在运行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值的阈值?
或欢迎任何可以解决我问题的方法的评论。
谢谢!
答案 0 :(得分: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 :(得分:0)
我建议删除具有高相关性的变量。 library 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。
答案 2 :(得分:-1)
要在运行挖泥机功能(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