从样本中分离两个总体

机器算法验证 数据集 异常值 期望最大化
2022-03-04 19:54:00

我试图从一个数据集中分离两组值。我可以假设其中一个总体是正态分布的,并且至少是样本大小的一半。第二个的值都低于或高于第一个的值(分布未知)。我要做的是找到将正常分布的人口与另一个人封闭起来的上限和下限。

我的假设为我提供了起点:

  • 样本四分位数范围内的所有点均来自正态分布总体。

我正在尝试测试从样本的其余部分中提取的异常值,直到它们不适合正态分布人口的 3 st.dev。这并不理想,但似乎产生了足够合理的结果。

我的假设在统计上是否合理?有什么更好的方法来解决这个问题?

ps请修复标签某人。

4个回答

如果我理解正确,那么您可以将两个法线混合到数据中。有很多 R 包可用于执行此操作。此示例使用mixtools包:

#Taken from the documentation
library(mixtools)
data(faithful)
attach(faithful)

#Fit two Normals
wait1 = normalmixEM(waiting, lambda = 0.5)
plot(wait1, density=TRUE, loglik=FALSE)

这给出了:

两种法线的混合 http://img294.imageshack.us/img294/4213/kernal.jpg

该软件包还包含更复杂的方法 - 检查文档。

  1. 对于 IQR 范围内的数据,您应该使用截断的正态分布(例如 R 包 gamlss.tr)来估计此分布的参数。
  2. 另一种方法是使用具有 2 个或 3 个分量(分布)的混合模型。您可以使用 gamlss.mx 包拟合此类模型(可以为混合物的每个成分指定来自包 gamlss.dist 的分布)。

这假设您甚至不知道第二个分布是否正常;我基本上只关注正态分布来处理这种不确定性。这可能是也可能不是最好的方法。

如果您可以假设两个总体完全分开(即分布 A 中的所有值都小于分布 B 中的所有值),那么一种方法是使用 R 中的 optimize() 函数来搜索断点产生使数据最有可能的正态分布的均值和 sd 的估计值:

#generate completely separated data
a = rnorm(100)
b = rnorm(100,10)
while(!all(a<b)){
    a = rnorm(100)
    b = rnorm(100,10)
}

#create a mix
mix = c(a,b)

#"forget" the original distributions
rm(a)
rm(b)

#try to find the break point between the distributions
break_point = optimize(
    f = function(x){
        data_from_a = mix[mix<x]
        likelihood = dnorm(data_from_a,mean(data_from_a),sd(data_from_a))
        SLL = sum(log(likelihood))
        return(SLL)
    }
    , interval = c(sort(mix)[2],max(mix))
    , maximum = TRUE
)$maximum

#label the data
labelled_mix = data.frame(
    x = mix
    , source = ifelse(mix<break_point,'A','B')
)
print(labelled_mix)

如果您不能假设完全分离,那么我认为您必须为第二个分布假设一些分布,然后使用混合建模。请注意,混合建模实际上不会标记单个数据点,但会为您提供混合比例和每个分布参数的估计值(例如均值、标准差等)。

我很惊讶没有人提出明显的解决方案:

 #generate completely separated data
library(robustbase)
set.seed(123)  
x<-rnorm(200)
x[1:40]<-x[1:40]+10  
x[41:80]<-x[41:80]-10
Rob<-ltsReg(x~1,nsamp="best")
#all the good guys
which(Rob$raw.weights==1)

现在解释一下:ltsRegpackage 中的函数robustbase,当使用选项调用时

nsamp="best"

产生单变量(精确)MCD 权重。(这些是存储在$raw.weights对象中的 n 向量 0-1 权重。识别它们的算法是 MCD 估计器 (1))。

简而言之,对于子集的成员,这些权重为 1h=(n+2)/2最集中的观察。

在第一维中,它首先对所有观察进行排序,然后计算所有连续子集的度量h观察:表示 x(i)ith排序观察向量的条目,它计算
(例如(x(1),...,x(h+1))然后(x(2),...,x(h+2)) 依此类推...)然后保留具有较小度量的那个。

该算法假设您的兴趣组占原始样本的严格多数,并且它具有对称分布(但没有关于剩余样本分布的假设 nh观察)。

(1) PJ 卢梭 (1984)。平方回归的最小中位数,美国统计协会杂志。