假设我们有2个rnorm,rnorm1 = rnorm(100,0,1)和rnorm2 = rnorm(100,1,1)然后我们定义input = c(rnorm1,rnorm2)。
这个问题真让我烦恼,任何人都可以帮忙吗?
对于最简单的情况,如果您有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
更一般地允许搜索断点,假设片段上的线性回归模型(例如,它可以在简单线性回归的情况下检测截距/斜率的变化)。