2011-09-05 8 views
14

Jest to związane z innym pytaniem: Plot weighted frequency matrix.Prawdopodobieństwo wydruku wykresu cieplnego/heksabina o różnych rozmiarach pojemników

mam tej grafiki (produkowany przez poniższy kod w R): multisample

#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) 

Bardzo podoba mi się sposób, że ta działka jest zbudowany i pokazuje częstszych ścieżki jako ciemniejszy niż rzadszych ścieżek (ale nie jest to wystarczająco jasne dla prezentacji drukowanej). To, co chciałbym zrobić, to wyprodukować jakiś hexbina lub mapę cieplną dla liczb. Na myśl o tym, wydaje się, że fabuła będzie musiał zawierać różne wielkości pojemniki (patrz moje plecy szkicu koperty):

binsketch

Moje pytanie to: Gdybym symulować milion działa przy użyciu kodu powyżej, jak mogę przedstawić go jako mapę cieplną lub hexbina, z pojemnikami o różnych rozmiarach, jak pokazano na szkicu?

Wyjaśnienie: Nie chcę polegać na przejrzystości, aby pokazać rzadkość procesu przechodzącego przez część fabuły. Zamiast tego chciałbym wskazać rzadkość na ciepło i pokazać wspólną ścieżkę jako gorącą (czerwony) i rzadką ścieżkę jako zimną (niebieską). Ponadto, nie sądzę, że beczki powinny być tej samej wielkości, ponieważ pierwsza próba ma tylko dwa miejsca, w których może być ścieżka, ale ostatnia ma wiele innych. Stąd fakt, że wybrałem zmianę skali bin, w oparciu o ten fakt. Zasadniczo liczę, ile razy ścieżka przechodzi przez komórkę (2 w kol. 1, 3 w kol. 2 itd.), A następnie koloruje komórkę w zależności od tego, ile razy została przepuszczona.

AKTUALIZACJA: Miałem już fabułę podobną do @Andrie, ale nie jestem pewien, czy jest ona o wiele jaśniejsza niż górna fabuła. Jest to nieciągły charakter tego wykresu, którego nie lubię (i dlaczego potrzebuję jakiejś mapy cieplnej). Myślę, że dlatego, że pierwsza kolumna ma tylko dwie możliwe wartości, że nie powinno być między nimi olbrzymiej luki wizualnej itp. Dlatego też przewidziałem różne wielkości pojemników. Nadal uważam, że wersja binningowa pokazałaby większą liczbę próbek.

plot2

Aktualizacja: To website przedstawia procedurę wykreślić mapę cieplną:

stworzenie wersji gęstości (termiczna) fabuły tego mamy skutecznie wyliczyć występowania tych punktów na siebie dyskretna lokalizacja na obrazie. Odbywa się to poprzez ustawienie siatki w górę i zliczanie ile razy współrzędne punktu "spadają" do każdego z poszczególnych "pól" piksela w każdym miejscu w tej siatce.

Być może niektóre informacje na tej stronie można łączyć z tym, co już mamy?

Aktualizacja: Wziąłem niektóre co Andrie napisał jedne z tym question, aby dojść do tego, co jest dość blisko do tego, co było poczęcie: heatmap

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) 

ja nie bardzo rozumiem, co jest dzieje się tak, ale wydaje mi się, że jest to bardziej to, co chciałem wyprodukować (oczywiście bez pojemników o różnych rozmiarach).

Aktualizacja: To jest podobne do innych działek tutaj.To nie jest całkiem w porządku:

hexbin

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

Ostatnia próba. Jak wyżej: enter image description here

image(mxcum$bet, mxcum$outcome) 

To jest całkiem dobry. Chciałbym, żeby wyglądał jak mój ręcznie narysowany szkic.

+0

Więc na rysunku, to górny prawy być cały niebieski przechodzący w czerwień w oddolne w lewo i w prawym dolnym rogu? –

+0

@Brandon Zasadniczo tak. Właśnie próbowałem makiety, ale nie jestem artystą (ani matematykiem). Spróbuję i pokażę, co bym chciał. –

+0

twoje pytanie wygląda ładnie :) – polerto

Odpowiedz

11

Edit

myślę następujące rozwiązanie ma co prosić.

(Zauważ, że ten jest powolny, zwłaszcza etap 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) 

enter image description here

+0

Nadal próbuję ustalić, jaki jest twój wykres. To bardzo interesujące, ale muszę się z tym nie zgodzić. Nie sądzę, że pokazuje to, o co prosiłem, ale, jak mówię, jest to interesujące. Dzięki za wysiłek, jeszcze raz. –

+0

W takim przypadku musisz opisać, co jest inne. Poprosiłeś o przeskalowanie prętów, żeby pokazać rozmiar, prawda? – Andrie

+0

Ostatnia próba: Weź pierwszą grafikę z mojego pytania i naszkicuj rysowaną przeze mnie siatkę. Policz ile razy dana ścieżka przechodzi przez dany kwadrat na siatce. Kolor częstych ścieżek jest gorący. Myślę, że twoja grafika pokazuje, że w 10000 próbach, na próbę 1, większość ludzi ma 0, w porównaniu z wynikiem 1, (1/6). Wykres, którego szukam, ma układ mojego ręcznie narysowanego szkicu, ale dane z pierwszego wykresu ... Ponieważ istnieją tylko dwie możliwe kategorie dla wersji próbnej 1 (hit miss), powinny być dwa równe przedziały. dzięki za pomoc btw. –

3

FYI: To bardziej rozbudowany komentarz niż odpowiedź.

Dla mnie ta nowa fabuła wygląda jak ułożony słupek, gdzie wysokość każdego pręta jest równa punktom przecięcia górnej i dolnej linii podczas następnej próby.

enter image description here

Sposób, że podchodzę do tego celu jest leczyć „Trials” jako zmienną kategorycznego. Następnie możemy przeszukać każdy wiersz xcum dla elementów, które są równe. Jeśli tak, to możemy uznać, że jest to punkt przecięcia, którego minima reprezentuje również wielokrotność określającą wysokość naszych prętów.

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

Teraz mamy wielokrotności rzeczywistych punktów, musimy dowiedzieć się, jak wziąć go do następnego etapu i znaleźć sposób binning informacje. Oznacza to, że musimy podjąć decyzję, ile punktów będzie reprezentować każdą grupę. Napiszmy kilka punktów dla potomności.

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 

Innymi słowy, dla każdej próby istnieje n-1 punktów do wykreślenia. Na twoim rysunku masz 7 pojemników. Musimy więc obliczyć wielokrotności dla każdego pojemnika.

Niech oszukać i podzielić ostatnie dwie kolumny przez dwa, wiemy z oględzin, że minima jest niższa niż 0,05

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

Następnie znaleźć minimum każdej kolumny:

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. 

Najczystszym sposobem, aby to zrobić, jest utworzenie każdego pojemnika osobno. Oczywiście można to zrobić automatycznie później. Pamiętając, że każdy punkt jest

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") 
+0

Będę musiał dać twojej odpowiedzi trochę myśli.Wyjaśniłem, co chcę z fabuły, jeśli to pomoże ludziom zrozumieć, dlaczego nie jestem całkiem zadowolony z tego, co już mam. Dzięki. –