R语言含ifelse的自定义函数对负数运算返回NaN问题求解
问题原因
- R语言的幂运算符
^默认仅在实数域执行计算,负数的非整数次幂会直接返回NaN:非整数指数本质对应分数开方运算,当分数分母为偶数时不存在实数结果,R没有自动判断分数分母奇偶性的逻辑,对所有负底数的非整数幂统一返回NaN。 - 你当前的函数逻辑存在错误:
ifelse的负数分支直接使用x^a计算,传入负数x时该运算本身就会生成NaN,再乘系数l也不会改变结果。
解决方案
如果你的函数是实现前景理论的价值函数,修正负数分支的计算逻辑即可:先对x取绝对值计算幂次,再处理符号和损失放大系数:
lambda <- 2.77 alpha <- 0.88 # 修正后的效用函数 util <- function( x, a, l){ ifelse(x >= 0, x^a, -l * ((-x)^a) ) }
测试调用结果:
> util(-0.5, alpha, lambda) [1] -1.553072 > util(0.5, alpha, lambda) [1] 0.5606758
如果你的业务逻辑不需要负数结果,只需返回损失的绝对值权重,去掉负数分支的前置负号即可,即把负数分支改为l * ((-x)^a)。
如果是通用的负数非整数幂实数计算场景,可使用通用写法:sign(x) * (abs(x)) ^ 指数,适配正负值的计算需求。
内容的提问来源于stack exchange,提问作者Petas Zwegas
相关产品推荐
相关产品推荐

