2011-06-26 27 views
5

Để phù hợp với một bộ dữ liệu của các số thực có giá trị (x) với một phân phối, chúng ta có thể sử dụng MASS như sau hoặc là gamma hoặc Student's t phân phối:R: Làm thế nào để phù hợp với một tập dữ liệu lớn với sự kết hợp của các bản phân phối?

fitdistr(x, "gamma") 

hoặc

fitdistr(x2, "t") 

gì nếu tôi tin rằng tập dữ liệu của tôi phải phù hợp với tổng của gamma và phân phối t?

P(X) = Gamma(x) + t(x) 

Tôi có thể phù hợp với các tham số của hỗn hợp phân bố xác suất bằng cách sử dụng Khả năng thích hợp tối đa trong R?

+2

tôi giả sử bạn có ý nghĩa (như các áp phích khác cũng đã thừa nhận) rằng phân phối của bạn là một * hỗn * của Gamma và t (tức là mỗi điểm cá nhân là rút ra từ các bản phân phối Gamma hoặc t). Phương án khác, điều này phức tạp hơn một chút, là (như tôi nghĩ nếu tôi đọc câu hỏi của bạn theo nghĩa đen) thì các giá trị riêng lẻ là tổng của các biến Gamma và t, tức là phân phối là một phép biến đổi của Gamma và t. Vui lòng làm rõ. Nếu nó là sau này tôi có thể đề xuất một giải pháp bằng cách sử dụng gói 'distr' ... –

+0

Hơn hai năm sau đó và không phải là poster ban đầu, nhưng tôi sẽ rất quan tâm đến giải pháp đề xuất của bạn cho convolution bằng cách sử dụng' distr' gói. – msp

Trả lời

3

Có phân tích maximum-likelihood estimators đối với một số thông số, chẳng hạn như giá trị trung bình của normal distribution hoặc tỷ lệ của exponential distribution. Đối với các thông số khác, không có bộ ước lượng phân tích, nhưng bạn có thể sử dụng numerical analysis để tìm ước tính thông số hợp lý.

Chức năng fitdistr() trong R sử dụng chức năng tối ưu hóa số của chức năng đăng nhập bằng cách gọi hàm optim(). Nếu bạn nghĩ rằng dữ liệu của bạn là hỗn hợp của phân phối Gamma và t, thì chỉ cần tạo một hàm khả năng mô tả một hỗn hợp như vậy. Sau đó, chuyển các giá trị tham số đó tới optim() để tối ưu hóa. Dưới đây là một ví dụ sử dụng phương pháp này để lắp một phân phối:

library(MASS) 

vals = rnorm(n = 10000, mean = 0, sd = 1) 
print(summary(x_vals)) 

ll_func = function(params) { 
    log_probs = log(dnorm(x = vals, mean = params[1], sd = params[2])) 
    tot = sum(log_probs) 
    return(-1 * tot) 
}  

params = c(0.5, 10) 

print(ll_func(params)) 
res = optim(params, ll_func) 
print(res$par) 

Chạy chương trình này trong R sản xuất sản lượng này:

[1] "mean: 0.0223766157516646" 
[1] "sd: 0.991566611447471" 

Đó là khá gần với giá trị ban đầu của trung bình = 0 và sd = 1

Đừng quên rằng với một hỗn hợp của hai bản phân phối, bạn có thêm một thông số xác định trọng số tương đối giữa các bản phân phối. Ngoài ra, hãy cẩn thận về việc lắp nhiều thông số cùng một lúc. Với nhiều thông số miễn phí bạn cần phải lo lắng về overfitting.

Các vấn đề liên quan