Bagaimana cara menghitung penaksir skala Qn Rousseeuw's dan Croux '(1993) untuk sampel besar?


13

Biarkan Qn=Cn.{|XiXj|;i<j}(k) jadi untuk sampel yang sangat singkat seperti {1,3,6,2,7,5} dapat dihitung dari menemukan urutan k statis dari perbedaan berpasangan:

    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

Jadi Qn=Cn.2

Jelas untuk sampel besar mengatakan terdiri dari 80.000 catatan, kami membutuhkan memori yang sangat besar.

Apakah ada pula untuk menghitung dalam ruang 1D bukan 2D?Qn

Tautan ke jawaban ftp://ftp.win.ua.ac.be/pub/preprints/92/Timeff92.pdf meskipun saya tidak dapat memahaminya sepenuhnya.


1
OK, jawaban untuk orang-orang yang akan membaca ini nanti: jika Anda hanya ingin menghitung penaksir skala yang kuat untuk sepotong data 1-instal versi terbaru R 2-instal paket robustbase 3-siap untuk pergi! tetapi jika Anda mengembangkan kode di luar lingkungan ini, Anda perlu menggunakan median tinggi tertimbang untuk meminimalkan perhitungan yang diperlukan untuk Sn atau Qn.
K-1

1
Tautan ke kertas tidak berfungsi. Referensi yang tepat (bahkan lebih baik, dengan kutipan informasi yang paling relevan) akan membantu kami menemukan informasi tersebut; karena tidak ada gunanya ketika link mati (seperti yang sering terjadi).
Glen_b -Reinstate Monica

2
bukankah seharusnya k = h pilih 2 = h (h-1) / 2 = 6 ? Itu tidak mengubah hasil akhirnya.
seekor harimau

mengapa Qn = Cn * 2, mengapa 2? bagaimana cara menghitungnya?
lidox

Jawaban:


15

Pembaruan: Inti masalahnya adalah bahwa untuk mencapai kompleksitas waktu O(nlog(n)) , seseorang perlu dalam urutan penyimpanan O(n) .


Tidak, O(nlog(n)) adalah teori batas bawah untuk kompleksitas waktu (lihat (1)) memilih kth elemen antara semua n(n1)2 mungkin|xixj|:1i<jn.

Anda bisa mendapatkan ruang O(1) , tetapi hanya dengan secara naif memeriksa semua kombinasi xixj dalam waktu O(n2) .

Berita baiknya adalah Anda dapat menggunakan penaksir skala τ (lihat (2) dan (3) untuk versi yang ditingkatkan dan beberapa perbandingan waktu), yang diimplementasikan dalam fungsi scaleTau2()dalam Rpaket robustbase. Estimator τ univariat adalah penduga skala dua langkah (yaitu re-weighted). Ini memiliki efisiensi Gaussian 95 persen, titik rincian 50 persen, dan kompleksitas O(n) waktu dan O(1) ruang (ditambah dapat dengan mudah dibuat 'online', mengurangi setengah dari biaya komputasi dalam penggunaan berulang - meskipun Anda harus menggali ke dalam Rkode untuk mengimplementasikan opsi ini, ini agak mudah dilakukan).

  1. Kompleksitas seleksi dan peringkat dalam X + Y dan matriks dengan kolom diurutkan GN Frederickson dan DB Johnson, Jurnal Ilmu Komputer dan Sistem Volume 24, Edisi 2, April 1982, Halaman 197-208.
  2. Yohai, V. dan Zamar, R. (1988). Perkiraan titik breakdown yang tinggi dari regresi dengan meminimalkan skala yang efisien. Jurnal Asosiasi Statistik Amerika 83 406-413.
  3. Maronna, R. dan Zamar, R. (2002). Perkiraan lokasi dan dispersi yang kuat untuk set data dimensi tinggi. Technometrics 44 307-317

Edit Untuk menggunakan ini

  1. Nyalakan R(gratis dan dapat diunduh dari sini )
  2. Instal paket dengan mengetik:
install.packages("robustbase")
  1. Muat paket dengan mengetik:
library("robustbase")
  1. Muat file data Anda dan jalankan fungsinya:
mydatavector <- read.table("address to my file in text format", header=T)
scaleTau2(mydatavector)

2
@ user603: tau yang Anda maksud. Btw mengapa tidak tersebar luas jika memiliki efisiensi statistik dan komputasi yang baik dan titik kerusakan?
Kuarsa

2
a) Anda dapat menghitung online gila dan median . Dari sana sepele untuk menghitung Tau. b) gangguan bukan ketahanan dan Tau memiliki bias yang mengerikan di hadapan outlier. Anda dapat menemukan lebih banyak argumen yang menentangnya di bagian 5 dari makalah Qn
user603


1
@ user603 menurut makalah, kurva bias memberitahu kita berapa banyak penaksir dapat berubah karena fraksi kontaminasi yang diberikan. dan S n bias untuk contoh simulasi saya (distribusi normal + 20% dari nilai yang sangat tinggi / rendah), dan tingkat bias sebanding. Mungkin saya mendapatkan sesuatu yang salah, tetapi baik S n dan Q n tampaknya menderita masalah yang sama. QnSnSnQn
Demidov Jerman

1
τ

0

(Jawaban sangat singkat) Teks untuk berkomentar mengatakan

hindari menjawab pertanyaan dalam komentar.

Qn

EDIT

Qn

Given a large sample {xi}i=1N divided into time windows of width n<N, {xi}i=tn+1t we can apply the Qn to each time window yielding Nn+1 values of the Qn. Denote these values {Qni}i=1Nn+1

The algorithm cited here allows to obtain Qni|Qni1 at an average cost less than the worst case O(nlog(n)) needed to compute Qni from scratch.

This algorithm can however not be used to compute the Qn of the full original sample {xi}i=1N. It also needs to maintain an buffer whose size can be as large as O(n2) (though it is often much smaller).


While you should not answer in comments, you should also not post comments as answers, and if your answer is only a link, it's not an answer (but might be a comment). If you want it to be an answer rather than a comment, your answer should contain the relevant information in some manner, such as a quote from a properly referenced link, or your own explanation of the important details. If you can, please provide the necessary details; alternatively I can convert this to a comment for you.
Glen_b -Reinstate Monica

@Glen_b: go ahead and convert. Thank you for the clarification.
serv-inc

1
@user603 The perhaps you could (as in the links in my comment) edit the essential information into the above answer -- as it stands at present it's not within the SE networks guidelines for answers.
Glen_b -Reinstate Monica

No problem, I will! (but it is really late here,)
user603

@user603 Thanks; I'll leave it here for now then
Glen_b -Reinstate Monica

0

this is my implement of Qn...

I was programming this in C and the result is this:

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
Although implementation is often mixed with substantive content in questions, we are supposed to be a site for providing information about statistics, machine learning, etc., not code. It can be good to provide code as well, but please elaborate your substantive answer in text for people who don't read this language well enough to recognize & extract the answer from the code.
gung - Reinstate Monica

This is the naive O(n**2) algorithm~
user603
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.