Somme di quadrati di tipo III


9

Ho un modello di regressione lineare con una sola variabile categorica (maschio e femmina) e una variabile continua .BAB

Ho impostato i codici di contrasto in R con options(contrasts=c("contr.sum","contr.poly")). E ora ho una somma di quadrati di tipo III per , e la loro interazione (A: B) .BABdrop1(model, .~., test="F")

Quello che mi sono bloccato con è come somme dei quadrati è calcolato per . IoB penso che sia sum((predicted y of the full model - predicted y of the reduced model)^2). Il modello ridotto sarebbe simile y~A+A:B. Ma quando uso predict(y~A+A:B), R restituisce valori previsti uguali ai valori previsti del modello completo. Pertanto, le somme dei quadrati sarebbero 0.

(Per le somme dei quadrati di , ho usato un modello ridotto di , che è lo stesso di .)Ay~B+A:By~A:B

Ecco un esempio di codice per i dati generati casualmente:

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
Questa è una bella domanda e ho alcune idee su come potrebbe apparire una risposta. Ma senza un esempio riproducibile, non sto investendo il mio tempo. OP, consegna!
Henrik,

1
Cosa ti fa desiderare i test di tipo III ("Senato USA") rispetto ai test di tipo II ("Camera dei rappresentanti degli Stati Uniti")? (analogie dovute a Paul Gallo, Novartis)
Frank Harrell,

il codice aiuta?
Jo Lewis,

Risposte:


3

Ho trovato differenze nella stima dei regressori tra R 2.15.1 e SAS 9.2, ma dopo aver aggiornato R alla versione 3.0.1 i risultati sono stati gli stessi. Quindi, per prima cosa ti consiglio di aggiornare R all'ultima versione.

Stai usando un approccio sbagliato perché stai calcolando la somma del quadrato rispetto a due modelli diversi, il che implica due matrici di design differenti. Questo ti porta a una stima totalmente diversa nei regressori usati da lm () per calcolare i valori previsti (stai usando regressori con valori diversi tra i due modelli). SS3 viene calcolato sulla base di un test di ipotesi, supponendo che tutti i regressori di condizionamento siano uguali a zero, mentre il regressore condizionato è uguale a 1. Per i calcoli, si utilizza la stessa matrice di progettazione utilizzata per stimare il modello completo, come per il regressore stimato per intero modello. Ricorda che le SS3 non sono completamente additive. Ciò significa che se si somma la SS3 stimata, non si ottiene il modello SS (SSM).

Qui suggerisco un'implementazione R della matematica che implementa l'algoritmo GLS utilizzato per stimare SS3 e regressori.

I valori generati da questo codice sono esattamente gli stessi generati utilizzando SAS 9.2 come per i risultati forniti nel codice, mentre SS3 (B | A, AB) è 0,167486 anziché 0,15075. Per questo motivo suggerisco di nuovo di aggiornare la tua versione R all'ultima disponibile.

Spero che sia di aiuto :)

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))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.