¿Cómo calcular el estimador de la escala Qn de Rousseeuw y Croux (1993) para muestras grandes?


13

Deje para que para una muestra muy corta como se pueda calcular de encontrar el orden estático de las diferencias por pares: { 1 , 3 , 6 , 2 , 7 , 5 } kQnorte=Cnorte.{El |Xyo-XjEl |;yo<j}(k){1,3,6 6,2,7 7,5 5}k

    7 6 5 3 2 1
1   6 5 4 2 1
2   5 4 3 1
3   4 3 2
5   2 1
6   1
7

h = [n / 2] + 1 = 4

k = h (h-1) / 2 = 8

Así Qn=Cn.2

Obviamente, para muestras grandes que constan de 80,000 registros, necesitamos memoria muy grande.

¿Hay alguna forma de calcular Qn en el espacio 1D en lugar de 2D?

Un enlace a la respuesta ftp://ftp.win.ua.ac.be/pub/preprints/92/Timeff92.pdf aunque no puedo entenderlo completamente.


1
OK, la respuesta para los chicos que leerán esto más tarde: si solo desea calcular un estimador de escala robusto para un dato 1-instale la última versión de R 2-instale el paquete robustbase 3 ¡listo para usar! pero si está desarrollando un código fuera de este entorno, debe usar medianas altas ponderadas para minimizar los cálculos necesarios para Sn o Qn.
K-1

1
El enlace al documento no funciona. Una referencia adecuada (aún mejor, con una cita de la información más relevante) nos habría ayudado a localizar la información; tal como está es inútil cuando el enlace muere (como sucede a menudo).
Glen_b -Reinstala Monica

2
¿No debería ser k = h elegir 2 = h (h-1) / 2 = 6 ? Sin embargo, no cambia el resultado final.
un tigre el

¿por qué Qn = Cn * 2, por qué 2? ¿Cómo se calculó?
lidox

Respuestas:


15

Actualización: El quid de la cuestión es que para lograr la complejidad de tiempo O(nlog(n)) , se necesita en el orden de almacenamiento O(n) .


No, O(nlog(n)) es el límite teórico inferior para la complejidad temporal de (ver (1)) seleccionar el elemento kth entre todos los n(n1)2 posibles|xixj|:1i<jn.

Puede obtener espacio O(1) , pero solo verificando ingenuamente todas las combinaciones de xixj en el tiempo O(n2) .

La buena noticia es que puede usar el estimador de escala τ (consulte (2) y (3) para obtener una versión mejorada y algunas comparaciones de temporización), implementado en la función scaleTau2()del Rpaquete robustbase. El estimador τ univariado es un estimador de escala de dos pasos (es decir, re-ponderado). Tiene una eficiencia gaussiana del 95 por ciento, un punto de ruptura del 50 por ciento y la complejidad del tiempo O(norte) y el espacio O(1) (además se puede hacer fácilmente 'en línea', reduciendo la mitad de los costos computacionales en uso repetido, aunque usted tendrá que cavar en el Rcódigo para implementar esta opción, es bastante sencillo de hacer).

  1. La complejidad de la selección y clasificación en X + Y y matrices con columnas ordenadas GN Frederickson y DB Johnson, Journal of Computer and System Sciences Volume 24, Issue 2, April 1982, páginas 197-208.
  2. Yohai, V. y Zamar, R. (1988). Estimaciones de regresión de alto punto de ruptura mediante la minimización de una escala eficiente. Revista de la Asociación Americana de Estadística 83 406–413.
  3. Maronna, R. y Zamar, R. (2002). Estimaciones sólidas de ubicación y dispersión para conjuntos de datos de alta dimensión. Technometrics 44 307–317

Editar Para usar esto

  1. Arranca R(es gratis y se puede descargar desde aquí )
  2. Instale el paquete escribiendo:
install.packages("robustbase")
  1. Cargue el paquete escribiendo:
library("robustbase")
  1. Cargue su archivo de datos y ejecute la función:
mydatavector <- read.table("address to my file in text format", header=T)
scaleTau2(mydatavector)

2
@ user603: la tau a la que te referías. Por cierto, ¿por qué no está tan extendido si tiene tan buenas eficiencias estadísticas y computacionales y un punto de ruptura?
Cuarzo

2
a) puedes calcular el loco y la mediana en línea . A partir de ahí, es trivial calcular el Tau. b) el colapso no es robustez y el Tau tiene un sesgo terrible en presencia de valores atípicos. Puede encontrar más argumentos en contra en la sección 5 del documento de Qn
usuario603


1
@ user603 según el documento, la curva de sesgo nos dice cuánto puede estimar el estimador debido a una fracción dada de contaminación. y S n estaban sesgadas para mis ejemplos simulados (distribución normal + 20% de valores extremadamente altos / bajos), y el nivel de sesgo fue comparable. Puede ser que haya algo mal, pero tanto S n como Q n parecen estar sufriendo el mismo problema. QnSnSnQn
Alemán Demidov

1
@ user603 lo siento, el efecto no se pudo ver en muestras de tamaño 100. Claramente veo el problema usando tamaños de muestra grandes. Todos tienen prejuicios terribles, pero tiene el más grande. τ
Alemán Demidov

0

(Respuesta muy corta) El texto para comentar dice

Evite responder preguntas en los comentarios.

así que aquí va: hay un documento sobre un algoritmo en línea que aparentemente funciona bastante bien: aplicando el estimador líneaQn .

EDITAR

(por el usuario user603). El algoritmo vinculado a este artículo es una versión en versión de ventana móvil de .Qn

{xi}i=1Nn<N{xi}i=tn+1tQnNn+1Qn{Qni}i=1Nn+1

Qni|Qni1 O(nlog(n))Qni

Qn{xi}i=1NO(n2)


Si bien no debe responder en los comentarios, tampoco debe publicar comentarios como respuestas, y si su respuesta es solo un enlace, no es una respuesta (pero podría ser un comentario). Si desea que sea una respuesta en lugar de un comentario, su respuesta debe contener la información relevante de alguna manera, como una cita de un enlace debidamente referenciado o su propia explicación de los detalles importantes. Si puede, proporcione los detalles necesarios; Alternativamente, puedo convertir esto en un comentario para usted.
Glen_b -Reinstala Monica

@Glen_b: adelante y convierta. Gracias por la aclaración.
serv-inc

1
@ user603 Tal vez podría (como en los enlaces en mi comentario) editar la información esencial en la respuesta anterior, ya que actualmente no está dentro de las pautas de respuestas de las redes SE.
Glen_b -Reinstala Monica

No hay problema, lo haré! (pero es muy tarde aquí)
usuario603

@ user603 Gracias; Lo dejaré aquí por ahora entonces
Glen_b -Reinstate Monica

0

esta es mi implementación de Qn ...

Estaba programando esto en C y el resultado es este:

void bubbleSort(double *datos, int N)
{
 for (int j=0; j<N-1 ;j++)     
  for (int i=j+1; i<N; i++)    
   if (datos[i]<datos[j])      
   {
    double tmp=datos[i];
    datos[i]=datos[j];
    datos[j]=tmp;
   }
}

double  fFactorial(long N)    
{
 double factorial=1.0;

 for (long i=1; i<=N; ++i)
  factorial*=(double)i;

 return factorial;  
}

double fQ_n(double *datos, int N)  // Rousseeuw's and Croux (1993) Qn scale estimator
{
 bubbleSort(datos, N);

 int m=(int)((fFactorial((long)N))/(fFactorial(2)*fFactorial((long)N-2)));

 double D[m];
 //double Cn=2.2219;      //not used now :) constant value https://www.itl.nist.gov/div898/software/dataplot/refman2/auxillar/qn_scale.htm

 int k=(int)((fFactorial((long)N/2+1))/(fFactorial(2)*fFactorial((long)N/2+1-2)));

 int y=0;

 for (int i=0; i<N; i++)
  for (int j=N-1; j>=0; j--)
   if (i<j)
   {
    D[y]=abs(datos[i]-datos[j]);
    y++;
   }

 bubbleSort(D, m);

 return D[k-1];
}

int main(int argc, char **argv)    
{
 double datos[6]={1,2,3,5,6,7};
 int N=6;

 // Priting in terminal the final solution
 printf("\n==[Results] ========================================\n\n");

 printf(" Q_n=%0.3f\n",fQ_n(datos,N));

 return 0;
}

1
Aunque la implementación a menudo se mezcla con contenido sustantivo en las preguntas, se supone que somos un sitio para proporcionar información sobre estadísticas, aprendizaje automático, etc., no código. También puede ser bueno proporcionar código, pero elabore su respuesta sustantiva en texto para las personas que no leen este idioma lo suficiente como para reconocer y extraer la respuesta del código.
gung - Restablece a Monica

Este es el ingenuo algoritmo O (n ** 2) ~
user603
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.