我用我的响应变量作为百分比来做一个GAM(0-100)。我使用了反正弦变换来改进模型拟合(asin(sqrt(myvariable/100)))。我现在想在原始尺度上评估解释因子变量水平之间的对比。我一直在尝试使用emmeans,并按照Transformations and link functions vignette中的步骤以emmeans可以读取的格式设置我的模型。然而,当我运行emmeans函数时,我得到以下错误:链接$mu.eta(object@bhat[estble])中出错:尝试应用非功能。
我这样设置转换对象:
tran <- make.tran("asin.sqrt", 100)
我相信bit可以工作,因为当我用emmeans在线性模型上尝试时,它工作了:
warp.t <- with(tran, lm(linkfun(breaks)~wool*tension, warpbreaks))
emmeans(warp.t, ~wool|tension, type="response")
tension = L:
wool response SE df lower.CL upper.CL
A 44.2 4.00 48 36.3 52.3
B 27.7 3.61 48 20.8 35.3
tension = M:
wool response SE df lower.CL upper.CL
A 23.5 3.41 48 17.0 30.7
B 28.4 3.63 48 21.4 35.9
tension = H:
wool response SE df lower.CL upper.CL
A 23.9 3.43 48 17.4 31.1
B 18.6 3.13 48 12.7 25.3
Confidence level used: 0.95
Intervals are back-transformed from the asin(sqrt(mu/100)) scale
然而,如果我在游戏中尝试它(直接进入emmeans()或使用regrid()),它不起作用:
dat <- data.frame("x" = rep(1:3, times=12),
"y" = rep(4:6, times=12),
"z" = runif(36, 0, 100),
"m" = rep(1:12, times=3))
gam.t <- with(tran, gam(linkfun(z) ~ x * y + s(m), data=dat))
emmeans(gam.t, ~x|y, type="response")
Error in linkinv(result[[cnm[1]]]) : could not find function "linkinv"
#or
regrid(emmeans(gam.t, ~x|y), transform="response")
Error in flink$mu.eta(object@bhat[estble]) :
attempt to apply non-function
这就像它在gam中寻找反向链接函数,但它不在emmeans期望的位置。我可以以某种方式将其分配给gam吗?它对gams无效吗?我做错了什么吗?
1条答案
按热度按时间laawzig21#
按照标题为“指定事后转换”的小插曲中的说明,我认为会给你你想要的结果:
响应变量在调用
gam()
时被转换,然后我们在参考网格上调用update()
来指定使用了什么转换。我得到的输出再次以百分比表示: