Come calcolare lo stimatore in scala Qn di Rousseeuw e Croux '(1993) per campioni di grandi dimensioni?


13

Sia Qn=Cn.{|XiXj|;i<j}(k) quindi per un campione molto breve come {1,3,6,2,7,5} può essere calcolato trovando il k ° ordine statico delle differenze a coppie:

    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

Quindi Qn=Cn.2

Ovviamente per campioni di grandi dimensioni che dicono di 80.000 registrazioni abbiamo bisogno di una memoria molto grande.

Esiste un modo per calcolare nello spazio 1D anziché in 2D?Qn

Un link alla risposta ftp://ftp.win.ua.ac.be/pub/preprints/92/Timeff92.pdf anche se non riesco a comprenderlo appieno.


1
OK, la risposta per i ragazzi che lo leggeranno in seguito: se vuoi solo calcolare un robusto stimatore di scala per un pezzo di dati 1-installa l'ultima versione di R 2-installa il pacchetto robustbase 3-pronto all'uso! ma se si sta sviluppando un codice al di fuori di questo ambiente, è necessario utilizzare mediane alte ponderate per ridurre al minimo i calcoli richiesti per Sn o Qn.
K-1,

1
Il collegamento al documento non funziona. Un riferimento adeguato (ancora meglio, con una citazione delle informazioni più rilevanti) ci avrebbe aiutato a localizzare le informazioni; così com'è è inutile quando il collegamento muore (come spesso accade).
Glen_b

2
non dovrebbe essere k = h scegliere 2 = h (h-1) / 2 = 6 ? Tuttavia, non cambia il risultato finale.
una tigre il

perché Qn = Cn * 2, perché 2? come è stato calcolato?
lidox,

Risposte:


15

Aggiornamento: il nocciolo del problema è che per ottenere la complessità temporale O(nlog(n)) , è necessario nell'ordine di archiviazione O(n) .


No, O(nlog(n)) è il limite teorico inferiore per la complessità temporale di (vedi (1)) selezionando l' elemento kth tra tutti n(n1)2 possibili|xixj|:1i<jn.

Puoi ottenere lo spazio O(1) , ma solo controllando ingenuamente tutte le combinazioni di xixj nel tempo O(n2) .

La buona notizia è che è possibile utilizzare lo stimatore τ della scala (vedere (2) e (3) per una versione migliorata e alcuni confronti di temporizzazione), implementato nella funzione scaleTau2()nel Rpacchetto robustbase. Lo stimatore univariato τ è uno stimatore di scala in due fasi (cioè ripesato). Ha un'efficienza gaussiana del 95 percento, un punto di rottura del 50 percento e la complessità del tempo O(n) e dello spazio O(1) (in più può essere facilmente reso "online", tagliando la metà dei costi di calcolo in un uso ripetuto, sebbene tu dovrà scavare nel Rcodice per implementare questa opzione, è piuttosto semplice da fare).

  1. La complessità della selezione e del posizionamento in X + Y e matrici con colonne ordinate GN Frederickson e DB Johnson, Journal of Computer and System Sciences Volume 24, Numero 2, Aprile 1982, Pagine 197-208.
  2. Yohai, V. e Zamar, R. (1988). Stime elevate del punto di rottura della regressione mediante la minimizzazione di una scala efficiente. Rivista dell'American Statistical Association 83 406–413.
  3. Maronna, R. e Zamar, R. (2002). Stime affidabili di posizione e dispersione per set di dati ad alta dimensione. Technometrics 44 307–317

Modifica Per usare questo

  1. Accendi R(è gratuito e può essere scaricato da qui )
  2. Installa il pacchetto digitando:
install.packages("robustbase")
  1. Carica il pacchetto digitando:
library("robustbase")
  1. Carica il tuo file di dati ed esegui la funzione:
mydatavector <- read.table("address to my file in text format", header=T)
scaleTau2(mydatavector)

2
@ user603: il tau a cui ti riferivi. A proposito, perché non è molto diffuso se ha così buone efficienze statistiche e computazionali e un punto di rottura?
Quarzo,

2
a) è possibile calcolare online il pazzo e la mediana . Da lì è banale calcolare il Tau. b) la rottura non è robustezza e il Tau ha un terribile pregiudizio in presenza di valori anomali. Puoi trovare ulteriori argomenti a riguardo nella sezione 5 del documento Qn
user603


1
@ user603 secondo il documento, la curva di polarizzazione ci dice quanto lo stimatore può cambiare a causa di una data frazione di contaminazione. e S n erano distorti per i miei esempi simulati (distribuzione normale + 20% di valori estremamente alti / bassi) e il livello di bias era comparabile. Forse ho sbagliato qualcosa, ma sia S n che Q n sembrano soffrire dello stesso problema. QnSnSnQn
Demidov tedesco,

1
@ user603 scusate, non è stato possibile vedere l'effetto per campioni di dimensioni 100. Vedo chiaramente il problema utilizzando campioni di grandi dimensioni. Tutti loro hanno pregiudizi terribili, ma ha il più grande. τ
Demidov tedesco

0

(Risposta molto breve) Il testo per commentare dice

evitare di rispondere alle domande nei commenti.

quindi eccoci qui: c'è un documento su un algoritmo online che sembra funzionare abbastanza bene: applicare lo stimatore onlineQn .

MODIFICARE

(dall'utente user603). L'algoritmo collegato in questo articolo è una versione della finestra mobile della .Qn

Dato un grande campione diviso in finestre temporali di larghezza n < N , { x i } t i = t - n + 1 possiamo applicare la Q n ad ogni finestra temporale che produce N - n + 1 valori di Q n . Indica questi valori { Q i n } N - n + 1 1{xi}i=1Nn<N{xi}i=tn+1tQnNn+1Qn{Qni}i=1Nn+1

L'algoritmo qui citato consente di ottenere a un costo medio inferiore al caso peggiore O ( n log ( n ) ) necessario per calcolare Q i n da zero.Qni|Qni1 O(nlog(n))Qni

Qn{xi}i=1NO(n2)


Anche se non dovresti rispondere nei commenti, non dovresti anche pubblicare commenti come risposte e se la tua risposta è solo un link, non è una risposta (ma potrebbe essere un commento). Se vuoi che sia una risposta piuttosto che un commento, la tua risposta dovrebbe contenere le informazioni pertinenti in qualche modo, come una citazione da un link correttamente referenziato, o la tua spiegazione dei dettagli importanti. Se possibile, fornire i dettagli necessari; in alternativa posso convertirlo in un commento per te.
Glen_b

@Glen_b: vai avanti e converti. Grazie per il chiarimento.
serv-inc

1
@ user603 Forse potresti (come nei link nel mio commento) modificare le informazioni essenziali nella risposta sopra - allo stato attuale non rientra nelle linee guida delle reti SE per le risposte.
Glen_b

Nessun problema, lo farò! (ma è davvero tardi qui,)
user603

@ user603 Grazie; Per ora lo lascerò qui
Glen_b -Restate Monica

0

questo è il mio strumento di Qn ...

Lo stavo programmando in C e il risultato è questo:

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
Sebbene l'implementazione sia spesso mescolata a contenuti sostanziali nelle domande, dovremmo essere un sito per fornire informazioni su statistiche, apprendimento automatico, ecc., Non codice. Può essere utile fornire anche il codice, ma si prega di elaborare la risposta sostanziale nel testo per le persone che non leggono abbastanza bene questa lingua per riconoscere ed estrarre la risposta dal codice.
gung - Ripristina Monica

Questo è l'algoritmo ingenuo O (n ** 2) ~
user603
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.