как генерировать случайные числа (вероятности) из экспоненциального распределения, суммирующие до 1 - PullRequest
0 голосов
/ 03 ноября 2018

Предположим, я хочу x случайных чисел, сумма которых равна единице, и это распределение является экспоненциальным. Когда я использую

x<-c(10,100,1000)

a<-rexp(x[3],rate=1)

a<-a/sum(a)

Это изменит распределение, верно?

Так кто-нибудь знает способ, чтобы вероятности все еще экспоненциально распределялись? Я знаю, что они больше не будут полностью независимыми.

Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 03 ноября 2018

Да, нормализация меняет распределение и, фактически, невозможно достичь именно того, что вы хотите.


Простое доказательство

Пусть X 1 ,…, X n для некоторых конечных n случайных величин, значения которых вы хотите сгенерировать. У вас есть два требования:

  1. X i ~ Exp (λ) для некоторого λ> 0 и i = 1,…, n.
  2. Х 1 + ... Х * п * одна тысяча двадцать один * * = тысяча двадцать два 1.

Хотя каждое из двух отдельных требований легко выполнить, невозможно выполнить оба одновременно. Причина этого заключается в том, что функция плотности вероятности экспоненциального распределения равна положительной на [0, ∞). Это означает, что каждый X i достигает значений больше 1 с положительной вероятностью, что означает, что требование 2 не всегда выполняется. На самом деле, оно выполняется с нулевой вероятностью.


Распределение вероятностей, подразумеваемое нормализацией

Теперь вы предлагаете интуитивно понятный подход, чтобы начать с требования 1 и выполнить нормализацию. Z i = X i / (X 1 +… + X n ) для каждого i = 1,…, n. Однако немногие распределения ведут себя хорошо при таких преобразованиях, как сложение, умножение и, в частности, деление, потому что случайные знаменатели редко могут быть найдены. В этом случае у нас есть дополнительное усложнение, что числитель и знаменатель Z i являются зависимыми.

Тем не менее, название точного распределения Z i на самом деле известно, и это Dirichlet . Чтобы увидеть это, обратите внимание, что X i ~ Gamma (1, λ), где λ выступает в качестве параметра скорости. Далее мы смотрим на определение распределения Дирихле: мы начинаем с Y i ~ Gamma (α i , θ) для i = 1,…, и затем, как вы предлагаете, определите W i = Y i / (Y 1 +… + Y n ). Затем (W 1 ,…, W n ) ~ Дирихле (α i ,…, α n ). Однако в случае требования 1 имеем, что α i = 1 для каждого i = 1,…, n. Таким образом, ваш подход приводит к (Z 1 ,…, Z n ) ~ Дирихле (1,…, 1).

Затем вы можете смоделировать значения из него, например, с помощью пакета MCMCpack:

library(MCMCpack)
rdirichlet(1, c(1, 1, 1))
#           [,1]      [,2]       [,3]
# [1,] 0.2088649 0.7444334 0.04670173
sum(rdirichlet(1, c(1, 1, 1)))
# [1] 1

Теперь, глядя на функцию плотности вероятности Дирихле (1, ..., 1), вы можете заметить, что она действительно постоянна (при положительном значении). Таким образом, вы можете рассматривать его как многомерный равномерный. Это имеет смысл, если вы задумаетесь об этом на секунду (например, подумайте, если точки на x + y = 1, x + y + z = 1).

Однако многомерное распределение, являющееся несколько однородным, не подразумевает нечто подобное в терминах маргинальных распределений. Фактически, можно показать , что они бета (1, n-1).

На Z i ограничено [0,1]

Поскольку для некоторых значений λ экспоненциальные случайные величины сосредоточены близко к нулю, можно ошибочно думать, что они действительно имеют ограниченную поддержку.

Кумулятивная функция распределения X i ~ Exp (λ) равна 1-exp (-λx). Таким образом, тогда P (X i <= 1) = 1-exp (-λ), который равен 1 только в пределе при λ-> ∞, но в этом случае X сходится к 0 в распределении. Таким образом, мы не можем иметь невырожденную экспоненциальную случайную величину, ограниченную [0,1]. Обратите внимание, однако, что для больших фиксированных значений λ 1-exp (-λ) близко к 1, и можно ошибочно думать, что X i фактически ограничено [0,1].

Пара тривиальных демонстраций. Во-первых, Z i (после распределения Дирихле) ограничены [0,1].

data <- replicate({
  x <- rexp(5)
  z <- x[1] / sum(x)}, n = 100000)
range(data)
# [1] 1.060492e-06 9.633081e-01
plot(density(data, bw = 0.01))

enter image description here

Во-вторых, X ~ Exp (1) явно принимает значения выше 1.

x <- rexp(10000)
range(x)
# [1] 7.737341e-05 1.005980e+01
mean(x < 1)
# [1] 0.6391
plot(density(x))

enter image description here


Масштабирование с положительным коэффициентом

Было несколько комментариев, предлагающихo использовать факт , что экспоненциальное распределение замкнуто при масштабировании положительным множителем, так что если X ~ Exp (λ), то kX ~ Exp (λ / k). Это, конечно, правда, но в данном случае это не применимо. Причина в том, что k = X 1 +… + X n не является константой (это означает, что k отличается для разных реализаций X i ) и, по этой причине kX ~ Exp (λ / k) не выполняется. Теперь, если бы мы рассматривали k как константу (например, 5), то не было бы никакой гарантии, что Z i = X i / 5 удовлетворит ваше требование 2. Фактически, ограничение будет выполняться с вероятностью 0.

Чтобы иметь четкое представление о том, что происходит, и чтобы вас не вводили в заблуждение эмпирические «доказательства» @MauritsEvers, вот некоторые подробности.

Пусть (Ω, F, P) - вероятностное пространство. Тогда X i : Ω-> R; то есть X i - это функция, принимающая значения X i (ω) в R с результатами ω (представьте их как set.seed значения) из Ω. Теперь у нас действительно есть это свойство: для константы k kX i ~ Exp (λ / k). Однако под константой подразумевается, что независимо от реализованного результата ω из Ω значение k всегда одинаково, как если бы k: Ω-> R была постоянной функцией. @MauritsEvers предлагает k = X 1 +… + X n . Это, однако, рассматривается как функция, не является постоянной величиной и зависит от результата ω.

Вот некоторые тривиальные примеры, демонстрирующие, как эта логика не работает: let k = 1 / X i . Тогда kX i = 1, которая является вырожденной случайной величиной, а не экспоненциальной. Аналогично, если X ~ N (0,1), то kX = 1, а не kX ~ N (0,1 / X ^ 2), что "следует" из того факта, что X ~ N (0,1) дает kX ~ N (0, k ^ 2) для константы k.


Ошибочная логика

Теперь можно сказать, что источником этой ошибочной логики, описанной выше, является неправильное обращение с вероятностными концепциями + непосредственное отношение к моделируемым значениям в R. @MauritsEvers утверждает, что если мы запустим

n <- 3
x <- rexp(n)
k <- sum(x)

тогда реализованная сумма k может быть использована в качестве константы k, упомянутой выше, и ожидать, что kX i ~ Exp (?). Проверка правильности взятия n <- 1, как в примере выше, уже показывает, что с этим аргументом что-то не так, поскольку тогда x / k - это просто 1 - вырожденная случайная переменная, а не экспоненциальная. Утверждается, что k <- sum(x) является допустимым выбором, потому что это ряд уже наблюдаемых реализаций. Это на самом деле причина, почему этот выбор неверен. В предыдущих обозначениях имеем k (ω) = X 1 (ω) +… + X n (ω), так что k не является постоянной функцией.

Другой способ взглянуть на это состоит в том, что если мы увидим x как-то случайным, то k будет столь же случайным , как и суммой x. Теперь и x, и k являются числами, реализациями, но мы не знаем ни одного из их значений, прежде чем попросим R напечатать их. Определением константы k будет то, что мы всегда знаем ее значение независимо от ω или set.seed.

Наконец, в качестве студенческого упражнения можно рассмотреть вопрос о CDF: kX i :

P (kX i <= x) = P (X <sub>i <= x / k) = 1-exp (-λx / k) </p>

и, следовательно, kX i ~ Exp (λ / k), как и ожидалось. Теперь возьмите n <- 2. В этом случае мы имеем дело с

P (X 1 / (X 1 + X 2 ) <= x) </p>

и мы больше не можем так легко избавиться от сложного знаменателя. Конечно, мы можем определить константу k = X 1 (ω) +… + X n (ω) для некоторого фиксированного ω из Ω. Но тогда Z i = X i / (X 1 (ω) +… + X n (ω)) больше не будут ограничено [0,1] и требование 2 снова не выполняется.


Ложные эмпирические "доказательства"

Наконец, можно спросить, почемуэмпирическое «доказательство» @MauritsEvers частично (поскольку моделирование + подбор + проверка гипотез далеко не теоретическое доказательство) утверждает, что Z i действительно следует экспоненциальному распределению.

Важнейшим элементом этого «доказательства» было принятие lambda <- 1 и n <- 1000, относительно большой величины. В этом случае у нас есть

Z i = X i / (X 1 + ... + X n ) ≈ X i / n * n / (X 1 +… + X n ).

Второй член в правой части, по закону больших чисел, переходит к λ - фиксированному числу - в то время как первый член следует, как мы знаем, Exp (λn). Таким образом, для большого n мы получаем приближение Z i как λExp (λn). Однако оригинальный вопрос не о приближениях или предельных распределениях.


Резюме

Мы можем выделить следующие три случая:

  1. Малый номер (Z 1 ,…, Z n ) следует распределению Дирихле (1,…, 1), а предельные распределения не эквивалентны экспоненциальным. Аппроксимация их экспоненциальными дает произвольные плохие результаты.
  2. Большой номер (Z 1 ,…, Z n ) по-прежнему следует распределению Дирихле (1,…, 1), а предельные распределения по-прежнему не эквивалентны экспоненциальным. Однако аппроксимация их экспоненциальными результатами должна дать совершенно достоверные результаты для практических целей.
  3. Предельный случай, когда n-> ∞. С ростом n каждый Z i становится все ближе и ближе к λExp (λn). Однако, как мы видели, λExp (λn) стремится к вырожденной случайной переменной, тождественно равной нулю.
0 голосов
/ 03 ноября 2018

С ?rexp

rexp(n, rate = 1)
   [...]
   n: number of observations. If ‘length(n) > 1’, the length is
      taken to be the number required.

Итак

x<-c(10,100,1000)
a<-rexp(x,rate=1)

совпадает с

rexp(3, rate = 1)

Нормализация этого значения до 1 гарантирует, что (экспоненциальная) функция вероятности удовлетворяет критериям (экспоненциальной) функции плотности вероятности.


Обновление

После несколько неясного обсуждения с @JuliusVainora я продемонстрирую, что a действительно экспоненциально распределен.

  1. Давайте заново сгенерируем данные:

    x <- c(10, 100, 1000)
    set.seed(2018)
    a <- rexp(x[3], rate=1)
    a <- a / sum(a)
    

    Я использую фиксированное случайное начальное число для воспроизводимости.

  2. Я подгоню байесовскую экспоненциальную модель для оценки lambda на основе a с использованием rstan

    library(rstan)
    stan_code <- "
    data {
        int N;
        real x[N];
    }
    
    parameters {
        real lambda;
    }
    
    model {
        x ~ exponential(lambda);
    }
    "
    
    fit <- stan(
        model_code = stan_code,
        data = list(N = length(a), x = a))
    
    fit
    #Inference for Stan model: b690462e8562075784125cf0e71c81e2.
    #4 chains, each with iter=2000; warmup=1000; thin=1;
    #post-warmup draws per chain=1000, total post-warmup draws=4000.
    #
    #          mean se_mean    sd    2.5%     25%     50%     75%   97.5% n_eff Rhat
    #lambda 1000.21    0.80 31.11  941.86  978.74  998.95 1020.84 1062.97  1502    1
    #lp__   5907.27    0.02  0.66 5905.52 5907.09 5907.53 5907.71 5907.75  1907    1
    #
    #Samples were drawn using NUTS(diag_e) at Sun Nov  4 01:09:40 2018.
    #For each parameter, n_eff is a crude measure of effective sample size,
    #and Rhat is the potential scale reduction factor on split chains (at
    #convergence, Rhat=1).
    
  3. Мы проводим тест Колмогорова-Смирнова для сравнения эмпирического распределения a с показателем экспоненциального распределения с lambda, оцененным по предыдущей модели Стэна

    ks.test(a, "pexp", summary(fit)$summary[1, 1])
    #
    #   One-sample Kolmogorov-Smirnov test
    #
    #data:  a
    #D = 0.021828, p-value = 0.7274
    #alternative hypothesis: two-sided
    

    С p -значением 0,72 мы не смогли отклонить нулевую гипотезу выборок, взятых из двух различных распределений.


Обновление 2

Для уточнения обсуждения в комментариях:

  1. Это просто (и намного более прозрачный IMO), чтобы продемонстрировать, что семейство экспоненциальных распределений закрыто при масштабировании с положительным множителем без необходимости вызывать целое Теоретико-измерительная техника.

  2. Что еще более важно, давайте вспомним, что любая функция плотности вероятности определяется как

    phi(x) = p(x) * N
    

    , где

    N = int p(x) 
    

    с интегралом, взятым по выборочному пространству p(x), так что

    int phi(x) = 1.
    

    Да, это то же самое p(x) как в выражении для phi, так и для N. Здесь важная часть: N все еще является константой, поскольку мы суммируем (интегрируем) по всему выборочному пространству.

Эквивалентно, мы нормализуем выборки, взятые из экспоненциального распределения, по постоянной сумме (уже) взятых выборок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...