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
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
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
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. –