我想在数据集中运行连续回归的VIF测试,每次使用一个变量作为响应,剩下的作为预测变量。
为此,我将把我的代码放在一个for循环中,该循环将为将用作响应的列的索引提供连续值,并将剩余的作为预测变量。
我将使用data.table包,我将使用基础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中的错误(formula = mtcars [,get(response)]〜 mtcars [,: 变量&#39; mtcars [,predictors,with = FALSE]的无效类型(列表)&#39;
你能解释一下这个错误并帮我纠正代码吗?
您的建议将不胜感激。
=============================================== ==============================
在重现建议的代码时,我收到了一条错误消息:
> 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)
我必须按如下方式修改Fredrik的代码,以获得所有变量的系数:
rhs <- paste(predictors, collapse ="+")
full_formula <- paste(response, "~", rhs)
full_formula <- as.formula(full_formula)
答案 0 :(得分: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())
答案 1 :(得分:0)
另一种解决方案基于glm.fit
:
model <- glm.fit(x=mtcars[, ..predictors], y=mtcars[[response]], family = gaussian())