VGAM バージョン 0.93
> logit(1000, inverse=T)
[1] 0 # it should be 1
問題はここにあります:
exp(1000 - log1p(exp(1000)))
ここlog1p(exp(1000))
になるInf
plogis
したがって、使用する数値法は、正しく機能する基数と比較して、大きな数を処理しません。
バグレポートを送信する価値はありますか? また、どこに送信すればよいですか?
更新: これはバグです。浮動小数点の問題にもかかわらず、1 を返す必要があります。実際、plogis
問題を正しく処理するため、この場合は関数を使用する必要があります。著者とメンテナは、DESCRIPTION ファイルで Thomas Yee として報告されています。彼に電子メールを送信する必要があります。
お使いのマシンは、それほど小さい浮動小数点を表すことができません。逆ロジット関数を考えてみましょう:
inv.logit<-function(x) exp(x)/(1+exp(x))
500 であっても、非常に小さいです。
inv.logit(-500)
# 7.124576e-218
私のマシンでは、これはマシンが表現できる限界に近づいています。この値を見つけることができます.Machine$double.xmin
。
.Machine$double.xmin
# [1] 2.225074e-308
ここで正確な値に本当に関心がある場合は、数値をコンピューターで表現できるスケールに変換する必要があります。
実際、多数の場合、問題は変わりません。(1000 の逆ロジットを要求する場合) マシンに何を表現するよう要求しているかを明確にするために、gmp
パッケージを使用してみてください。この数の逆数の補数を求めています:
library(gmp)
exp(1)^as.bigz(1000)
Big Integer ('bigz') :
[1] 10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376
問題は、この数値の逆数を取ることです。これは非常に小さくなり、コンピューターでは表現できません。
実際にRmpfr
パッケージを使用してこの数を計算できます (gmp
依存関係として使用されます。以下に例を示します。
library(Rmpfr)
1- (1/exp(mpfr(1000,precBits=1e5)))
[1] 0.999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999994924041102450543234708 ....