Интеграция эмпирического CDF

13

У меня есть эмпирическое распределение . Я рассчитываю это следующим образомG(x)

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

Я обозначаю , т. - это pdf, а - это cdf.h Gh(x)=dG/dxhG

Теперь я хочу решить уравнение для верхнего предела интегрирования (скажем, ), чтобы ожидаемое значение составляло .х кaxk

То есть, интегрируя от до , я должен иметь . Я хочу решить для .b x h ( x ) d x = k b0bxh(x)dx=kb

Интегрируя по частям, я могу переписать уравнение как

0 бbG(b)0bG(x)dx=k , где интеграл от до ------- (1)0b

Я думаю, что могу вычислить интеграл следующим образом

    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 is 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

user46768
источник

Ответы:

13

Пусть отсортированные данные будут . Чтобы понять эмпирический CDF , рассмотрим одно из значений в --let, называемом -, и предположим, что некоторое число в меньше и в равно . Выберите интервал в котором из всех возможных значений данных отображается только . Тогда по определению в этом интервале имеет постоянное значение для чисел, меньшихx1x2xnGxiγkxiγt1xiγ[α,β]γGk/nγи переходит к постоянному значению для чисел, превышающих .(k+t)/nγ

ECDF

Рассмотрим вклад в из интервала . Хотя не является функцией - это точечная мера размера в - интеграл определяется посредством интегрирования частями, чтобы преобразовать его в интеграл честности в доброту. Давайте сделаем это за интервал :0bxh(x)dx[α,β]ht/nγ[α,β]

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

Новое подынтегральное выражение, хотя оно и разрывно в , является интегрируемым. Его значение легко найти, разбив область интегрирования на части, предшествующие и следующие за скачком в :γ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

с одним членом для каждого из значений данных, равным . Добавление вкладов от всех таких скачков показывает, чтоγG

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

Мы можем назвать это «частичным средним», видя, что оно равно раз частичной сумме. (Обратите внимание, что это не ожидание. Это может быть связано с ожиданием версии базового дистрибутива, которая была усечена до интервала : вы должны заменить коэффициент на где - количество значений данных в пределах .)1/n[0,b]1/n1/mm[0,b]

Для заданного вы хотите найти для которогоПоскольку частичные суммы представляют собой конечный набор значений, как правило, решения не существует: вам нужно согласиться на лучшее приближение, которое можно найти, заключив в скобки между двумя частичными средними, если это возможно. То есть, найдя такой, чтоkbК1nxibxi=k.kj

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

Вы сузите до интервала . Вы можете сделать не лучше, чем с помощью ECDF. (Подбирая некоторое непрерывное распределение к ECDF, вы можете интерполировать, чтобы найти точное значение , но его точность будет зависеть от точности подбора.)[ x j - 1 , x j ) bb[xj1,xj)b


Rвыполняет вычисление частичной суммы с помощью cumsumи находит, где оно пересекает любое указанное значение, используя whichсемейство поисков, как в:

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])

Выходные данные в этом примере данных, извлеченных из экспоненциального распределения:

Верхний предел лежит между 0,39 и 0,57

Истинное значение, решающее составляет . Его близость к сообщенным результатам позволяет предположить, что этот код является точным и правильным. (Моделирование с гораздо большими наборами данных продолжает поддерживать этот вывод).0,5318120.1=0bxexp(x)dx,0.531812

Вот график эмпирического CDF для этих данных с оценочными значениями верхнего предела, показанными в виде вертикальных пунктирных серых линий:G

Рисунок ECDF

Whuber
источник
Это очень четкий и полезный ответ, так что спасибо!
user46768