如何找到正态分布的切割点(有序数据案例)- 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).
- 我们怎样才能找到这两个分布的切点(在本例中是点 100)并保持输入中的数据有序(根本不改变顺序)?
- 此外,如果我们有多个正态分布(比如超过 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 的变化)。
假设我们有 2 个 rnorm,rnorm1 = rnorm(100,0,1) 和 rnorm2 = rnorm(100,1,1) 然后我们定义 input = c(rnorm1, rnorm2).
- 我们怎样才能找到这两个分布的切点(在本例中是点 100)并保持输入中的数据有序(根本不改变顺序)?
- 此外,如果我们有多个正态分布(比如超过 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 的变化)。