我怎样才能在 R 中做矢量积分?

how can I do vector integral in R?

我想在 R 中集成一个一维向量,我应该怎么做? 假设我有:

d=hist(p, breaks=100, plot=FALSE)$density

其中 p 是一个样本,例如:

p=rnorm(1e5)

如何计算 d 的积分?

如果我们假设 d 中的值对应于函数的 y 值,那么我们可以使用离散近似计算积分。例如,我们可以为此目的使用梯形规则或辛普森规则。然后我们还需要输入 x 轴上离散区间对应的步长,以便 "approximate the area under the curve".

离散积分函数定义如下:

p=rnorm(1e5)
d=hist(p,breaks=100,plot=FALSE)$density

discreteIntegrationTrapeziumRule <- function(v,lower=1,upper=length(v),stepsize=1)
{
  if(upper > length(v))
    upper=length(v)
  if(lower < 1)
    lower=1

  integrand <- v[lower:upper]
  l <- length(integrand)
  stepsize*(0.5*integrand[1]+sum(integrand[2:(l-1)])+0.5*v[l])
}

discreteIntegrationSimpsonRule <- function(v,lower=1,upper=length(v),stepsize=1)
{
  if(upper > length(v))
    upper=length(v)
  if(lower < 1)
    lower=1

  integrand <- v[lower:upper]
  l <- length(integrand)
  a = seq(from=2,to=l-1,by=2);
  b = seq(from=3,to=l-1,by=2)
  (stepsize/3)*(integrand[1]+4*sum(integrand[a])+2*sum(integrand[b])+integrand[l])
}

作为示例,让我们在假设离散 x 步长为 1 的同时近似曲线下的完整区域,然后在我们假设 x 步长为 0.2 的情况下对 d 的后半部分执行相同的操作。

> plot(1:length(d),d) # stepsize one on x-axis
> resultTrapeziumRule <- discreteIntegrationTrapeziumRule(d) # integrate over complete interval, assume x-stepsize = 1
> resultSimpsonRule <- discreteIntegrationSimpsonRule(d) # integrate over complete interval, assume x-stepsize = 1
> resultTrapeziumRule
[1] 9.9999
> resultSimpsonRule
[1] 10.00247

> plot(seq(from=-10,to=(-10+(length(d)*0.2)-0.2),by=0.2),d) # stepsize 0.2 on x-axis
> resultTrapziumRule <- discreteIntegrationTrapeziumRule(d,ceiling(length(d)/2),length(d),0.2) # integrate over second part of vector, x-stepsize=0.2
> resultSimpsonRule <- discreteIntegrationSimpsonRule(d,ceiling(length(d)/2),length(d),0.2) # integrate over second part of vector, x-stepsize=0.2
> resultTrapziumRule
[1] 1.15478
> resultSimpsonRule
[1] 1.11678

一般来说,辛普森法则提供了更好的积分近似值。您拥有的 y 值越多(x 轴步长越小),您的近似值就越好。

编辑 为清楚起见: 在这种特殊情况下,步长显然应该是 0.1。正如预期的那样,密度曲线下的完整面积(大约)等于 1。

> d=hist(p,breaks=100,plot=FALSE)$density
> hist(p,breaks=100,plot=FALSE)$mids # stepsize = 0.1
 [1] -4.75 -4.65 -4.55 -4.45 -4.35 -4.25 -4.15 -4.05 -3.95 -3.85 -3.75 -3.65 -3.55 -3.45 -3.35 -3.25 -3.15 -3.05 -2.95 -2.85 -2.75 -2.65 -2.55
[24] -2.45 -2.35 -2.25 -2.15 -2.05 -1.95 -1.85 -1.75 -1.65 -1.55 -1.45 -1.35 -1.25 -1.15 -1.05 -0.95 -0.85 -0.75 -0.65 -0.55 -0.45 -0.35 -0.25
[47] -0.15 -0.05  0.05  0.15  0.25  0.35  0.45  0.55  0.65  0.75  0.85  0.95  1.05  1.15  1.25  1.35  1.45  1.55  1.65  1.75  1.85  1.95  2.05
[70]  2.15  2.25  2.35  2.45  2.55  2.65  2.75  2.85  2.95  3.05  3.15  3.25  3.35  3.45  3.55  3.65  3.75  3.85  3.95  4.05  4.15

> resultTrapeziumRule <- discreteIntegrationTrapeziumRule(d,stepsize=0.1) 
> resultTrapeziumRule
[1] 0.999985