关于loess插值区间定义的疑问:为何部分场景置信区间不显示?
loess插值置信区间不显示的原因解析
我搞不懂loess插值的工作原理,尤其是置信区间的定义——明明知道至少需要5个数据点,但有时候数据点超过5个还是看不到置信区间。比如下面两个测试案例:
案例1:无置信区间的Graph1
# Dataframe 1 creation temperatura <- c(120, 130, 140, 150, 160, 120, 130, 140, 150, 160) viscosita <- c(65000, 45000, 29500, 20500, 15500, 65000, 45000, 29500, 20500, 15500) df <- data.frame(Temperatura = temperatura, Viscosita = viscosita) library(ggplot2) Graph1 <- ggplot(data=df, aes(x=`Temperatura`, y=`Viscosita`)) + geom_point(aes(color = "red"), shape = 1, size = 3.0, stroke = 1.5) + geom_smooth(aes(level=0.99, span = 0.1)) Graph1
这段代码生成的Graph1完全看不到置信区间,但仅修改一个数据点后,Graph2就能正常显示。
案例2:显示置信区间的Graph2
# Dataframe 2 creation temperatura <- c(120, 130, 140, 150, 160, 120, 130, 140, 150, 160) viscosita <- c(65000, 45000, 29500, 20500, 15500, 65000, 43500, 29500, 20500, 15500) df <- data.frame(Temperatura = temperatura, Viscosita = viscosita) library(ggplot2) Graph2 <- ggplot(data=df, aes(x=`Temperatura`, y=`Viscosita`)) + geom_point(aes(color = "red"), shape = 1, size = 3.0, stroke = 1.5) + geom_smooth(aes(level=0.99, span = 0.1)) Graph2
核心原因解析
1. 数据变异是置信区间显示的前提
loess的置信区间基于局部拟合的残差方差计算:
- Graph1中,每个温度(x值)对应的粘度(y值)完全重复,比如120对应两个65000,130对应两个45000,以此类推。这导致每个x处的y值方差为0,局部拟合的残差平方和也为0,估计的方差为0,置信区间的上下限完全和拟合曲线重合,自然看不到。
- Graph2修改了130对应的其中一个y值为43500,打破了完全重复,y值有了变异,残差方差不为0,置信区间就能正常计算并显示。
2. span参数的放大效应
你设置的span=0.1非常小,意味着loess拟合时每个局部窗口只包含极少的数据点(在这个案例中,每个窗口基本就是同一个x的重复数据)。这种情况下,Graph1里每个窗口的y值完全一致,方差为0的问题被放大,直接导致置信区间“消失”;而Graph2中存在变异的窗口就能正常计算区间。
验证方法
你可以手动计算两个数据集的y值分组方差:
# Graph1的y值分组方差 aggregate(Viscosita ~ Temperatura, df1, var) # 结果全为0 # Graph2的y值分组方差 aggregate(Viscosita ~ Temperatura, df2, var) # 130对应的方差不为0,其余仍为0,但足够让loess计算出可见的置信区间
内容的提问来源于stack exchange,提问作者GiacomoDB
相关产品推荐
相关产品推荐

