将glm与data.table以及预测变量和响应

时间:2017-06-03 10:23:04

标签: r data.table glm

我想在数据集中运行连续回归的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)

编辑2

我必须按如下方式修改Fredrik的代码,以获得所有变量的系数:

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

2 个答案:

答案 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())