我需要计算均值向量的“运行”标准偏差,计算它们就像样本量增加一样。换句话说,我需要计算mean_y [1],mean_y [1]和mean_y [2],mean_y [1],mean_y [2],mean_y [3]等的sd,等等,
其中:
y <- rnorm(10000, mean=5, sd=2)
i <- seq(1 : length(y))
mean_y <- cumsum(y)/i
尝试应用相同的标准(因此,没有明确地使用循环),我为运行方式的向量的标准偏差生成了以下代码:
se <- sqrt(1/i^2*cumsum(y^2) - 1/i*mean_y^2)
这是因为var(mean(x))= 1 / n * var(x)。 对我来说,代码似乎没问题。但是当我用他们对i的置信区间(增加的样本大小)绘制运行方式时,95%的条带完全与手段重合!
代码是:
error <- qnorm(0.975)*se/sqrt(i)
lower <- mean_y - error
upper <- mean_y + error
# plotting means and ci's against sample size (= up to 10000)
plot(x=i, y=mean_y, xlab="Number of iterations (sample size)",
ylab="E[y] estimates and 95% CI's", cex=0.4, ylim=c(4.6, 5.4))
lines(lower, col="gold")
lines(upper, col="gold")
理由是产生一个图表,显示当样本量不断增加时估计量“mean_y”的收敛。
任何人都可以帮助我吗?可能在se
公式或lower
和upper
中存在某种基本错误。谢谢!!斯特凡诺
答案 0 :(得分:1)
在以下几行中,您可以找到三种等效方法来解决初始问题并绘制相同的图表:
i <- seq(1 : length(y))
m <- cumsum(y)/i
se_y <- sqrt((1/(i-1)*cumsum(y^2) - i/(i-1)*m^2))
error <- qnorm(0.975)*se_y/sqrt(i)
lower <- m - error
upper <- m + error
# equivalent (slightly slower) methods for getting the std. errors
# method2:
se_2 <- rep(NA, length(y))
for (n in 1:length(y)) {
se_2[n] <- sd(y[1:n])
}
# method3:
se_3 <- sapply(1:length(y), FUN= function(x) sd(y[1:x]))
最终图表是:
# plotting means and ci's against sample size (= up to 10000)
plot(x=i, y=m, xlab="Number of iterations (sample size)",
title("Convergence of the ENVP's mean"),
ylab="E[y] estimates and 95% CI's (EUR millions)", cex=0.4, ylim=c(2620, 2665))
lines(lower, col="gold")
lines(upper, col="gold")
legend("bottomright", legend=c("envp's mean", "95% ci"),
cex=0.8, col=c("black", "gold"), lwd=2, lty=1, bty="n")
dev.copy(tiff, file="mc_envp.tiff", height=6, width=6, units="in", res=200)
dev.off(); dev.off()
windows.options(reset=TRUE)
希望这一切都有所帮助!