Как сделать GLM, когда «контрасты могут применяться только к факторам с 2 или более уровнями»? - PullRequest
0 голосов
/ 11 мая 2018

Я хочу сделать регрессию в R, используя glm, но есть ли способ сделать это, так как я получаю ошибку контрастов.

mydf <- data.frame(Group=c(1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12),
                   WL=rep(c(1,0),12), 
                   New.Runner=c("N","N","N","N","N","N","Y","N","N","N","N","N","N","Y","N","N","N","Y","N","N","N","N","N","Y"), 
                   Last.Run=c(1,5,2,6,5,4,NA,3,7,2,4,9,8,NA,3,5,1,NA,6,10,7,9,2,NA))

mod <- glm(formula = WL~New.Runner+Last.Run, family = binomial, data = mydf)
#Error in `contrasts<-`(`*tmp*`, value = contr.funs[1 + isOF[nn]]) :
# contrasts can be applied only to factors with 2 or more levels

1 Ответ

0 голосов
/ 28 июля 2018

Используя функции debug_contr_error и debug_contr_error2, определенные здесь: Как отладить ошибку «контрасты можно применять только к факторам с 2 или более уровнями»? мы можем легко определить проблему: толькоодин уровень остается в переменной New.Runner.

info <- debug_contr_error2(WL ~ New.Runner + Last.Run, mydf)

info[c(2, 3)]
#$nlevels
#New.Runner 
#         1 
#
#$levels
#$levels$New.Runner
#[1] "N"

## the data frame that is actually used by `glm`
dat <- info$mf

. Коэффициент одного уровня не может применяться к контрастам, так как любой вид контрастов уменьшит количество уровней на 11 - 1 = 0 эта переменная будет удалена из матрицы модели.

Что ж, можем ли мы просто потребовать, чтобы никакие контрасты не применялись к одноуровневому коэффициенту?Нет. Все методы контрастирования запрещают это:

contr.helmert(n = 1, contrasts = FALSE)
#Error in contr.helmert(n = 1, contrasts = FALSE) : 
#  not enough degrees of freedom to define contrasts

contr.poly(n = 1, contrasts = FALSE)
#Error in contr.poly(n = 1, contrasts = FALSE) : 
#  contrasts not defined for 0 degrees of freedom

contr.sum(n = 1, contrasts = FALSE)
#Error in contr.sum(n = 1, contrasts = FALSE) : 
#  not enough degrees of freedom to define contrasts

contr.treatment(n = 1, contrasts = FALSE)
#Error in contr.treatment(n = 1, contrasts = FALSE) : 
#  not enough degrees of freedom to define contrasts

contr.SAS(n = 1, contrasts = FALSE)
#Error in contr.treatment(n, base = if (is.numeric(n) && length(n) == 1L) n else length(n),  : 
#  not enough degrees of freedom to define contrasts

На самом деле, если вы тщательно обдумаете это, вы придете к выводу, что без контрастов, фактор с одним уровнем - это просто фиктивная переменная всех 1,то есть перехват .Итак, вы определенно можете сделать следующее:

dat$New.Runner <- 1    ## set it to 1, as if no contrasts is applied

mod <- glm(formula = WL ~ New.Runner + Last.Run, family = binomial, data = dat)
#(Intercept)   New.Runner     Last.Run  
#     1.4582           NA      -0.2507

Вы получаете NA коэффициент для New.Runner из-за ранг-дефицита .На самом деле применение контрастов является фундаментальным способом избежать дефицита ранга .Просто, когда фактор имеет только один уровень, применение контрастов становится парадоксом.

Давайте также посмотрим на матрицу модели:

model.matrix(mod)
#   (Intercept) New.Runner Last.Run
#1            1          1        1
#2            1          1        5
#3            1          1        2
#4            1          1        6
#5            1          1        5
#6            1          1        4
#8            1          1        3
#9            1          1        7
#10           1          1        2
#11           1          1        4
#12           1          1        9
#13           1          1        8
#15           1          1        3
#16           1          1        5
#17           1          1        1
#19           1          1        6
#20           1          1       10
#21           1          1        7
#22           1          1        9
#23           1          1        2

(intercept) и New.Runner имеют одинаковые столбцы, и только один из них может быть оценен.Если вы хотите оценить New.Runner, отбросьте перехват:

glm(formula = WL ~ 0 + New.Runner + Last.Run, family = binomial, data = dat)
#New.Runner    Last.Run  
#    1.4582     -0.2507 

Убедитесь, что вы тщательно переварили проблему дефицита ранга.Если у вас есть более одного одноуровневого фактора, и вы заменяете все их на 1, отбрасывание одного перехвата все равно приводит к дефициту ранга.

dat$foo.factor <- 1
glm(formula = WL ~ 0 + New.Runner + foo.factor + Last.Run, family = binomial, data = dat)
#New.Runner  foo.factor    Last.Run  
#    1.4582          NA     -0.2507 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...