【问题标题】:getting "NaN" results from for loop从 for 循环获取“NaN”结果
【发布时间】:2013-04-20 21:27:53
【问题描述】:

首先 - 很抱歉这么长的帖子。我想具体一点!感谢阅读:) 我有两个向量如下:

popd = vector(mode='numeric', 100) popr = vector(mode='numeric', 100)

这些代表 2 个总体中的初始分布。 我想定义这些,例如

popd[]=0.01
popr[]=0.01

我还定义了 e=0.05,然后种群将根据以下 for 循环进行变换:

loop <- for(i in 1:100)
{π <- function(S)
    {x <- sum(popd[1:S])
    return((100-S)*x)}
µ <- function(A)
    {share <- vector(mode='numeric', (101-A))
    share[] = A:100
    return(share%*%popr[A:100])}
for(S in 1:100){vectorπ <- vector(mode='numeric', 100)
    vectorπ[S]=π(S)}
for(A in 1:100){vectorµ <- vector(mode='numeric', 100)
    vectorµ[A]=µ(A)}
av.payoffd <- sum(popd * vectorπ)
av.payoffr <- sum(popr * vectorµ)
newd <- vector(mode='numeric', 100)
    for(S in 1:100){newd[S]=(popd[S]/(av.payoffd))}
newr <- vector(mode='numeric', 100)
    for(A in 1:100){newr[A]=(popr[A]/(av.payoffr))}
newpopd <- vectorπ * newd
    test1[i,2]=(sum(newpopd * (1:100)))
newpopr <- vectorµ * newr
    test1[i,4]=(sum(newpopr * (1:100)))
mutationmatrix <- function(e)
    {mut <- c(e, 1-(2*e), e)
    return(matrix(c(1-e, e, (rep(c(rep098, mut), times=98)), rep098, e, 1-e), nrow=100))}
mutpopd <- function(e)
    {mutationmatrix(e) %*% newpopd}
    test1[i,3]=(sum(mutpopd(e) * (1:100)))
mutpopr <- function(e)
    {mutationmatrix(e) %*% newpopr}
    test1[i,5]=(sum(mutpopr(e) * (1:100)))
if(i<100){
    popd=mutpopd(e)
    popr=mutpopr(e)
}
if(i==100){
    for(i in 1:100){
    popdistcomp1[i,3]=mutpopd(e)[i,1]
    popdistcomp1[i,6]=mutpopr(e)[i,1]}
}
}

test1 和 popdistcomp1 都是我已经定义的矩阵。 但是,当我询问结果时,我得到了:

test1
         i meanoffer meanmutoffer meanminaccept meanmutminaccept
  [1,]   1       NaN          NaN           100            99.95
  [2,]   2       NaN          NaN           100            99.95
  [3,]   3       NaN          NaN           100            99.95
  [4,]   4       NaN          NaN           100            99.95
  [5,]   5       NaN          NaN           100            99.95
  [6,]   6       NaN          NaN           100            99.95
  [7,]   7       NaN          NaN           100            99.95
  [8,]   8       NaN          NaN           100            99.95
  [9,]   9       NaN          NaN           100            99.95
 [10,]  10       NaN          NaN           100            99.95

popdistcomp1
       p(i)   initialpopd mutatedpopd q(a)   initialpopr mutatedpopr
  [1,] "p1"   "0.01"      "NaN"       "q1"   "0.01"      "0"        
  [2,] "p2"   "0.01"      "NaN"       "q2"   "0.01"      "0"        
  [3,] "p3"   "0.01"      "NaN"       "q3"   "0.01"      "0"        
  [4,] "p4"   "0.01"      "NaN"       "q4"   "0.01"      "0"        
  [5,] "p5"   "0.01"      "NaN"       "q5"   "0.01"      "0"        
  [6,] "p6"   "0.01"      "NaN"       "q6"   "0.01"      "0"        
  [7,] "p7"   "0.01"      "NaN"       "q7"   "0.01"      "0"        
  [8,] "p8"   "0.01"      "NaN"       "q8"   "0.01"      "0"        
  [9,] "p9"   "0.01"      "NaN"       "q9"   "0.01"      "0"        
 [10,] "p10"  "0.01"      "NaN"       "q10"  "0.01"      "0"   

为了篇幅,我只展示了前 10 个条目,但它们大致相同,尽管我应该说 popdistcomp1 在 mutatedpopr 下的最后两个条目是 0.05 和 0.95。

我不确定“NaN”条目的来源。我猜代码某处有问题,或者可能是我的循环结构有问题。我是一个完整的初学者,已经使用 R 大约 5 天了,如果我很愚蠢,请见谅。

感谢您的帮助,

露西

【问题讨论】:

    标签: r loops for-loop iteration nan


    【解决方案1】:

    一些开始的建议:

    R 是高度矢量化的,因此请避免编写大量“微函数”。一方面,您很幸运,像 popd 这样的对象恰好对函数可见(因为您没有将它们传递给函数)。请改用my.pi &lt;- sum(popd[1:S]*(100-S)

    for 不返回值,所以不要输入 foo&lt;-for(....

    不要使用希腊符号。它没有帮助,很可能无法转移到其他系统。

    最后,做一些调试工作。查看meanoffer(又名test1[,4])计算之前的每个计算,检查每个步骤的输出,并查看NaN 第一次出现的位置。您的步骤非常简单,因此应该很容易弹出错误。

    【讨论】:

    • 你好,卡尔。非常感谢那些指点。我知道它在 for 循环中有很多愚蠢的功能 - 我宁愿不是这种情况,因为打字很糟糕,但我不知道该怎么做,有什么建议吗? popd 和 popr 必须在循环之外定义,否则它将循环返回并再次获取这些值?
    • 哎呀。我还没有按回车的意思。我正在循环中,希望能找到一些东西。
    • 是的,在循环之外定义它们;我的观点是,函数有自己的环境,因此让它们使用未显式作为参数传入函数的对象是有风险的。
    • 我找到了错误!谢谢@卡尔。你的个人资料也让我微笑,因为它让我抬头看看那些狗……看到它们就笑不出来了!干杯。
    • 很高兴听到您解决了问题。希望你喜欢R;顺便说一句,有一只小狗依偎在你的椅子上,编程总是更有趣!
    猜你喜欢
    • 2021-05-26
    • 2017-02-07
    • 2021-09-12
    • 1970-01-01
    • 2021-03-05
    • 1970-01-01
    • 1970-01-01
    • 2014-06-20
    • 1970-01-01
    相关资源
    最近更新 更多