統計関数でInfsを適切に処理する方法


8

次のような関数があるとします。

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

これは、xの任意の実際の値で機能するはずですが、実際には、xが710以上の場合、NaNを返します。この問題を処理する適切な方法は何だろうと思います。1を返すだけにするのは簡単だと思いますが、統計学者の観点からは、それは良い行動ではないかもしれません。誰かコメントや提案がありますか?


このような関数の影響値が高いモデルベースのパラメーター推定を信頼できるかどうかはわかりません。標準のNewton-Raphsonアルゴリズムでは、値がロジスティック回帰モデルの線形予測子として無意味なパラメーター推定値になることが期待できます。オッズ比無限値として報告されます。さらに、オッズ比の有効な信頼区間を取得するためにスコアテストを反転できると思います。x
AdamO 2014

それは、価値観がどのような目的に向けられているかによります。大型用に行く。これは、ある目的には役立ち、他の目的にはあまり役に立たない場合があります。exp(x)/(1+exp(x))x1exp(x)
Glen_b-モニカを復元する

回答:


11

この場合、NaN指数ではない計算が倍精度演算でオーバーフローするため、(数値ではない)が返されます。

MacLaurinシリーズで中心に展開された代数的に等価な式は、次のとおりです。0

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

これは交互のシリーズであるため、任意の項の削除で発生するエラーは、次の項のサイズ以下です。したがって、場合、エラーは真の値に対してです。これは、どの統計計算よりもはるかに正確であるため、この状況では戻り値をに置き換えます。EXP - 710 10 - 3082 - 1024個の 1x>710exp(710)1030821024 1

興味深いことに、指数アンダーフローがR発生することはありません。したがって、あなただけの符号に応じて、計算のより信頼性の高いバージョンを選ぶことができるのように、NaNx

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

この問題はほとんどすべてのコンピューティングプラットフォームで発生し(まだ例外は確認していません)、オーバーフローとアンダーフローの処理方法が異なります。指数関数はこれらの種類の問題を作成することで悪名高いですが、それだけではありません。したがって、問題を解決するだけでは十分ではありませんR。優れた統計学者は、コンピュータの算術の原理を理解し、これらを使用してコンピューティング環境の特異性を検出および回避する方法を知っています。


1
程度の場合、浮動小数点の丸めにより、は(正確に)と評価されることに注意してください。同様に、、評価するに商が生成そこから、正確な値。が天文学的に小さい場合の精度の問題!1 + exp x 1 x > 36 1 + exp x exp x 1 | x | > 710x<361+exp(x)1x>361+exp(x)exp(x)1|x|>710
whuber

1

他の人はすでに計算の問題について議論しているので、私は彼らにそれを任せます。私はあなたがRで作業していると想定しているので、ブートパッケージには、計算上非常に安定した独自の逆ロジット関数が付属していることを指摘しておきます。

require(boot) inv.logit(710)

必要に応じて1に評価されるようです。


1
または、パッケージの依存関係の導入を避けたい場合でもplogis(710)、同じ結果が得られます。(確かinv.logitplogis。の単なるエイリアスです。)
オリゾン2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.