Tipo III sumas de cuadrados

9

Tengo un modelo de regresión lineal con una variable categórica (macho y hembra) y una variable continua B .UNAsi

Configuré códigos de contrastes en R con options(contrasts=c("contr.sum","contr.poly")). Y ahora tengo sumas de cuadrados de Tipo III para , B y su interacción (A: B) usando .UNAsidrop1(model, .~., test="F")

De lo que estoy atascado con es como sumas de cuadrados se calcula para . Yosi creo que si sum((predicted y of the full model - predicted y of the reduced model)^2). El modelo reducido se vería así y~A+A:B. Pero cuando lo uso predict(y~A+A:B), R está devolviendo valores pronosticados que son los mismos que los valores pronosticados del modelo completo. Por lo tanto, las sumas de cuadrados serían 0.

(Para las sumas de cuadrados de , utilicé un modelo reducido de , que es el mismo que ).UNAy~B+A:By~A:B

Aquí hay un código de ejemplo para datos generados aleatoriamente:

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    
Jo Lewis
fuente
1
Esa es una buena pregunta y tengo algunas ideas sobre cómo podría ser una respuesta. Pero sin un ejemplo reproducible, no estoy invirtiendo mi tiempo. OP, entregar!
Henrik
1
¿Qué te hace querer pruebas de tipo III ("Senado de los Estados Unidos") en comparación con las pruebas de tipo II ("Cámara de Representantes de los Estados Unidos")? (analogías debido a Paul Gallo, Novartis)
Frank Harrell
¿ayuda el código?
Jo Lewis
Pregunta relacionada: ¿Cómo interpretar ANOVA y MANOVA tipo I (secuencial)?
gung - Restablece a Monica

Respuestas:

3

He encontrado diferencias en la estimación de regresores entre R 2.15.1 y SAS 9.2, pero después de actualizar R a la versión 3.0.1 los resultados fueron los mismos. Entonces, primero le sugiero que actualice R a la última versión.

Está utilizando el enfoque incorrecto porque está calculando la suma del cuadrado contra dos modelos diferentes, lo que implica dos matrices de diseño diferentes. Esto lo lleva a una estimación totalmente diferente en los regresores utilizados por lm () para calcular los valores pronosticados (está usando regresores con diferentes valores entre los dos modelos). SS3 se calcula en base a una prueba de hipotesis, suponiendo que todos los regresores de acondicionamiento son iguales a cero, mientras que el regresor condicionado es igual a 1. Para los cálculos, se usa la misma matriz de diseño utilizada para estimar el modelo completo, como para el regresor estimado en su totalidad modelo. Recuerde que los SS3 no son aditivos completos. Esto significa que si suma el SS3 estimado, no obtiene el modelo SS (SSM).

Aquí sugiero una implementación R de las matemáticas que implementa el algoritmo GLS utilizado para estimar SS3 y regresores.

Los valores generados por este código son exactamente los mismos generados con SAS 9.2 que para los resultados que dio en su código, mientras que el SS3 (B | A, AB) es 0.167486 en lugar de 0.15075. Por esta razón, sugiero nuevamente que actualice su versión R a la última disponible.

Espero que esto ayude :)

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
fuente