2011-06-01 4 views
1

Je suis désolé, je suis d'être ici très descriptif mais j'espère que vous pourriez me aider avec le problème suivant (j'essaie de programmer en R):Sciences politiques Programmation Question

Disons que nous avons tableau où les lignes sont parties et les colonnes sont les positions d'émission des parties (mesurées comme la distance de la position d'émission médiane entre toutes les parties). Je veux modéliser les parties annonçant une plateforme d'émission. Cela va comme ceci: commencer par le problème sur lequel la distance de la position d'émission médiane est la plus petite et annoncer cette plate-forme avec probabilité (1 moins la distance d'émission de médiane .... les parties annoncent que cette question est leur plate-forme avec probabilité = 1 s'ils sont la partie médiane sur cette question). Si rbinom (1,1, prob) == 1 ils annonceront ce problème (c'est-à-dire, l'indicateur de colonne) comme plate-forme. Si rbinom (1,1, prob) == 0, ils passeront à la question sur laquelle la distance de la position d'émission médiane est la plus petite à la plus petite (et tirera d'une distribution binomiale) Et ainsi de suite jusqu'à ce qu'une plate-forme soit annoncé. Toutes les parties passent par les mêmes étapes pour trouver une plate-forme d'émission pour ce cycle du modèle, mais les parties diffèrent sur les questions sur lesquelles elles sont les plus proches de la partie médiane.

Auriez-vous des conseils sur la programmation d'une telle configuration?

+1

Qu'avez-vous essayé jusqu'à présent? Collez quelques exemples de données et les résultats attendus. Voir http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example/5963610#5963610 pour obtenir des conseils sur une bonne question. – Andrie

+1

Quelques questions à clarifier: (1) les décisions des parties sont-elles indépendantes les unes des autres, c'est-à-dire que vous pouvez aller par rang dans l'ordre que vous voulez, une fois les distances calculées? (2) les distances sont probablement mises à l'échelle d'une certaine façon, de sorte qu'elles sont comprises entre 0 et 1? [Est-ce que exactement-0 ou exactement-1 possibilités?] Un petit exemple montrant les étapes que vous prendriez avec (par exemple) 2 parties et 2 questions pourrait être utile. –

Répondre

2

J'ai construit un modèle de jouet qui peut calculer ce que vous voulez. En supposant qu'il y ait n parties et k problèmes, ci-dessous je fournis un code pour calculer le choix du parti pour une partie. Il devrait être assez direct pour généraliser le code pour toutes les parties. Vous avez juste besoin d'ajouter une boucle. Je laissâmes, comme un exercice pour vous =):

n = 4 # example with n=4 
k = 3 # k = 3 issues 
party_position = matrix(runif(k*n),nrow=n, ncol=k) # matrix with party positions on each issue 

med = apply(party_position,2 , median) # compute median of each column 

gen.pos = function(party_position, median=med, k) { 

if (k ==1) { # case base, i.e., when all previous decisions were rbinom == 0, there is only one platafform left. Pick that one. 
    issue.announcing = which.max(abs(party_position[1,]-med)) 
    return(issue.announcing) 
} 
else { 
    dif=abs(party_position[1,]-med) # difference between party position and median 
    value=min(dif) # value gets minor difference 
    pos=which.min(dif) # position in party_position matrix of value 
    decision = rbinom(1, 1, 1- value) # decision with probability 1 - difference of minimum value and median 
     if (decision < 1) { # if rbinom < 1, i.e, equals zero 
     k=k-1 # set new k, so recursive function can work 
     party_position[1,-pos] # it'll drop of matrix minimum value found before, so we can pick new minimum value 
     return (gen.pos(party.position, median=med, k)) } # call the function with new matrix 
     else { #i.e. if decision was equal 1, just pick pos as issue plataform 
     issue.announcing = pos 
     return (issue.announcing) 
     } 
    } 
} 

Le functon « gen.pos » trouveront le plataform parti pour partie une (première rangée). Je suppose que vous avez juste besoin d'appliquer un "pour" pour générer des positions pour toutes les parties. Notez que la fonction est récursive, ce qui est, btw, la raison pour laquelle j'ai passé mon temps là-dedans: j'aime vraiment écrire des fonctions récursives!

ps .: Vérifiez ma fonction. Cela a semblé fonctionner ici et je pense que c'est correct, mais comme certaines personnes disent, «faites confiance, mais vérifiez». Ps2: la fonction renvoie la position (c'est-à-dire la colonne) pour la première partie. Si vous avez besoin du numéro, et non de la position, fait usage,

position.final = gen.pos(Party_position, med, k) 
plataform = party_position[1,position.final] 
+0

Merci Manoel. Je vais vérifier et revenir à vous. Best, Martijn – Martijn

+0

J'espère que cela aide. Si vous avez des doutes, il suffit de demander. Et si cela vous convient, je vous demanderais de le considérer comme une réponse acceptée. –