我有以下用于在R
中生成随机变量的代码theta<-1
n<-1000
u<-runif(n)
H<-(-theta*log(1-u)^(1/3))
我的问题是,当我知道答案是真实的时,我得到的输出是输出的NaN 1000倍。我定义H的方式有问题吗?
答案 0 :(得分:3)
按顺序:
u = runif(n) # between 0 and 1
1 - u # between 0 and 1
log(1 - u) # negative real
log(1 - u) ^ (1/3) # NaN because...
来自help("^")
“用户有时会对返回的值感到惊讶,例如为什么(-8)^(1/3)
为NaN
。对于双输入,R对所有人使用IEC 60559算法平台,以及用于^运算符的C系统函数pow。相关标准定义了许多极端情况下的结果。特别是,上述示例中的结果是C99标准规定的。“
因此,每当您将x
提升为非整数幂时,如果NaN
,答案将为x < 0
。获得负实际结果的一个选择是将abs(x)
提升为非整数幂,然后使结果为负。 (更一般地说,我们乘以sign(x)
,因此它仍适用于正x
。)
sign(log(1 - u)) * (abs(log(1 - u)) ^ (1/3)) # Negative real, based on your inputs
-theta * sign(log(1 - u)) * (abs(log(1 - u)) ^ (1/3)) # Maybe what you want?