考虑以下代码,我们拟合回归模型,更改数据并根据拟合的回归模型为更改后的数据创建相应的设计矩阵:
mtcars_alt <- mtcars |>
dplyr::mutate(vs = factor(vs),
am = factor(am))
mod_lm <- lm(mpg ~ vs*am, data = mtcars_alt)
mtcars_alt |>
dplyr::mutate(am = "0") |>
model.matrix(mod_lm, data = _)
mod_glm <- glm(mpg ~ vs*am, data = mtcars_alt)
mtcars_alt |>
dplyr::mutate(am = "0") |>
model.matrix(mod_glm, data = _)
当回归模型基于
lm()
时,它可以正常工作,但是,当它基于 glm()
时,它会抛出错误
Error in `contrasts<-`(`*tmp*`, value = contr.funs[1 + isOF[nn]]) :
contrasts can be applied only to factors with 2 or more levels
知道如何避免这个错误吗?
如果您在 GLM 公式上调用
model.matrix()
而不是模型对象本身 and 创建常数因子 am
作为具有两个级别的因子(即使只观察到一个,如 @Stefan Hansen 在评论中所建议的) ),你应该得到想要的结果。
mtcars_alt <- mtcars |>
dplyr::mutate(vs = factor(vs),
am = factor(am))
mod_glm <- glm(mpg ~ vs*am, data = mtcars_alt)
mtcars_alt |>
dplyr::mutate(am = factor("0", levels=c("0", "1"))) |>
model.matrix(formula(mod_glm), data = _)
#> (Intercept) vs1 am1 vs1:am1
#> Mazda RX4 1 0 0 0
#> Mazda RX4 Wag 1 0 0 0
#> Datsun 710 1 1 0 0
#> Hornet 4 Drive 1 1 0 0
#> Hornet Sportabout 1 0 0 0
#> Valiant 1 1 0 0
#> Duster 360 1 0 0 0
#> Merc 240D 1 1 0 0
#> Merc 230 1 1 0 0
#> Merc 280 1 1 0 0
#> Merc 280C 1 1 0 0
#> Merc 450SE 1 0 0 0
#> Merc 450SL 1 0 0 0
#> Merc 450SLC 1 0 0 0
#> Cadillac Fleetwood 1 0 0 0
#> Lincoln Continental 1 0 0 0
#> Chrysler Imperial 1 0 0 0
#> Fiat 128 1 1 0 0
#> Honda Civic 1 1 0 0
#> Toyota Corolla 1 1 0 0
#> Toyota Corona 1 1 0 0
#> Dodge Challenger 1 0 0 0
#> AMC Javelin 1 0 0 0
#> Camaro Z28 1 0 0 0
#> Pontiac Firebird 1 0 0 0
#> Fiat X1-9 1 1 0 0
#> Porsche 914-2 1 0 0 0
#> Lotus Europa 1 1 0 0
#> Ford Pantera L 1 0 0 0
#> Ferrari Dino 1 0 0 0
#> Maserati Bora 1 0 0 0
#> Volvo 142E 1 1 0 0
#> attr(,"assign")
#> [1] 0 1 2 3
#> attr(,"contrasts")
#> attr(,"contrasts")$vs
#> [1] "contr.treatment"
#>
#> attr(,"contrasts")$am
#> [1] "contr.treatment"
创建于 2024 年 11 月 14 日,使用 reprex v2.1.0