経験的CDFの統合


13

経験的分布G(x)ます。次のように計算します

    x <- seq(0, 1000, 0.1)
    g <- ecdf(var1)
    G <- g(x)

私はh(x)=dG/dx。つまり、hはpdfで、Gはcdfです。

私は今(と言う統合の上限のための方程式を解決したいの期待値というように、)xはいくつかあるのkaxk

それから、積分、ある0b、私が持っているべきであるxh(x)dx=kについて解きたいb

部品ごとに統合して、方程式を次のように書き換えることができます。

bG(b)0bG(x)dx=k積分はあり、0b -------(1)

次のように積分を計算できると思います

    intgrl <- function(b) {
        z <- seq(0, b, 0.01)
        G <- g(z)
        return(mean(G))
     }

しかし、この関数を使用しようとすると

    library(rootSolve)
    root <- uniroot.All(fun, c(0, 1000))

funがeq(1)の場合、次のエラーが表示されます

    Error in seq.default(0, b, by = 0.01) : 'to' must be of length 1  

問題は、私の関数intgrlが数値で評価されuniroot.All、間隔を通過していることだと思いますc(0,1000)

この状況でRのをどのように解決すればよいですか?b

回答:


13

ソートされたデータは、とする。経験的CDF Gを理解するために、x iの値の1つを考えてみましょうと呼びましょうx1x2xnGxiγ -そして、いくつかの番号と仮定のは、xは、私がある未満γT 1のは、xは、私が同じですγ。すべての可能なデータ値のうち、γのみの間隔[ α β ]を選択しますkxiγt1xiγ[α,β]γが表示されます。次に、定義により、この間隔内で、γより小さい数については定数値k / nを持ち、γより大きい数については定数値k + t / nにジャンプします。Gk/nγ(k+t)/nγ

ECDF

寄与検討から間隔 [ α β ]を。が hは関数ではない-それは、サイズの点尺度である T / N γ --the積分され定義された正直ツー良積分に変換する部分積分によって。これを区間 [ α β ]で行いましょう:0bxh(x)dx[α,β]ht/nγ[α,β]

αβxh(x)dx=(xG(x))|αβαβG(x)dx=(βG(β)αG(α))αβG(x)dx.

新しい被積分関数は、で不連続ですが、積分可能です。その値は、統合ドメインをGのジャンプの前後の部分に分割することで簡単に見つかります。γG

αβG(x)dx=αγG(α)dx+γβG(β)dx=(γα)G(α)+(βγ)G(β).

これを前述のものに代入して、を思い出すと、G(α)=k/n,G(β)=(k+t)/n

αβxh(x)dx=(βG(β)αG(α))((γα)G(α)+(βγ)G(β))=γtn.

つまり、この積分は、各ジャンプの位置軸に沿った)にそのジャンプのサイズを掛けます。ジャンプのサイズはX

tn=1n++1n

等しいデータ値ごとに1つの項があります。すべてのそのようなジャンプからの寄与追加Gを示すことをγG

0bxh(x)dx=i:0xib(xi1n)=1nxibxi.

1/n[0,b]1/n1/mm[0,b]。)

kb1nxibxi=k.kj

1ni=1j1xik<1ni=1jxi,

you will have narrowed b to the interval [xj1,xj). You can do no better than that using the ECDF. (By fitting some continuous distribution to the ECDF you can interpolate to find an exact value of b, but its accuracy will depend on the accuracy of the fit.)


R performs the partial sum calculation with cumsum and finds where it crosses any specified value using the which family of searches, as in:

set.seed(17)
k <- 0.1
var1 <- round(rgamma(10, 1), 2)
x <- sort(var1)
x.partial <- cumsum(x) / length(x)
i <- which.max(x.partial > k)
cat("Upper limit lies between", x[i-1], "and", x[i])

The output in this example of data drawn iid from an Exponential distribution is

Upper limit lies between 0.39 and 0.57

The true value, solving 0.1=0bxexp(x)dx, is 0.531812. Its closeness to the reported results suggests this code is accurate and correct. (Simulations with much larger datasets continue to support this conclusion).

Here is a plot of the empirical CDF G for these data, with the estimated values of the upper limit shown as vertical dashed gray lines:

Figure of ECDF


This is a very clear and helpful answer, so thank you!
user46768
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.