Rでさまざまな投票力指数を計算できるようにする必要があるプロジェクトがあります。これの最初の試みとして、banzhaf指数を計算する小さな関数を書きました。メンバーと投票のラベルを付ける必要がある 2 つの列を持つデータフレームと、過半数 (割り当て) に必要な投票数の 2 つの引数を取ります。
library(combinat)
banzhaf <- function(data,quota){
f <- vector()
m <- vector()
score <- vector()
name <- vector()
pivot <- vector()
for (n in 1:nrow(data)){
y <- as.matrix(combn(data$member,n))
for (i in 1:ncol(y)){
for ( j in 1:n){
f[j] <- data[data$member == y[j,i],]$vote
m[j] <- as.character(data[data$member == y[j,i],]$member)
o <- data.frame(member = m, vote = f)
}
if (sum(o$vote) >= quota){
for (k in 1:length(o$member)){
t <- o[-k,]
if (sum(t$vote) < quota){
pivot[length(pivot) + 1] <- as.character(o$member[k])
}
}
}
}
}
for (l in unique(pivot)){
score[length(score) + 1] <- sum(pivot == l)
name[length(name) + 1] <- l
}
out <- data.frame(name = name, score = score/length(pivot))
return(out)
}
この関数の問題は、データフレームに 8 つを超えるメンバーがあると、非常に遅くなることです。これは、最も外側のループで使用されている combn() 関数によるものです (と思います)。これをより高速に実行する方法を知っている人はいますか?
ベスト、トーマス
PS: テストしたい場合は、次のデータを使用してください。ただし、永久に実行される可能性があることに注意してください。
x <- c("Germany","France","UK","Italy","Spain","Poland","Romania","Netherlands","Greece","Portugal","Belgium","Czech Rep.","Hungary","Sweden","Austria","Bulgaria","Denmark","Slovakia","Finland","Ireland","Lithuania","Latvia","Slovenia","Estonia","Cyprus","Luxembourg","Malta")
z <- c(29,29,29,29,27,27,14,13,12,12,12,12,12,10,10,10,7,7,7,7,7,4,4,4,4,4,3)
dat <- data.frame(member = as.character(x),vote = z)
oi <- banzhaf(dat, 255)
oi