10 方差缩减技术
10.1 习题
习题1
先利用平均值法求解积分:
N <- 10000
u <- matrix(runif(N*2),N,2)
eta <- exp((u[,1]+u[,2])^2)
I1 <- mean(eta);I1
#> [1] 4.878306
var1 <- var(eta)/N;var1
#> [1] 0.003524155利用对立变量法改进 :
N <- 10000
u <- matrix(runif(N*2),N,2)
v <- 1-u
eta <- 0.5*(exp((u[,1]+u[,2])^2)+exp((v[,1]+v[,2])^2))
I2 <- mean(eta);I2
#> [1] 4.929019
var2 <- var(eta)/N;var2
#> [1] 0.001189351习题2
mu <- 0
Sigma <- 1
N <- 100000
n <- c(5,10,30)
b1 <- vector("double",length(n))
b2 <- vector("double",length(n))
s1 <- vector("double",length(n))
s2 <- vector("double",length(n))
for(i in seq_along(n)){
x <- matrix(rnorm(N*n[[i]],mu,Sigma),N,n[[i]])
m <- apply(x,1,mean) # 每组样本均值
shat <- apply((x-m)^2,1,sum)
shat.1 <- shat/(n[[i]]-1) # 两个方差估计
shat.2 <- shat/n[[i]]
b1[[i]] <- mean(shat.1)-Sigma^2
b2[[i]] <- mean(shat.2)-Sigma^2
s1[[i]] <- mean((shat.1-Sigma)^2)
s2[[i]] <- mean((shat.2-Sigma)^2)
}
df <- data.frame(
n = n,
b1 = b1,
b2 = b2,
s1 = s1,
s2 = s2,
d = s1-s2
)
knitr::kable(df)| n | b1 | b2 | s1 | s2 | d |
|---|---|---|---|---|---|
| 5 | -0.0012968 | -0.2010375 | 0.5002920 | 0.3606019 | 0.1396901 |
| 10 | -0.0001247 | -0.1001122 | 0.2228895 | 0.1905629 | 0.0323266 |
| 30 | -0.0004414 | -0.0337600 | 0.0688494 | 0.0654755 | 0.0033739 |
1是无偏估计,2是有偏估计。有由可以看出,估计1点偏差要更小但均方误差要更大,所有指标随着样本数的增大都逐渐下降。