关于 joint_tests 无法通过 make.tran() 识别 asin.sqrt 转换 我有
emmeans
1.8.8
set.seed(83)
library(emmeans)
dummy <- expand.grid(
covar = runif(72, min = 0, max = 1),
resp = runif(72, min = 0, max = 2),
site = c("a", "b", "c", "d", "e", "g"),
C = 1:4,
R = c("i", "j", "k")
)
as.tran <- make.tran("asin.sqrt")
mod <- with(as.tran, lm(sqrt(resp) ~ site + C * R * linkfun(covar), data = dummy))
这个
joint_tests
命令没有给出任何涉及 covar 的行。model term df1 df2 F.ratio p.value
site 5 373231 0.000 1.0000
C 1 373231 0.000 1.0000
R 2 373231 0.000 1.0000
C:R 2 373231 0.000 1.0000
切换
resp
和 covar
,下面的 joint_tests(mod2)
给出了完整的 ancova 模型
mod2 <- with(as.tran, lm( linkfun(covar) ~ site + C * R * sqrt(resp), data = dummy))
joint_tests(mod2)
model term df1 df2 F.ratio p.value
site 5 373231 0.000 1.0000
C 1 373231 0.000 1.0000
R 2 373231 0.000 1.0000
resp 1 373231 0.000 1.0000
C:R 2 373231 0.000 1.0000
C:resp 1 373231 0.000 1.0000
R:resp 2 373231 0.000 1.0000
C:R:resp 2 373231 0.000 1.0000
使用
asin
,joint_tests
可以识别 make.tran()
外部协变量的即时变换
mod3 <- lm( sqrt(resp) ~ site + C * R * asin(covar), data = dummy)
joint_tests(mod3)
model term df1 df2 F.ratio p.value
site 5 373231 0.000 1.0000
C 1 373231 0.000 1.0000
R 2 373231 0.000 1.0000
covar 1 373231 0.000 1.0000
C:R 2 373231 0.000 1.0000
C:covar 1 373231 0.000 1.0000
R:covar 2 373231 0.000 1.0000
C:R:covar 2 373231 0.000 1.0000
但不在
make.tran()
a.tran = make.tran("asin")
mod4 <- with(a.tran, lm(sqrt(resp) ~ site + C * R * linkfun(covar), data = dummy))
joint_tests(mod4)
model term df1 df2 F.ratio p.value
site 5 373231 0.000 1.0000
C 1 373231 0.000 1.0000
R 2 373231 0.000 1.0000
C:R 2 373231 0.000 1.0000
感谢您的光临。
正如相关 GitHub 问题页面 中所解释的,问题是默认情况下,协变量被缩减为相差 2 的两个值的区间。这将两端抛出到 [0,1] 的合法区间之外变换,导致
NaN
值和协变量项被隐藏,因为它们的 d.f 为 0。如果您这样做,您就会看到结果,例如,
joint_tests(mod4, cov.reduce = function(x) mean(x) + c(-1,1)/10)
...以便使用更短的间隔,将所有内容都放在界限内。