0

VGAM バージョン 0.93

> logit(1000, inverse=T)
[1] 0 # it should be 1

問題はここにあります:

exp(1000 - log1p(exp(1000)))

ここlog1p(exp(1000))になるInf

plogisしたがって、使用する数値法は、正しく機能する基数と比較して、大きな数を処理しません。

バグレポートを送信する価値はありますか? また、どこに送信すればよいですか?

4

1 に答える 1

0

更新: これはバグです。浮動小数点の問題にもかかわらず、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 ....
于 2014-04-25T14:19:26.930 に答える