Tính toán hàm siêu bội trong R


8

Tôi đang gặp khó khăn rất lớn khi đánh giá với gói trong R. Trong trường hợp của tôi, các giá trị của , , luôn là các số thực dương. Mặc dù vậy, hàm siêu bội rất nhạy cảm với các giá trị của chúng. Tôi không tìm kiếm độ chính xác cao; Tôi có thể sử dụng Excel để có được ước tính sơ bộ về siêu âm Guass phù hợp với mục đích của mình.2F1(một,b;c;z)hypergeob cmộtbc

Bất kỳ đề xuất nào cho việc triển khai trong R sẽ cung cấp một phép tính siêu bội Gaussian siêu chính xác, nhanh chóng, nếu không phải là siêu thực với các giá trị dương?

Chỉnh sửa: có vẻ như có nhiều mã cho điều này trong MATLAB hơn R. Bạn có suy nghĩ gì về lý do tại sao không?


tôi đã nghĩ rằng một cách tiếp cận tốt sẽ là tìm thuật ngữ lớn nhất trong tổng siêu bội và cắt ngắn xung quanh thuật ngữ này. bằng cách này, bạn có thể tính ra số hạng lớn nhất và làm việc với các số hạng nhỏ hơn 1 trong tổng số. bạn cũng có thể sử dụng phương pháp laplace trên biểu diễn tích phân (được tham số hóa phù hợp để tránh các vấn đề biên).
xác suất

Câu trả lời:


14

Trừ khi bạn cần đánh giá hàm siêu bội Gauss cho các giá trị phức tạp của các tham số hoặc biến, tốt hơn là sử dụng gslgói Robin Hankin .

[0,1]]-,0]

library(gsl)
Gauss2F1 <- function(a,b,c,x){
    if(x>=0 & x<1){
        hyperg_2F1(a,b,c,x)
    }else{
            hyperg_2F1(c-a,b,c,1-1/(1-x))/(1-x)^b
        }
}

Cập nhật

Đây là cách triển khai thay thế của tôi với gói gmp (ít nhất là cho vui)


1
Cảm ơn cho một giải pháp đơn giản, sạch sẽ cho một vấn đề không đơn giản! Không có nhiều tài liệu về các hàm siêu bội gauss cho R nên cách tiếp cận này có giá trị.
benrolls

@benrolls Tôi đã trải nghiệm chức năng siêu âm Gauss với gói hypergeo, gói gsl, một phương thức khác do chính tôi thực hiện và Mathicala cũng vậy. Tôi đảm bảo rằng giải pháp tôi đưa ra ở trên rất hiệu quả, tôi chưa bao giờ tìm thấy lỗi khi sử dụng nó.
Stéphane Laurent

Công thức của Stéphane ở trên là tuyệt vời, nhưng tôi nhận thấy rằng nó tạo ra NaN khi c-một

1

@ Công thức của Stéphane Laurent ở trên là tuyệt vời. Tôi đã nhận thấy rằng đôi khi nó tạo ra NaNs khi a, b, clớn và zlà tiêu cực - tôi đã không thể ghim các điều kiện chính xác xuống. Trong những trường hợp này, chúng ta có thể sử dụng một phép biến đổi siêu bội khác bắt đầu từ biểu thức thay thế của Stéphane. Nó dẫn đến công thức thay thế này:

library(gsl)
Gauss2F1b <- function(a,b,c,x){
    if(x>=0 & x<1){
        hyperg_2F1(a,b,c,x)
    }else{
        hyperg_2F1(a,c-b,c,1-1/(1-x))/(1-x)^a
    }
}

Ví dụ:

> Gauss2F1(80.2,50.1,61.3,-1)
[1] NaN
>
> Gauss2F1b(80.2,50.1,61.3,-1)
[1] 5.498597e-20
>
>
> Gauss2F1(80.2,50.1,61.3,-3)
[1] NaN
> Gauss2F1b(80.2,50.1,61.3,-3)
[1] 5.343807e-38
>
>
> Gauss2F1(80.2,50.1,61.3,-0.4)
[1] NaN
> Gauss2F1b(80.2,50.1,61.3,-0.4)
[1] 3.322785e-10

cả ba đều đồng ý với Mathicala's Hypergeometric2F1. Công thức này dường như cũng cư xử cũng cho nhỏ hơn a, b, c. Tuy nhiên, xin lưu ý rằng có những trường hợp mà công thức này đưa ra NaNvà Stéphane thì không . Tốt nhất để kiểm tra từng trường hợp.

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.