Question

Ceci est lié à une autre question:. matrice pondérée en fréquence terrain

I ai ce graphique (produit par le code ci-dessous dans R): multi-échantillon

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

Je aime beaucoup la façon dont cette parcelle est construite et montre les chemins plus fréquents comme plus sombre que les chemins plus rares (mais il ne suffit pas claire pour une présentation d'impression). Ce que je voudrais faire est de produire une sorte de hexbin ou heatmap pour les chiffres. En pensant à ce sujet, il semble que la parcelle devra intégrer différents bacs de taille (voir mon dos de l'esquisse d'enveloppe):

binsketch

Ma question alors: Si je simule un million de courses en utilisant le code ci-dessus, comment puis-je présenter comme un heatmap ou hexbin, avec les différents bacs de taille comme indiqué dans l'esquisse

Pour clarifier: Je ne veux pas compter sur la transparence pour montrer la rareté d'un procès en passant par une partie de l'intrigue. Au lieu de cela, je voudrais avec la chaleur rareté représentent chacun et montrer une voie commune aussi chaude (rouge) et une voie rare que le froid (bleu). De plus, je ne pense pas que les bacs doivent être de la même taille que le premier essai n'a que deux endroits où le chemin peut être, mais le dernier a beaucoup plus. D'où le fait que je choisi une échelle bin changer, en fonction de ce fait. Pour l'essentiel, je compte le nombre de fois un chemin passe à travers la cellule (2 dans la colonne 1, 3 dans la colonne 2, etc.), puis la coloration de la cellule en fonction de combien de fois il a été passé à travers.

Mise à jour: j'avais déjà un terrain semblable à @Andrie, mais je ne suis pas sûr qu'il est beaucoup plus clair que le tracé de haut. Il est de la nature discontinue de ce graphique, que je ne aime pas (et pourquoi je veux une sorte de heatmap). Je pense que parce que la première colonne ne comporte que deux valeurs possibles, qu'il ne devrait pas être un énorme écart visuel entre eux, etc., etc. Par conséquent pourquoi je prévoyais les différents bacs de taille. Je me sens encore que la version binning montrerait un grand nombre d'échantillons mieux.

Plot2

Mise à jour: Ce site décrit une procédure à tracer un heatmap:

Pour créer une densité (heatmap) version graphique de cela, nous devons énumérer efficacement l'apparition de ces points à chaque emplacement discret dans l'image. Cela se fait par la mise en place d'une grille et en comptant le nombre de fois qu'un point de coordonnées « tombe » dans chacun des pixels individuels « poubelles » à chaque emplacement dans cette grille.

Peut-être que certaines des informations sur ce site peut être combiné avec ce que nous avons déjà?

Mise à jour: J'ai pris une partie de ce Andrie a écrit avec une partie de cette

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)

Je ne comprends pas tout à fait ce qui se passe, mais cela semble être plus comme ce que je voulais produire (évidemment sans les différents bacs de taille).

Mise à jour: Ceci est similaire aux autres parcelles ici. Il n'est pas tout à fait raison:

hexbin

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

dernier essai. Comme ci-dessus: entrer image description ici

image(mxcum$bet, mxcum$outcome)

Ceci est assez bon. Je voudrais juste que ça ressemble à mon croquis dessinés à la main.

Était-ce utile?

La solution

Modifier

Je pense que la solution suivante fait ce que vous demandez.

(Notez que cela est lent, en particulier l'étape de 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)

entrer image description ici

Autres conseils

Pour votre information: Ceci est plus d'un commentaire étendu qu'une réponse.

Pour moi, cette nouvelle apparence de l'intrigue comme un bar empilé où la hauteur de chaque barre est égale aux points d'intersection de la ligne supérieure et inférieure à l'essai suivant.

entrer image description ici

La façon dont je l'approche est de traiter les « essais » comme une variable. Ensuite, nous pouvons rechercher chaque ligne de xcum pour les éléments qui sont égaux. Si elles le sont, on peut considérer que ce soit un point d'intersection dont les minima représente également le multiple définissant la hauteur de nos barres.

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

Maintenant, nous avons les multiples des points réels, nous avons besoin de savoir comment le prendre à l'étape suivante et trouver un moyen de binning l'information. Cela signifie que nous devons prendre une décision sur le nombre de points représenteront chaque groupe. Écrivons quelques points pour la postérité.

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

En d'autres termes, pour chaque essai il y a n-1 points à tracer. Dans votre dessin, vous avez 7 bacs. Nous avons donc besoin de comprendre les multiples pour chaque bac.

Pense-bête Let et diviser les deux dernières colonnes par deux, nous savons par inspection visuelle que les minima est inférieure à 0,05

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

Ensuite, trouver le minimum de chaque colonne:

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. 

La façon la plus claire de le faire est de créer chaque bac séparément. De toute évidence, cela pourrait se faire automatiquement plus tard. En rappelant que chaque point est

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")
scroll top