Добавить 95% доверительные пределы к совокупному графику - PullRequest
6 голосов
/ 27 мая 2011

Я хотел бы добавить линию параболы, обозначающую 95% доверительный интервал, к этому графику броска монеты, используя R:

x  <- sample(c(-1,1), 60000, replace = TRUE)
plot.ts(cumsum(x), ylim=c(-250,250))

Вот пример того, что я ищу: graph

ОБНОВЛЕНИЕ: @ bill_080 ответил отлично.Однако я уже рассчитал 100 000 бросков монет:

str(100ktoss)
num [1:100000] -1 1 1 1 -1 -1 1 -1 -1 -1 ...

, и я действительно хочу просто добавить 95% лимит к этому графику: toss

plot.ts(cumsum(100ktoss))

Потребовалось несколько часов, чтобыпосчитайте мои 100K бросков монет, и когда я попытаюсь повторить код @ bill_080, у меня не хватит памяти (на 100 000).

ЗАКЛЮЧИТЕЛЬНОЕ ОБНОВЛЕНИЕ: Хорошо.Последняя проблемаУ меня есть график нескольких раундов кумулятивных попаданий, на одном графике с началом каждого раунда, ограниченным нулями (фактически 1 или -1 в зависимости от того, был ли это выигрыш или проигрыш).

>str(1.ts)  
Time-Series [1:35] from 1 to 35: 1 2 1 2 3 4 5 4 5 6 ...  
>str(2.ts)  
Time-Series [1:150] from 36 to 185: -1 0 1 0 -1 -2 -1 0 1 2 ...  

Я хотел бы добавить одинаковый лимит 95% для каждого сегмента, как, например, так. Теперь решено :

@ bill_080 Большое спасибо.Это конечный продукт:

cum

1 Ответ

9 голосов
/ 27 мая 2011

Попробуй это.Все циклы for, поэтому вы можете легко добавлять дополнительные вычисления.

#Set the number of bets and number of trials and % lines
numbet <- 6000 #6000 bets
numtri <- 1000 #Run 1000 trials of the 6000 bets
perlin <- 0.05 #Show the +/- 5% lines on the graph
rantri <- 60 #The 60th trial (just a random trial to be drawn)

#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(-1,1), numbet, replace = TRUE)
  xcum[,i] <- cumsum(x)
}

#Plot the trials as transparent lines so you can see the build up
matplot(xcum, type="l", xlab="Number of Bets", ylab="Cumulative Sum", main="Cumulative Results", col=rgb(0.01, 0.01, 0.01, 0.02))
grid()

#Sort the trials of each bet so you can pick out the desired %
xcumsor <- xcum
for (i in 1:numbet) {
  xcumsor[i,] <- xcum[i,order(xcum[i,])]
}

#Draw the upper/lower limit lines and the 50% probability line     
lines(xcumsor[, perlin*numtri], type="l", lwd=2, col=rgb(1, 0.0, 0.0)) #Lower limit
lines(xcumsor[, 0.5*numtri], type="l", lwd=3, col=rgb(0, 1, 0.0)) #50% Line
lines(xcumsor[, (1-perlin)*numtri], type="l", lwd=2, col=rgb(1, 0.0, 0.0)) #Upper limit

#Show one of the trials
lines(xcum[, rantri], type="l", lwd=1, col=rgb(1, 0.8, 0)) #Random trial

#Draw the legend
legend("bottomleft", legend=c("Various Trials", "Single Trial", "50% Probability", "Upper/Lower % Limts"), bg="white", lwd=c(1, 1, 3, 2), col=c("darkgray", "orange", "green", "red"))

enter image description here

Редактировать 1 ================================================================

Если вы просто пытаетесь нарисовать линии +/- 5%, это просто функция квадратного корня.Вот код:

#Set the bet sequence and the % lines
betseq <- 1:100000 #1 to 100,000 bets
perlin <- 0.05 #Show the +/- 5% lines on the graph

#Calculate the Upper and Lower limits using perlin
#qnorm() gives the multiplier for the square root
upplim <- qnorm(1-perlin)*sqrt(betseq)
lowlim <- qnorm(perlin)*sqrt(betseq)

#Get the range for y
yran <- range(upplim, lowlim)

#Plot the upper and lower limit lines
plot(betseq, upplim, ylim=yran, type="l", xlab="", ylab="")
lines(betseq, lowlim)

enter image description here

Изменить 2 =================================================

Чтобы добавить параболы в нужных местах, вероятно, будет проще, если вы определите функцию.Помните, что поскольку новая функция (dralim) использует lines, график должен существовать до вызова dralim.Используя некоторые из тех же переменных, что и код в Edit 1:

#Set the bet sequence and the % lines
betseq <- 0:700 #0 to 700 bets
perlin <- 0.05 #Show the +/- 5% lines on the graph

#Define a function that plots the upper and lower % limit lines
dralim <- function(stax, endx, perlin) {
  lines(stax:endx, qnorm(1-perlin)*sqrt((stax:endx)-stax))
  lines(stax:endx, qnorm(perlin)*sqrt((stax:endx)-stax))
}

#Build the plot area and draw the vertical dashed lines
plot(betseq, rep(0, length(betseq)), type="l", ylim=c(-50, 50), main="", xlab="Trial Number", ylab="Cumulative Hits")
abline(h=0)
abline(v=35, lty="dashed") #Seg 1
abline(v=185, lty="dashed") #Seg 2
abline(v=385, lty="dashed") #Seg 3
abline(v=485, lty="dashed") #Seg 4
abline(v=585, lty="dashed") #Seg 5

#Draw the % limit lines that correspond to the vertical dashed lines by calling the
#new function dralim.
dralim(0, 35, perlin) #Seg 1
dralim(36, 185, perlin) #Seg 2
dralim(186, 385, perlin) #Seg 3
dralim(386, 485, perlin) #Seg 4
dralim(486, 585, perlin) #Seg 5
dralim(586, 701, perlin) #Seg 6

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...