Виділення двох сукупностей від вибірки


13

Я намагаюся відокремити дві групи значень з одного набору даних. Я можу припустити, що одна з популяцій зазвичай розподілена і становить щонайменше половину розміру вибірки. Значення другого є і нижчими, або вищими, ніж значення першого (розподіл невідомий). Що я намагаюся зробити - це знайти верхню і нижню межі, які охоплювали б нормально розподілене населення від іншого.

Моє припущення надає мені вихідну точку:

  • всі точки міжквартильного діапазону вибірки походять із нормально розподіленої сукупності.

Я намагаюсь перевірити на інших людей, які беруть їх з решти вибірки, поки вони не впишуться в 3 ст.дев нормально розподіленої сукупності. Що не ідеально, але, здається, дає достатньо розумний результат.

Чи моє припущення статистично обгрунтоване? Який був би кращий шлях для цього?

ps виправте теги комусь.


Чи можете ви припустити, що інші дві групи є різними нормальними розподілами?
csgillespie

@cgillespie: гадаю, це одна і та ж група, тільки з двома режимами, і тому я, мабуть, не можу цього припустити.
SilentGhost

1
Чи знаєте ви, що члени другої групи не входять до першої групи або ви просто готові помилково позначити цих членів як належать до першої групи?
Крістіан

Відповіді:


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

3
  1. Для даних діапазону IQR слід використовувати усічений нормальний розподіл (наприклад, пакет R gamlss.tr) для оцінки параметрів цього розподілу.
  2. Інший підхід - використання моделей сумішей з 2 або 3 компонентами (розподілами). Ви можете підходити до таких моделей, використовуючи пакет gamlss.mx (розподіли з пакету gamlss.dist можна вказати для кожного компонента суміші).

2

Це передбачає, що ви навіть не знаєте, нормальний чи другий розподіл; Я в основному вирішую цю невизначеність, зосереджуючись лише на нормальному розподілі. Це може бути чи не найкращим підходом.

Якщо ви можете припустити, що дві сукупності повністю відокремлені (тобто всі значення з розподілу A менше, ніж усі значення з розподілу B), тоді один підхід полягає у використанні функції optimize () в R для пошуку точки перелому, яка дає оцінки середнього і 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)

Якщо ви не можете припустити повне розділення, я думаю, вам доведеться припустити деякий розподіл для другого розподілу, а потім використовувати моделювання суміші. Зауважте, що моделювання суміші фактично не позначає окремі точки даних, але дасть вам співвідношення суміші та оцінки параметрів кожного розподілу (наприклад, середнє значення, sd тощо).


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)

Тепер для пояснення: ltsRegфункція в пакеті robustbase, коли викликається з опцією

nsamp="best"

дає одноманітні (точні) ваги MCD. (це n-векторні ваги 0-1, що зберігаються в $raw.weightsоб'єкті. Алгоритм їх ідентифікації - це оцінювач MCD (1)).

год=(н+2)/2

годх(i)iтгод
(х(1),...,х(год+1))(х(2),...,х(год+2))

н-год

(1) PJ Rousseeuw (1984). Найменша медіана регресії квадратів, Журнал Американської статистичної асоціації.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.