2013-04-26 5 views
0

Premier - donc désolé pour un poste si long. J'essaie d'être précis! Merci pour le lire :) J'ai deux vecteurs comme suit:obtenir "NaN" résultats de pour la boucle

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

Ceux-ci représentent la distribution initiale dans les 2 populations. Je veux définir ces paramètres, par ex.

popd[]=0.01 
popr[]=0.01 

Je définis également e = 0,05, et les populations vont ensuite transformer selon les critères suivants pour la boucle:

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 et popdistcomp1 sont deux matrices que je l'ai déjà définies. Cependant, quand je demande les résultats que j'obtiens:

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 

et

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" 

Je n'ai montré les 10 premières entrées pour des raisons d'espace, mais ils continuent dans la même veine, bien que je devrais probablement dire que les deux dernières entrées de popdistcomp1 sous mutatedpopr sont 0.05 et 0.95. Ce dont je ne suis pas sûr, c'est l'origine des entrées "NaN". Je suppose qu'il y a un problème dans le code quelque part, ou peut-être que c'est un problème avec la structure de ma boucle. Je suis un débutant complet, en utilisant R depuis environ 5 jours alors excuses si je suis daft.

Merci pour toute aide,

Lucy

Répondre

0

Quelques suggestions pour commencer:

R est fortement vectorisée, afin d'éviter d'écrire des tonnes de 'microfonctions'. D'une part, vous avez de la chance que des objets comme popd soient visibles par la fonction (puisque vous ne les avez pas passés dans la fonction). Essayez plutôt my.pi <- sum(popd[1:S]*(100-S).

forfor ne renvoie pas de valeur, donc ne tapez pas foo<-for(.....

N'utilisez pas de symboles grecs. Cela n'aide pas et peut très bien échouer à transférer à d'autres systèmes.

Enfin, effectuez un travail de débogage. Jetez un oeil à chaque calcul qui précède le calcul de meanoffer, aka test1[,4], examiner la sortie de chaque étape, et voir où NaN apparaît d'abord. Vos étapes sont assez simples, donc l'erreur devrait apparaître assez facilement.

+0

Salut Carl. Merci beaucoup pour ces conseils. Je sais qu'il a un nombre stupide de fonctions dans la boucle for - je préférerais que ce ne soit pas le cas car c'est horrible de taper, mais je ne sais pas comment faire autrement, des suggestions? popd et popr doivent être définis avec la boucle sûrement, sinon il va revenir en arrière et reprendre ces valeurs? – lucy0790

+0

oups. Je ne voulais pas appuyer sur Enter pour le moment. Je suis en train de passer à travers la boucle et j'espère trouver quelque chose. – lucy0790

+0

Oui, définissez-les en dehors de la boucle; Mon point était que les fonctions ont leur propre environnement donc il est risqué de leur faire utiliser des objets qui ne sont pas explicitement passés en arguments aux fonctions. –

Questions connexes