我想进行似然比检验以确定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
函数输入兼容?
答案 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
}