14 votos

La separación de dos poblaciones de la muestra

Estoy tratando de separar a los dos grupos de valores a partir de un único conjunto de datos. Puedo asumir que una de las poblaciones normalmente distribuidas y es menos de la mitad del tamaño de la muestra. Los valores de la segunda son inferiores o superiores a los valores de la primera (la distribución es desconocida). Lo que estoy tratando de hacer es encontrar los límites superior e inferior que podría encerrar la que normalmente distribuida a la población de los otros.

Mi suposición me dan con el punto de partida:

  • todos los puntos dentro del rango intercuartil de la muestra son de los que normalmente distribuida a la población.

Estoy tratando de prueba para los valores atípicos tomarlos desde el resto de la muestra hasta que no encajan dentro de los 3 pt.dev de la que normalmente distribuida a la población. Que no es lo ideal, pero no parecen producir suficientemente razonables como resultado.

Es mi suposición estadísticamente sonido? ¿Cuál sería una mejor manera de ir sobre esto?

p.s. por favor, corrija las etiquetas a alguien.

10voto

Eggs McLaren Puntos 945

Si entiendo correctamente, entonces usted puede ajustar una mezcla de dos Normales a los datos. Hay un montón de R paquetes que están disponibles para ello. En este ejemplo se utiliza la mixtools paquete:

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

Esto nos da:

Mixture of two Normals

El paquete también contiene métodos más sofisticados - verificación de la documentación.

3voto

Kev Puntos 60744
  1. Para los datos en IQR rango que debe utilizar trunca distribución normal (para ejemplo de paquete de R gamlss.tr) estimar los parámetros de este de distribución.
  2. Otro enfoque es el uso de modelos de mezcla con 2 o 3 componentes (distribuciones). Puede ajustar estos modelos utilizando gamlss.paquete mx (distribuciones de paquete gamlss.dist puede ser especificado para cada componente de la mezcla).

2voto

Matt Mitchell Puntos 17005

Esto supone que ni siquiera sé si la segunda distribución es normal o no; yo, básicamente, manejar esta incertidumbre por centrarse sólo en la distribución normal. Esto puede o no puede ser el mejor enfoque.

Si se puede asumir que las dos poblaciones son completamente separados (es decir, todos los valores de Una distribución son menos de la totalidad de los valores de la distribución B), entonces una solución es utilizar el optimizar() en función de R para buscar el punto de ruptura que produce estimaciones de la media y la desviación estándar de la distribución normal que hagan que los datos más probable es:

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

Si usted no puede asumir la completa separación, entonces creo que tendrás que asumir algunos de distribución para la distribución en segundo y, a continuación, utilizar la mezcla de modelado. Tenga en cuenta que la mezcla de la modelización de la realidad no de la etiqueta de los puntos de datos individuales, pero le dará a usted la mezcla en la proporción y las estimaciones de los parámetros de cada distribución (por ejemplo. media, sd, etc).

1voto

Patrick Puntos 183

Me sorprende que nadie sugirió que la solución obvia:

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

Ahora la explicación: el ltsReg función en el paquete robustbase, cuando se llama con la opción de

nsamp="best"

los rendimientos de la univariante (exacta) MCD pesos. (estos son un n-vector 0-1 pesos almacenados en la $raw.weights objeto. El algoritmo para identificarlos es el MCD estimador de (1)).

En pocas palabras, estos pesos son 1 para el los miembros del subconjunto de $h=\lceil(n+2)/2\rceil$ más concentrado observaciones.

En la dimensión uno, se inicia con la clasificación de todos los observaciones, a continuación, calcula la medida de todas las contiguo subconjuntos de a $h$ observaciones: denota $x_{(i)}$ $i^{th}$ entrada del vector de ordenadas observaciones, calcula la medida de
(por ejemplo, $(x_{(1)},...,x_{(h+1)})$ $(x_{(2)},...,x_{(h+2)})$ y así sucesivamente...) entonces conserva el uno con menor medida.

Este algoritmo asume que su grupo de interés de los números una estricta mayoría de la muestra original y que tiene una distribución simétrica (pero no ninguna hipótesis sobre la distribución de los restantes $n-h$ observación).

(1) P. J. Rousseeuw (1984). Menos de la mediana de los cuadrados de la regresión, Diario de la Asociación Americana de Estadística.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X