R:共识投票的模拟研究
R: Simulation study of consensus voting
在这项研究中,我要求 nRaters
对不同的响应选项进行投票(他们响应不同选择的概率由 ProbabilityDist
定义,如下所示)。对于每个item.i
,投票在两种情况下停止(以先到者为准):
- "votes" 的人数超过
AgreementThreshold
(即同意某项的人数百分比。
- 已回答问题的评分者达到最大数量(由
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.
在这项研究中,我要求 nRaters
对不同的响应选项进行投票(他们响应不同选择的概率由 ProbabilityDist
定义,如下所示)。对于每个item.i
,投票在两种情况下停止(以先到者为准):
- "votes" 的人数超过
AgreementThreshold
(即同意某项的人数百分比。 - 已回答问题的评分者达到最大数量(由
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.