将 95% 置信限添加到累积图 [英] Add 95% confidence limits to cumulative plot
问题描述
我想使用 R 向这个抛硬币图添加一条表示 95% 置信限的抛物线:
I would like to add a parabola line denoting 95% confidence limits to this coin toss plot using R:
x <- sample(c(-1,1), 60000, replace = TRUE)
plot.ts(cumsum(x), ylim=c(-250,250))
这是我正在寻找的示例:
Here is an example of what I'm looking for:
更新:@bill_080 的回答非常好.但是我已经计算了 100,000 次抛硬币:
UPDATE: @bill_080's answer is excellent. However I have already calculated 100,000 coin tosses:
str(100ktoss)
num [1:100000] -1 1 1 1 -1 -1 1 -1 -1 -1 ...
我真的想在该图中添加 95% 的限制:
and I really want to just add the 95% limit to that plot:
plot.ts(cumsum(100ktoss))
计算我的 100,000 次抛硬币需要几个小时,当我尝试使用 @bill_080 的代码进行复制时,我的内存不足(对于 100,000 次).
It took several hours to calculate my 100K coin tosses and when I try and replicate with @bill_080's code I run out of memory (for 100,000).
最终更新:好的.最后一个问题.我在一个图表上绘制了几轮累积命中的图,每轮的开始都固定为零(实际上是 1 或 -1,取决于它是赢还是输).
FINAL UPDATE: Okay. Last problem. I have a plot of several rounds of cummulative hits, on a single graph with the start of each round clamped at zero (actually 1 or -1 depending on if it was a win or lose).
>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% 限制,就像这样.现已解决:
I would like to add the same 95% limit to each segment, like thus. Now solved:
@bill_080 非常感谢.这是最终产品:
@bill_080 Many thanks. This is the the end product:
推荐答案
试试这个.所有循环都是 for
循环,因此您可以轻松添加更多计算.
Try this. All loops are for
loops, so you can easily add more calculations.
#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"))
编辑1 ============================================================
Edit 1 ==========================================================
如果您只是想绘制 +/- 5% 的线,它只是一个平方根函数.代码如下:
If you're just trying to draw the +/- 5% lines, it's just a square root function. Here's the code:
#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)
编辑2 ==================================================
Edit 2 ==================================================
要在正确的位置添加抛物线,如果定义一个函数可能会更容易.请记住,因为新函数 (dralim
) 使用 lines
,所以在调用 dralim
之前绘图必须存在.使用一些与编辑 1 中的代码相同的变量:
To add the parabolas at the right locations, it is probably easier if you define a function. Keep in mind that because the new function (dralim
) uses lines
, the plot has to exist before you call dralim
. Using some of the same variables as the code in 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
这篇关于将 95% 置信限添加到累积图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!