Bagaimana mengubah distribusi leptokurtik menjadi normal?

12

Misalkan saya memiliki variabel leptokurtik yang ingin saya ubah menjadi normal. Transformasi apa yang dapat menyelesaikan tugas ini? Saya sadar betul bahwa mentransformasikan data mungkin tidak selalu diinginkan, tetapi sebagai upaya akademis, anggaplah saya ingin "memalu" data menjadi normal. Selain itu, seperti yang Anda tahu dari plot, semua nilai benar-benar positif.

Saya telah mencoba berbagai transformasi (hampir semua yang pernah saya lihat digunakan sebelumnya, termasuk , dll.), Tetapi tidak ada yang bekerja dengan baik. Apakah ada transformasi terkenal untuk membuat distribusi leptokurtik lebih normal?1X,X,asinh(X)

Lihat contoh plot QQ Normal di bawah ini:

masukkan deskripsi gambar di sini

Underminer
sumber
5
Apakah Anda terbiasa dengan probabilitas integral transformasi ? Itu telah dipanggil di beberapa utas di situs ini , jika Anda ingin melihatnya beraksi.
whuber
8
Anda memerlukan sesuatu yang bekerja secara simetris (variabel "tengah") sambil juga menghargai tanda. Tidak ada yang Anda coba mendekati jika Anda tidak memiliki "menengah". Gunakan median untuk "tengah" dan coba akar pangkat tiga dari penyimpangan, ingat untuk menerapkan pangkat akar sebagai tanda (.) * Abs (.) ^ (1/3). Tidak ada jaminan dan sangat ad hoc, tetapi harus mendorong ke arah yang benar.
Nick Cox
1
Eh, apa yang membuatmu menyebutnya platykurtic? Kecuali saya melewatkan sesuatu, sepertinya kurtosis lebih tinggi dari biasanya.
Glen_b -Reinstate Monica
3
@ Glen_b saya pikir itu benar: itu leptokurtik. Tetapi kedua istilah ini cukup konyol, kecuali sejauh mereka mengizinkan referensi ke kartun asli oleh Student in Biometrika . Kriteria yang digunakan adalah kurtosis; nilainya tinggi atau rendah atau (bahkan lebih baik) dikuantifikasi.
Nick Cox
3
Mengapa leptokurtik digambarkan sebagai 'ekor tipis'? Meskipun tidak ada hubungan yang diperlukan antara ketebalan ekor dan kurtosis, kecenderungan umum untuk ekor berat dikaitkan dengan kurtosis (mis. Bandingkan dengan normal, untuk kepadatan terstandarisasi)t6
Glen_b -Reinstate Monica

Jawaban:

12

Saya menggunakan distribusi berat ekor Lambert W x F untuk menggambarkan dan mengubah data leptokurtik. Lihat (saya) posting berikut untuk detail dan referensi lebih lanjut:

Berikut adalah contoh yang dapat direproduksi menggunakan paket LambertW R.

library(LambertW)
set.seed(1)
theta.tmp <- list(beta = c(2000, 400), delta = 0.2)
yy <- rLambertW(n = 100, distname = "normal", 
                theta = theta.tmp)

test_norm(yy)

uji normalitas data asli

## $seed
## [1] 267509
## 
## $shapiro.wilk
## 
##  Shapiro-Wilk normality test
## 
## data:  data.test
## W = 1, p-value = 0.008
## 
## 
## $shapiro.francia
## 
## 	Shapiro-Francia normality test
## 
## data:  data.test
## W = 1, p-value = 0.003
## 
## 
## $anderson.darling
## 
##  Anderson-Darling normality test
## 
## data:  data
## A = 1, p-value = 0.01

The qqplot yysangat dekat dengan qqplot Anda di pos asli dan data memang sedikit leptokurtic dengan kurtosis 5. Oleh karena itu data Anda dapat digambarkan dengan baik oleh distribusi Lambert W Gaussian dengan input dan parameter ekor (yang menyiratkan bahwa hanya beberapa saat hingga pesanan ada).X N ( 2000 , 400 ) δ = 0,2 5×XN(2000,400)δ=0.25

Sekarang kembali ke pertanyaan Anda: bagaimana membuat data leptokurtik ini menjadi normal kembali? Kita dapat memperkirakan parameter distribusi menggunakan MLE (atau untuk metode saat menggunakan IGMM()),

mod.Lh <- MLE_LambertW(yy, distname = "normal", type = "h")
summary(mod.Lh)

## Call: MLE_LambertW(y = yy, distname = "normal", type = "h")
## Estimation method: MLE
## Input distribution: normal
## 
##  Parameter estimates:
##        Estimate  Std. Error  t value Pr(>|t|)    
## mu     2.05e+03    4.03e+01    50.88   <2e-16 ***
## sigma  3.64e+02    4.36e+01     8.37   <2e-16 ***
## delta  1.64e-01    7.84e-02     2.09    0.037 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## -------------------------------------------------------------- 
## 
## Given these input parameter estimates the moments of the output random variable are 
##   (assuming Gaussian input): 
##  mu_y = 2052; sigma_y = 491; skewness = 0; kurtosis = 13.

dan kemudian menggunakan transformasi inversif bijective (berdasarkan W_delta()) untuk mengubah data menjadi input , yang - menurut desain - harus sangat dekat dengan normal.X

# get_input() handles does the right transformations automatically based on
# estimates in mod.Lh
xx <- get_input(mod.Lh)
test_norm(xx)

uji normalitas data yang di-Gaussian

## $seed
## [1] 218646
## 
## $shapiro.wilk
## 
##  Shapiro-Wilk normality test
## 
## data:  data.test
## W = 1, p-value = 1
## 
## 
## $shapiro.francia
## 
## 	Shapiro-Francia normality test
## 
## data:  data.test
## W = 1, p-value = 1
## 
## 
## $anderson.darling
## 
##  Anderson-Darling normality test
## 
## data:  data
## A = 0.1, p-value = 1

Voila!

Georg M. Goerg
sumber
Saya seorang penggemar, dan mulai mengerjakan versi scikit-learning like untuk python: github.com/gregversteeg/gaussianize
Greg Ver Steeg
Georg, apakah mungkin bagi Anda untuk memberikan penjelasan yang lebih intuitif tentang bagaimana transformasi Anda bekerja?
azuric
Z=Uexp(δ/2U2)Uδ>0Z
9

sign(.)abs(.)13Ymedian(Y)

Meskipun transformasi root cube tidak berhasil dengan baik, ternyata root kuadrat dan root three-quarter lebih jelas bekerja dengan baik.

Berikut adalah plot kepadatan kernel asli yang sesuai dengan plot QQ dari variabel leptokurtik dalam pertanyaan awal:

masukkan deskripsi gambar di sini


Setelah menerapkan transformasi akar kuadrat untuk penyimpangan, plot QQ terlihat seperti ini:

masukkan deskripsi gambar di sini

Lebih baik, tetapi bisa lebih dekat.


Memalu lagi, menerapkan transformasi tiga perempat root untuk penyimpangan memberikan:

masukkan deskripsi gambar di sini


Dan kepadatan kernel akhir dari variabel yang diubah ini terlihat seperti ini:

masukkan deskripsi gambar di sini

Terlihat dekat dengan saya.

Underminer
sumber
8

Dalam banyak kasus, mungkin tidak ada transformasi monotonik sederhana yang akan menghasilkan hasil mendekati normal.

Sebagai contoh, bayangkan kita memiliki distribusi yang merupakan campuran terbatas dari distribusi lognormal dari berbagai parameter. Transformasi log akan mengubah komponen campuran menjadi normal, tetapi campuran normal dalam data yang diubah membuat Anda memiliki sesuatu yang tidak normal.

Atau mungkin ada transformasi yang relatif bagus, tetapi bukan dari salah satu bentuk yang Anda pikir akan coba - jika Anda tidak tahu distribusi data, Anda mungkin tidak menemukannya. Misalnya, jika data tersebut didistribusikan secara gamma, Anda bahkan tidak akan menemukan transformasi yang tepat untuk normalitas (yang tentunya ada) kecuali saya memberi tahu Anda dengan tepat apa distribusinya (meskipun Anda mungkin menemukan transformasi kubus-root yang dalam hal ini case akan membuatnya cukup dekat dengan normal asalkan parameter bentuk tidak terlalu kecil).

Ada banyak cara di mana data dapat terlihat cukup dapat diterima untuk ditransformasikan tetapi tidak terlihat bagus pada daftar transformasi yang jelas.

Jika Anda dapat memberi kami akses ke data, mungkin kami dapat melihat transformasi yang baik-baik saja - atau kami dapat menunjukkan kepada Anda mengapa Anda tidak akan menemukannya.

Hanya dari kesan visual di sana, itu terlihat seperti campuran dua normals dengan skala yang berbeda. Hanya ada sedikit sedikit asimetri, yang bisa Anda amati secara kebetulan. Berikut adalah contoh sampel dari campuran dua normals dengan rata-rata umum - seperti yang Anda lihat agak mirip plot Anda (tetapi sampel lain mungkin terlihat lebih berat atau lebih ringan berekor - pada ukuran sampel ini ada banyak variasi dalam urutan statistik di luar 1 sd kedua sisi rata-rata).

masukkan deskripsi gambar di sini

Sebenarnya di sini adalah milik Anda dan milik saya ditumpangkan:

masukkan deskripsi gambar di sini

Glen_b -Reinstate Monica
sumber
Itu memang terlihat seperti campuran dari dua distribusi normal dengan skala yang berbeda, pengamatan yang sangat baik.
Underminer