R:共识投票的模拟研究

R: Simulation study of consensus voting

在这项研究中,我要求 nRaters 对不同的响应选项进行投票(他们响应不同选择的概率由 ProbabilityDist 定义,如下所示)。对于每个item.i,投票在两种情况下停止(以先到者为准):

  1. "votes" 的人数超过 AgreementThreshold(即同意某项的人数百分比。
  2. 已回答问题的评分者达到最大数量(由 MaxNRaters 定义)

例如,如果评判者 1 和评判者 2 响应 "A",则投票停止,但如果评判者 1 响应 "A" 但评判者 2 响应 "B",则投票继续(在这种情况下,"A" 应该是returned 如果 Rater3 回复 "A" 因为达到了 50% 以上。但是,如果 Rater3 回复 "C" - [= "NoAgreement" 应该 returned 38=] 因为未达到 AgreementThreshold)。

我已经开始编写下面的代码,但我仍然不知道如何创建一个循环或其中有条件停止的函数。我也想重复此操作,以便我可以 return 像 d.out.

中显示的示例输出一样输出
ResponseChoices= LETTERS[1:8]
ProbabilityDist= c(0.6, 0.2, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03)
MaxNRaters=3
AgreementThreshold = .5 
    #Obtain consensus answer when greater than 50% of raters agree 
    #e.g., if votes for Item.i = "A" "H" "A" return "A"

### Some kind of conditional loop here ###
### Note: the loop should iterate through multiple items using the stop rules described above

VotesForItem.i <- sample(ResponseChoices, nRaters, replace=TRUE, prob=ProbabilityDist)

##########################################


# return(votes)

#Sample of desired output
items=c(1:5)
VotedResponses=c("A","A","B","NoAgreement","A")
d.out=cbind(items,VotedResponses)

执行您要求的操作,尽管对于 MaxNRaters 的大值来说确实很慢。

items <- 3    
responses <- c(8, 5, 4) # number of responses for each item
ResponseChoices <- lapply(1:items, function(i) paste0(LETTERS[1:responses[i]], i))
ProbabilityDist <- lapply(1:items, function(i)rmultinom(1, 100, prob = 1:responses[i])/100)

MaxNRaters=3
AgreementThreshold = .5
simResults=NULL
for(j in 1:items){
    i <- 1
    VotedResponses <- c()
    Rater <- c()
    decision <- c()
    while(i<=MaxNRaters){
        Rater <- c(Rater, i)

        resp <- sample(ResponseChoices[[j]], 1 , replace=TRUE, prob=ProbabilityDist[[j]])
        VotedResponses <- c(VotedResponses, resp)
        if(any(table(VotedResponses) > i*AgreementThreshold)&i>1) {
            decision <- c(decision, resp)
            break
        }
        else{
            decision <- c(decision, "No Agreement")
            i <- i+1
        }
    }
    nraters=length(decision)
    decision=decision[nraters]

    simResults.i=cbind(j, nraters,decision)

    simResults=rbind(simResults, simResults.i)
}

或接近您想要的输出

library(dplyr)
data_frame(responses=sample(ResponseChoices, 5, replace=TRUE, prob=ProbabilityDist))%>%
    group_by(responses) %>% mutate(counts=1:n()) %>% ungroup %>% 
    mutate(d= floor(row_number()*AgreementThreshold))%>%  
    mutate(decision=ifelse( cummax(counts) > d, responses, "NoAgreement"))%>% 
    select(-counts, -d)

#   responses    decision
#1         B           B
#2         A NoAgreement
#3         A           A
#4         A           A
#5         A           A

投票在第一个非 NoAgreement 决定时停止。在上面的示例中,它停在 3.