参考资料:方差缩减技术-条件期望法
目录
1. 分层抽样法
题目1:如何通过分层抽样法得到 的一个模拟估计量?
算法:
① 将抽样区间划分为 [0,0.5] 和 [0.5,1],以0.5的概率从[0,0.5]中抽取随机变量,以0.5的概率从[0.5,1]中抽取随机变量 - getVal()
② 利用①中生成的随机变量,使用模拟法估计该定积分的值
代码:
getVal = function() { # 分层抽样法得到随机变量
u = runif(1)
if (u < 0.5) {
result = runif(1, min=0, max=0.5)
} else {
result = runif(1, min=0.5, max=1)
}
result
}
f = function(x,y) exp((x+y)^2)
t1 = function(n) {
u1 = 0; u1[2] = 0
u2 = 0; u2[2] = 0
for (i in 1:n) {
u1[i] = getVal()
u2[i] = getVal()
}
result = mean(f(u1,u2))
err = sqrt(var(f(u1,u2))/n)
print(result)
print(err)
}
t1(10000)
题目2:试利用分层抽样法估计 ,其中 W1 W2 是独立同分布的weibull(威布尔)分布,其密度函数为:
思路:
根据之前学过的知识,生成连续型随机变量的主要方式有:逆变换法、筛选法,其中筛选法暂时想不到好的g(x),故采用逆变换法.
逆变换法需要先求解f(x)的分布函数,然后令其等于U,并反解出X,之后就可利用U来模拟生成X的值.
后续再按照普通的期望估计方法来求出期望估计值.
代码:
getU = function(){ # 实现分层抽样
u = runif(n)
if (n<0.5) {
result = runif(1,min=0,max=0.5)
} else {
result = runif(1,min=0.5,max=1)
}
result
}
transF = function(u) (-log(1-u))^(2/3)
getVal = function() {
u = getU()
result = floor(transF(u))
result
}
f = function(w1,w2) (w1+w2)^(5/4)
t10 = function(n) {
# 初始化u1 u2
u1 = 0; u1[2] = 0
u2 = 0; u2[2] = 0
for (i in 1:n) {
u1[i] = getVal()
u2[i] = getVal()
}
result = mean(f(u1,u2))
err = sqrt(var(f(u1,u2))/n)
print(result)
print(err)
}
t10(10000)
结果:
估计值:2.0855
标准误差:0.004
2. 条件期望法
题目1:X和Y是相互独立的随机变量,其分布函数分别为F和G,均值为ux uy,对给定的t,估计
解:
先产生随机变量X,在X = x的条件下,产生Y的随机变量;
创建序列P用于储存模拟概率,当Y > t,则直接记p = 0,如果为其他,则令 p = reX(t - Y) 反解出p;
模拟的结果为序列P的均值,标准误差为
题目2:

*注:MSE估计改为标准误差.
思路:同上一题.
代码:
t6 = function(n) {
y = rnorm(n,1,1)
z = 1-pnorm(1,y,2) # 最后的2是替代了pnorm((1-y)/2)的快捷办法
result = mean(z)
err = sqrt(var(z)/n)
print(result)
print(err)
}
t61(10000)
本文详述了如何运用分层抽样法和条件期望法解决统计模拟问题。首先,通过分层抽样法解决了一个定积分的模拟估计,介绍了将区间划分为两部分并生成随机变量的方法。接着,利用逆变换法生成Weibull分布的随机变量,进而估算期望值。其次,讨论了条件期望法,解释了在给定X的情况下如何模拟Y,并计算估计值及标准误差。所有方法都结合R语言进行了实现。
&spm=1001.2101.3001.5002&articleId=117287427&d=1&t=3&u=e47507f02b0b48d1aa5432d319e0fa31)
9502

被折叠的 条评论
为什么被折叠?



