如何找到正态分布的切割点(有序数据案例)- R

How to find the cutting points of normal distributions (ordered data case) - R

假设我们有 2 个 rnorm,rnorm1 = rnorm(100,0,1)rnorm2 = rnorm(100,1,1) 然后我们定义 input = c(rnorm1, rnorm2).

  1. 我们怎样才能找到这两个分布的切点(在本例中是点 100)并保持输入中的数据有序(根本不改变顺序)?
  2. 此外,如果我们有多个正态分布(比如超过 3 个),我们如何做同样的事情但没有定义分布的数量?

这个问题很困扰我,谁能帮个忙?

对于最简单的情况,您有 2 个分布并且知道每个分布的均值,您可以通过计算每个可能的分界点的(对数)似然来找到分界点:

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)

虽然这只是问题的临时解决方案,但对于更强大的统计过程,您可能需要查看诸如变点分析之类的东西。

如果总体均值未知,您可以使用 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 更普遍地允许搜索断点假设段上的线性回归模型(例如,在简单线性回归的情况下,它可以检测 intercept/slope 的变化)。