Пользовательские контрасты в 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
для других стандартных контрастов.