make.tran生成asin.sqrt变换后,joint_tests报错的解决方法咨询
joint_tests()处理asin.sqrt变换模型时出错的解决办法
问题重现
构建的模型代码:
tran = make.tran("asin.sqrt", 100) mod <- with(tran, lm(linkfun(cty) ~ manufacturer + drv * linkfun(hwy), data = mpg))
执行joint_tests(mod)生成方差分析表时出现错误:
joint_tests(mod) Error in ratios && true.con && misc$tran %in% c("log", "log2", "log10", : 'length = 5' in coercion to 'logical(1)'
但emmeans可以正常识别该变换,运行结果如下:
emmeans(mod, ~ manufacturer, type = "response") manufacturer response SE df lower.CL upper.CL audi 15.0 0.258 214 14.4 15.5 chevrolet 16.1 0.240 214 15.7 16.6 dodge 16.2 0.216 214 15.8 16.6 ford 16.6 0.223 214 16.2 17.1 honda 17.4 0.390 214 16.7 18.2 hyundai 16.1 0.289 214 15.5 16.7 jeep 16.5 0.362 214 15.8 17.2 land rover 15.2 0.480 214 14.2 16.1 lincoln 15.7 0.634 214 14.4 16.9 mercury 16.0 0.479 214 15.1 17.0 nissan 16.8 0.289 214 16.2 17.3 pontiac 14.8 0.423 214 14.0 15.7 subaru 16.9 0.356 214 16.2 17.6 toyota 16.9 0.206 214 16.5 17.3 volkswagen 16.5 0.248 214 16.0 17.0 Results are averaged over the levels of: drv Confidence level used: 0.95 Intervals are back-transformed from the asin(sqrt(mu/100)) scale
解决办法
方法1:手动创建变换变量后拟合模型
直接手动生成变换后的响应变量和协变量,避免make.tran的结构导致joint_tests识别异常:
# 手动计算asin.sqrt变换(基于100的缩放) mpg$cty_tran <- asin(sqrt(mpg$cty / 100)) mpg$hwy_tran <- asin(sqrt(mpg$hwy / 100)) # 拟合线性模型 mod2 <- lm(cty_tran ~ manufacturer + drv * hwy_tran, data = mpg) # 执行joint_tests joint_tests(mod2)
方法2:使用基础包的anova()替代
如果仅需要效应的联合检验结果,线性模型可以直接用anova()函数,输出标准方差分析表:
anova(mod2)
方法3:手动修复模型的变换属性
报错根源是模型的misc$tran属性为长度5的向量,导致逻辑判断失败。手动设置为单个字符串即可:
# 给原模型添加正确的变换属性 mod$misc$tran <- "asin.sqrt" # 重新运行joint_tests joint_tests(mod)
此方法保留了make.tran的变换信息,不影响后续emmeans的使用。
内容的提问来源于stack exchange,提问作者hnguyen
相关产品推荐
相关产品推荐

