在GLM的准拟合规范中使用变量

5

我正在对一些数据进行GLM拟合,采用准似然方法(family=quasi(...))。

我想要在方差规格化中使用一个变量p,就像这样:

family = quasi(link=log, variance=mu^p) 

然而,这种方法不起作用(它不再识别mu)。

有没有办法让R在表达式评估之前插入p的值,这样我就可以使用p代替数字了?

以下是一个不起作用的示例:

set.seed(1)
x <- runif(100)
y <- x^2+2*x+sin(2*pi*x) + rnorm(100)

fitModel <- function(x,y, p) {
  model <- glm(y~x, family=quasi(link=log, variance=mu^p))
  return(model)
}
fitModel(x,y,2)

谢谢!


1
方差 = paste0("mu^", p),其中p可以是1、2或3。 - Roland
否则,您需要提供一个包含组件varfunvalidmudev.residsinitializename的列表(请参见?family)。 - Roland
理想情况下,我想在调用glm的函数中使用variance = paste0("mu^", p)。但是这会导致错误:'variance' "NA"无效:可能的值为"mu(1-mu)", "mu", "mu^2", "mu^3"和"constant" - 可能是因为此时p为NA。给它一个默认值似乎也没有帮助。有什么想法吗? - user2249626
1
请在您的问题中添加所有相关信息(包括代码和玩具数据以便复现)。 - Roland
1个回答

3

family函数进行了复杂的解析,这意味着在评论中建议的paste0解决方案需要跨越相当大的障碍才能实现。此外,如果任何y值为<= 0,则以下函数将失败,因此我稍微更改了示例(如果您确实具有负响应值,则必须考虑要做什么...)

set.seed(1)
x <- seq(2,10,length=100)
y <- x^2+2*x+sin(2*pi*x) + rnorm(100,)

我所做的是创建了一个“准”家族对象,然后动态修改它的差异函数。
pfamily <- quasi(link="log",variance="mu")
fitModel <- function(x,y, p) {
    pfamily[["variance"]] <- function(mu) mu^p
    model <- glm(y~x, family=pfamily)
    model
}

fitModel(x,y,2)
fitModel(x,y,1)

值得一提的是,这个变量可以处理任意的 p 值,因此您可以绘制出方差幂上的曲线:

dfun <- function(p) {
   deviance(fitModel(x,y,p))
}
pvec <- seq(0.1,3,by=0.1)
dvec <- sapply(pvec,dfun)
par(las=1,bty="l")
plot(pvec,dvec,type="b",xlab="variance power",ylab="deviance")

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接