我使用拟似然方法 ( ) 将 GLM 拟合到一些数据family=quasi(...)。
我想p在方差规范中使用一个变量,如下所示:
family = quasi(link=log, variance=mu^p)
Run Code Online (Sandbox Code Playgroud)
然而这不起作用(它不再识别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)
Run Code Online (Sandbox Code Playgroud)
谢谢!
该family函数进行了奇特的解析,这意味着paste0评论中建议的解决方案如果不跳过相当大的圈子就无法工作。另外,如果任何 y 值 <= 0,则以下函数将失败,因此我稍微更改了示例(如果您确实有负响应值,则必须考虑对此做什么... )
set.seed(1)
x <- seq(2,10,length=100)
y <- x^2+2*x+sin(2*pi*x) + rnorm(100,)
Run Code Online (Sandbox Code Playgroud)
我所做的是创建一个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)
Run Code Online (Sandbox Code Playgroud)
就其价值而言,此变体应该能够执行 的任意值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")
Run Code Online (Sandbox Code Playgroud)

| 归档时间: |
|
| 查看次数: |
760 次 |
| 最近记录: |