Политология Программирование Вопрос - PullRequest
1 голос
/ 02 июня 2011

Извините, я здесь очень наглядно описываю, но надеюсь, вы могли бы помочь мне решить следующую проблему (я пытаюсь запрограммировать это на R):

Допустим, у нас есть массив, в котором строки - стороны, а столбцы - позиции выпуска сторон (измеренные как расстояние от медианной позиции выпуска по всем сторонам). Я хочу смоделировать вечеринки, объявляющие о проблеме платформы. Это выглядит так: начните с вопроса, по которому расстояние от медианного положения вопроса наименьшее, и объявите эту платформу с вероятностью (1 минус расстояние выпуска от медианного .... стороны объявят, что проблема является их платформой с вероятностью = 1 если они являются срединной стороной в этом вопросе). Если rbinom (1,1, prob) == 1, они объявят эту проблему (то есть индикатор столбца) в качестве своей платформы. Если rbinom (1,1, prob) == 0, они перейдут к проблеме, по которой расстояние от средней позиции вопроса будет вторым к наименьшему (и получено из биномиального распределения) и так далее, пока платформа не станет объявил. Все стороны проходят одни и те же шаги, чтобы найти платформу для этой модели, но стороны расходятся в вопросах, по которым они ближе всего к срединной стороне.

Не могли бы вы посоветовать, как запрограммировать такую ​​настройку?

1 Ответ

2 голосов
/ 02 июня 2011

Я построил игрушечную модель, которая может вычислять то, что вы хотите. Предполагая, что есть n сторон и k проблем, ниже я предоставляю код для вычисления выбора стороны для одной стороны. Следует обобщить код для всех сторон. Вам просто нужно добавить петлю. Я оставил это как упражнение для вас =):

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)
      }
  }
}

Функция "gen.pos" найдет платформу для первой партии (первая строка). Я думаю, вам просто нужно применить "для", чтобы генерировать позиции для всех сторон. Обратите внимание, что функция рекурсивная, и именно поэтому я потратил на это свое время: мне действительно нравится писать рекурсивные функции!

пс .: Проверьте мою функцию. Казалось, что это работает здесь, и я думаю, что это правильно, но, как говорят некоторые люди, «доверяй, но проверяй».

ps.2: функция возвращает позицию (т. Е. Столбец) для первой стороны. Если вам нужен номер, а не позиция, используйте Juts,

position.final = gen.pos(Party_position, med, k)
plataform = party_position[1,position.final]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...