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



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

  1. 我们如何找到这两个分布的切割点(在这种情况下为点100),将数据保留在输入有序中(完全不更改顺序)?
  2. 更重要的是,如果我们有多个普通分布(例如3个以上),我们该怎么做同样的事情,但是不定义分布的数量

这个问题真的困扰着我,有人可以帮忙吗?

对于最简单的情况,您有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)

这只是解决问题的一个临时解决方案,对于更强大的统计过程,您可能想查看像更改点分析的内容。

如果人口含义未知,则可以使用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通常允许在段上假设线性回归模型的断点(例如,在简单线性回归的情况下,它可以检测到截距/斜率的更改)。

最新更新