Как рассчитать x-значения свертки двух распределений? - PullRequest
0 голосов
/ 18 мая 2018

(Этот вопрос может подойти для https://stats.stackexchange.com/,, но я думаю, что именно как вы рассчитываете то, что я хочу в R, это мой вопрос).

Я пытаюсьдобавьте несколько дистрибутивов вместе, а затем посмотрите на полученный дистрибутив.Я проиллюстрирую мою проблему на простом примере с использованием нормально распределенных случайных величин p1 и p2.

set.seed(21)
N <- 1000

p1 <- rnorm(N, mean = 0, sd = 1)
p2 <- rnorm(N, mean = 10, sd = 1)

, которые мы можем построить:

data.frame(p1, p2) %>%
  gather(key="dist", value="value") %>%
  ggplot(aes(value, color=dist)) + geom_density()

enter image description here

Я могу добавить эти распределения вместе, используя convolve.Хорошо, так что все в порядке.Но что я не могу понять, так это как построить график суммирования распределений с соответствующими значениями x.В примерах, которые я видел, похоже, что значения x добавляются вручную способом, который не кажется «точным» из-за отсутствия лучшей работы.См. Пример .

Я могу «сложить» их вместе и построить график:

pdf.c <- convolve(pdf1.y, pdf2.y, type = "open")

plot(pdf.c, type="l")

enter image description here

У меня вопрос, как получить соответствующие значения x нового дистрибутива.Я уверен, что что-то упущено с точки зрения основополагающей статистики.

Приложение для pdf1 и pdf2:

set.seed(21)
N <- 1000

p1 <- rnorm(N, mean = 0, sd = 1)
p2 <- rnorm(N, mean = 10, sd = 1)

pdf1.x <- density(p1)$x
pdf2.x <- density(p2)$x

pdf1.y <- density(p1)$y / sum(density(p1)$y)
pdf2.y <- density(p2)$y / sum(density(p2)$y)

df1 <- data.frame(pdf.x = pdf1.x, pdf.y = pdf1.y, dist = "1", stringsAsFactors = FALSE)
df2 <- data.frame(pdf.x = pdf2.x, pdf.y = pdf2.y, dist = "2", stringsAsFactors = FALSE)

df <- bind_rows(df1, df2)

1 Ответ

0 голосов
/ 19 мая 2018

Предполагая, что p1 и p2 дискретизируются равномерно с одинаковым интервалом dx между последовательными значениями x.(Я вижу, что вы разделили p1 и p2 в случайных точках - это не одно и то же, и, не задумываясь об этом, у меня нет ответа на этот вопрос.) Пусть x1 = x1_0 + (k - 1)времена dx, k = 1, 2, 3, ..., n1 - это точки, в которых дискретизируется p1, и x2 = x2_0 + (k - 1) раз dx, k = 1, 2, 3, ...,n2 - это точки, в которых дискретизируется p2.

Каждая точка xi_k = xi_0 + (k - 1) раз dx представляет центральную точку стержня с шириной dx и высотой pi (xi_k), i = 1, 2. Таким образом, масса стержня dx умножена на pi (xi_k), а общая масса для всех стержней приближается к 1, когда dx приближается к 0. Эти массы являются значениями, которые являются свернутыми.Если дискретизированные массы нормализованы до 1, то их свертка также будет нормализована до 1.

Чтобы быть очень осторожным, диапазон, в котором дискретизируются распределения, составляет от xi_0 - dx / 2 до xi_0 + (ni -1) раз дх + дх / 2.После вычисления свертки диапазон для результата также равен -dx / 2 и + dx / 2 для первой и последней точек соответственно.

Свертка имеет n = n1 + n2 - 1 балл, а именно x1_0 +x2_0 + (k - 1) раз dx, k = 1, 2, 3, ..., n1 + n2 - 1. Первая точка - x1_0 + x2_0 (т. е. первая точка для p1 плюс первая точка для p2) и последняяточка равна x1_0 + x2_0 + (n1 + n2 - 2) раз dx = (x1_0 + (n1 - 1) раз dx) + (x2_0 + (n2 - 1) раз dx) (т. е. последняя точка для p1 плюс последняя точка для p2).Из этого вы можете построить значения x, соответствующие свертке, через функцию seq или что-то в этом роде.

...