我使用准可能性方法(family=quasi(...)
)将GLM拟合到某些数据。
我想在方差规范中使用变量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)
谢谢!
答案 0 :(得分:1)
family
函数进行了花哨的解析,这意味着评论中建议的paste0
解决方案如果不跳过大量的箍就行不通。此外,如果任何y值都是&lt; = 0,则以下函数会失败,所以我稍微更改了一些示例(如果你确实有负面的响应值,你将不得不考虑你想对此做些什么。 。)
set.seed(1)
x <- seq(2,10,length=100)
y <- x^2+2*x+sin(2*pi*x) + rnorm(100,)
我所做的是创建一个quasi
系列对象,然后动态修改其方差函数。
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")