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

问题描述 投票:0回答:2

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

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

这个问题真让我烦恼,任何人都可以帮忙吗?

r time-series cut normal-distribution
2个回答
0
投票

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

这只是问题的临时解决方案,但对于更强大的统计过程,您可能希望查看类似变换点分析的内容。


0
投票

如果人口手段未知,您可以使用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更一般地允许搜索断点,假设片段上的线性回归模型(例如,它可以在简单线性回归的情况下检测截距/斜率的变化)。

© www.soinside.com 2019 - 2024. All rights reserved.