Là kurtosis mẫu vô vọng thiên vị?


8

Tôi đang xem xét sự suy yếu mẫu của một biến ngẫu nhiên khá sai lệch và kết quả có vẻ không nhất quán. Để chỉ đơn giản là minh họa vấn đề, tôi đã xem xét sự suy yếu mẫu của một RV bình thường. Trong R (mà tôi đang dần học):

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));

Tóm tắt tôi nhận được là

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

Theo Wikipedia , mức độ tổn thương cho RV thông thường này phải ở khoảng 114. Rõ ràng là sự suy yếu mẫu là sai lệch.

Thực hiện một số nghiên cứu tôi thấy rằng kurtosis mẫu bị sai lệch cho kích thước mẫu nhỏ. Tôi đã sử dụng công cụ ước tính 'G2' được cung cấp bởi e1071gói trong CRAN và nhận được kết quả rất giống với kích thước mẫu này.

Câu hỏi : điều nào sau đây mô tả những gì đang diễn ra:

  1. Lỗi tiêu chuẩn của kurtosis mẫu đơn giản là rất lớn đối với RV này (mặc dù ước tính chung về sóng chuẩn của lỗi tiêu chuẩn là theo thứ tự ). Ngoài ra, tôi đã sử dụng quá ít mẫu (2048) trong nghiên cứu này.1/n
  2. Những triển khai của nhọn mẫu bị vấn đề số mà có thể được sửa chữa bằng cách ví dụ như phương pháp Terriberry của (theo cách tương tự mà phương pháp Welford của cho kết quả tốt hơn so với phương pháp ngây thơ cho đúng mẫu).
  3. Tôi đã tính toán dân số không chính xác. (ouch)
  4. Kurtosis mẫu vốn đã thiên vị và bạn không bao giờ có thể sửa nó cho các cỡ mẫu nhỏ như vậy.

BTW, vì tôi là người mới bắt đầu học R, tôi sẽ đánh giá cao bất kỳ nhận xét nào liên quan đến mã của tôi, tuy nhiên, ngắn gọn, cả về điểm phong cách và chất. Cụ thể, tôi đã hy vọng có thể có một cách thanh lịch hơn để diễn đạt vòng lặp for.
shabbychef

1
trên kiểu R, bạn không cần ;ở phần cuối của câu lệnh. Bạn đã đúng khi phân bổ trước, nhưng không cần điền NA, kvals <- numeric(length = n_trial)sẽ có hiệu lực. Với rep, bạn chỉ cần đối số 1 và 3 từ cuộc gọi của mình (ví dụ rep(NA, 10)). Trong forthiết lập vòng lặp, 1:n_trialcó thể nguy hiểm nếu lập trình; tốt hơn là seq_along(kvals)hoặc seq_len(n_trial)trong trường hợp này. Cuối cùng, nếu bạn không cần bắt buộc in, hãy bỏ qua print()vòng summary()- bạn chỉ cần nó nếu bạn không làm việc tương tác với R. HTH.
Gavin Simpson

cảm ơn! chắc chắn những gì tôi đang tìm kiếm. Tôi đã chạy nó từ một tập tin, vì vậy tôi cần print. Các đối repsố chắc chắn là sai lầm.
shabbychef

Câu trả lời:


6

Có một sự điều chỉnh sai lệch . Nó không lớn lắm. Tôi tin rằng phương sai lấy mẫu của kurtosis tỷ lệ thuận với thời điểm trung tâm thứ tám (!), Có thể là rất lớn đối với phân phối logic. Bạn sẽ cần hàng triệu thử nghiệm (hoặc nhiều hơn nữa) trong một mô phỏng để phát hiện sai lệch trừ khi CV nhỏ. (Vẽ biểu đồ các khoảng thời gian để xem chúng bị lệch một cách bất thường như thế nào.)

Kurtosis chính xác thực sự là khoảng 113.9364.

Theo kiểu R, có thể thuận tiện để đóng gói mô phỏng trong một hàm để bạn có thể dễ dàng sửa đổi kích thước mẫu hoặc số lượng thử nghiệm.


2
Công cụ ước tính G2 từ e1071cung cấp hiệu chỉnh sai lệch 'tiêu chuẩn'; xem cran.r-project.org/web/packages/e1071/e1071.pdf . Sử dụng công cụ ước tính này thay vì g2, được triển khai bởi momentsgói, ít có tác dụng, như tôi đã lưu ý trong Q. Việc phụ thuộc vào khoảnh khắc thứ tám thực sự có nghĩa là kích thước mẫu quá nhỏ ở đây.
shabbychef

5

[Chỉ trên Phong cách R - @whuber đã trả lời Kurtsosis Q]

Điều này là một chút quá phức tạp để dính vào một bình luận. Đối với các vòng lặp đơn giản như vòng lặp bạn sử dụng, chúng ta có thể kết hợp đề xuất của @ whuber về việc đóng gói mô phỏng trong hàm với replicate()hàm. replicate()chăm sóc phân bổ và chạy vòng lặp cho bạn. Một ví dụ được đưa ra dưới đây:

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

Chúng tôi sử dụng nó như thế này:

> 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

Lưu ý rằng tôi sử dụng rlnorm()hàm để tạo biến ngẫu nhiên log-normal. Nó tương đương với exp(rnorm())trong vòng lặp của bạn nhưng sử dụng công cụ chính xác và chúng tôi cho phép chức năng của chúng tôi truyền các tham số do người dùng chỉ định của phân phối log-normal.

> set.seed(123)
> exp(rnorm(1))
[1] 0.5709374
> set.seed(123)
> rlnorm(1)
[1] 0.5709374

+1 cho set.seed, sẽ giúp trong các ví dụ như thế này. Có một lý do đáng kể nào để đóng gói trong một hàm ( ví dụ: trình thông dịch R sẽ biên dịch trước các hàm, do đó có một số tăng tốc), hoặc là kiểu cách ( ví dụ như các hàm đóng gói, như bông cải xanh, tốt cho bạn) hoặc ở đâu đó ở giữa ( ví dụ, có rất nhiều toán tử trong R hoạt động trên các hàm, vì vậy người ta nên làm quen với lập trình hàm)?
shabbychef

@shabbychef: Tôi nghĩ cái chính là nỗ lực. Bạn có thể chạy mã của mình với vòng lặp vv nhiều lần và nó sẽ ổn, nhưng bạn phải tiếp tục chạy tất cả các dòng mã của mình. Bằng cách đóng gói nó, bạn chạy 1 dòng mã R cho mỗi mô phỏng bạn muốn chạy. Không tăng tốc vì R không biên dịch bất cứ thứ gì trước thời hạn IIRC.
Gavin Simpson

1
Cảm ơn bạn đã làm rõ. Vì đây là tất cả trong một tệp nhỏ, dù sao nó cũng chỉ là một dòng : source('foo.r');)
shabbychef
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.