rtransformationemmeansancova

joint_tests omits covariate transformed with asin(sqrt()) via make.tran()


Relating to joint_tests doesn't recognize asin.sqrt transformation via make.tran() I have 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))

This joint_tests command did not give any row that involved the covar.
joint_tests(mod)

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

Switching resp and covar, and the joint_tests(mod2) below gave the full ancova model

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

With asin, joint_tests recognize on-the-fly transformation of the covariate outside of 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

but not in 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

Thanks for stopping by.


Solution

  • As was explained in the related GitHub issue page, the problem is that by default, covariates are reduced to an interval of two values that differ by 2. That throws both ends outside the legal interval of [0,1] for this transformation, resulting in NaN values and the covariate terms being hidden because they have 0 d.f. You will see results if you do, for example,

    joint_tests(mod4, cov.reduce = function(x) mean(x) + c(-1,1)/10)
    

    ... so that a much shorter interval is used that puts everything within bounds.