- 上の例では、複数の選択肢から発生するすべての帰結に順序を入れた。さらに、その順序に応じて、なるべく、「順序が前」の帰結が得られるように「単純な」処理を繰り返した
- 「順序〜大小関係」のみを用いるというのは、結局のところ、不等号には重み1の差をつけ、等号には重みの差をつけずに、「線形な面」をつくっているのと(多分)同じ
- そうすると、「治療選択における、治癒と死亡」ただし、「治癒にも副作用ありとなしがあって、死亡にも副作用ありなしがある」のような場合には、「副作用の有無によらず治癒」は「副作用の有無によらず死亡」の上位におきたい
- すべての帰結を同一尺度に並べ、ただし、不等号に持たせる重みに軽重をつける、というのも一つのやり方だろう
- また別のやり方としては、「順序〜大小関係」にヒエラルキーを入れることになるだろう
- いずれにしろ、その「関数・重みづけ係数」がわかっていれば、簡単なわけで、それがわからないながら、前進したい、と、それをする方便を入れないといけない
- そんな方向としては、モンテカルロ比較をしながら、「選択肢Aだと、こうなって、選択肢Bだとこうなる、と仮定したら、AとBとどっちをとりますか?」だけでなく(これだと順序を入れただけ)、どのくらい強く(主観的で酔い)Aをとりたいですか?」とインターラクティブにモンテカルロを回す、というのもありかもしれない。
- ひとまず、2治療、副作用持ち込み編(順序だけで評価)の書き散らしソースを
k <- 2
s <- sample(2:5,k,replace=TRUE)
s <- rep(4,k)
s.list <- list()
for(i in 1:k){
s.list[[i]] <- 1:s[i]
}
true.prob <- list()
for(i in 1:k){
true.prob[[i]] <- rdirichlet(1,rep(10,s[i]))
}
true.prob[[1]] <- c(0.0,0.6,0.1,0.3)
true.prob[[2]] <- c(0.4,0.15,0.15,0.3)
cat.combin <- expand.grid(s.list)
preference <- matrix(1,prod(s),k)
for(i in 1:prod(s)){
tmp.s <- sample(0:(k-1),1)
preference[i,sample(1:k,tmp.s)] <- 0
preference[i,] <- preference[i,]/sum(preference[i,])
}
scores <- matrix(c(7,4,3,1,6,5,3,2),ncol=2)
for(i in 1:length(preference[,1])){
tmp <- c(scores[cat.combin[i,1],1],scores[cat.combin[i,2],2])
preference[i,] <- as.numeric(tmp==max(tmp))
}
for(i in 1:length(preference[,1])){
preference[i,] <- preference[i,]/sum(preference[i,])
}
pre <- list()
for(i in 1:k){
pre[[i]] <- sample(0:0,s[i],replace=TRUE)
}
n.history <- 1000
history <- matrix(0,n.history,sum(s))
n.iter <- 100
for(h in 1:n.history){
tmp <- c()
for(j in 1:k){
tmp <- c(tmp,pre[[j]])
}
history[h,] <- tmp
chosen <- rep(0,k)
this.time.chosen <- rep(0,k)
rs <- list()
for(j in 1:k){
rs[[j]] <- rdirichlet(n.iter,pre[[j]]+1)
}
for(i in 1:n.iter){
tmp.rs <- list()
for(j in 1:k){
tmp.rs[[j]] <- rs[[j]][i,]
}
probs <- expand.grid(tmp.rs)
tmp.prob <- apply(probs,1,prod)
tmp2 <- preference * tmp.prob
tmp3 <- apply(tmp2,2,sum)
tmp.max <- which(tmp3 == max(tmp3))
if(length(tmp.max)==1){
choice <- tmp.max
}else{
choice <- sample(tmp.max,1)
}
this.time.chosen[choice] <- this.time.chosen[choice]+1
}
tmp.max <- which(this.time.chosen==max(this.time.chosen))
if(length(tmp.max)==1){
selected.chosen <- tmp.max
}else{
selected.chosen <- sample(tmp.max,1)
}
selected.chosen <- tmp.max[sample(seq(tmp.max),1)]
chosen[selected.chosen] <- chosen[selected.chosen]+1
really.chosen <- sample(1:k,1,prob=this.time.chosen/sum(this.time.chosen))
really.happen <- sample(1:s[really.chosen],1,prob=true.prob[[really.chosen]])
pre[[really.chosen]][really.happen] <- pre[[really.chosen]][really.happen]+1
}
matplot(history,type="l")