使用移动窗口均值平滑响应实际上是有效且准确的:这可以在整个数据集上通过快速傅里叶变换在几分之一秒内完成。出于绘图目的,请考虑对原始数据和平滑数据进行二次抽样。您可以进一步平滑二次采样平滑。这将比仅仅平滑二次采样数据更可靠。
通过多种方式实现对平滑强度的控制,为这种方法增加了灵活性:
较大的窗口会增加平滑度。
可以对窗口中的值进行加权以创建连续平滑。
可以调整用于平滑子采样平滑的最低参数。
例子
首先让我们生成一些有趣的数据。它们存储在两个并行数组中,times和x(二进制响应)。
set.seed(17)
n <- 300000
times <- cumsum(sort(rgamma(n, 2)))
times <- times/max(times) * 25
x <- 1/(1 + exp(-seq(-1,1,length.out=n)^2/2 - rnorm(n, -1/2, 1))) > 1/2
这是应用于完整数据集的运行平均值。使用了相当大的窗口半角();这可以增加以获得更强的平滑度。内核具有高斯形状以使平滑合理地连续。该算法完全公开:在这里您可以看到内核显式构造并与数据进行卷积以生成平滑数组。1172y
k <- min(ceiling(n/256), n/2) # Window size
kernel <- c(dnorm(seq(0, 3, length.out=k)))
kernel <- c(kernel, rep(0, n - 2*length(kernel) + 1), rev(kernel[-1]))
kernel <- kernel / sum(kernel)
y <- Re(convolve(x, kernel))
让我们以内核半宽的一小部分间隔对数据进行二次采样,以确保不会忽略任何内容:
j <- floor(seq(1, n, k/3)) # Indexes to subsample
在示例j中,只有元素代表所有原始值。768300,000
代码的其余部分绘制了子采样原始数据、子采样平滑(灰色)、子采样平滑的低平滑(红色)和子采样数据的低平滑(蓝色)。最后一种方法虽然很容易计算,但比推荐的方法更易变化,因为它基于一小部分数据。
plot(times[j], x[j], col="#00000040", xlab="x", ylab="y")
a <- times[j]; b <- y[j] # Subsampled data
lines(a, b, col="Gray")
f <- 1/6 # Strength of the lowess smooths
lines(lowess(a, f=f)$y, lowess(b, f=f)$y, col="Red", lwd=2)
lines(lowess(times[j], f=f)$y, lowess(x[j], f=f)$y, col="Blue")

红线(下采样窗口平均值的低平滑)是用于生成数据的函数的非常准确的表示。蓝线(子采样数据的低平滑度)表现出虚假的可变性。