Mô phỏng giới hạn bình thường ở giới hạn dưới hoặc trên trong R


9

Tôi muốn tạo dữ liệu ngẫu nhiên từ phân phối bình thường bị ràng buộc bằng R.

Ví dụ: tôi có thể muốn mô phỏng một biến từ phân phối bình thường mean=3, sd= 2và bất kỳ giá trị nào lớn hơn 5 được lấy lại từ cùng một phân phối bình thường.

Vì vậy, đối với chức năng chung, tôi có thể làm như sau.

rnorm(n=100, mean=3, sd=2)

Sau đó tôi đã có một vài suy nghĩ:

  • Lặp lại một ifelsehàm với một vòng lặp lặp lại cho đến khi tất cả các giá trị bị ràng buộc nằm trong giới hạn.
  • Mô phỏng nhiều giá trị hơn mức yêu cầu và lấy giá trị đầu tiên nthỏa mãn ràng buộc.
  • Tránh mô phỏng biến số thông thường và thay vào đó sử dụng một vòng lặp for với một trong khi bên trong để mô phỏng từng quan sát tại một thời điểm và vòng lặp khi cần thiết.

Tất cả những điều trên có vẻ hơi vụng về.

Câu hỏi

  • Một cách đơn giản để mô phỏng một biến bình thường ngẫu nhiên bị ràng buộc trong R từ bình thường với mean = 3, sd = 2 và max = 5 là gì?
  • Nói chung, một cách tổng quát tốt để kết hợp các ràng buộc vào các biến mô phỏng trong R là gì?

1
Tôi đoán bạn muốn tạo dữ liệu ngẫu nhiên từ phân phối bình thường bị cắt ngắn (bị cắt ở mức 5).
vinux

Câu trả lời:


13

Đây được gọi là phân phối chuẩn bị cắt ngắn:

http://en.wikipedia.org/wiki/Truncated_n normal_distribution

Christian Robert đã viết về một cách tiếp cận để thực hiện nó cho nhiều tình huống (sử dụng khác nhau tùy thuộc vào vị trí của các điểm cắt) ở đây:

Robert, CP (1995) "Mô phỏng các biến thông thường bị cắt cụt",
Thống kê và tính toán, Tập 5, Số 2, Tháng 6, Trang 121-125

Giấy có sẵn tại http://arxiv.org/abs/0907.4010

Điều này thảo luận về một số ý tưởng khác nhau cho các điểm cắt ngắn khác nhau. Đây không phải là cách duy nhất để tiếp cận những thứ này bằng mọi cách nhưng nó thường có hiệu suất khá tốt. Nếu bạn muốn thực hiện nhiều quy tắc cắt ngắn khác nhau với các điểm cắt ngắn khác nhau, đó sẽ là một cách tiếp cận hợp lý. Như bạn đã lưu ý, msm::tnormdựa trên cách tiếp cận của Robert, trong khi truncnorm::truncnormthực hiện lấy mẫu từ chối chấp nhận của Geweke (1991); điều này có liên quan đến cách tiếp cận trong bài báo của Robert. Lưu ý rằng msm::tnormbao gồm các hàm mật độ, cdf và định lượng (nghịch đảo cdf) theo cách thông thường R.

Một tài liệu tham khảo cũ hơn với cách tiếp cận là cuốn sách của Luc Devroye ; kể từ khi nó được in ra, anh ấy đã lấy lại bản quyền và tải nó xuống dưới dạng bản tải xuống.

Ví dụ cụ thể của bạn giống như lấy mẫu một tiêu chuẩn bình thường bị cắt ở 1 (nếu là điểm cắt, ), sau đó nhân rộng kết quả (nhân lên bằng và thêm ).t(t-μ)/σ= =(5-3)/2= =1σμ

Trong trường hợp cụ thể đó, Robert cho rằng ý tưởng của bạn (trong lần tái sinh thứ hai hoặc thứ ba) là khá hợp lý. Bạn nhận được một giá trị chấp nhận được khoảng 84% thời gian và trung bình tạo ra khoảng (bạn có thể tính ra các giới hạn để bạn tạo đủ giá trị bằng thuật toán véc tơ nói 99,5% thời gian và sau đó thỉnh thoảng tạo ra một số ít hiệu quả cuối cùng - thậm chí từng cái một).1,19n

Cũng có thảo luận về việc triển khai mã R ở đây (và trong Rccp trong một câu trả lời khác cho cùng một câu hỏi, nhưng mã R thực sự nhanh hơn). Mã R đơn giản ở đó tạo ra 50000 quy tắc rút ngắn trong 6 mili giây, mặc dù thông thường bị cắt cụ thể đó chỉ cắt đứt các đuôi cực đoan, do đó, việc cắt ngắn rõ ràng hơn có nghĩa là kết quả chậm hơn. Nó thực hiện ý tưởng tạo ra "quá nhiều" bằng cách tính toán số lượng cần tạo ra gần như chắc chắn để có đủ.

Nếu tôi chỉ cần một loại cắt cụ thể bình thường rất nhiều lần, có lẽ tôi sẽ xem xét việc điều chỉnh một phiên bản của phương pháp ziggurat, hoặc một cái gì đó tương tự, cho vấn đề.

Trên thực tế, có vẻ như Nicolas Chopin đã làm điều đó rồi, vì vậy tôi không phải là người duy nhất xảy ra:

http://arxiv.org/abs/1201.6140

Anh ta thảo luận về một số thuật toán khác và so sánh thời gian cho 3 phiên bản thuật toán của mình với các thuật toán khác để tạo ra 10 ^ 8 quy tắc ngẫu nhiên cho các điểm cắt ngắn khác nhau.

Có lẽ không ngạc nhiên, thuật toán của anh hóa ra tương đối nhanh.

Từ biểu đồ trong bài báo, ngay cả những thuật toán chậm nhất mà anh ta so sánh với các điểm cắt ngắn nhất (đối với họ) đang tạo ra giá trị trong khoảng 3 giây - điều đó cho thấy rằng bất kỳ thuật toán nào được thảo luận đều có thể chấp nhận được nếu có lý thực hiện tốt.10số 8

Chỉnh sửa: Một điều mà tôi không chắc chắn được đề cập ở đây (nhưng có lẽ trong một trong các liên kết) là biến đổi (thông qua cdf bình thường nghịch đảo) một bộ đồng phục bị cắt cụt - nhưng đồng phục có thể được cắt bớt bằng cách đơn giản tạo ra một bộ đồng phục trong giới hạn cắt ngắn . Nếu cdf bình thường nghịch đảo nhanh thì điều này vừa nhanh, vừa dễ và hoạt động tốt cho một loạt các điểm cắt ngắn.


10

Theo dõi từ tài liệu tham khảo của @ glen_b và tập trung hoàn toàn vào triển khai R. Có một số hàm được thiết kế để lấy mẫu từ phân phối chuẩn bị cắt ngắn:

  • rtruncnorm(100, a=-Inf, b=5, mean=3, sd=2)trong truncnormgói
  • rtnorm(100, 3, 2, upper=5)trong msmgói

Cảm ơn vì điều đó. (. Tôi đã lên kế hoạch để theo dõi các gói xuống bên cạnh và chỉnh sửa đề cập trong, bởi vì tôi đã nhìn thấy một số gói trong quá khứ mà đã làm như vậy nhưng không nhớ tên của họ Bạn đã cứu tôi một thời gian ở đó.)
Glen_b -Reinstate Monica

Cảm ơn câu trả lời. Thật tuyệt vời khi có các tài liệu tham khảo đến các tài liệu khái niệm rộng hơn về các thuật toán khác nhau.
Jeromy Anglim
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.