Separare due popolazioni dal campione


13

Sto cercando di separare due gruppi di valori da un singolo set di dati. Posso presumere che una delle popolazioni sia normalmente distribuita e abbia almeno la metà della dimensione del campione. I valori del secondo sono entrambi inferiori o superiori ai valori del primo (la distribuzione è sconosciuta). Quello che sto cercando di fare è trovare i limiti superiore e inferiore che racchiudono la popolazione normalmente distribuita dall'altra.

La mia ipotesi mi fornisce il punto di partenza:

  • tutti i punti all'interno dell'intervallo interquartile del campione provengono dalla popolazione normalmente distribuita.

Sto cercando di testare gli outlier che li prendono dal resto del campione fino a quando non rientrano nel terzo livello della popolazione normalmente distribuita. Che non è l'ideale, ma sembra produrre risultati abbastanza ragionevoli.

Il mio presupposto è statisticamente valido? Quale sarebbe un modo migliore per farlo?

ps per favore correggi i tag qualcuno.


Puoi presumere che gli altri due gruppi provengano da diverse distribuzioni normali?
csgillespie,

@cgillespie: è lo stesso gruppo, solo con due modalità, immagino, e quindi probabilmente non posso supporre questo.
SilentGhost,

1
Sai che i membri del secondo gruppo non sono inclusi nel primo gruppo o sei disposto a etichettare erroneamente quei membri come appartenenti al primo gruppo?
Christian,

Risposte:


10

Se ho capito bene, allora puoi semplicemente adattare una miscela di due normali ai dati. Ci sono molti pacchetti R disponibili per farlo. Questo esempio usa il pacchetto 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)

Questo da:

Miscela di due normali http://img294.imageshack.us/img294/4213/kernal.jpg

Il pacchetto contiene anche metodi più sofisticati: controlla la documentazione.


L'immagine che hai allegato è scaduta.
naktinis,

3
  1. Per i dati nell'intervallo IQR è necessario utilizzare la distribuzione normale troncata (ad esempio pacchetto R gamlss.tr) per stimare i parametri di questa distribuzione.
  2. Un altro approccio consiste nell'utilizzare modelli di miscele con 2 o 3 componenti (distribuzioni). È possibile adattare tali modelli utilizzando il pacchetto gamlss.mx (è possibile specificare le distribuzioni dal pacchetto gamlss.dist per ciascun componente della miscela).

2

Ciò presuppone che non si sappia nemmeno se la seconda distribuzione è normale o meno; Fondamentalmente gestisco questa incertezza concentrandomi solo sulla distribuzione normale. Questo potrebbe essere o meno l'approccio migliore.

Se si può presumere che le due popolazioni siano completamente separate (ovvero, tutti i valori dalla distribuzione A sono inferiori a tutti i valori dalla distribuzione B), un approccio consiste nell'utilizzare la funzione optimize () in R per cercare il punto di interruzione che produce stime della media e della sd della distribuzione normale che rendono più probabili i dati:

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

Se non puoi assumere una separazione completa, penso che dovresti assumere una certa distribuzione per la seconda distribuzione e quindi utilizzare la modellazione della miscela. Si noti che la modellazione della miscela non etichetterà effettivamente i singoli punti dati, ma fornirà la proporzione della miscela e le stime dei parametri di ciascuna distribuzione (ad es. Media, sd, ecc.).


optimizerichiede che due distribuzioni siano affiancate a quanto ho capito. Nel mio caso l'uno è all'interno dell'altro, cioè i valori della seconda popolazione sono su entrambi i lati dei limiti.
SilentGhost,

1

Sono sorpreso che nessuno abbia suggerito la soluzione ovvia:

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

Ora per la spiegazione: la ltsRegfunzione nel pacchetto robustbase, quando viene chiamata con l'opzione

nsamp="best"

fornisce i pesi MCD univariati (esatti). (questi sono pesi 0-1 n-vettore memorizzati $raw.weightsnell'oggetto. L'algoritmo per identificarli è lo stimatore MCD (1)).

In breve, questi pesi sono 1 per i membri del sottoinsieme di h=(n+2)/2 osservazioni più concentrate.

Nella dimensione uno, inizia ordinando tutte le osservazioni, quindi calcola la misura di tutti i sottoinsiemi contigui di h osservazioni: denotando X(io) il iothinserendo il vettore di osservazioni ordinate, calcola la misura di
(es(X(1),...,X(h+1)) poi (X(2),...,X(h+2)) e così via ...) quindi mantiene quello con una misura minore.

Questo algoritmo presuppone che il tuo gruppo di interessi contenga una maggioranza rigorosa del campione originale e che abbia una distribuzione simmetrica (ma non vi è alcuna ipotesi sulla distribuzione del rimanente n-h osservazione).

(1) PJ Rousseeuw (1984). Minima regressione mediana dei quadrati, Journal of American Statistical Association.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.