which()

例えば、勝率>60%なら赤、<40%なら青、で描いてみようとしたとき、R-tipsを見て
x<- runif(100)
plot(x,col=ifelse(x>2/3,"red","blue"))
で2色では描けるのですが、色を増やそうと思って
plot(x,col=if(x>2/3,"red"),elseif(x>1/3,"blue"),else("green"))
と書くとエラーで、それならグラフを何枚も上書きしようとして
if(x>2/3){plot(x,col="red")}
par(new=T)
・・・
と書くと条件が長さ2以上で…と出るので何かいい案あればお願いします。

これに対して。

  • ベクトルの要素のうち、条件を取り出す関数which()を使う
  • 離散的確率変数の確率密度を累積確率分布にする関数cumsum()
  • モノクロトーンを作る関数gray()
library(MCMCpack)
k<-4
v<-rdirichlet(1,rep(1,k))
accumv<-cumsum(v)

col<-c("red","blue","green","pink")
# in case many categories, "col<-gray((1:k)/(k+1))" for example
Nsim<-100
x<-runif(Nsim)
xlim<-c(1,Nsim)
ylim<-c(0,1)
par(mfcol=c(1,2))
plot(which(x<accumv[1]),x[which(x<accumv[1])],col=col[1],xlim=xlim,ylim=ylim)
for(i in 2:k){
 par(new=TRUE)
 plot(which(x<accumv[i] & x>=accumv[i-1]),x[which(x<accumv[i] & x>=accumv[i-1])],col=col[i],xlim=xlim,ylim=ylim)
}

col<-gray((1:k)/(k+1))

plot(which(x<accumv[1]),x[which(x<accumv[1])],col=col[1],xlim=xlim,ylim=ylim)
for(i in 2:k){
 par(new=TRUE)
 plot(which(x<accumv[i] & x>=accumv[i-1]),x[which(x<accumv[i] & x>=accumv[i-1])],col=col[i],xlim=xlim,ylim=ylim)
}