Отделение двух популяций от образца

13

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

Мое предположение дает мне отправную точку:

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

Я пытаюсь проверить выбросы, отбирая их из остальной части выборки, пока они не вписываются в 3-е число в нормально распределенной популяции. Что не идеально, но, кажется, дает достаточно разумный результат.

Является ли мое предположение статистически обоснованным? Что может быть лучше для этого?

ps пожалуйста исправьте теги кого-то.

SilentGhost
источник
Можете ли вы предположить, что две другие группы из разных нормальных распределений?
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

Пакет также содержит более сложные методы - проверьте документацию.

csgillespie
источник
Срок действия прикрепленного изображения истек.
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)).

В двух словах, эти веса равны 1 для членов подмножества часзнак равно(N+2)/2 Наиболее концентрированные наблюдения.

В первом измерении он начинается с сортировки всех наблюдений, а затем вычисляет меру всех смежных подмножеств час наблюдения: обозначает Икс(я) яTчасВвод вектора отсортированных наблюдений, он вычисляет меру
(например,(Икс(1),,,,,Икс(час+1)) тогда (Икс(2),,,,,Икс(час+2)) и так далее ...) затем сохраняет тот с меньшей мерой.

Этот алгоритм предполагает, что ваша группа интересов имеет строгое большинство исходной выборки и имеет симметричное распределение (но нет никакой гипотезы о распределении остальных N-час наблюдение).

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

user603
источник