首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >审稿人问:如何对两条回归直线进行比较?

审稿人问:如何对两条回归直线进行比较?

作者头像
医学和生信笔记
发布2026-05-19 11:36:49
发布2026-05-19 11:36:49
1150
举报

医学研究中有时会遇到对两直线回归方程进行比较的假设检验问题,例如比较不同的两个实验室获得的某种标准曲线是否一致。这里首先要检验两条直线是否平行,若平行,再检验其截距是否相等

孙振球《医学统计学》第4版例9-9、例9-10

某地方病研究所调查了8名正常儿童和10名大骨节病患儿的年龄与其尿肌酐含量(mmol/24h)。推断两总体尿肌酐含量(Y)对其年龄(X)的回归直线是否不平行。

正常儿童数据见例9-1,大骨节病儿童数据见例9-9,问:回归直线是否不平行?

代码语言:javascript
复制
# 例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

建立回归方程:

代码语言:javascript
复制
# 例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检验,会得到以下报错:

代码语言:javascript
复制
anova(fit9_1,fit9_9)

Error in anova.lmlist(object, ...) : 
  models were not all fitted to the same size of dataset

这是因为这个函数只能处理样本量完全一样的两个模型的比较,此时我们可以把两个数据集合并到一起,添加一个交互项,查看交互项的显著性,以此来判断两条回归直线是否平行(如果有现成的函数可以比较的,请大神告诉我)。

代码语言:javascript
复制
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 ...

建立回归方程,并比较:

代码语言:javascript
复制
# 建立不包含交互项的模型
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,可认为两条回归直线是平行的。

当认为两条总体回归直线平行时,如果能进一步认为其总体截距是相等的,在两组数据的自变量取值范围接近时,便可认为两条总体回归直线基本重合,这时可合并两组样本资料,计算一个统一的回归方程。

下面我们检测其截距是否相等,可通过直接查看有交互项模型的结果:

代码语言:javascript
复制
# 查看模型摘要,检查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,说明其截距是有差异的,不相等的。

下面画个图展示两条直线:

代码语言:javascript
复制
library(ggplot2)

ggplot(data9, aes(x,y,color=group))+
  geom_point()+
  geom_smooth(method = "lm", se=F)+
  theme_bw()
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-05-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 医学和生信笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档