如何干净地使用点之间的插值来生成 R 中的平均值

How to cleanly use interpolation between points to generate a mean in R

我在尝试生成一个代码时遇到问题,该代码将基于使用插值的简单点图干净地生成平均值(特别是加权平均值)。

例如;

ex=c(1,2,3,4,5)
why=c(2,5,9,15,24)

这显示了我正在使用的信息类型。

plot(ex, why, type="o")

在这一点上,我想要每个点 "binned" 所以它们之间的线是直的。为此,我一直在 excel 中手动将点添加到 x 值作为 (x+0.01)。 这是新的输出:

why=c(2,2,5,5,9,9,15,15,24,24)
ex=c(1,2,2.01,3,3.01,4,4.01,5,5.01,6)
plot(ex, why, type="o")

这就是我的问题所在。我必须多次这样做并且不想生成大量新的向量和对象。为了获得加权平均值,我一直在使用插值法将 y 值插值到新对象中,以 0.01 的 x 增量进行插值。然后我可以进入这个新对象并在一个点落在实际 ex 值之间时得到一个平均值,即

mean(newy[1:245])

因为我为 x 的 100 个增量创建了新的 y 值(基本上)沿着一条直线,所以我在这里得到 x= 1 到 2.45 的加权平均值。

有没有更简单、更优雅的方法将插值代码嵌入到平均代码中,所以我可以说 "average of interpolated y for nonreal x to nonreal x?"

根据你的第二个绘图示例,我认为你可能正在寻找这个:

library(ggplot2)
qplot(ex, why, geom="step")

这给出:

或者如果你想让线条先垂直,你可以使用:

qplot(ex, why, geom="step", direction = "vh")

给出:

它并不完全符合您的要求,但您应该考虑 stepfun 函数——这会在两个系列中创建阶跃函数。

plot(stepfun(ex[-1], why))

stepfun 很方便,因为它为您提供了一个在该区间内定义的函数,因此您可以轻松地通过在任何地方进行评估来进行插值。它的缺点是它没有严格定义在给定的范围内(这就是为什么我们必须切断 ex 中的第一个值)。