2014-06-12 39 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。

相關問題