如何计算R曲线下面积的95%可信限?

时间:2013-01-07 17:53:23

标签: r interpolation integral

我有以下分布:

x<-c(22.5,28.14285714,33.78571429,39.42857143,45.07142857,50.71428571,56.35714286,62,67.64285714,73.28571429,78.92857143,84.57142857,90.21428571,95.85714286,101.5,107.1428571,112.7857143,118.4285714,124.0714286,129.7142857,135.3571429,141,146.6428571,152.2857143,157.9285714,163.5714286,169.2142857,174.8571429,180.5,186.1428571,191.7857143,197.4285714,203.0714286,208.7142857,214.3571429,220,225.6428571,231.2857143,236.9285714,242.5714286,248.2142857,253.8571429,259.5,265.1428571,270.7857143,276.4285714,282.0714286,287.7142857,293.3571429,299)
y<-c(0.003541755,0.003541755,0.003541755,0.003541755,0.003541755,0.003541755,0.003541755,0.003541755,0.003541755,0.003541755,0.003541755,0.003541755,0.003541755,0.003541755,0.003541755,0.003541755,0.003541755,0.003541755,0.003541755,0.00328839614285714,0.00296425985714286,0.002655899,0.00236187857142857,0.002080895,0.00181184271428571,0.00155376085714286,0.00130578928571429,0.001074706,0.000877193,0.000709397142857142,0.000567189714285714,0.000447254,0.000346858571428571,0.000263689142857143,0.000195768428571429,0.000141427,9.92657142857141e-05,6.77857142857142e-05,4.48571428571428e-05,2.86428571428571e-05,1.75142857142857e-05,1.01357142857143e-05,5.52e-06,2.78857142857142e-06,1.27285714285713e-06,5.00714285714284e-07,1.5742857142857e-07,3.29857142857142e-08,2.78857142857137e-09,1.74e-12)

plot(x,y)

我想找到x的值,该值将分布下的0.95区域与左侧的区域分开,将区域的0.05区域分隔为右侧(单尾95%的可信区间)。

我想我必须将我的经验曲线拟合到一个函数然后整合函数,这样我才能获得所需的值,但我真的不知道从哪里开始。

怎么可能在R?

中完成

2 个答案:

答案 0 :(得分:4)

正如其他答案所表明的那样,这是曲线问题下的积分,与确定面积达到总面积的95%的位置配对。我采用比David's answer更简单的集成方法。我只是使用梯形积分规则来获得每个区间贡献的区域,而不是插入曲线并对其进行积分。然后添加这些单独的区域以获得总面积。然后找到累积面积超过总面积95%的指数,并绘制一条线。

piece_area <- c(0, (x[-1] - x[-length(x)])*(y[-1] + y[-length(y)]) / 2)
cum_area <- cumsum(piece_area)
total_area <- cum_area[length(cum_area)]
idx095 <- min(which(cum_area > 0.95 * total_area))

abline(v = x[idx095])

enter image description here

通过在分布的原始样本中使用更多的点,可以获得越过95%的精确点的更高分辨率。

答案 1 :(得分:2)

这是一个整合问题(曲线下的总和)。您可以将积分分为正方形和曲线1。 但是,您可以通过样条线使用快速而肮脏的近似值:

y<-c(0.003541755,0.003541755,0.003541755,0.003541755,0.003541755,0.003541755,0.003541755,0.003541755,0.003541755,0.003541755,0.003541755,0.003541755,0.003541755,0.003541755,0.003541755,0.003541755,0.003541755,0.003541755,0.003541755,0.00328839614285714,0.00296425985714286,0.002655899,0.00236187857142857,0.002080895,0.00181184271428571,0.00155376085714286,0.00130578928571429,0.001074706,0.000877193,0.000709397142857142,0.000567189714285714,0.000447254,0.000346858571428571,0.000263689142857143,0.000195768428571429,0.000141427,9.92657142857141e-05,6.77857142857142e-05,4.48571428571428e-05,2.86428571428571e-05,1.75142857142857e-05,1.01357142857143e-05,5.52e-06,2.78857142857142e-06,1.27285714285713e-06,5.00714285714284e-07,1.5742857142857e-07,3.29857142857142e-08,2.78857142857137e-09,1.74e-12)
x<-c(22.5,28.14285714,33.78571429,39.42857143,45.07142857,50.71428571,56.35714286,62,67.64285714,73.28571429,78.92857143,84.57142857,90.21428571,95.85714286,101.5,107.1428571,112.7857143,118.4285714,124.0714286,129.7142857,135.3571429,141,146.6428571,152.2857143,157.9285714,163.5714286,169.2142857,174.8571429,180.5,186.1428571,191.7857143,197.4285714,203.0714286,208.7142857,214.3571429,220,225.6428571,231.2857143,236.9285714,242.5714286,248.2142857,253.8571429,259.5,265.1428571,270.7857143,276.4285714,282.0714286,287.7142857,293.3571429,299)

sp=smooth.spline(x,y)
f = function(t)
{
    predict(sp,t)$y
}   

N=500 # this is an accuracy parameter
xBis=seq(x[1],x[length(x)],length=N)
yBis=sapply(x,f)

J = function (input)
{   # This function takes input in 1:N
    Integral = 0
    dx=(x[length(x)]-x[1])/N

    for ( j in 1: input)
{   z=xBis[j]
    Integral=Integral+ f(x[1]+z)*dx
}
J=Integral
}
######
I=J(N) # This is the value of the sum under the curve
# It should be roughly equal (given the shape of the curve) to:
index=max(which(y==y[1]))
I = (x[index]-x[1])*(y[index])*3/2
######
res=sapply(1:N,J)/I
Index5=max(which(res<=.05))
Index95=min(which(res>=.95))

x5=xBis[Index5] # This is the 5% quantile 
x95=xBis[Index95]

HTH

如果有什么不清楚,请告诉我

P.S我认为有更好的方法可以做到这一点。