Как найти точки среза нормальных распределений (случай упорядоченных данных) - R - PullRequest
0 голосов
/ 22 февраля 2019

Предположим, у нас есть 2 rnorm, rnorm1 = rnorm (100,0,1) и rnorm2 = rnorm (100,1,1) , а затем мы определяем input= c (rnorm1, rnorm2) .

  1. Как мы можем найти точку среза (в данном случае это точка 100) этих 2 распределений и сохранить данные на входе в порядке (без изменения порядка)?
  2. Более того, если у нас есть несколько нормальных распределений (скажем, более 3), как мы можем сделать то же самое, но не определяя количество распределений?

Этот вопрос действительно беспокоит меня, кто-нибудь может оказать услугу?

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Если средство заполнения неизвестно, вы можете использовать пакет strucchange.

Пример, предполагающий уникальную точку останова:

library(strucchange)
set.seed(666)
y <- c(rnorm(100,0,1), rnorm(100,1,1))
bp <- breakpoints(y ~ 1, breaks = 1) # assume a unique breakpoint
bp$breakpoints
# 102

Если нет предположения о количестве точек останова:

library(strucchange)
set.seed(666)
y <- c(rnorm(100,0,1), rnorm(100,1,1), rnorm(100,0,1))
bp <- breakpoints(y ~ 1, breaks = NULL) # unknown number of breakpoints
bp$breakpoints
# 102, 213

changepoint - еще один пакет для обнаружения точек останова.

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

0 голосов
/ 22 февраля 2019

В простейшем случае, когда у вас есть 2 распределения и вы знаете средние значения каждого, вы можете найти точку отсечения, рассчитав (log) вероятность для каждой возможной точки отсечения:

x = rnorm(100, 0, 1)
y = rnorm(100, 1, 1)
combined = c(x, y)

log_lik = function(cutpoint) {
    part1 = combined[1:cutpoint]
    part2 = combined[(cutpoint + 1):length(combined)]
   sum(dnorm(part1, mean = 0, log = TRUE)) +
    sum(dnorm(part2, mean = 1, log = TRUE))
}

res = sapply(1:length(combined), log_lik)
plot(res)
which.max(res)

Это простоТем не менее, для более точных статистических процедур вы, вероятно, захотите взглянуть на что-то вроде анализа точек изменения.

...