使用glm.fit后的ANOVA

时间:2014-07-22 11:32:28

标签: r glm anova

我想进行似然比检验以确定DOE中模型项的功效。直到现在我一直在使用glm fit中的p值来做到这一点并且一切都很好。当我开始使用anova函数时,我意识到似乎没有一个anova函数被设计为接受来自glm.fit函数的输入,只有一个glm函数。以下是我想要做的一个例子:

X # This is a model matrix from matrix.model
y # These are the y values for the fit
tfit = glm.fit(X, y, family = poisson())
anova(tfit, test = 'LRT')

通常我会假设anova函数调用只需要更改为anova.glm,但事实并非如此。如何使glm.fit函数输出与anova函数输入兼容?

1 个答案:

答案 0 :(得分:1)

问题在于glm.fit不输出类glm,而是包含有关模型的各种数据的原始列表。这不能提供给anova.glm,因为此函数需要glm函数生成的类glm的对象。如果您有可用的原始数据(因此没有输入模型矩阵,您可以将glm函数应用于此以产生所需的结果。

X <- matrix(c(runif(10), rnorm(10)), ncol = 2)
y <- round(runif(10, 1, 5))
X.mm <- model.matrix(y ~ X)
model.fit.1 <- glm.fit(X.mm, y, family = poisson())
class(model.fit.1)
model.fit.2 <- glm(y ~ X, family = "poisson")
class(model.fit.2)

anova(model.fit.2, test = "LRT")

如果您不能使用glm函数并且必须使用glm.fit,那么您可以自己从glm.fit输出构建LRT。首先,请执行以下功能

LRT.glm.fit <- function(glm.fit.mod){
  df.null <- glm.fit.mod$df.null
  df.mod <- glm.fit.mod$df.residual
  dev.null <- glm.fit.mod$null.deviance
  dev.mod <- glm.fit.mod$deviance
  dev.diff <- dev.null - dev.mod
  p.value <- 1 - pchisq(dev.null - dev.mod, df.null - df.mod)
  output <- c(round(df.null), round(df.mod), dev.null, dev.mod, p.value)
  names(output) <- c("df.null", "df.mod", "dev.null", "dev.mod", "p.value")
  output
}