определение управляющего значения в model.matrix

При построении матрицы модели я заметил, что при работе с переменными, имеющими более двух значений, матрица модели, кажется, случайным образом выбирает, какие переменные использовать в качестве столбцов:

В примере 1:

diet <- factor(c('high','high','control','control','low','low'))
sex <- factor(c("f","f","m","f","m","m"))
model.matrix(~ diet + sex)
  (Intercept) diethigh dietlow sexm
1           1        1       0    0
2           1        1       0    0
3           1        0       0    1
4           1        0       0    0
5           1        0       1    1
6           1        0       1    1

диета = контроль, и пол = f. В случае с диетой контроль исключен, так что матрицей я доволен.

В примере 2:

diet <- factor(c('high','high','med','med','low','low'))
sex <- factor(c("f","f","m","f","m","m"))
model.matrix(~ diet + sex)
  (Intercept) dietlow dietmed sexm
1           1       0       0    0
2           1       0       0    0
3           1       0       1    1
4           1       0       1    0
5           1       1       0    1
6           1       1       0    1

диета = высокая — недостающая переменная. Теперь я знаю, что это может быть педантизмом, потому что я знаю, что R это не волнует. но есть ли способ указать, какая из переменных должна быть исключена (в этом случае я хочу, чтобы диета = med была контролем и, следовательно, не учитывалась)


person kmace    schedule 18.03.2016    source источник
comment
Я нашел здесь кое-что в Интернете о повышении уровня: genomicsclass.github.io/book/pages/ это правильный способ добиться этого?   -  person kmace    schedule 19.03.2016
comment
да, это был бы мой подход   -  person Raad    schedule 19.03.2016
comment
См. contrasts, C и т. д. Обратите внимание на аргумент base. См. также необязательный аргумент contrasts.arg для model.matrix.   -  person A. Webb    schedule 19.03.2016


Ответы (1)


Выбор не случаен. Он пропускает то, что когда-либо было первым уровнем фактора. В ваших примерах обратите внимание

# from example 1
levels(factor(c('high','high','control','control','low','low')))
# [1] "control" "high"    "low" 

# from example 2
levels(factor(c('high','high','med','med','low','low')))
# [1] "high" "low"  "med" 

По умолчанию они отсортированы по алфавиту. Таким образом, в первом случае в качестве эталона используется «контроль», а во втором случае в качестве эталона используется «высокий». Это не было бы проблемой, если бы у вас были одинаковые уровни обоих факторов. Вы можете отрегулировать это, либо установив для своих факторов одинаковые уровни экспликации при создании фактора, либо вы можете использовать команду relevel(). Например

diet <- relevel(diet,"med")
model.matrix(~ diet + sex)

Кроме того, помните, что они не «забыты»; контрастность по умолчанию - опорный уровень, поэтому опорный уровень оказывается на пересечении с ними. Если вы подходите к модели без перехвата, все там

model.matrix(~ diet -1)
#   dietmed diethigh dietlow
# 1       0        1       0
# 2       0        1       0
# 3       1        0       0
# 4       1        0       0
# 5       0        0       1
# 6       0        0       1
person MrFlick    schedule 18.03.2016