Re: Anova() in car not works after loading piecewiseSEM package

Jinsong Zhao <[email protected]> Sun, 19 Jul 2026 16:55:19 +0800
Newsgroups gmane.comp.lang.r.general
Message-ID <[email protected]>
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.

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.