14

これは別の質問に関連しています:重み付き周波数行列をプロットします。

私はこのグラフィックを持っています(以下のRのコードによって生成されます):マルチサンプル

#Set the number of bets and number of trials and % lines
numbet <- 36 
numtri <- 1000 
#Fill a matrix where the rows are the cumulative bets and the columns are the trials
xcum <- matrix(NA, nrow=numbet, ncol=numtri)
for (i in 1:numtri) {
x <- sample(c(0,1), numbet, prob=c(5/6,1/6), replace = TRUE)
xcum[,i] <- cumsum(x)/(1:numbet)
}
#Plot the trials as transparent lines so you can see the build up
matplot(xcum, type="l", xlab="Number of Trials", ylab="Relative Frequency", main="", col=rgb(0.01, 0.01, 0.01, 0.02), las=1)

私はこのプロットが構築され、より頻繁なパスがよりまれなパスよりも暗く表示される方法が非常に好きです(ただし、印刷物のプレゼンテーションには十分に明確ではありません)。私がやりたいのは、数値のある種のヘクスビンまたはヒートマップを作成することです。考えてみると、プロットにはさまざまなサイズのビンを組み込む必要があるようです(封筒のスケッチの裏側を参照)。

binsketch

私の質問:上記のコードを使用して100万回の実行をシミュレートした場合、スケッチに示されているように、さまざまなサイズのビンを使用して、ヒートマップまたはhexbinとして表示するにはどうすればよいですか?

明確にするために:私は、プロットの一部を通過する裁判の希少性を示すために透明性に依存したくありません。代わりに、私は希少性を熱で示し、一般的な経路を高温(赤)、まれな経路を低温(青)として示したいと思います。また、最初の試行ではパスを配置できる場所が2つしかないため、ビンを同じサイズにする必要はないと思いますが、最後の試行ではさらに多くの場所があります。したがって、私がその事実に基づいて変化するビンスケールを選択したという事実。基本的に、パスがセルを通過する回数(列1の2、列2の3など)をカウントし、通過した回数に基づいてセルに色を付けます。

更新:私はすでに@Andrieに似たプロットを持っていましたが、それが一番上のプロットよりもはるかに明確かどうかはわかりません。私が気に入らないのは、このグラフの不連続な性質です(そして、なぜある種のヒートマップが必要なのか)。最初の列には2つの可能な値しかないので、それらの間に大きな視覚的なギャップなどがあってはならないと思います。したがって、異なるサイズのビンを想定したのはなぜですか。ビニングバージョンでは、多数のサンプルがより適切に表示されると思います。

plot2

更新:このWebサイトでは、ヒートマップをプロットする手順の概要を説明しています。

これの密度(ヒートマップ)プロットバージョンを作成するには、画像内の各離散位置でのこれらのポイントの発生を効果的に列挙する必要があります。これは、グリッドを設定し、そのグリッド内のすべての場所でポイント座標が個々のピクセル「ビン」のそれぞれに「落ちる」回数を数えることによって行われます。

おそらく、そのWebサイトの情報の一部は、私たちがすでに持っているものと組み合わせることができますか?

更新:私はアンドリーがこの質問のいくつかで書いたもののいくつかを取り、これに到達しました。これは私が考えていたものに非常に近いです: ヒートマップ

numbet <- 20
numtri <- 100
prob=1/6
#Fill a matrix 
xcum <- matrix(NA, nrow=numtri, ncol=numbet+1)
for (i in 1:numtri) {
  x <- sample(c(0,1), numbet, prob=c(prob, 1-prob), replace = TRUE)
  xcum[i, ] <- c(i, cumsum(x)/cumsum(1:numbet))
}
colnames(xcum) <- c("trial", paste("bet", 1:numbet, sep=""))

mxcum <- reshape(data.frame(xcum), varying=1+1:numbet, 
  idvar="trial", v.names="outcome", direction="long", timevar="bet")

 #from the other question
 require(MASS)
dens <- kde2d(mxcum$bet, mxcum$outcome)
filled.contour(dens)

何が起こっているのかよくわかりませんが、これは私が作成したかったものに似ているようです(明らかに異なるサイズのビンはありません)。

更新:これは、ここにある他のプロットと同様です。それは完全に正しくありません:

hexbin

plot(hexbin(x=mxcum$bet, y=mxcum$outcome))

最後に試してください。上記のように: ここに画像の説明を入力してください

image(mxcum$bet, mxcum$outcome)

これはかなり良いです。手描きのスケッチのように見せたいです。

4

2 に答える 2

11

編集

私は次の解決策があなたが求めることをするだろうと思います。

(これは遅いことに注意してください、特にreshapeステップ)

numbet <- 32
numtri <- 1e5
prob=5/6
#Fill a matrix 
xcum <- matrix(NA, nrow=numtri, ncol=numbet+1)
for (i in 1:numtri) {
  x <- sample(c(0,1), numbet, prob=c(prob, 1-prob), replace = TRUE)
  xcum[i, ] <- c(i, cumsum(x)/cumsum(1:numbet))
}
colnames(xcum) <- c("trial", paste("bet", 1:numbet, sep=""))

mxcum <- reshape(data.frame(xcum), varying=1+1:numbet, 
  idvar="trial", v.names="outcome", direction="long", timevar="bet")


library(plyr)
mxcum2 <- ddply(mxcum, .(bet, outcome), nrow)
mxcum3 <- ddply(mxcum2, .(bet), summarize, 
                ymin=c(0, head(seq_along(V1)/length(V1), -1)), 
                ymax=seq_along(V1)/length(V1),
                fill=(V1/sum(V1)))
head(mxcum3)

library(ggplot2)

p <- ggplot(mxcum3, aes(xmin=bet-0.5, xmax=bet+0.5, ymin=ymin, ymax=ymax)) + 
    geom_rect(aes(fill=fill), colour="grey80") + 
    scale_fill_gradient("Outcome", formatter="percent", low="red", high="blue") +
    scale_y_continuous(formatter="percent") +
    xlab("Bet")

print(p)

ここに画像の説明を入力してください

于 2011-09-14T13:28:13.043 に答える
3

参考:これは、回答というよりも拡張されたコメントです。

私には、この新しいプロットは、各バーの高さが次の試行での上下の線の交点に等しい積み重ねられたバーのように見えます。

ここに画像の説明を入力してください

私がこれに取り組む方法は、「試行」をカテゴリ変数として扱うことです。次に、xcumの各行で等しい要素を検索できます。もしそうなら、これは交差点であると見なすことができ、その最小値はバーの高さを定義する倍数も表します。

x <- t(xcum)
x <- x[duplicated(x),]
x[x==0] <- NA

これで実際のポイントの倍数が得られたので、それを次のステップに進める方法を理解し、情報をビニングする方法を見つける必要があります。つまり、各グループを表すポイントの数を決定する必要があります。後世のためにいくつかのポイントを書きましょう。

Trial 1 (2) = 1, 0.5 # multiple = 0.5
Trial 2 (3) = 1, 0.66, 0.33 #  multiple = 0.33
Trial 3 (4) = 1, 0.75, 0.5, 0.25 # multiple = 0.25
Trial 4 (5) = 1, 0.8,  0.6, 0.4, 0.2 # multiple = 0.2
Trial 5 (6) = 1, 0.8333335, 0.6666668, 0.5000001, 0.3333334, 0.1666667
... 
Trial 36 (35) = 1, 0.9722223, ..., 0.02777778 # mutiple = 0.05555556 / 2

言い換えると、各試行に対して、プロットするn-1ポイントがあります。図面には7つのビンがあります。したがって、各ビンの倍数を把握する必要があります。

最後の2列をごまかして2で割ってみましょう。目視検査から、最小値が0.05未満であることがわかります。

x[,35:36] <- x[,35:36] / 2

次に、各列の最小値を見つけます。

x <- apply(x, 2, function(x) min(x, na.rm=T))[-1] # Drop the 1
x <- x[c(1,2,3,4,8,17,35)] # I'm just guessing here by the "look" of your drawing. 

これを行う最も明確な方法は、各ビンを個別に作成することです。明らかに、これは後で自動的に行うことができます。各ポイントが

bin1 <- data.frame(bin = rep("bin1",2), Frequency = rep(x[1],2))
bin2 <- data.frame(bin = rep("bin2",3), Frequency = rep(x[2],3))
bin3 <- data.frame(bin = rep("bin3",4), Frequency = rep(x[3],4))
bin4 <- data.frame(bin = rep("bin4",5), Frequency = rep(x[4],5))
bin5 <- data.frame(bin = rep("bin5",9), Frequency = rep(x[5],9))
bin6 <- data.frame(bin = rep("bin6",18), Frequency = rep(x[6],18))
bin7 <- data.frame(bin = rep("bin7",36), Frequency = rep(x[7],36))

df <- rbind(bin1,bin2,bin3,bin4,bin5,bin6,bin7)
ggplot(df, aes(bin, Frequency, color=Frequency)) + geom_bar(stat="identity", position="stack")
于 2011-09-05T13:37:35.197 に答える