Memisahkan dua populasi dari sampel

13

Saya mencoba memisahkan dua kelompok nilai dari satu set data. Saya dapat berasumsi bahwa salah satu populasi terdistribusi secara normal dan setidaknya setengah dari ukuran sampel. Nilai yang kedua sama-sama lebih rendah atau lebih tinggi dari nilai dari yang pertama (distribusi tidak diketahui). Yang saya coba lakukan adalah menemukan batas atas dan bawah yang akan menyertakan populasi yang berdistribusi normal dari yang lain.

Asumsi saya memberi saya titik awal:

  • semua titik dalam kisaran interkuartil sampel berasal dari populasi yang berdistribusi normal.

Saya mencoba untuk menguji outlier mengambil mereka dari sisa sampel sampai mereka tidak masuk ke dalam 3 st.dev dari populasi yang terdistribusi normal. Yang tidak ideal, tetapi tampaknya menghasilkan hasil yang cukup masuk akal.

Apakah asumsi saya secara statistik masuk akal? Apa cara yang lebih baik untuk melakukan ini?

ps tolong perbaiki tag seseorang.

SilentGhost
sumber
Dapatkah Anda berasumsi bahwa dua kelompok lainnya berasal dari distribusi Normal yang berbeda?
csgillespie
@cgillespie: itu adalah grup yang sama, hanya dengan dua mode, saya kira, dan karena itu saya mungkin tidak dapat menganggap ini.
SilentGhost
1
Apakah Anda tahu bahwa anggota kelompok kedua tidak termasuk dalam kelompok pertama atau apakah Anda hanya secara keliru memberi label anggota tersebut sebagai milik kelompok pertama?
Christian

Jawaban:

10

Jika saya mengerti dengan benar, maka Anda bisa memasukkan campuran dua Normals ke data. Ada banyak paket R yang tersedia untuk melakukan ini. Contoh ini menggunakan paket 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)

Ini memberi:

Campuran dua Normals http://img294.imageshack.us/img294/4213/kernal.jpg

Paket ini juga berisi metode yang lebih canggih - periksa dokumentasi.

csgillespie
sumber
Gambar yang Anda lampirkan telah kedaluwarsa.
naktinis
3
  1. Untuk data dalam rentang IQR Anda harus menggunakan distribusi normal terpotong (misalnya paket R gamlss.tr) untuk memperkirakan parameter distribusi ini.
  2. Pendekatan lain adalah menggunakan model campuran dengan 2 atau 3 komponen (distribusi). Anda dapat memasukkan model-model tersebut menggunakan paket gamlss.mx (distribusi dari paket gamlss.dist dapat ditentukan untuk setiap komponen campuran).
Wojtek
sumber
2

Ini mengasumsikan bahwa Anda bahkan tidak tahu apakah distribusi kedua normal atau tidak; Saya pada dasarnya menangani ketidakpastian ini dengan hanya berfokus pada distribusi normal. Ini mungkin atau mungkin bukan pendekatan terbaik.

Jika Anda dapat mengasumsikan bahwa dua populasi benar-benar dipisahkan (yaitu, semua nilai dari distribusi A lebih kecil dari semua nilai dari distribusi B), maka salah satu pendekatan adalah menggunakan fungsi optimisasi () dalam R untuk mencari titik-break yang Menghasilkan estimasi rata-rata dan sd dari distribusi normal yang membuat data paling mungkin:

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

Jika Anda tidak dapat mengasumsikan pemisahan lengkap, maka saya pikir Anda harus mengasumsikan beberapa distribusi untuk distribusi kedua dan kemudian menggunakan pemodelan campuran. Perhatikan bahwa pemodelan campuran sebenarnya tidak akan memberi label titik data individu, tetapi akan memberi Anda proporsi campuran dan perkiraan parameter dari setiap distribusi (mis. Mean, sd, dll.).

Mike Lawrence
sumber
optimizemembutuhkan dua distribusi untuk berdampingan seperti yang saya mengerti. Dalam kasus saya satu ada di dalam yang lain, yaitu, nilai-nilai dari populasi kedua berada di kedua sisi batas.
SilentGhost
1

Saya terkejut tidak ada yang menyarankan solusi yang jelas:

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

Sekarang untuk penjelasan: ltsRegfungsi dalam paket robustbase, ketika dipanggil dengan opsi

nsamp="best"

menghasilkan bobot MCD univariat (tepat). (Ini adalah n-vektor 0-1 bobot yang disimpan dalam $raw.weightsobjek. Algoritma untuk mengidentifikasi mereka adalah penaksir MCD (1)).

Singkatnya, bobot ini adalah 1 untuk anggota subset dari h=(n+2)/2 kebanyakan pengamatan terkonsentrasi.

Dalam dimensi satu, itu dimulai dengan menyortir semua pengamatan kemudian menghitung ukuran semua himpunan bagian yang berdekatan h pengamatan: menunjukkan x(saya) itu sayathentri vektor pengamatan diurutkan, itu menghitung ukuran
(misalnya(x(1),...,x(h+1)) kemudian (x(2),...,x(h+2)) dan sebagainya ...) lalu simpan yang berukuran lebih kecil.

Algoritma ini mengasumsikan bahwa grup minat Anda merupakan mayoritas ketat dari sampel asli dan memiliki distribusi simetris (tetapi tidak ada hipotesis pada distribusi sisanya). n-h pengamatan).

(1) PJ Rousseeuw (1984). Median regresi kuadrat, Jurnal Asosiasi Statistik Amerika.

pengguna603
sumber