医学研究中有时会遇到对两直线回归方程进行比较的假设检验问题,例如比较不同的两个实验室获得的某种标准曲线是否一致。这里首先要检验两条直线是否平行,若平行,再检验其截距是否相等。
孙振球《医学统计学》第4版例9-9、例9-10
某地方病研究所调查了8名正常儿童和10名大骨节病患儿的年龄与其尿肌酐含量(mmol/24h)。推断两总体尿肌酐含量(Y)对其年龄(X)的回归直线是否不平行。
正常儿童数据见例9-1,大骨节病儿童数据见例9-9,问:回归直线是否不平行?
# 例9-1数据
data9_1 <- data.frame(x = c(13,11,9,6,8,10,12,7),
y = c(3.54,3.01,3.09,2.48,2.56,3.36,3.18,2.65))
# 例9-9数据
data9_9 <- foreign::read.spss("datasets/例09-09.sav", to.data.frame = T)
## re-encoding from CP936建立回归方程:
# 例9-1的回归方程
fit9_1 <- lm(y ~ x, data = data9_1)
summary(fit9_1)
##
## Call:
## lm(formula = y ~ x, data = data9_1)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.21500 -0.15937 -0.00125 0.09583 0.30667
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.66167 0.29700 5.595 0.00139 **
## x 0.13917 0.03039 4.579 0.00377 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.197 on 6 degrees of freedom
## Multiple R-squared: 0.7775, Adjusted R-squared: 0.7404
## F-statistic: 20.97 on 1 and 6 DF, p-value: 0.003774
# 例9-2的回归方程
fit9_9 <- lm(y ~ x, data = data9_9)
summary(fit9_9)
##
## Call:
## lm(formula = y ~ x, data = data9_9)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.31927 -0.07671 -0.01592 0.16026 0.30073
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.09573 0.26341 4.160 0.00317 **
## x 0.17224 0.02255 7.639 6.08e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.2116 on 8 degrees of freedom
## Multiple R-squared: 0.8794, Adjusted R-squared: 0.8644
## F-statistic: 58.36 on 1 and 8 DF, p-value: 6.076e-05如果此时你直接使用anova进行F检验,会得到以下报错:
anova(fit9_1,fit9_9)
Error in anova.lmlist(object, ...) :
models were not all fitted to the same size of dataset这是因为这个函数只能处理样本量完全一样的两个模型的比较,此时我们可以把两个数据集合并到一起,添加一个交互项,查看交互项的显著性,以此来判断两条回归直线是否平行(如果有现成的函数可以比较的,请大神告诉我)。
data9_1$group <- "group9_1"
data9_9$group <- "group9_9"
data9 <- rbind(data9_1,data9_9[,-1])
data9$group <- factor(data9$group)
str(data9)
## 'data.frame': 18 obs. of 3 variables:
## $ x : num 13 11 9 6 8 10 12 7 10 9 ...
## $ y : num 3.54 3.01 3.09 2.48 2.56 3.36 3.18 2.65 3.01 2.83 ...
## $ group: Factor w/ 2 levels "group9_1","group9_9": 1 1 1 1 1 1 1 1 2 2 ...建立回归方程,并比较:
# 建立不包含交互项的模型
model_no_interaction <- lm(y ~ x + group, data = data9)
# 建立包含交互项的模型
model_interaction <- lm(y ~ x * group, data = data9)
# 使用anova函数比较两个模型
anova(model_no_interaction, model_interaction)
## Analysis of Variance Table
##
## Model 1: y ~ x + group
## Model 2: y ~ x * group
## Res.Df RSS Df Sum of Sq F Pr(>F)
## 1 15 0.62211
## 2 14 0.59101 1 0.031103 0.7368 0.4052得到的F=0.7368,P值大于0.05,可认为两条回归直线是平行的。
当认为两条总体回归直线平行时,如果能进一步认为其总体截距是相等的,在两组数据的自变量取值范围接近时,便可认为两条总体回归直线基本重合,这时可合并两组样本资料,计算一个统一的回归方程。
下面我们检测其截距是否相等,可通过直接查看有交互项模型的结果:
# 查看模型摘要,检查group的显著性
summary(model_no_interaction)
##
## Call:
## lm(formula = y ~ x + group, data = data9)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.29885 -0.15905 0.01675 0.14186 0.34023
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.44893 0.18427 7.863 1.06e-06 ***
## x 0.16156 0.01785 9.049 1.83e-07 ***
## groupgroup9_9 -0.23256 0.10181 -2.284 0.0373 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.2037 on 15 degrees of freedom
## Multiple R-squared: 0.8457, Adjusted R-squared: 0.8252
## F-statistic: 41.12 on 2 and 15 DF, p-value: 8.162e-07结果中的groupgroup9_9的t值=-2.284,P值小于0.05,说明其截距是有差异的,不相等的。
下面画个图展示两条直线:
library(ggplot2)
ggplot(data9, aes(x,y,color=group))+
geom_point()+
geom_smooth(method = "lm", se=F)+
theme_bw()