eve*_*lyn 5 r gam lsmeans emmeans
我正在使用我的响应变量作为百分比(0-100)进行 GAM。我使用反正弦变换来改进模型拟合(asin(sqrt(myvariable/100)))。我现在想评估原始规模上解释因子变量水平之间的对比。我一直在尝试使用 emmeans 并按照转换和链接函数小插图中的步骤来设置我的模型,并以 emmeans 可以读取的格式进行转换。但是,当我运行 emmeans 函数时,出现以下错误: link$mu.eta(object@bhat[estble]) 中的错误:尝试应用非函数。
我这样设置转换对象:
tran <- make.tran("asin.sqrt", 100)
Run Code Online (Sandbox Code Playgroud)
我相信 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
Run Code Online (Sandbox Code Playgroud)
但是,如果我在游戏中尝试它(直接进入 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
Run Code Online (Sandbox Code Playgroud)
就好像它在 gam 中寻找反向链接函数,但它并不是 emmeans 期望的地方。我可以以某种方式将其分配给游戏吗?不支持游戏吗?难道我做错了什么?
按照“事后指定转换”标题下的小插图中的说明进行操作,我认为会给您带来您正在寻找的结果:
gam.t2 <- gam(asin(sqrt(z/100)) ~ x * y + s(m), data = dat)
refgrid_gam.t2 <- update(ref_grid(gam.t2), tran = tran)
emmeans(refgrid_gam.t2, ~ x | y, type = "response")
Run Code Online (Sandbox Code Playgroud)
响应变量在对 的调用中进行转换gam(),然后我们调用update()参考网格来指定使用的转换。我得到的输出再次以百分比形式显示:
y = 5:
x response SE df lower.CL upper.CL
2 52 10.3 32 31.5 72.2
Confidence level used: 0.95
Intervals are back-transformed from the asin(sqrt(mu/100)) scale
Run Code Online (Sandbox Code Playgroud)