İki popülasyonun örnekten ayrılması


13

İki grup veri tek bir veri kümesinden ayırmaya çalışıyorum. Popülasyonlardan birinin normal olarak dağıldığını ve numunenin en az yarısı kadar olduğunu varsayabilirim. İkincisinin değerleri, birincinin değerlerinden daha düşük veya daha yüksektir (dağılım bilinmemektedir). Ne yapmaya çalışıyorum normal dağıtılmış nüfusu diğerine kapsayacak üst ve alt sınırları bulmaktır.

Benim varsayım bana başlangıç ​​noktası sağlar:

  • örneğin çeyrekler arası aralığı içindeki tüm noktalar normal olarak dağılmış popülasyondan gelir.

Ben normalde dağılmış popülasyonun 3 st. Hangi ideal değil, ama yeterince makul sonuç üretiyor gibi görünüyor.

Varsayım istatistiksel olarak sağlam mı? Bununla ilgili daha iyi bir yol ne olabilir?

ps lütfen etiketleri birini düzeltin.


Diğer iki grubun farklı Normal dağılımlardan olduğunu varsayabilir misiniz?
csgillespie

@cgillespie: Aynı grup, sadece iki modla, sanırım ve bu yüzden muhtemelen bunu kabul edemem.
SilentGhost

1
İkinci grubun üyelerinin ilk gruba dahil olmadığını veya bu üyeleri yanlışlıkla ilk gruba ait olarak etiketlemeye istekli misiniz?
Christian

Yanıtlar:


10

Doğru anlarsam, verilere iki Normalin bir karışımını yerleştirebilirsiniz. Bunu yapmak için birçok R paketi vardır. Bu örnekte mixtools paketi kullanılmaktadır:

#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)

Bu şunu verir:

İki Normalin karışımı http://img294.imageshack.us/img294/4213/kernal.jpg

Paket ayrıca daha karmaşık yöntemler içerir - belgelere bakın.


1
Eklediğiniz resmin süresi doldu.
naktinis

3
  1. IQR aralığındaki veriler için, bu dağılımın parametrelerini tahmin etmek üzere kesilmiş normal dağılımı (örneğin R paketi gamlss.tr) kullanmalısınız.
  2. Başka bir yaklaşım, 2 veya 3 bileşenli (dağılımlar) karışım modelleri kullanmaktır. Bu modelleri gamlss.mx paketini kullanarak sığdırabilirsiniz (karışımın her bileşeni için gamlss.dist paketinden dağıtımlar belirtilebilir).

2

Bu, ikinci dağılımın normal olup olmadığını bilmediğinizi varsayar; Temel olarak bu belirsizliği sadece normal dağılıma odaklanarak ele alıyorum. Bu en iyi yaklaşım olabilir veya olmayabilir.

İki popülasyonun tamamen ayrıldığını varsayabilirseniz (yani, A dağıtımındaki tüm değerler B dağıtımındaki tüm değerlerden daha azdır), o zaman bir yaklaşım, kesme noktasını aramak için R'deki optimize () işlevini kullanmaktır. verileri en olası kılan normal dağılımın ortalamasının ve sd'sinin tahminlerini verir:

#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)

Tam bir ayrılma olduğunu varsayamazsanız, ikinci dağıtım için bir miktar dağıtım üstlenmeniz ve daha sonra karışım modellemesi kullanmanız gerektiğini düşünüyorum. Karışım modellemesinin aslında tek tek veri noktalarını etiketlemeyeceğini, ancak her bir dağılımın parametrelerinin (örneğin, ortalama, sd, vb.) Karışım oranını ve tahminlerini vereceğini unutmayın.


optimizeanladığım kadarıyla iki dağıtımın yan yana olmasını gerektirir. Benim durumumda biri diğerinin içindedir, yani ikinci popülasyondan gelen değerler sınırların her iki tarafındadır.
SilentGhost

1

Kimse bariz bir çözüm önermedi:

 #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)

Şimdi açıklama için: seçenekle çağrıldığında ltsRegpaketteki işlevrobustbase

nsamp="best"

tek değişkenli (tam) MCD ağırlıklarını verir. (bunlar $raw.weightsnesnede saklanan n-vektör 0-1 ağırlıklarıdır . Bunları tanımlamak için kullanılan algoritma MCD tahmincisidir (1)).

Özetle, bu ağırlıklar en konsantre gözlemlerin alt kümesinin üyeleri için .h=(n+2)/2

Boyut birinde, daha sonra tüm bitişik alt kümelerine ölçüsünü hesaplar tüm gözlemler sıralama başlar belirten: gözlem sıralanmış gözlemler vektörün giriş, bu ölçü hesaplar ( örneğin sonra vb. ) daha sonra küçük olanı tutar.x ( i ) ı t h ( x ( 1 ) , . . . , x ( h + 1 ) ) ( X ( 2 ) , . . . , x ( h + 2 ) )hx(i)ith
(x(1),...,x(h+1))(x(2),...,x(h+2))

Bu algoritma, ilgi grubunuzun orijinal örneğin katı bir çoğunluğunu oluşturduğunu ve simetrik bir dağılımı olduğunu varsayar (ancak kalan gözleminin dağılımı hakkında herhangi bir hipotez yoktur ).nh

(1) PJ Rousseeuw (1984). En küçük kareler regresyon medyanı, Amerikan İstatistik Derneği Dergisi.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.