Re: Anova() in car not works after loading piecewiseSEM package
Jinsong Zhao <[email protected]> Sun, 19 Jul 2026 19:59:45 +0800
| Newsgroups | gmane.comp.lang.r.general |
|---|---|
| Message-ID | <[email protected]> |
On 7/19/2026 7:39 PM, Kamil Bartoń wrote: > The problem may be that `car:::model.matrix.lme` uses: > > NextMethod(formula(object), [...] > > while the first argument for `NextMethod` should be a name of a > generic function. This is why > it is the lme object that is passed to `model.matrix.default` (which > in turn looks for `model.frame.lme`, which is not implemented in > "nlme") instead of a formula. > > I suppose the line in `car:::model.matrix.lme` should be changed to: > > model.frame(formula(object), [...]) > > to work as intended. > > ~kB > I have tried to modify the car:::model.matrix.lme as suggested, however, it does not work. > fm2 <- lme(distance ~ age + Sex, data = Orthodont, random = ~ 1) > car::Anova(fm2) Error in eval(extras, data, env) : object 'object' not found > traceback() 9: eval(extras, data, env) 8: eval(extras, data, env) 7: model.frame.default(formula(object), data = data, contrasts.arg = object$contrasts) 6: model.frame(formula(object), data = data, contrasts.arg = object$contrasts) 5: model.matrix.lme(mod) 4: model.matrix(mod) 3: Anova_II_lme(mod, vcov., singular.ok = singular.ok) 2: Anova.lme(fm2) 1: car::Anova(fm2) > > > On 2026-07-19 13:21, varin sacha wrote: >> Sorry, >> >> There is no nlme:::model.frame.lme. That makes an S3 method signature >> mismatch the most likely explanation. The question of how best to >> resolve it is probably one for the MuMIn package maintainer. >> >> Best >> >> >>> Le 19 juil. 2026 à 12:30, varin sacha via R-help >>> <[email protected]> a écrit : >>> >>> Thanks Duncan. This seems like a promising workaround. You should >>> try re-registering the multcomp method: >>> >>> registerS3method("model.frame", "lme", multcomp:::model.frame.lme) >>> >>> And then test: >>> >>> car::Anova(fm2) >>> >>> If this resolves the issue, it would provide strong evidence that >>> the problem is caused by the incompatible MuMIn::model.frame.lme() >>> S3 registration rather than by car::Anova() itself. >>> >>> >>> >>> >>>> Le 19 juil. 2026 à 12:14, Duncan Murdoch <[email protected]> >>>> a écrit : >>>> >>>> On 2026-07-19 4:55 a.m., Jinsong Zhao wrote: >>>>>> On 7/19/2026 3:52 PM, Jinsong Zhao wrote: >>>>>> On 7/19/2026 2:59 PM, Jinsong Zhao wrote: >>>>>>> >>>>>>> On 7/19/2026 2:38 PM, varin sacha wrote: >>>>>>>> Ok ! >>>>>>>> According to what I see, the error is occurring inside >>>>>>>> car:::Anova.lme(), specifically during the construction of the >>>>>>>> model >>>>>>>> matrix. >>>>>>>> >>>>>>>> It therefore appears to be a genuine compatibility problem between >>>>>>>> the current CRAN versions of car (3.1-5), piecewiseSEM (2.3.1), >>>>>>>> and/or nlme (3.1-170). >>>>>>>> >>>>>>>> The fact that you reproduced the same behavior on both Windows and >>>>>>>> FreeBSD also suggests that the issue is not platform-specific. >>>>>>>> >>>>>>>> I think this would be worth reporting to the package maintainers >>>>>>>> (perhaps starting with car, since the traceback shows that the >>>>>>>> failure occurs inside Anova.lme(), while mentioning that the >>>>>>>> problem >>>>>>>> only arises after loading piecewiseSEM). The reproducible example >>>>>>>> you’ve provided should make it straightforward for them to >>>>>>>> investigate. >>>>>>> >>>>>>> The current maintainers of car and piecewiseSEM packages are also >>>>>>> copied on this thread. As a regular user, I am just wondering >>>>>>> what's >>>>>>> behind the change in Anova()'s behavior—specifically, what gets >>>>>>> modified after attaching piecewiseSEM? >>>>>>> >>>>>>> Best, >>>>>>> >>>>>>> Jinsong >>>>>>> >>>>>> A small step forward toward the root of the issue: I've just >>>>>> discovered that the model.frame.lme() function defined in the MuMIn >>>>>> package is what caused this problem (so I've copied this email to >>>>>> the >>>>>> maintainer of MuMIn). >>>>>> >>>>>> However, I'm still unclear as to why Anova() calls model.frame.lme() >>>>>> in the first place, given that car does not depend on the MuMIn >>>>>> package. And directly invoking MuMIn:::model.frame.lme(fm2, random= >>>>>> TRUE) did not cause error. >>>>>> >>>>> I think I've found the root cause. >>>>> piecewiseSEM imports MuMIn, where model.frame.lme is registered as >>>>> an S3 >>>>> method: >>>>> S3method(model.frame, lme) >>>>> Its definition is: >>>>> model.frame.lme <- function(formula, random = FALSE, ...) >>>>> But Anova() calls it (per traceback()) with: >>>>> model.frame.lme(object, data, xlev = xlev) >>>>> This passes data to the random argument, causing a type mismatch >>>>> and the >>>>> error: >>>>> Error in if (random) { : the condition has length > 1 >>>>> I've diagnosed the issue, but I don't yet know how to fix it. >>>> >>>> This looks hard to fix. >>>> >>>> One problem is that there are two definitions for model.frame.lme, >>>> one from MuMIn and the other from multcomp. The one from MuMIn is >>>> being called. If the one in multcomp was called, things would be >>>> fine. Perhaps a fix could be for the MuMIn package to change its >>>> definition to something compatible with the multcomp definition, >>>> but the two functions appear to do different things. I don't know >>>> if they can be made compatible. >>>> >>>> Another problem is in the stats package. The >>>> stats:::model.matrix.default method makes a call to >>>> >>>> data <- model.frame(object, data, xlev = xlev) >>>> >>>> The definition of the generic model.frame() looks like >>>> >>>> function (formula, ...) >>>> UseMethod("model.frame") >>>> >>>> so stats:::model.matrix.default has no basis for assuming that the >>>> second argument is the data. Changing that call to >>>> >>>> data <- model.frame(object, data = data, xlev = xlev) >>>> >>>> would fix the issue of binding data to the "random" argument, but >>>> you'd still end up calling the "wrong" method. >>>> >>>> Maybe someone else has an elegant idea to fix this? >>>> >>>> Duncan Murdoch >>>> >>>>> Best, >>>>> Jinsong >>>>>> Best, >>>>>> >>>>>> Jinsong >>>>>> >>>>>>> library(MuMIn) >>>>>>> library(nlme) >>>>>>> library(car) >>>>>> Loading required package: carData >>>>>>> fm2 <- lme(distance ~ age + Sex, data = Orthodont, random = ~ 1) >>>>>>> Anova(fm2) >>>>>> Error in if (random) { : the condition has length > 1 >>>>>> >>>>>> >>>>>>>> >>>>>>>>> Le 19 juil. 2026 à 08:22, Jinsong Zhao <[email protected]> a >>>>>>>>> écrit : >>>>>>>>> >>>>>>>>> Thank for the instruction. Here is the whole outputs: >>>>>>>>> >>>>>>>>>> library(piecewiseSEM) >>>>>>>>> Registered S3 method overwritten by 'lme4': >>>>>>>>> method from >>>>>>>>> na.action.merMod car >>>>>>>>> >>>>>>>>> This is piecewiseSEM version 2.3.0.2. >>>>>>>>> >>>>>>>>> >>>>>>>>> Questions or bugs can be addressed to <[email protected]>. >>>>>>>>>> library(nlme) >>>>>>>>>> library(car) >>>>>>>>> Loading required package: carData >>>>>>>>>> fm2 <- lme(distance ~ age + Sex, data = Orthodont, random = ~ 1) >>>>>>>>>> Anova(fm2) >>>>>>>>> Error in if (random) { : the condition has length > 1 >>>>>>>>>> car::Anova(fm2) >>>>>>>>> Error in if (random) { : the condition has length > 1 >>>>>>>>>> car:::Anova.lme(fm2) >>>>>>>>> Error in if (random) { : the condition has length > 1 >>>>>>>>>> traceback() >>>>>>>>> 8: model.frame.lme(object, data, xlev = xlev) >>>>>>>>> 7: model.frame(object, data, xlev = xlev) >>>>>>>>> 6: model.matrix.default(mod, data = structure(list(distance = >>>>>>>>> c(26, >>>>>>>>> 25, 29, 31, 21.5, 22.5, 23, 26.5, 23, 22.5, 24, 27.5, >>>>>>>>> 25.5, 27.5, >>>>>>>>> 26.5, 27, 20, 23.5, 22.5, 26, 24.5, 25.5, 27, 28.5, 22, >>>>>>>>> 22, 24.5, >>>>>>>>> 26.5, 24, 21.5, 24.5, 25.5, 23, 20.5, 31, 26, 27.5, 28, >>>>>>>>> 31, 31.5, >>>>>>>>> 23, 23, 23.5, 25, 21.5, 23.5, 24, 28, 17, 24.5, 26, 29.5, >>>>>>>>> 22.5, >>>>>>>>> 25.5, 25.5, 26, 23, 24.5, 26, 30, 22, 21.5, 23.5, 25, 21, 20, >>>>>>>>> 21.5, 23, 21, 21.5, 24, 25.5, 20.5, 24, 24.5, 26, 23.5, 24.5, >>>>>>>>> 25, 26.5, 21.5, 23, 22.5, 23.5, 20, 21, 21, 22.5, 21.5, 22.5, >>>>>>>>> 23, 25, 23, 23, 23.5, 24, 20, 21, 22, 21.5, 16.5, 19, 19, >>>>>>>>> 19.5, >>>>>>>>> 24.5, 25, 28, 28), age = c(8, 10, 12, 14, 8, 10, 12, 14, >>>>>>>>> 8, 10, >>>>>>>>> 12, 14, 8, 10, 12, 14, 8, 10, 12, 14, 8, 10, 12, 14, 8, >>>>>>>>> 10, 12, >>>>>>>>> 14, 8, 10, 12, 14, 8, 10, 12, 14, 8, 10, 12, 14, 8, 10, >>>>>>>>> 12, 14, >>>>>>>>> 8, 10, 12, 14, 8, 10, 12, 14, 8, 10, 12, 14, 8, 10, 12, >>>>>>>>> 14, 8, >>>>>>>>> 10, 12, 14, 8, 10, 12, 14, 8, 10, 12, 14, 8, 10, 12, 14, >>>>>>>>> 8, 10, >>>>>>>>> 12, 14, 8, 10, 12, 14, 8, 10, 12, 14, 8, 10, 12, 14, 8, >>>>>>>>> 10, 12, >>>>>>>>> 14, 8, 10, 12, 14, 8, 10, 12, 14, 8, 10, 12, 14), Subject = >>>>>>>>> structure(c(15L, >>>>>>>>> 15L, 15L, 15L, 3L, 3L, 3L, 3L, 7L, 7L, 7L, 7L, 14L, 14L, 14L, >>>>>>>>> 14L, 2L, 2L, 2L, 2L, 13L, 13L, 13L, 13L, 5L, 5L, 5L, 5L, 6L, >>>>>>>>> 6L, 6L, 6L, 11L, 11L, 11L, 11L, 16L, 16L, 16L, 16L, 4L, >>>>>>>>> 4L, 4L, >>>>>>>>> 4L, 8L, 8L, 8L, 8L, 9L, 9L, 9L, 9L, 10L, 10L, 10L, 10L, 12L, >>>>>>>>> 12L, 12L, 12L, 1L, 1L, 1L, 1L, 20L, 20L, 20L, 20L, 23L, 23L, >>>>>>>>> 23L, 23L, 25L, 25L, 25L, 25L, 26L, 26L, 26L, 26L, 21L, >>>>>>>>> 21L, 21L, >>>>>>>>> 21L, 19L, 19L, 19L, 19L, 22L, 22L, 22L, 22L, 24L, 24L, >>>>>>>>> 24L, 24L, >>>>>>>>> 18L, 18L, 18L, 18L, 17L, 17L, 17L, 17L, 27L, 27L, 27L, 27L), >>>>>>>>> levels = c("M16", >>>>>>>>> "M05", "M02", "M11", "M07", "M08", "M03", "M12", "M13", >>>>>>>>> "M14", >>>>>>>>> "M09", "M15", "M06", "M04", "M01", "M10", "F10", "F09", >>>>>>>>> "F06", >>>>>>>>> "F01", "F05", "F07", "F02", "F08", "F03", "F04", "F11"), >>>>>>>>> class >>>>>>>>> = c("ordered", >>>>>>>>> "factor")), Sex = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, >>>>>>>>> 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, >>>>>>>>> 1L, 1L, >>>>>>>>> 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, >>>>>>>>> 1L, 1L, >>>>>>>>> 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, >>>>>>>>> 1L, 1L, >>>>>>>>> 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, >>>>>>>>> 2L, 2L, >>>>>>>>> 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, >>>>>>>>> 2L, 2L, >>>>>>>>> 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, >>>>>>>>> 2L, 2L, >>>>>>>>> 2L, 2L, 2L, 2L), levels = c("Male", "Female"), class = >>>>>>>>> "factor")), row.names = c("1", >>>>>>>>> "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", >>>>>>>>> "13", >>>>>>>>> "14", "15", "16", "17", "18", "19", "20", "21", "22", >>>>>>>>> "23", "24", >>>>>>>>> "25", "26", "27", "28", "29", "30", "31", "32", "33", >>>>>>>>> "34", "35", >>>>>>>>> "36", "37", "38", "39", "40", "41", "42", "43", "44", >>>>>>>>> "45", "46", >>>>>>>>> "47", "48", "49", "50", "51", "52", "53", "54", "55", >>>>>>>>> "56", "57", >>>>>>>>> "58", "59", "60", "61", "62", "63", "64", "65", "66", >>>>>>>>> "67", "68", >>>>>>>>> "69", "70", "71", "72", "73", "74", "75", "76", "77", >>>>>>>>> "78", "79", >>>>>>>>> "80", "81", "82", "83", "84", "85", "86", "87", "88", >>>>>>>>> "89", "90", >>>>>>>>> "91", "92", "93", "94", "95", "96", "97", "98", "99", "100", >>>>>>>>> "101", "102", "103", "104", "105", "106", "107", "108"), >>>>>>>>> outer >>>>>>>>> = ~Sex, class = c("nfnGroupedData", >>>>>>>>> "nfGroupedData", "groupedData", "data.frame"), formula = >>>>>>>>> distance ~ >>>>>>>>> age | Subject, labels = list(x = "Age", y = "Distance >>>>>>>>> from >>>>>>>>> pituitary to pterygomaxillary fissure"), units = list( >>>>>>>>> x = "(yr)", y = "(mm)"), FUN = structure(function (x) >>>>>>>>> max(x, na.rm = TRUE), source = "function (x) max(x, na.rm = >>>>>>>>> TRUE)"), order.groups = TRUE), >>>>>>>>> contrasts.arg = list(Sex = structure(c(0, 1), dim = 2:1, >>>>>>>>> dimnames = list( >>>>>>>>> c("Male", "Female"), "Female")))) >>>>>>>>> 5: NextMethod(formula(object), data = data, contrasts.arg = >>>>>>>>> object$contrasts) >>>>>>>>> 4: model.matrix.lme(mod) >>>>>>>>> 3: model.matrix(mod) >>>>>>>>> 2: Anova_II_lme(mod, vcov., singular.ok = singular.ok) >>>>>>>>> 1: car:::Anova.lme(fm2) >>>>>>>>>> sessionInfo() >>>>>>>>> R version 4.6.1 (2026-06-24 ucrt) >>>>>>>>> Platform: x86_64-w64-mingw32/x64 >>>>>>>>> Running under: Windows 10 x64 (build 19045) >>>>>>>>> >>>>>>>>> Matrix products: default >>>>>>>>> LAPACK version 3.12.1 >>>>>>>>> >>>>>>>>> locale: >>>>>>>>> [1] LC_COLLATE=Chinese (Simplified)_China.utf8 >>>>>>>>> [2] LC_CTYPE=Chinese (Simplified)_China.utf8 >>>>>>>>> [3] LC_MONETARY=Chinese (Simplified)_China.utf8 >>>>>>>>> [4] LC_NUMERIC=C >>>>>>>>> [5] LC_TIME=Chinese (Simplified)_China.utf8 >>>>>>>>> >>>>>>>>> time zone: Asia/Shanghai >>>>>>>>> tzcode source: internal >>>>>>>>> >>>>>>>>> attached base packages: >>>>>>>>> [1] stats graphics grDevices utils datasets methods base >>>>>>>>> >>>>>>>>> other attached packages: >>>>>>>>> [1] car_3.1-5 carData_3.0-6 nlme_3.1-170 >>>>>>>>> piecewiseSEM_2.3.1 >>>>>>>>> >>>>>>>>> loaded via a namespace (and not attached): >>>>>>>>> [1] Matrix_1.7-5 jsonlite_2.0.0 compiler_4.6.1 Rcpp_1.1.2 >>>>>>>>> [5] DiagrammeR_1.0.12 splines_4.6.1 boot_1.3-32 fastmap_1.2.0 >>>>>>>>> [9] lattice_0.22-9 TH.data_1.1-5 Formula_1.2-5 >>>>>>>>> MuMIn_1.48.19 >>>>>>>>> [13] rbibutils_2.4.1 htmlwidgets_1.6.4 MASS_7.3-66 >>>>>>>>> visNetwork_2.1.4 >>>>>>>>> [17] nloptr_2.2.1 insight_1.5.2 minqa_1.2.8 >>>>>>>>> RColorBrewer_1.1-3 >>>>>>>>> [21] rlang_1.3.0 multcomp_1.4-31 performance_0.17.1 >>>>>>>>> estimability_2.0.0 >>>>>>>>> [25] cli_3.6.6 magrittr_2.0.5 Rdpack_2.6.6 emmeans_2.0.4 >>>>>>>>> [29] digest_0.6.39 grid_4.6.1 mvtnorm_1.4-2 >>>>>>>>> sandwich_3.1-2 >>>>>>>>> [33] lme4_2.0-6 reformulas_0.4.4 glue_1.8.1 >>>>>>>>> codetools_0.2-20 >>>>>>>>> [37] zoo_1.8-15 survival_3.8-9 abind_1.4-8 stats4_4.6.1 >>>>>>>>> [41] tools_4.6.1 htmltools_0.5.9 >>>>>>>>>> packageVersion("car") >>>>>>>>> [1] ‘3.1.5’ >>>>>>>>>> packageVersion("piecewiseSEM") >>>>>>>>> [1] ‘2.3.1’ >>>>>>>>>> packageVersion("nlme") >>>>>>>>> [1] ‘3.1.170’ >>>>>>>>> >>>>>>>>> All the packages are installed from CRAN, and updated to the >>>>>>>>> latest >>>>>>>>> version. I also run the codes on FreeBSD 15.1, the same output. >>>>>>>>> >>>>>>>>> Best, >>>>>>>>> >>>>>>>>> Jinsong >>>>>>>>> >>>>>>>>>> On 7/19/2026 2:02 PM, varin sacha wrote: >>>>>>>>>> Hi, >>>>>>>>>> >>>>>>>>>> Could this be a package compatibility bug? >>>>>>>>>> >>>>>>>>>> Since Anova(fm2), car::Anova(fm2), and even car:::Anova.lme(fm2) >>>>>>>>>> all produce the same error, it doesn’t appear to be a simple >>>>>>>>>> namespace masking issue. >>>>>>>>>> >>>>>>>>>> Could you post the output of: >>>>>>>>>> >>>>>>>>>> traceback() >>>>>>>>>> sessionInfo() >>>>>>>>>> packageVersion("car") >>>>>>>>>> packageVersion("piecewiseSEM") >>>>>>>>>> packageVersion("nlme") >>>>>>>>>> >>>>>>>>>> That should help identify the exact call that’s failing and >>>>>>>>>> whether the problem lies in car, piecewiseSEM, or an >>>>>>>>>> incompatibility between the two packages. >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>>>>> Le 19 juil. 2026 à 04:58, Jinsong Zhao <[email protected]> a >>>>>>>>>>>>> écrit : >>>>>>>>>>>> I have tried each solution in a new R session, and neither >>>>>>>>>>>> works. >>>>>>>>>>>> >>>>>>>>>>>>> library(piecewiseSEM) >>>>>>>>>>>> Registered S3 method overwritten by 'lme4': >>>>>>>>>>>> method from >>>>>>>>>>>> na.action.merMod car >>>>>>>>>>>> >>>>>>>>>>>> This is piecewiseSEM version 2.3.0.2. >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> Questions or bugs can be addressed to <[email protected]>. >>>>>>>>>>>>> library(nlme) >>>>>>>>>>>>> library(car) >>>>>>>>>>>> Loading required package: carData >>>>>>>>>>>>> fm2 <- lme(distance ~ age + Sex, data = Orthodont, random >>>>>>>>>>>>> = ~ 1) >>>>>>>>>>>>> Anova(fm2) >>>>>>>>>>>> Error in if (random) { : the condition has length > 1 >>>>>>>>>>>>> car::Anova(fm2) >>>>>>>>>>>> Error in if (random) { : the condition has length > 1 >>>>>>>>>>>>> car:::Anova.lme(fm2) >>>>>>>>>>>> Error in if (random) { : the condition has length > 1 >>>>>>>> >>>>>>>> ______________________________________________ >>>>>>>> [email protected] mailing list -- To UNSUBSCRIBE and more, see >>>>>>>> https://stat.ethz.ch/mailman/listinfo/r-help >>>>>>>> PLEASE do read the posting guide >>>>>>>> https://www.R-project.org/posting-guide.html >>>>>>>> and provide commented, minimal, self-contained, reproducible code. >>>>>>> >>>>>>> ______________________________________________ >>>>>>> [email protected] mailing list -- To UNSUBSCRIBE and more, see >>>>>>> https://stat.ethz.ch/mailman/listinfo/r-help >>>>>>> PLEASE do read the posting guide >>>>>>> https://www.R-project.org/posting-guide.html >>>>>>> and provide commented, minimal, self-contained, reproducible code. >>>>> ______________________________________________ >>>>> [email protected] mailing list -- To UNSUBSCRIBE and more, see >>>>> https://stat.ethz.ch/mailman/listinfo/r-help >>>>> PLEASE do read the posting guide >>>>> https://www.R-project.org/posting-guide.html >>>>> and provide commented, minimal, self-contained, reproducible code. >>>> >>> >>> ______________________________________________ >>> [email protected] mailing list -- To UNSUBSCRIBE and more, see >>> https://stat.ethz.ch/mailman/listinfo/r-help >>> PLEASE do read the posting guide >>> https://www.R-project.org/posting-guide.html >>> and provide commented, minimal, self-contained, reproducible code. >> > > ______________________________________________ > [email protected] mailing list -- To UNSUBSCRIBE and more, see > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide > https://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code.