III型平方和


9

我有一个带有类别变量的线性回归模型 一个(男性和女性)和一个连续可变。

我在的R中设置了对比代码options(contrasts=c("contr.sum","contr.poly"))。现在,我有了,以及它们之间的相互作用(A:B)的类型III平方和。一个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:B,该模型与相同y~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
这是一个很好的问题,我对答案的外观有一些想法。但是,如果没有可复制的示例,我不会花时间。运,送!
Henrik

1
是什么让您想要III型(“美国参议院”)测试而不是II型(“美国众议院”)测试?(由于保罗·加洛,诺华引起的类比)
弗兰克·哈雷尔

该代码有帮助吗?
约翰·路易斯

Answers:


3

我发现R 2.15.1和SAS 9.2之间的回归值估算存在差异,但是将R更新到3.0.1版本后,结果是相同的。因此,首先我建议您将R更新到最新版本。

您使用了错误的方法,因为您要针对两个不同的模型计算平方和,这意味着存在两个不同的设计矩阵。这会导致您对lm()用于计算预测值的回归变量进行完全不同的估计(您正在使用两个模型之间具有不同值的回归变量)。SS3是基于假设检验计算的,假设所有条件回归变量均等于零,而条件回归变量均等于1。对于计算,您使用与估算完整模型相同的设计矩阵,就如同对完整模型估算的回归​​指标一样。模型。请记住,SS3并非完全添加剂。这意味着,如果将估算的SS3相加,则不会获得模型SS(SSM)。

在这里,我提出了一种数学上的R实现,该实现实现了用于估算SS3和回归变量的GLS算法。

此代码生成的值与使用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))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.