Тип III суммы квадратов

9

У меня линейная регрессионная модель с одним категориальными переменными (мужчинами и женщинами) и одной непрерывной переменной .BAB

Я устанавливаю контрастные коды в R с options(contrasts=c("contr.sum","contr.poly")). А теперь у меня есть суммы квадратов типа III для , и их взаимодействия (A: B) .BABdrop1(model, .~., test="F")

То , что я застрял, как сумма квадратов вычисляется для . ЯB думаю, что это так sum((predicted y of the full model - predicted y of the reduced model)^2). Уменьшенная модель будет выглядеть так y~A+A:B. Но когда я использую predict(y~A+A:B), R возвращает предсказанные значения, которые совпадают с предсказанными значениями полной модели. Следовательно, суммы квадратов будут равны 0.

(Для сумм квадратов я использовал уменьшенную модель , которая аналогична .)Ay~B+A:By~A:B

Вот пример кода для случайно сгенерированных данных:

A<-as.factor(rep(c("male","female"), each=5))
set.seed(1)
B<-runif(10)
set.seed(5)
y<-runif(10)

model<-lm(y~A+B+A:B)

options(contrasts = c("contr.sum","contr.poly"))

#type3 sums of squares
drop1(model, .~., test="F")
#or same result:
library(car)
Anova(lm(y~A+B+A:B),type="III")

#full model
predFull<-predict(model)

#Calculate sum of squares
#SS(A|B,AB)
predA<-predict(lm(y~B+A:B))
sum((predFull-predA)^2) 

#SS(B|A,AB) (???)
predB<-predict(lm(y~A+A:B))
sum((predFull-predB)^2) 
#Sums of squares should be 0.15075 (according to anova table)
#but calculated to be 2.5e-31

#SS(AB|A,B)
predAB<-predict(lm(y~A+B))
sum((predFull-predAB)^2)


#Anova Table (Type III tests)
#Response: y
#             Sum Sq Df F value Pr(>F)
#(Intercept) 0.16074  1  1.3598 0.2878
#A           0.00148  1  0.0125 0.9145
#B           0.15075  1  1.2753 0.3019
#A:B         0.01628  1  0.1377 0.7233
#Residuals   0.70926  6    
Джо Льюис
источник
1
Это хороший вопрос, и у меня есть некоторые идеи о том, как может выглядеть ответ. Но без воспроизводимого примера я не трачу свое время. ОП, доставь!
Хенрик
1
Что заставляет вас хотеть тесты типа III («Сенат США»), а не тесты типа II («Палата представителей США»)? (аналогии с Полом Галло, Новартис)
Фрэнк Харрелл
помогает ли код?
Джо Льюис,
Смежный вопрос: Как интерпретировать ANOVA и MANOVA типа I (последовательные)?
gung - Восстановить Монику

Ответы:

3

Я обнаружил различия в оценке регрессоров между R 2.15.1 и SAS 9.2, но после обновления R до версии 3.0.1 результаты были такими же. Итак, сначала я предлагаю вам обновить R до последней версии.

Вы используете неправильный подход, потому что вы рассчитываете сумму квадрата для двух разных моделей, что подразумевает две разные матрицы дизайна. Это приведет вас к совершенно разным оценкам в регрессорах, используемых lm () для вычисления предсказанных значений (вы используете регрессоры с разными значениями между двумя моделями). SS3 вычисляется на основе теста на гипотезу, предполагая, что все регрессоры кондиционирования равны нулю, а условный регрессор равен 1. Для вычислений используется та же матрица расчета, используемая для оценки полной модели, что и для регрессора, оцененного в полной модель. Помните, что SS3 не полная добавка. Это означает, что если вы суммируете предполагаемый SS3, вы не получите модель SS (SSM).

Здесь я предлагаю R-реализацию математики, которая реализует алгоритм GLS, используемый для оценки SS3 и регрессоров.

Значения, сгенерированные этим кодом, точно такие же, сгенерированные с помощью SAS 9.2, как и для результатов, которые вы дали в своем коде, в то время как SS3 (B | A, AB) составляет 0,167486 вместо 0,15075. По этой причине я предлагаю снова обновить вашу версию R до последней доступной.

Надеюсь это поможет :)

A<-as.factor(rep(c("male","female"), each=5))
set.seed(1)
B<-runif(10)
set.seed(5)
y<-runif(10)


# Create a dummy vector of 0s and 1s
dummy <- as.numeric(A=="male")

# Create the design matrix
R <- cbind(rep(1, length(y)), dummy, B, dummy*B)

# Estimate the regressors
bhat <- solve(t(R) %*% R) %*% t(R) %*% y
yhat <- R %*% bhat
ehat <- y - yhat

# Sum of Squares Total
# SST <- t(y)%*%y - length(y)*mean(y)**2
# Sum of Squares Error
# SSE <- t(ehat) %*% ehat
# Sum of Squares Model
# SSM <- SST - SSE

# used for ginv()
library(MASS)

# Returns the Sum of Squares of the hypotesis test contained in the C matrix
SSH_estimate <- function(C)
{
    teta <- C%*%bhat
    M <- C %*% ginv(t(R)%*%R) %*% t(C)
    SSH <- t(teta) %*% ginv(M) %*% teta
    SSH
}

# SS(A|B,AB)
# 0.001481682
SSH_estimate(matrix(c(0, 1, 0, 0), nrow=1, ncol=4))
# SS(B|A,AB)
# 0.167486
SSH_estimate(matrix(c(0, 0, 1, 0), nrow=1, ncol=4))
# SS(AB|A,B)
# 0.01627824
SSH_estimate(matrix(c(0, 0, 0, 1), nrow=1, ncol=4))
pietrop
источник