You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

R语言代码计算返回NaN问题求助:如何修正得到正确结果

问题原因与解决方法

你的代码返回NaN是因为R的浮点数运算规则和你手动计算的逻辑存在差异,具体来说是0与无穷大(Inf)/负无穷大(-Inf)相乘时会得到NaN,而你手动计算时默认这些项为0。我们来拆解问题:

导致NaN的关键部分

nu[1] = 0时:

  1. nu[1]*(log(nu[1])-1)log(0)在R中返回-Inf,计算0 * (-Inf)的结果是NaN
  2. g1*nu[1]*(1+log(h.new[1]/nu[1]))h.new[1]/nu[1]5/0,返回Inflog(Inf)Inf,再计算0 * Inf同样得到NaN

这两个NaN会导致整个表达式的结果变成NaN,尽管其他项的计算是正常的。

修改后的代码

我们可以通过条件判断,在nu = 0时直接将这些涉及0乘无穷大的项设为0(和你手动计算的逻辑一致),其他情况保留原计算:

a0 = 1.5; a1 = 0.4; b1 = 0.3; g1= 0.7 
nu = rep(0,1) 
h.new = rep(0,1) 
ddp = rep(0,1) 

nu[1] = 0 
h.new[1] = a0/(1-a1-b1) 

# 拆分各项并处理nu=0的边界情况
term1 <- 0.5 * log(g1)
term2 <- -g1 * h.new[1]
# 当nu=0时,该项手动计算为0
term3 <- if (nu[1] == 0) 0 else nu[1] * (log(nu[1]) - 1)
term4 <- -log(factorial(nu[1]))  # factorial(0)=1,log(1)=0,这部分没问题
# 同样处理nu=0的情况
term5 <- if (nu[1] == 0) 0 else g1 * nu[1] * (1 + log(h.new[1]/nu[1]))

ddp[1] <- term1 + term2 + term3 + term4 + term5

验证结果

运行修改后的代码,ddp[1]会返回你手动计算的结果:

> ddp[1]
[1] -3.678302

这个方法的核心是明确处理nu=0的边界场景,对齐R的运算规则和你的手动计算逻辑,避免出现0与无穷大相乘的情况。

内容的提问来源于stack exchange,提问作者Miyazaki

火山引擎 最新活动