Пользовательские контрасты в R: матрица коэффициента контрастности или контрастная матрица/схема кодирования? И как туда добраться?

Пользовательские контрасты очень широко используются в анализах, например: "Значения DV на уровне 1 и 3 уровня этого трехуровневого фактора значительно отличаются?"

Интуитивно этот контраст выражается в терминах клеточных средств как:

c(1,0,-1)

Один или несколько из этих контрастов, связанных как столбцы, образуют матрицу коэффициента контрастности, например

mat = matrix(ncol = 2, byrow = TRUE, data = c(
    1,  0,
    0,  1,
   -1, -1)
)
     [,1] [,2]
[1,]    1    0
[2,]    0    1
[3,]   -1   -1

Однако, когда дело доходит до запуска этих контрастов, заданных матрицей коэффициентов, в Интернете и в книгах есть много (по-видимому, противоречивая) информация. Мой вопрос в том, какая информация верна?

Претензия 1: контрасты (коэффициент) принимают матрицу коэффициентов

В некоторых примерах пользователю показано, что матрицу интуитивного контрастного коэффициента можно использовать непосредственно через функции contrasts() или C(), Так что это просто:

contrasts(myFactor) <- mat

Претензия 2: коэффициенты преобразования для создания схемы кодирования

В другом месте (например, статистика UCLA) нам говорят, что матрица коэффициентов (или базовая матрица) должна быть преобразована из матрицы коэффициентов в контрастную матрицу перед использованием. Это включает в себя обратное преобразование матрицы коэффициентов: (mat')⁻¹, или, в Rish:

contrasts(myFactor) = solve(t(mat))

Этот метод требует заполнения матрицы с помощью начального столбца средств для перехвата. Чтобы этого избежать, некоторые сайты рекомендуют использовать обобщенную обратную функцию, которая может справиться с неквадратичными матрицами, т.е. MASS::ginv()

contrasts(myFactor) = ginv(t(mat))

Третий вариант: преждевременно преобразовать, взять обратный и пост-умножить на преобразование

В другом месте (например, примечание от поддержка SPSS), мы узнаем, что правильная алгебра: (mat'mat)-¹ mat'

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

x = solve(t(mat)%*% mat)%*% t(mat)
     [,1] [,2] [,3]
[1,]    0    0    1
[2,]    1    0   -1
[3,]    0    1   -1

contrasts(myFactor) = x

Мой вопрос в том, что правильно? (Если я правильно интерпретирую и описываю каждый совет). Как указать пользовательские контрасты в R для lm, lme и т.д.?

Refs

Ответ 1

За что это стоит....

Если у вас есть фактор с 3 уровнями (уровни A, B и C), и вы хотите протестировать следующие ортогональные контрасты: A vs B и avg. A и B против C, ваши коды контрастности будут:

Cont1<- c(1,-1, 0)
Cont2<- c(.5,.5, -1)

Если вы делаете так, как указано на сайте UCLA (коэффициенты преобразования для создания схемы кодирования), как таковой:

Contrasts(Variable)<- solve(t(cbind(c(1,1,1), Cont1, Cont2)))[,2:3]

тогда ваши результаты будут ИДЕНТИЧНЫ, если вы создали две фиктивные переменные (например:

Dummy1<- ifelse(Variable=="A", 1, ifelse(Variable=="B", -1, 0))
Dummy2<- ifelse(Variable=="A", .5, ifelse(Variable=="B", .5, -1))

и ввел их в уравнение регрессии вместо вашего фактора, что заставляет меня думать, что это правильный путь.

PS Я не пишу самый элегантный R-код, но он выполняет свою работу. Извините, я уверен, что есть более простые способы перекодировать переменные, но вы получаете суть.

Ответ 2

Я, вероятно, что-то пропустил, но в каждом из ваших трех примеров вы указываете контрастную матрицу таким же образом, т.е.

## Note it should plural of contrast
contrasts(myFactor) = x

Единственное, что отличается, - это значение x.

Использование данных с веб-сайта UCLA в качестве примера

hsb2 = read.table('http://www.ats.ucla.edu/stat/data/hsb2.csv', header=T, sep=",")

#creating the factor variable race.f
hsb2$race.f = factor(hsb2$race, labels=c("Hispanic", "Asian", "African-Am", "Caucasian"))

Мы можем указать либо версию treatment контрастов

contrasts(hsb2$race.f) = contr.treatment(4)
summary(lm(write ~ race.f, hsb2))

или sum версия

contrasts(hsb2$race.f) = contr.sum(4)
summary(lm(write ~ race.f, hsb2))

В качестве альтернативы мы можем указать контрастную матрицу на заказ.

См. ?contr.sum для других стандартных контрастов.