比较 R 中两个多项式回归之间差异的统计显着性

机器算法验证 r 回归 统计学意义 回归系数 群体差异
2022-03-05 07:05:54

所以首先我在这个论坛上做了一些研究,我知道有人问了非常相似 的问题,但他们通常没有得到正确的回答,或者有时答案不够详细,我无法理解。所以这次我的问题是:我有两组数据,每组数据都进行多项式回归,如下所示:

Ratio<-(mydata2[,c(2)])
Time_in_days<-(mydata2[,c(1)])
fit3IRC <- lm( Ratio~(poly(Time_in_days,2)) )

多项式回归图是:

在此处输入图像描述

系数是:

> as.vector(coef(fit3CN))
[1] -0.9751726 -4.0876782  0.6860041
> as.vector(coef(fit3IRC))
[1] -1.1446297 -5.4449486  0.5883757 

现在我想知道,如果有一种方法可以使用 R 函数进行测试,它会告诉我两个多项式回归之间的差异是否存在统计显着性,因为知道相关的天数是 [ 1,100]。

据我了解,我不能直接应用方差分析测试,因为这些值来自两组不同的数据,也不是用于比较模型/真实数据的 AIC。

我尝试按照@Roland 在相关问题中给出的说明进行操作,但在查看结果时我可能误解了一些东西:

这是我所做的:

我将两个数据集合并为一个。

f是@Roland 谈到的可变因素。我为第一组输入 1,为另一组输入 0。

y<-(mydata2[,c(2)])
x<-(mydata2[,c(1)])
f<-(mydata2[,c(3)])

plot(x,y, xlim=c(1,nrow(mydata2)),type='p')

fit3ANOVA <- lm( y~(poly(x,2)) )

fit3ANOVACN <- lm( y~f*(poly(x,2)) )

我的数据现在看起来像这样:

在此处输入图像描述

红色的fit3ANOVA那个还在工作,但我对蓝色fit3ANOVACN的有问题,模型的结果很奇怪。我不知道拟合模型是否正确,我不明白@Roland 的确切含义。

考虑到@DeltaIV 解决方案,我想在这种情况下: 在此处输入图像描述 即使它们重叠,模型也有很大不同。我这样认为是对的吗?

2个回答
#Create some example data
mydata1 <- subset(iris, Species == "setosa", select = c(Sepal.Length, Sepal.Width))
mydata2 <- subset(iris, Species == "virginica", select = c(Sepal.Length, Sepal.Width))

#add a grouping variable
mydata1$g <- "a"
mydata2$g <- "b"

#combine the datasets
mydata <- rbind(mydata1, mydata2)

#model without grouping variable
fit0 <- lm(Sepal.Width ~ poly(Sepal.Length, 2), data = mydata)

#model with grouping variable
fit1 <- lm(Sepal.Width ~ poly(Sepal.Length, 2) * g, data = mydata)

#compare models 
anova(fit0, fit1)
#Analysis of Variance Table
#
#Model 1: Sepal.Width ~ poly(Sepal.Length, 2)
#Model 2: Sepal.Width ~ poly(Sepal.Length, 2) * g
#  Res.Df     RSS Df Sum of Sq      F    Pr(>F)    
#1     97 16.4700                                  
#2     94  7.1143  3    9.3557 41.205 < 2.2e-16 ***
#  ---
#  Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

如您所见,fit1明显优于fit0,即分组变量的效果显着。由于分组变量代表各自的数据集,因此可以认为对两个数据集的多项式拟合显着不同。

@Ronald 的答案是最好的,它广泛适用于许多类似的问题(例如,男性和女性在体重和年龄之间的关系上是否存在统计学上的显着差异?)。但是,我将添加另一个解决方案,虽然不是定量的(它不提供p值),但可以很好地图形显示差异。

编辑:根据这个问题,看起来predict.lm,用于ggplot2计算置信区间的函数不计算回归曲线周围的同时置信带,而只计算逐点置信带。最后这些波段不适合评估两个拟合的线性模型在统计上是否存在差异,或者以另一种方式说,它们是否可以与相同的真实模型兼容。因此,它们不是回答您问题的正确曲线。由于显然没有 R 内置来获得同时置信带(奇怪!),我编写了自己的函数。这里是:

simultaneous_CBs <- function(linear_model, newdata, level = 0.95){
    # Working-Hotelling 1 – α confidence bands for the model linear_model
    # at points newdata with α = 1 - level

    # summary of regression model
    lm_summary <- summary(linear_model)
    # degrees of freedom 
    p <- lm_summary$df[1]
    # residual degrees of freedom
    nmp <-lm_summary$df[2]
    # F-distribution
    Fvalue <- qf(level,p,nmp)
    # multiplier
    W <- sqrt(p*Fvalue)
    # confidence intervals for the mean response at the new points
    CI <- predict(linear_model, newdata, se.fit = TRUE, interval = "confidence", 
                  level = level)
    # mean value at new points
    Y_h <- CI$fit[,1]
    # Working-Hotelling 1 – α confidence bands
    LB <- Y_h - W*CI$se.fit
    UB <- Y_h + W*CI$se.fit
    sim_CB <- data.frame(LowerBound = LB, Mean = Y_h, UpperBound = UB)
}

library(dplyr)
# sample datasets
setosa <- iris %>% filter(Species == "setosa") %>% select(Sepal.Length, Sepal.Width, Species)
virginica <- iris %>% filter(Species == "virginica") %>% select(Sepal.Length, Sepal.Width, Species)

# compute simultaneous confidence bands
# 1. compute linear models
Model <- as.formula(Sepal.Width ~ poly(Sepal.Length,2))
fit1  <- lm(Model, data = setosa)
fit2  <- lm(Model, data = virginica)
# 2. compute new prediction points
npoints <- 100
newdata1 <- with(setosa, data.frame(Sepal.Length = 
                                       seq(min(Sepal.Length), max(Sepal.Length), len = npoints )))
newdata2 <- with(virginica, data.frame(Sepal.Length = 
                                          seq(min(Sepal.Length), max(Sepal.Length), len = npoints)))
# 3. simultaneous confidence bands
mylevel = 0.95
cc1 <- simultaneous_CBs(fit1, newdata1, level = mylevel)
cc1 <- cc1 %>% mutate(Species = "setosa", Sepal.Length = newdata1$Sepal.Length)
cc2 <- simultaneous_CBs(fit2, newdata2, level = mylevel)
cc2 <- cc2 %>% mutate(Species = "virginica", Sepal.Length = newdata2$Sepal.Length)

# combine datasets
mydata <- rbind(setosa, virginica)
mycc   <- rbind(cc1, cc2)    
mycc   <- mycc %>% rename(Sepal.Width = Mean) 
# plot both simultaneous confidence bands and pointwise confidence
# bands, to show the difference
library(ggplot2)
# prepare a plot using dataframe mydata, mapping sepal Length to x,
# sepal width to y, and grouping the data by species
p <- ggplot(data = mydata, aes(x = Sepal.Length, y = Sepal.Width, color = Species)) + 
# add data points
geom_point() +
# add quadratic regression with orthogonal polynomials and 95% pointwise
# confidence intervals
geom_smooth(method ="lm", formula = y ~ poly(x,2)) +
# add 95% simultaneous confidence bands
geom_ribbon(data = mycc, aes(x = Sepal.Length, color = NULL, fill = Species, ymin = LowerBound, ymax = UpperBound),alpha = 0.5)
print(p)

在此处输入图像描述

内部带是默认计算的那些geom_smooth:这些是回归曲线周围的逐点95% 置信带。外部的半透明带(感谢图形提示,@Roland)是同时的95% 置信带。正如您所看到的,它们比逐点波段大,正如预期的那样。来自两条曲线的同时置信带不重叠的事实可以被视为两个模型之间的差异具有统计显着性这一事实的指示。

当然,对于具有有效p值的假设检验,必须遵循 @Roland 方法,但这种图形方法可以视为探索性数据分析。此外,情节可以给我们一些额外的想法。很明显,这两个数据集的模型在统计上是不同的。但看起来二度 1 模型几乎与两个二次模型一样适合数据。我们可以很容易地检验这个假设:

fit_deg1 <- lm(data = mydata, Sepal.Width ~ Species*poly(Sepal.Length,1))
fit_deg2 <- lm(data = mydata, Sepal.Width ~ Species*poly(Sepal.Length,2))
anova(fit_deg1, fit_deg2)
# Analysis of Variance Table

# Model 1: Sepal.Width ~ Species * poly(Sepal.Length, 1)
# Model 2: Sepal.Width ~ Species * poly(Sepal.Length, 2)
#  Res.Df    RSS Df Sum of Sq      F Pr(>F)
# 1     96 7.1895                           
# 2     94 7.1143  2  0.075221 0.4969   0.61

1 阶模型和 2 阶模型之间的差异并不显着,因此我们不妨对每个数据集使用两个线性回归。