如何解释我如何根据核密度估计划分双峰分布

机器算法验证 r 聚类 密度函数 内核平滑
2022-03-22 11:30:11

我有一个双峰人口数据集。它包含一个较小的峰(被认为是“坏”)和一个较大的峰。我尝试将数据的不良部分与其余数据分开。我所做的是:首先我做了一个核密度估计,然后找到这个小峰的局部最大值,以及两个峰之间的坑的局部最小值,然后我取它们的中点(x坐标的算术平均值),并将其定义为截止值。低于这个临界值的所有东西都被认为是“坏的”。我选择中点而不是坑的原因是因为我试图更加保守。

现在我想问:我做的合理吗?如果是,我如何以统计学家喜欢的方式解释我的行为?如果没有,我该如何改变?(欢迎任何其他方法,尤其是在 R 中实现的方法。)谢谢!

这是这个数字。

在此处输入图像描述

3个回答

您可以使用http://cran.r-project.org/web/packages/mixtools/index.html拟合双组分混合模型尝试使用 normalmixEM。然后,您可以按照 Erich Schubert 的建议,找到 Pr[数据点从具有较小平均值的组件生成] >= 0.50 的区域。

编辑:示例 R 代码:

library(mixtools)

simulate <- function(lambda=0.3, mu=c(0, 4), sd=c(1, 1), n.obs=10^5) {
    x1 <- rnorm(n.obs, mu[1], sd[1])
    x2 <- rnorm(n.obs, mu[2], sd[2])    
    return(ifelse(runif(n.obs) < lambda, x1, x2))
}

x <- simulate()

model <- normalmixEM(x=x, k=2)
index.lower <- which.min(model$mu)  # Index of component with lower mean

find.cutoff <- function(proba=0.5, i=index.lower) {
    ## Cutoff such that Pr[drawn from bad component] == proba
    f <- function(x) {
        proba - (model$lambda[i]*dnorm(x, model$mu[i], model$sigma[i]) /
                     (model$lambda[1]*dnorm(x, model$mu[1], model$sigma[1]) + model$lambda[2]*dnorm(x, model$mu[2], model$sigma[2])))
        }
        return(uniroot(f=f, lower=-10, upper=10)$root)  # Careful with division by zero if changing lower and upper
}

cutoffs <- c(find.cutoff(proba=0.5), find.cutoff(proba=0.75))  # Around c(1.8, 1.5)

hist(x)
abline(v=cutoffs, col=c("red", "blue"), lty=2)

如果您还估计了两者的“高度”(实际上是更多的重量),然后将阈值设置为临界点,这可能会更有意义。

即将数据建模为

p1pdf(x,μ1,σ1)+p2pdf(x,μ2,σ2)

并将阈值设置为x在哪里

p1pdf(x,μ1,σ1)=p2pdf(x,μ2,σ2)

即对象有相同的机会属于两个类。

您仍然可以添加一个参数来调整您的方法的保守程度,例如使用

p1pdf(x,μ1,σ1)=cp2pdf(x,μ2,σ2)

在哪里c=2会给第二个分布加倍权重。

我正在使用此示例,有时会出现此错误

uniroot 中的错误(f = f,lower = -10,upper = 10):端点处的 f() 值不是相反的符号

所以我将较低的值更改为-1,并且对于某些数据集它修复了它,但在其他数据集上仍然出错。不确定是否可以根据输入向量(即 x)动态设置?