具有高斯分布的 R 加权平均值
R weighted mean with gaussian distribution
有限的统计教育,所以可能正在尝试定义一些简单的函数,或者为什么我找不到现有的答案
问题是计算时间序列的加权平均值,对最新数据赋予更大的权重。权重应遵循“高斯曲线的一侧”函数(“S”曲线?),从最近(最后)点开始的最高值。我意识到会有几个系数来定义曲线的梯度,但假设“正常”
Weighting Points along an 'S' curve in R
这似乎在问同样的问题,但唯一的答案对于我正在寻找的东西来说有点过度设计
我可以生成线性加权平均值,如下所示
# time series data
d <- c(7, 8, 10, 7, 8, 11, 9, 6, 13, 10, 11, 11)
# weight coefficients
w <- seq(1, length(d), 1)
w <- w / sum(w)
w
[1] 0.01282051 0.02564103 0.03846154 0.05128205 0.06410256 0.07692308 0.08974359 0.10256410
[9] 0.11538462 0.12820513 0.14102564 0.15384615
weighted.mean(d, w, na.rm = T)
[1] 9.846154
如何为 w
使用“高斯序列”而不是线性序列?
您可以获得如下正态分布 left-hand 一侧的权重:
w <- dnorm(seq(-3, 0, length = length(d)))
w <- w / sum(w)
所以权重看起来像这样:
plot(w)
如果希望曲线更陡峭,可以将dnorm
的sd
参数设置为小于1,如果希望曲线更平缓,则增大其值。目前示例显示默认值,sd = 1.
编辑
可能允许更好控制的替代方法是逻辑曲线:
w <- plogis(seq(-1, 1, length = length(d)), scale = 0.3)
w <- w / sum(w)
plot(w)
w <- plogis(seq(-1, 1, length = length(d)), scale = 0.15)
w <- w / sum(w)
plot(w)
对于 运行 时间序列的加权平均值,出于效率原因,我建议使用 convolve
,而不是尝试重新实现它。例如:
d <- c(7, 8, 10, 7, 8, 11, 9, 6, 13, 10, 11, 11)
k <- dnorm(seq(-2,2, length.out = 5))
convolve(d, k/sum(k), type = "filter")
[1] 9.466427 7.427122 8.213693 10.465371 8.894341 7.066883 11.933909
[8] 10.425011
有限的统计教育,所以可能正在尝试定义一些简单的函数,或者为什么我找不到现有的答案
问题是计算时间序列的加权平均值,对最新数据赋予更大的权重。权重应遵循“高斯曲线的一侧”函数(“S”曲线?),从最近(最后)点开始的最高值。我意识到会有几个系数来定义曲线的梯度,但假设“正常”
Weighting Points along an 'S' curve in R
这似乎在问同样的问题,但唯一的答案对于我正在寻找的东西来说有点过度设计
我可以生成线性加权平均值,如下所示
# time series data
d <- c(7, 8, 10, 7, 8, 11, 9, 6, 13, 10, 11, 11)
# weight coefficients
w <- seq(1, length(d), 1)
w <- w / sum(w)
w
[1] 0.01282051 0.02564103 0.03846154 0.05128205 0.06410256 0.07692308 0.08974359 0.10256410
[9] 0.11538462 0.12820513 0.14102564 0.15384615
weighted.mean(d, w, na.rm = T)
[1] 9.846154
如何为 w
使用“高斯序列”而不是线性序列?
您可以获得如下正态分布 left-hand 一侧的权重:
w <- dnorm(seq(-3, 0, length = length(d)))
w <- w / sum(w)
所以权重看起来像这样:
plot(w)
如果希望曲线更陡峭,可以将dnorm
的sd
参数设置为小于1,如果希望曲线更平缓,则增大其值。目前示例显示默认值,sd = 1.
编辑
可能允许更好控制的替代方法是逻辑曲线:
w <- plogis(seq(-1, 1, length = length(d)), scale = 0.3)
w <- w / sum(w)
plot(w)
w <- plogis(seq(-1, 1, length = length(d)), scale = 0.15)
w <- w / sum(w)
plot(w)
对于 运行 时间序列的加权平均值,出于效率原因,我建议使用 convolve
,而不是尝试重新实现它。例如:
d <- c(7, 8, 10, 7, 8, 11, 9, 6, 13, 10, 11, 11)
k <- dnorm(seq(-2,2, length.out = 5))
convolve(d, k/sum(k), type = "filter")
[1] 9.466427 7.427122 8.213693 10.465371 8.894341 7.066883 11.933909
[8] 10.425011