7 votos

La distancia entre empíricamente generado distribuciones (en R)

Yo no soy un estadístico, pero yo a veces tengo que jugar con los datos. Tengo dos conjuntos de datos, listas de valores en la unidad de intervalo. He representado como histogramas, así que tengo una idea intuitiva de lo "lejos" que son. Pero quiero algo un poco más formal.

Mi primer pensamiento fue simplemente la suma de las diferencias de los valores en los contenedores, pero este no es satisfactoria. Entonces pensé en tomar una de tres bin promedio y la suma de las diferencias respecto de estos. (Disculpas si me estoy destrozando las estadísticas de la terminología)

Pero yo estaba pensando probablemente estoy reinventando la rueda, así que vine aquí. Preguntas similares, parece, a la "prueba de Kolmogorov Smirnov pruebas" o algo así.

Así que mi pregunta es esta: ¿es este el método adecuado para calcular la medida de estos conjuntos de datos son aparte? Y no hay una manera fácil de hacer esto en R? Idealmente ubicado KStest(data1,data2) o algo así.

Editar destacar, estoy particularmente interesado en maneras para medir hasta qué punto los datos están separados directamente en lugar de ajuste de una distribución a cada uno y luego medir la distancia entre las distribuciones. [¿Que sentido? Supongo cálculos numéricos en R se hará mediante el muestreo de una distribución de todos modos...]

7voto

Kevin Ballard Puntos 88866

Usted puede hacer una prueba de Kolmogorov-Smirnov el uso de la ks.test función. Ver ?ks.test.

En general, cuando usted está buscando para una función en R (y usted no sabe su nombre) intenta utilizar ??. Por ejemplo, ??"Kolmogorov Smirnov". Si no aparece nada RSiteSearch("whatever you're looking for") debería ayudar :)

4voto

J Wynia Puntos 4679

Primero : definir la "distancia". Suena como una pregunta estúpida, pero ¿a qué te refieres como la distancia? Los datos vinculados? Entonces -y sólo entonces tiene sentido mirar a la suma de (al cuadrado) de las diferencias, para decidir acerca de la distancia entre dos conjuntos de datos. Si no, usted tiene que recurrir a otros medios.

La siguiente pregunta es : se distribuyen los datos en la misma forma? Si es así, usted puede ver la diferencia entre los medios como el "cambio de ubicación" de los datos (o la distancia entre los dos conjuntos de datos).

Pero si ninguno de los dos es verdadero, ¿cómo se puede definir la distancia entre los conjuntos de datos? ¿Toma usted la forma de la distribución en cuenta, por ejemplo? Usted realmente tiene que pensar acerca de los temas antes de intentar calcular una distancia.

Este dijo : Uno (ingenuo) posibilidad es utilizar la media de las diferencias entre todos los posibles de x-y combinaciones. Formalizó este es :

$$Dist=\sqrt{\frac{1}{n_1 n_2}\sum_{i=1}^{n_1} \sum_{j=1}^{n_2}(X_i - Y_j)^2}$$

En R :

x <- rnorm(10)
y <- rnorm(10,2)
sqrt(mean(outer(x,y,"-")^2))

Si permiten negativo distancias, puede colocar la raíz cuadrada y el ^2 :

mean(outer(x,y,"-"))

Una simulación muestra fácilmente que este va a dar, de hecho, la diferencia entre los medios en el ejemplo, ya que ambas distribuciones son iguales en este caso. Pero se advirtió que la negativa de las distancias no son permitidos en muchas aplicaciones. En el primer caso, el número será siempre un poco más grande que la diferencia entre la media. En cualquier caso, si usted está interesado en la diferencia entre el centro de sus bases de datos, definir el centro y calcular la diferencia entre los centros. Que muy bien podría ser lo que usted está después.

Contrariamente a las otras propuestas, este enfoque no hacer suposiciones acerca de la distribución de los datos. Lo que la hace aplicable en todas las situaciones, pero también difícil de interpretar.

4voto

Eggs McLaren Puntos 945

Una forma estándar para comparar las distribuciones es el uso de la Kullback-Leibler divergencia. Como de costumbre, hay un paquete de R que hace esto para usted! De la ?KLdiv página de ayuda en la flexmix paquete, se obtiene el siguiente fragmento de código:

## Gaussian and Student t are much closer to each other than
## to the uniform:
> library(flexmix)
> x = seq(-3, 3, length=200)
> y = cbind(u=dunif(x), n=dnorm(x), t=dt(x, df=10))
> matplot(x, y, type="l")

> round(KLdiv(y),3)
      u     n     t
u 0.000 1.082 1.108
n 4.661 0.000 0.004
t 4.686 0.005 0.000

Observe que la comparación no es simétrica: de manera uniforme vs Normal es diferente de la Normal vs Uniforme.

Usted no explicó por qué quería comparar las distribuciones. Dando un caso de uso puede obtener más respuestas específicas.

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