Apakah sampel kurtosis bias tanpa harapan?

8

Saya melihat sampel kurtosis dari variabel acak yang cukup miring, dan hasilnya tampak tidak konsisten. Untuk sekadar menggambarkan masalahnya, saya melihat contoh kurtosis RV normal log. Dalam R (yang perlahan saya pelajari):

library(moments); 

samp_size = 2048;
n_trial = 4096;

kvals <- rep(NA,1,n_trial); #preallocate
for (iii in 1:n_trial) {
    kvals[iii] <- kurtosis(exp(rnorm(samp_size)));
}
print(summary(kvals));

Ringkasan yang saya dapatkan adalah

   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  11.87   28.66   39.32   59.17   61.70 1302.00 

Menurut Wikipedia , kurtosis untuk RV log-normal ini harus sekitar 114. Jelas sampel kurtosis bias.

Melakukan penelitian saya menemukan bahwa sampel kurtosis bias untuk ukuran sampel kecil. Saya menggunakan estimator 'G2' yang disediakan oleh e1071paket di CRAN, dan mendapatkan hasil yang sangat mirip untuk ukuran sampel ini.

Pertanyaannya : manakah dari karakter berikut yang mencirikan apa yang terjadi:

  1. Kesalahan standar dari kurtosis sampel sangat besar untuk RV ini (meskipun perkiraan umum gelombang tangan dari kesalahan standar adalah sesuai urutan). 1/n). Atau, saya menggunakan terlalu sedikit sampel (2048) dalam penelitian ini.
  2. Implementasi kurtosis sampel ini menderita dari masalah numerik yang dapat diperbaiki dengan metode Terriberry misalnya (dalam banyak cara yang sama bahwa metode Welford memberikan hasil yang lebih baik daripada metode naif untuk varians sampel).
  3. Saya salah menghitung kurtosis populasi. (Aduh)
  4. Kurtosis sampel pada dasarnya bias dan Anda tidak pernah dapat memperbaikinya untuk ukuran sampel sekecil itu.
shabbychef
sumber
BTW, karena saya seorang pemula di R, saya akan menghargai komentar tentang kode saya, betapapun singkatnya, baik dalam hal gaya dan substansi. Secara khusus, saya berharap mungkin ada cara yang lebih elegan untuk mengucapkan for the loop.
shabbychef
1
pada gaya R, Anda tidak perlu ;di ujung pernyataan Anda. Anda memang melakukan pra-alokasi, tetapi tidak perlu mengisinya NA, kvals <- numeric(length = n_trial)sudah cukup. Dengan rep, Anda hanya perlu argumen 1 dan 3 dari panggilan Anda (mis rep(NA, 10).). Dalam pengaturan forloop, 1:n_trialbisa berbahaya jika pemrograman; lebih baik seq_along(kvals)atau seq_len(n_trial)dalam hal ini. Akhirnya, jika Anda tidak perlu memaksakan pencetakan, jatuhkan print()putaran summary()- Anda hanya akan membutuhkannya jika Anda tidak bekerja secara interaktif dengan R. HTH.
Gavin Simpson
Terima kasih! pasti apa yang saya cari. Saya menjalankan ini dari file, jadi saya butuh print. Argumen untuk repitu tentu saja salah.
shabbychef

Jawaban:

6

Ada koreksi bias . Itu tidak besar. Saya percaya varians pengambilan sampel dari kurtosis sebanding dengan momen sentral kedelapan (!), Yang bisa sangat besar untuk distribusi lognormal. Anda akan membutuhkan jutaan percobaan (atau lebih banyak) dalam simulasi untuk mendeteksi bias kecuali CV kecil. (Plot histogram kval untuk melihat seberapa condongnya mereka.)

Kurtosis yang benar memang sekitar 113.9364.

Sejauh gaya R berjalan, akan lebih mudah untuk merangkum simulasi dalam suatu fungsi sehingga Anda dapat dengan mudah memodifikasi ukuran sampel atau jumlah percobaan.

whuber
sumber
2
Penaksir G2 dari e1071memberikan koreksi bias 'standar'; lihat cran.r-project.org/web/packages/e1071/e1071.pdf . Menggunakan estimator ini sebagai ganti g2, yang diimplementasikan oleh momentspaket, memiliki efek yang kecil, seperti yang saya catat di Q. Ketergantungan pada momen kedelapan memang menyiratkan ukuran sampel terlalu kecil di sini.
shabbychef
5

[Just on the R Style - @whuber telah menjawab Kurtsosis Q]

Ini agak terlalu rumit untuk dimasukkan dalam komentar. Untuk loop sederhana seperti yang Anda gunakan, kami dapat menggabungkan saran @ whuber untuk mengenkapsulasi simulasi dalam suatu fungsi dengan replicate()fungsi tersebut. replicate()mengurus alokasi dan menjalankan loop untuk Anda. Contoh diberikan di bawah ini:

require(moments)
foo <- function(size, trials, meanlog = 0, sdlog = 1) {
    replicate(trials,
              kurtosis(rlnorm(size, meanlog = meanlog, 
                              sdlog = sdlog)))
}

Kami menggunakannya seperti ini:

> set.seed(1)
> out <- foo(2048, 10000)
> summary(out)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  10.93   28.77   39.99   62.53   62.58 1557.00

Perhatikan bahwa saya menggunakan rlnorm()fungsi untuk menghasilkan variabel acak log-normal. Ini sama dengan exp(rnorm())di loop Anda tetapi menggunakan alat yang benar, dan kami mengizinkan fungsi kami meneruskan parameter yang ditentukan pengguna dari distribusi log-normal.

> set.seed(123)
> exp(rnorm(1))
[1] 0.5709374
> set.seed(123)
> rlnorm(1)
[1] 0.5709374
Gavin Simpson
sumber
+1 untuk set.seed, yang akan membantu dalam contoh-contoh seperti ini. Apakah ada alasan substansial untuk mengenkapsulasi dalam suatu fungsi ( mis . Penerjemah R akan melakukan pre-kompilasi fungsi, sehingga ada beberapa peningkatan), atau bergaya ( misalnya fungsi enkapsulasi, seperti brokoli, baik untuk Anda), atau di suatu tempat di antaranya ( misalnya ada, katakanlah, banyak operator di R yang bekerja pada fungsi, jadi kita harus terbiasa dengan pemrograman fungsional)?
shabbychef
@shabbychef: Saya pikir yang utama adalah usaha. Anda dapat menjalankan kode Anda dengan loop dll berulang kali dan itu akan baik-baik saja, tetapi Anda harus tetap menjalankan semua baris kode Anda. Dengan mengenkapsulasi, Anda menjalankan 1 baris kode R untuk setiap simulasi yang ingin Anda jalankan. Tidak ada kecepatan karena R tidak mengkompilasi apa pun sebelumnya IIRC.
Gavin Simpson
1
terimakasih atas klarifikasinya. Karena ini semua dalam file kecil, itu tetap satu baris source('foo.r')
:;