You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 11:10:32