Bagaimana cara menangani Infs dengan benar dalam fungsi statistik?

8

Misalkan saya memiliki fungsi seperti:

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

itu seharusnya bekerja untuk setiap nilai nyata x, tetapi sebenarnya mengembalikan NaN ketika x adalah 710 atau lebih besar. Saya bertanya-tanya apa cara yang tepat untuk menangani masalah ini. Saya menyadari mudah untuk membuatnya hanya mengembalikan 1, tetapi mungkin itu bukan perilaku yang baik dari sudut pandang seorang ahli statistik. Apakah ada yang punya komentar atau saran?

David Z
sumber
Saya tidak tahu apakah saya bisa memercayai estimasi parameter berbasis model dengan nilai-nilai pengaruh tinggi dalam fungsi. Anda dapat mengharapkan algoritma Newton-Raphson standar Anda untuk memberi Anda perkiraan parameter yang tidak masuk akal dengan nilai sebagai prediktor linier dalam model regresi logistik. Rasio peluang dapat dilaporkan sebagai nilai tak terbatas. Selain itu, saya yakin Anda dapat membalikkan tes skor untuk mendapatkan interval kepercayaan yang valid untuk rasio odds. x
AdamO
Itu benar-benar tergantung pada tujuan apa nilai-nilai itu sedang berubah. untuk besar pergi ke ; ini mungkin berguna untuk beberapa tujuan dan tidak banyak baik untuk yang lain. exp(x)/(1+exp(x))x1exp(x)
Glen_b -Reinstate Monica

Jawaban:

11

Dalam hal ini NaN(bukan angka) dikembalikan karena perhitungan luapan eksponensial dalam aritmatika presisi ganda.

Ekspresi yang setara secara aljabar, diperluas dalam seri MacLaurin sekitar , adalah0

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

Karena ini adalah seri bergantian, kesalahan yang dibuat dalam menjatuhkan istilah apa pun tidak lebih besar dari ukuran istilah berikutnya. Jadi ketika , kesalahannya tidak lebih besar dari relatif terhadap nilai sebenarnya. Itu jauh lebih tepat daripada perhitungan statistik apa pun yang perlu dilakukan, jadi Anda boleh mengganti nilai pengembalian dengan dalam situasi ini.x>710exp(710)1030821024 1

Menariknya, Rtidak akan menghasilkan NaNketika eksponensial mengalir . Dengan demikian Anda bisa memilih versi perhitungan yang lebih andal, tergantung pada tanda x, seperti pada

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

Masalah ini muncul di hampir semua platform komputasi (saya belum melihat pengecualian) dan mereka akan bervariasi dalam bagaimana mereka menangani overflow dan underflow. Eksponensial terkenal karena menciptakan masalah seperti ini, tetapi mereka tidak sendirian. Oleh karena itu, tidak cukup hanya dengan memiliki solusi R: seorang ahli statistik yang baik memahami prinsip-prinsip aritmatika komputer dan tahu bagaimana menggunakannya untuk mendeteksi dan mengatasi kekhasan lingkungan komputernya.

whuber
sumber
1
Mungkin perlu menunjukkan bahwa ketika atau lebih, akan mengevaluasi ke ( tepatnya ) karena pembulatan floating point. Demikian pula, ketika , mengevaluasi ke , ketika hasil bagi menghasilkan nilai yang tepat dari . Masalah presisi ketika secara astronomis lebih kecil! x<-361+exp(x)1x>361+exp(x)exp(x)1|x|>710
whuber
1

Yang lain sudah membahas masalah komputasi, jadi saya akan menyerahkannya kepada mereka. Karena saya menganggap Anda bekerja dengan R, saya pikir saya akan menunjukkan paket boot dilengkapi dengan fungsi logit terbalik sendiri untuk Anda gunakan yang cukup stabil secara komputasi:

require(boot) inv.logit(710)

tampaknya mengevaluasi ke 1 seperti yang diinginkan.

Samuel Benidt
sumber
1
Atau jika Anda ingin menghindari ketergantungan pada paket, plogis(710)dapatkan hasil yang sama. (Memang inv.logithanya alias untuk plogis.)
orizon