我有兴趣验证模拟数据的Weak Law of Large Numbers。我的想法是生成一个观察向量并按顺序取样本平均值,首先进行1次观察,然后进行2,3,...,n。为此,我写下了以下功能:
n <- 10000
x <- rnorm(n)
xn <- function(n) {
xn <- mean(x[1:n])
list(xn)
}
然后我想绘制样本均值与n对n = 1,...,n,但不幸的是我不知道该怎么做。我一直(天真地)尝试代码:
y <- c(1:n)
plot(y, xn(y))
这是我一直在犯的错误
Error in xy.coords(x, y, xlabel, ylabel, log) :
'x' and 'y' lengths differ
In addition: Warning message:
In 1:n : numerical expression has 1000 elements: only the first used
你可以帮我解决最后一部分吗?
答案 0 :(得分:4)
您可以有效地计算累积均值&#39;通过cumsum()
函数,然后按1:n
进行矢量化除法:
n <- 10000
set.seed(101)
x <- rnorm(n)
cx <- cumsum(x)
cm <- cx/(1:n)
plot(1:n,cm,type="l")
答案 1 :(得分:3)
Ben Bolker的解决方案效率更高,但您可以通过以下方式修复原始代码。
问题是你的函数需要一个元素而不是一个向量/元素列表,所以你必须使用sapply
将它应用于y
中的每个元素。
n <- 10000
x <- rnorm(n)
xn <- function(n) {
xn <- mean(x[1:n])
}
y <- 1:n
plot(y, sapply(y, xn))