为什么我在R的这个计算中得到NAs?
在处理 Rcpp 程序时,我使用了 sample() 函数,这给了我以下错误:“概率不允许 NA。” 我将这个问题追溯到我使用的概率向量中包含 NA 值的事实。我不知道如何。下面是一些捕获错误的 R 代码:
n.0=20
n.1=20
n.reps=1
beta0.vals=rep(seq(-.3,.1,,n.0),n.reps)
beta1.vals=rep(seq(-7,0,,n.1),n.reps)
beta.grd=as.matrix(expand.grid(beta0.vals,beta1.vals))
n.rnd=200
beta.rnd.grd=cbind(runif(n.rnd,min(beta0.vals),max(beta0.vals)),runif(n.rnd,min(beta1.vals),max(beta1.vals)))
beta.grd=rbind(beta.grd,beta.rnd.grd)
N = 22670
count = 0
for(i in 1:dim(beta.grd)[1]){ # iterate through 600 possible beta values in beta grid
beta.ind = 0 # indicator for current pair of beta values
for(j in 1:N){ # iterate through all possible Nsums
logit = beta.grd[i,1]/N*(j - .1*N)^2 + beta.grd[i,2];
phi01 = exp(logit)/(1 + exp(logit))
if(is.na(phi01)){
count = count + 1
}
}
}
cat("Total number of invalid probabilities: ", count)
这里,$beta_0 in (-0.3, 0.1), beta_1 in (-7, 0), N = 22670, N_text{sum} in (1, N)$。请注意,$N$和$N_text{sum}$是整数,而 beta 值可能不是。
从数学上讲,$phi_{01} in (0,1)$,我假设 NA 出现是因为 R 不喜欢极小的值。我也收到了大量的 NA 值。比数字更重要。为什么我会在这段代码中得到 NAs?
回答
包括print(logit)旁边count = count + 1,您会发现很多 logit > 1000 值。exp(1000) == Inf 所以你把Inf通过Inf这将让你NaN和NaN是NA:
> exp(500)
[1] 1.403592e+217
> Inf/Inf
[1] NaN
> is.na(NaN)
[1] TRUE
所以,你的问题是不是太小,而是大量的未来先出的评估exp(x)有x较大然后大致700:
> exp(709)
[1] 8.218407e+307
> exp(710)
[1] Inf