OK, he revisado ampliamente esta respuesta. Creo que en lugar de agrupar sus datos y comparar recuentos en cada contenedor, la sugerencia que había enterrado en mi respuesta original de ajustar una estimación de densidad de kernel 2d y compararlos es una idea mucho mejor. Aún mejor, hay una función kde.test () en el paquete ks de Tarn Duong para R que lo hace tan fácil como un pastel.
Consulte la documentación de kde.test para obtener más detalles y los argumentos que puede modificar. Pero básicamente hace exactamente lo que quieres. El valor p que devuelve es la probabilidad de generar los dos conjuntos de datos que está comparando bajo la hipótesis nula de que se estaban generando a partir de la misma distribución. Por lo tanto, cuanto mayor sea el valor p, mejor será el ajuste entre A y B. Vea mi ejemplo a continuación, donde esto fácilmente identifica que B1 y A son diferentes, pero que B2 y A son plausiblemente iguales (que es cómo se generaron) .
# generate some data that at least looks a bit similar
generate <- function(n, displ=1, perturb=1){
BV <- rnorm(n, 1*displ, 0.4*perturb)
UB <- -2*displ + BV + exp(rnorm(n,0,.3*perturb))
data.frame(BV, UB)
}
set.seed(100)
A <- generate(300)
B1 <- generate(500, 0.9, 1.2)
B2 <- generate(100, 1, 1)
AandB <- rbind(A,B1, B2)
AandB$type <- rep(c("A", "B1", "B2"), c(300,500,100))
# plot
p <- ggplot(AandB, aes(x=BV, y=UB)) + facet_grid(~type) +
geom_smooth() + scale_y_reverse() + theme_grey(9)
win.graph(7,3)
p +geom_point(size=.7)
> library(ks)
> kde.test(x1=as.matrix(A), x2=as.matrix(B1))$pvalue
[1] 2.213532e-05
> kde.test(x1=as.matrix(A), x2=as.matrix(B2))$pvalue
[1] 0.5769637
MI RESPUESTA ORIGINAL A CONTINUACIÓN, SE GUARDA SOLO PORQUE AHORA HAY ENLACES DESDE OTRA PARTE QUE NO TENDRÁ SENTIDO
Primero, puede haber otras formas de hacerlo.
Justel y col. han presentado una extensión multivariada de la prueba de bondad de ajuste de Kolmogorov-Smirnov que creo que podría usarse en su caso, para probar qué tan bien se ajusta cada conjunto de datos modelados al original. No pude encontrar una implementación de esto (por ejemplo, en R) pero tal vez no busqué lo suficiente.
Alternativamente, puede haber una manera de hacer esto ajustando una cópula tanto a los datos originales como a cada conjunto de datos modelados, y luego comparando esos modelos. Hay implementaciones de este enfoque en R y otros lugares, pero no estoy especialmente familiarizado con ellos, así que no lo he intentado.
Pero para abordar su pregunta directamente, el enfoque que ha adoptado es razonable. Se sugieren varios puntos:
A menos que su conjunto de datos sea más grande de lo que parece, creo que una cuadrícula de 100 x 100 es demasiados contenedores. Intuitivamente, puedo imaginar que concluir que los diversos conjuntos de datos son más diferentes de lo que son solo debido a la precisión de sus contenedores significa que tiene muchos contenedores con un bajo número de puntos, incluso cuando la densidad de datos es alta. Sin embargo, esto al final es una cuestión de juicio. Ciertamente verificaría sus resultados con diferentes enfoques para binning.
Una vez que haya realizado el binning y haya convertido sus datos en (en efecto) una tabla de recuento de contingencia con dos columnas y un número de filas igual al número de bins (10,000 en su caso), tiene un problema estándar de comparar dos columnas de cuentas. Una prueba de Chi cuadrado o la adaptación de algún tipo de modelo de Poisson funcionaría, pero como usted dice, es incómodo debido a la gran cantidad de recuentos cero. Cualquiera de esos modelos normalmente se ajusta minimizando la suma de los cuadrados de la diferencia, ponderada por el inverso del número esperado de conteos; cuando esto se acerca a cero puede causar problemas.
Editar: el resto de esta respuesta ahora ya no creo que sea un enfoque apropiado.
nortesol× 2
nortesol× 2nortesol es el número total de contenedores. Aunque no es probable que un cálculo completo sea práctico debido al número de filas en su tabla, puede obtener buenas estimaciones del valor p utilizando la simulación de Monte Carlo (la implementación R de la prueba de Fisher ofrece esto como una opción para tablas que son más grande que 2 x 2 y sospecho que también lo hacen otros paquetes). Estos valores p son la probabilidad de que el segundo conjunto de datos (de uno de sus modelos) tenga la misma distribución a través de sus bins que el original. Por lo tanto, cuanto mayor sea el valor p, mejor será el ajuste.
Simulé algunos datos para que se parecieran un poco a los suyos y descubrí que este enfoque era bastante efectivo para identificar cuáles de mis conjuntos de datos "B" se generaron a partir del mismo proceso que "A" y cuáles eran ligeramente diferentes. Ciertamente más efectivo que a simple vista.
- nortesol× 2 esun problema si usa solo la suma de diferencias absolutas o diferencias cuadradas, como propuso originalmente). Sin embargo, sí importa que cada una de sus versiones de B tenga un número diferente de puntos. Básicamente, los conjuntos de datos B más grandes tenderán a devolver valores p más bajos. Puedo pensar en varias posibles soluciones a este problema. 1. Puede reducir todos sus conjuntos de datos B al mismo tamaño (el tamaño del más pequeño de sus conjuntos B), tomando una muestra aleatoria de ese tamaño de todos los conjuntos B que son más grandes que ese tamaño. 2. Primero puede ajustar una estimación de densidad de núcleo bidimensional a cada uno de sus conjuntos B y luego simular datos de esa estimación que sean de igual tamaño. 3. podría usar algún tipo de simulación para determinar la relación de los valores p con el tamaño y usarla para "corregir" los valores p que obtiene del procedimiento anterior para que sean comparables. Probablemente hay otras alternativas también. El que haga dependerá de cómo se generaron los datos B, cuán diferentes son los tamaños, etc.
Espero que ayude.