Tip III karelerin toplamları


9

Bir kategorik değişken (erkek ve dişi) ve bir sürekli değişken ile doğrusal bir regresyon modelim var .AB

R ile kontrast kodları ayarladım options(contrasts=c("contr.sum","contr.poly")). Ve şimdi , için Tip III toplamları kareleri ve bunların etkileşimlerini (A: B) kullanıyorum .ABdrop1(model, .~., test="F")

Sıkıştığım şey için karelerin toplamının nasıl hesaplandığı . BenB öyle düşünüyorum sum((predicted y of the full model - predicted y of the reduced model)^2). İndirgenmiş model gibi görünecektir y~A+A:B. Ama kullandığımda predict(y~A+A:B), R, tam model öngörülen değerlerle aynı olan öngörülen değerleri döndürüyor. Bu nedenle, karelerin toplamı 0 olur.

( karelerinin toplamı için, ile aynı olan azaltılmış bir model kullandım .)Ay~B+A:By~A:B

Rastgele oluşturulmuş veriler için örnek kod:

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
Bu güzel bir soru ve bir cevabın nasıl görünebileceğine dair bazı fikirlerim var. Ama tekrarlanabilir bir örnek olmadan, zamanımı yatırmıyorum. OP, teslim et!
Henrik

1
Tip II ("ABD Temsilciler Meclisi") testlerinin aksine tip III ("ABD Senatosu") testlerini istemenizi sağlayan nedir? (Paul Gallo, Novartis'e göre analojiler)
Frank Harrell

kod yardımcı oluyor mu?
Jo Lewis

Yanıtlar:


3

R 2.15.1 ve SAS 9.2 arasındaki gerileme tahminlerinde farklılıklar buldum, ancak R'yi 3.0.1 sürümüne güncelledikten sonra sonuçlar aynıydı. Bu yüzden, önce R'yi en son sürüme güncellemenizi öneririm.

Yanlış yaklaşımı kullanıyorsunuz çünkü iki farklı tasarım matrisini ima eden iki farklı modele göre kare toplamını hesaplıyorsunuz. Bu, tahmin edilen değerleri hesaplamak için lm () tarafından kullanılan regresörlerde tamamen farklı bir tahmin yapılmasına yol açar (iki model arasında farklı değerlere sahip regresörler kullanıyorsunuz). SS3, tüm şartlandırıcı regresörlerin sıfıra eşit olduğu varsayılarak bir hipotez testine dayanılarak hesaplanır. Koşullu regresör 1'e eşittir. modeli. SS3'lerin tam katkı maddesi olmadığını unutmayın. Bu, tahmini SS3'ü toplarsanız, SS (SSM) modelini elde edemeyeceğiniz anlamına gelir.

Burada SS3 ve regresörleri tahmin etmek için kullanılan GLS algoritmasını uygulayan matematiğin R uygulamasını öneririm.

Bu kod tarafından üretilen değerler, kodunuzda verdiğiniz sonuçlara ilişkin SAS 9.2 kullanılarak tam olarak aynıdır, SS3 (B | A, AB) 0.15075 yerine 0.167486'dır. Bu nedenle, R sürümünüzü en son sürüme güncellemenizi öneririm.

Bu yardımcı olur umarım :)

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))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.