为什么我在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这将让你NaNNaNNA

> 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


以上是为什么我在R的这个计算中得到NAs?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>