在R中计算线图的积分

3
我有两个正值向量x和y,在R中长度相同。使用plot(x,y,“l”,...)可以从我的有限向量x和y中得到2维连续线图。有没有一种方法在R中计算该线图的某些范围内的定积分?
编辑1:我已经研究了R中的integrate函数。然而,我不确定如何将这两个向量制成一个函数传递给它,因为我的向量都是有限的。
编辑2:更多背景信息,x和y的长度约为10,000。我编写了一个函数来查找数据中异常的周期[ xi,xj ]。对于这些异常情况中的每一个,我使用plot来查看我的数据片段中发生了什么。现在,我需要计算与这些异常周期中积分值相关的统计信息,因此我正在尝试获得尽可能准确的数字以匹配我的图形。X是时间变量,并且我采取了非常细小的时间间隔。
3个回答

5
您可以使用integrate()进行集成。要从向量xy创建函数,您需要在值之间进行插值。approxfun()正是这样做的。 integrate接受一个函数和两个边界。 approxfun接受两个向量xy,就像您拥有的那些一样。
因此,我的解决方案是:
integrate(approxfun(x,y), range(x)[1], range(x)[2])

感谢您的回复。我在网上看到了,但不确定如何在R中将两个向量制作成函数。能否详细说明一下? - mt88
我不确定我理解你想要什么。你想计算将x的每个元素映射到相应的y元素的函数的积分吗? - kjaquier
正确。但是,x和y是有限的,例如x = c(1, 3, 9, 7, 12, 15)和y = c(2, 17, 99, 21, 33, 16)。因此,它们不会一起形成连续函数。 - mt88
那么你的积分不就是y的总和吗? - kjaquier
感谢您一直以来的帮助。approxfun是否类似于plot在底层使用的插值方法?我正在尝试避免我的计算结果与图形之间出现差异。 - mt88
显示剩余2条评论

3
approxfun函数接受两个向量并返回一个函数,该函数在点之间进行线性插值。然后可以将此函数传递给integrate等函数。splinefun函数也会进行插值,但基于样条而不是分段线性。
在分段线性情况下,积分将仅为梯形的总和,只需计算梯形的面积(宽度,x差异)即可更快/更简单地完成。

谢谢您的回复。我会尝试这个方法。approxfun使用的插值方法是否类似于plot()在底层使用的插值方法?只是想确保我的图形和使用approxfun的结果之间没有差异。 - mt88
1
@mt88,如果x的顺序已排序,两者都使用线性插值,并且将得到相同的结果(好吧,准确来说,积分选择在哪里进行插值,可能会切掉一个角,但差异很小)。 - Greg Snow

1

我到这里来的时间比较晚。但是对于未来的访客,这里有一些代码,可以根据Greg Snow的答案建议,用于分段线性函数:

line_integral <- function(x, y) {
dx <- diff(x)
  end <- length(y)
  my <- (y[1:(end - 1)] + y[2:end]) / 2
  sum(dx *my)
} 

# example
x <- c(0, 2, 3, 4, 5, 5, 6)
y <- c(0, 0, 1,-2,-1, 0, 0)
plot(x,y,"l")
line_integral(x,y)

你的解决方案原则上是正确的,但例子有点不太幸运,因为你的向量 xy 没有定义一个函数:当 x = 5 时它没有被很好地定义。这意味着对于你的例子,使用 approxfun 函数将无法很好地逼近该函数。f <- approxfun(x, y) 导致 f(5) = -0.5,这可能不是你想要的结果。 - Stibu
我其实是故意这么做的:mt88试图获取分段线性图形(x,y)的积分,无论它来自哪些函数。(在这种情况下,它可能来自非连续函数...除了垂直部分) - Alban K
谢谢!这正是我在寻找的! - Rasmus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接