从样本中分离出两个总体


13

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

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

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

我正在尝试测试是否将异常值从样本的其余部分中提取出来,直到它们不适合正态分布总体的第3个标准差。这不是理想的,但似乎会产生足够的结果。

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

ps请修复某人的标签。


您可以假设其他两组来自不同的正态分布吗?
csgillespie 2010年

@cgillespie:我猜这是同一组,只有两种模式,因此我可能无法假设。
SilentGhost

1
您是否知道第二组的成员未包含在第一组中?或者您只是愿意错误地将这些成员标记为属于第一组?
克里斯蒂安

Answers:


10

如果我理解正确,则可以将两个法线的混合拟合到数据中。有很多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
您附加的图像已过期。
naktinis 2015年

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

2

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

如果您可以假设两个总体完全分开(即,分布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)

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


optimize据我所知,需要两个分布是并行的。在我的情况下,一个在另一个内部,即第二个总体的值在限制的两侧。
SilentGhost

1

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

 #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,当使用option调用时

nsamp="best"

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

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

在维度中的一个,它开始通过排序所有观察然后计算的所有连续的子集的度量意见:表示 的排序观测的向量的条目,它计算的度量 (例如然后 等... ),然后保留较小的尺寸。X ħX 1 X ħ + 1 X 2 X ħ + 2 hx(i)ith
(x(1),...,x(h+1))(x(2),...,x(h+2))

该算法假设您的兴趣组对原始样本进行了严格的编号,并且它具有对称的分布(但对其余观测的分布没有假设 )。nh

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.