2017-06-03 45 views
0

我想要做VIF測試,在數據集內運行連續迴歸,每次使用一個變量作爲響應,其餘爲預測變量。使用glm與data.table和預測變量和響應的參數化定義

爲此目的,我將把我的代碼放在一個for循環中,這個循環將給出將作爲響應使用的列的索引的連續值,並將其餘的值作爲預測值。

我要使用data.table封裝和I將使用基礎R發現mtcars數據集以產生可再現的例子:

data(mtcars) 
setDT(mtcars) 
# Let i-- the index of the response -- be 1 for demonstration purposes 
i <- 1 
variables <- names(mtcars) 
response <- names(mtcars)[i] 
predictors <- setdiff(variables, response) 
model <- glm(mtcars[, get(response)] ~ mtcars[, predictors , with = FALSE], family = "gaussian") 

然而,這導致一個錯誤消息:

錯誤model.frame.default(式= mtcars [,得到(響應)]〜 mtcars [,: 無效型(列表)爲變量 'mtcars [,預測,與= FALSE]'

你能解釋一下錯誤並幫我糾正代碼嗎?

您的建議將不勝感激。

============================================== ===============================

編輯:

再現代碼建議我得到了一個錯誤消息:

> library(car) 
> library(data.table) 
> 
> data(mtcars) 
> setDT(mtcars) 
> model <- glm(formula = mpg ~ .,data=mtcars , family = "gaussian") 
> vif(model) 
Error in (function (classes, fdef, mtable) : 
    unable to find an inherited method for function ‘vif’ for signature ‘"glm"’ 

更新:

沒有問題的代碼運行時,我明確指定的包,即:

car::vif(model) 

編輯2

我不得不修改弗雷德裏克的代碼如下得到所有變量的係數:

rhs <- paste(predictors, collapse ="+") 
full_formula <- paste(response, "~", rhs) 
full_formula <- as.formula(full_formula) 

回答

0

另一種解決方案是基於使用的glm.fit

model <- glm.fit(x=mtcars[, ..predictors], y=mtcars[[response]], family = gaussian()) 
1

如果你要計算你的預測,我建議在看的VIF vif功能包car。它會爲你做計算並推廣到具有多個自由度的預測因子,如因子。

要獲取所有的VIF你只甲肝

library(car) 
library(data.table) 

data(mtcars) 
setDT(mtcars) 
model <- glm(formula = mpg ~ .,data=mtcars , family = "gaussian") 
vif(model) 

至於你的錯誤,我認爲這是你混合了glm這需要一個公式和數據集,並glm.fit這需要設計矩陣和預測,按此順序。您在呼叫中擁有來自這兩個功能的概念。

要適合你的模式,我建議使用,因爲這將glm去給你一流的GLM帶有附加功能的對象,如做plot(model)而不是glm.fit,你只能得到相關的模型值的列表的能力。

在這種情況下,您只需要創建公式,看起來像:

library(data.table) 

data(mtcars) 
setDT(mtcars) 
# Let i-- the index of the response -- be 1 for demonstration purposes 
i <- 1 
variables <- names(mtcars) 
response <- names(mtcars)[i] 
predictors <- setdiff(variables, response) 


rhs <- paste(predictors, sep = " + ") 
full_formula <- paste(response, "~", rhs) 
model <- glm(formula = full_formula ,data=mtcars, family = "gaussian") 

與此相反:

model <- glm.fit(y=mtcars[, get(response)] , 
        x=mtcars[, predictors , with = FALSE], 
        family=gaussian())