Làm thế nào để xử lý đúng Infs trong một chức năng thống kê?


8

Giả sử tôi có một chức năng như:

f <- function(x){
  exp(x) / (1 + exp(x))
}

nó được cho là hoạt động với bất kỳ giá trị thực nào của x, nhưng thực tế nó trả về NaN khi x là 710 hoặc lớn hơn. Tôi đang tự hỏi đâu là cách thích hợp để xử lý vấn đề này. Tôi nhận ra rằng thật dễ dàng để làm cho nó chỉ trở lại 1, nhưng có lẽ đó không phải là một hành vi tốt từ quan điểm của một nhà thống kê. Có ai đó có một số ý kiến ​​hoặc đề xuất?


Tôi không biết liệu tôi có thể tin tưởng các ước tính tham số dựa trên mô hình với các giá trị ảnh hưởng cao như vậy trong hàm không. Bạn có thể mong đợi các thuật toán Newton-Raphson tiêu chuẩn của mình sẽ cung cấp cho bạn các ước tính tham số vô nghĩa với các giá trị như một công cụ dự báo tuyến tính trong các mô hình hồi quy logistic. Tỷ lệ cược có thể được báo cáo là có giá trị vô hạn. Hơn nữa, tôi tin rằng bạn có thể đảo ngược bài kiểm tra điểm số để có được khoảng tin cậy hợp lệ cho tỷ lệ cược. x
AdamO

exp(x)/(1+exp(x))x1exp(x)

Câu trả lời:


11

Trong trường hợp này, NaN(không phải là một số) được trả về vì tính toán của số mũ tràn theo số học chính xác kép.

0

exp(x)1+exp(x)=11+exp(x)=1exp(x)+exp(2x).

x>710exp(710)1030821024 1

Điều thú vị là, Rsẽ không sản xuất một NaNkhi mũ underflows . Do đó, bạn chỉ có thể chọn phiên bản tính toán đáng tin cậy hơn, tùy thuộc vào dấu hiệu của x, như trong

f <- function(x) ifelse(x < 0, exp(x) / (1 + exp(x)), 1 / (1 + exp(-x)))

Vấn đề này xuất hiện trong hầu hết tất cả các nền tảng điện toán (tôi vẫn chưa thấy ngoại lệ) và chúng sẽ thay đổi trong cách chúng xử lý tràn và tràn. Các hàm mũ nổi tiếng với việc tạo ra các loại vấn đề này, nhưng chúng không đơn độc. Do đó, chỉ cần có một giải pháp là không đủ R: một nhà thống kê giỏi hiểu các nguyên tắc số học máy tính và biết cách sử dụng chúng để phát hiện và làm việc xung quanh các đặc điểm riêng của môi trường điện toán của cô ấy.


1
x<361+exp(x)1x>361+exp(x)exp(x)1|x|>710
whuber

1

Những người khác đã thảo luận về các vấn đề tính toán, vì vậy tôi sẽ để lại cho họ. Vì tôi cho rằng bạn đang làm việc với R, tôi nghĩ rằng tôi đã chỉ ra gói khởi động đi kèm với chức năng logit nghịch đảo của chính nó để bạn sử dụng khá ổn định về mặt tính toán:

require(boot) inv.logit(710)

dường như đánh giá đến 1 như mong muốn.


1
Hoặc nếu bạn muốn tránh đưa ra một phụ thuộc gói, plogis(710)đạt được kết quả tương tự. (Quả thực inv.logitchỉ là một bí danh cho plogis.)
orizon
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.