Суми квадратів III типу


9

У мене лінійна регресійна модель з одним категоріальним змінними (чоловіками і жінками) і однієї безперервної змінної .АБ

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

Те , що я застряг, як сума квадратів обчислюється для . ЯБ думаю, що це так 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.

(Для сум квадратів я використовував зменшену модель , яка така сама, як .)Аy~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 ("Палати представників США")? (аналогії через Пола Галло, Новартіс)
Френк Харрелл

чи допомагає код?
Джо Льюїс

Відповіді:


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))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.