Re: Anova() in car not works after loading piecewiseSEM package
varin sacha via R-help <[email protected]> Sun, 19 Jul 2026 13:21:13 +0200
| Newsgroups | gmane.comp.lang.r.general |
|---|---|
| Message-ID | <[email protected]> |
Sorry, There is no nlme:::model.frame.lme. That makes an S3 method signature misma= tch 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 =C3=A0 12:30, varin sacha via R-help <[email protected]= rg> a =C3=A9crit : > = > =EF=BB=BFThanks Duncan. This seems like a promising workaround. You shoul= d 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 pro= blem is caused by the incompatible MuMIn::model.frame.lme() S3 registration= rather than by car::Anova() itself. > = > = > = > = >> Le 19 juil. 2026 =C3=A0 12:14, Duncan Murdoch <[email protected]>= a =C3=A9crit : >> = >> =EF=BB=BFOn 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=E2=80=99ve provided should make it straightforward for them to i= nvestigate. >>>>> = >>>>> 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=E2=80=94specifically, what ge= ts >>>>> 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=3D >>>> 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 =3D FALSE, ...) >>> But Anova() calls it (per traceback()) with: >>> model.frame.lme(object, data, xlev =3D 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 f= rom 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 co= uld be for the MuMIn package to change its definition to something compatib= le with the multcomp definition, but the two functions appear to do differe= nt things. I don't know if they can be made compatible. >> = >> Another problem is in the stats package. The stats:::model.matrix.defau= lt method makes a call to >> = >> data <- model.frame(object, data, xlev =3D 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 secon= d argument is the data. Changing that call to >> = >> data <- model.frame(object, data =3D data, xlev =3D 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 =3D Orthodont, random =3D ~ 1) >>>>> Anova(fm2) >>>> Error in if (random) { : the condition has length > 1 >>>> = >>>> = >>>>>> = >>>>>>> Le 19 juil. 2026 =C3=A0 08:22, Jinsong Zhao <[email protected]> a =C3= =A9crit : >>>>>>> = >>>>>>> =EF=BB=BFThank 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 =3D Orthodont, random =3D ~ = 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 =3D xlev) >>>>>>> 7: model.frame(object, data, xlev =3D xlev) >>>>>>> 6: model.matrix.default(mod, data =3D structure(list(distance =3D 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 =3D 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 =3D >>>>>>> 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 =3D 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 >>>>>>> =3D c("ordered", >>>>>>> "factor")), Sex =3D 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 =3D c("Male", "Female"), class =3D >>>>>>> "factor")), row.names =3D 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 >>>>>>> =3D ~Sex, class =3D c("nfnGroupedData", >>>>>>> "nfGroupedData", "groupedData", "data.frame"), formula =3D >>>>>>> distance ~ >>>>>>> age | Subject, labels =3D list(x =3D "Age", y =3D "Distance = from >>>>>>> pituitary to pterygomaxillary fissure"), units =3D list( >>>>>>> x =3D "(yr)", y =3D "(mm)"), FUN =3D structure(function (x) >>>>>>> max(x, na.rm =3D TRUE), source =3D "function (x) max(x, na.rm = =3D >>>>>>> TRUE)"), order.groups =3D TRUE), >>>>>>> contrasts.arg =3D list(Sex =3D structure(c(0, 1), dim =3D 2:= 1, >>>>>>> dimnames =3D list( >>>>>>> c("Male", "Female"), "Female")))) >>>>>>> 5: NextMethod(formula(object), data =3D data, contrasts.arg =3D >>>>>>> object$contrasts) >>>>>>> 4: model.matrix.lme(mod) >>>>>>> 3: model.matrix(mod) >>>>>>> 2: Anova_II_lme(mod, vcov., singular.ok =3D 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=3DChinese (Simplified)_China.utf8 >>>>>>> [2] LC_CTYPE=3DChinese (Simplified)_China.utf8 >>>>>>> [3] LC_MONETARY=3DChinese (Simplified)_China.utf8 >>>>>>> [4] LC_NUMERIC=3DC >>>>>>> [5] LC_TIME=3DChinese (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] =E2=80=983.1.5=E2=80=99 >>>>>>>> packageVersion("piecewiseSEM") >>>>>>> [1] =E2=80=982.3.1=E2=80=99 >>>>>>>> packageVersion("nlme") >>>>>>> [1] =E2=80=983.1.170=E2=80=99 >>>>>>> = >>>>>>> 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=E2=80=99t appear to be a simp= le >>>>>>>> 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=E2=80=99s failing and >>>>>>>> whether the problem lies in car, piecewiseSEM, or an >>>>>>>> incompatibility between the two packages. >>>>>>>> = >>>>>>>> = >>>>>>>> = >>>>>>>>>>> Le 19 juil. 2026 =C3=A0 04:58, Jinsong Zhao <[email protected]> a= =C3=A9crit : >>>>>>>>>> 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 =3D Orthodont, random =3D= ~ 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-guid= e.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.