【统计模拟及其R实现】分层抽样法 / 条件期望法 习题答案(超详细)

本文详述了如何运用分层抽样法和条件期望法解决统计模拟问题。首先,通过分层抽样法解决了一个定积分的模拟估计,介绍了将区间划分为两部分并生成随机变量的方法。接着,利用逆变换法生成Weibull分布的随机变量,进而估算期望值。其次,讨论了条件期望法,解释了在给定X的情况下如何模拟Y,并计算估计值及标准误差。所有方法都结合R语言进行了实现。

课本:统计模拟及其R实现 - 肖枝红,朱强 武汉大学出版社

参考资料:方差缩减技术-条件期望法

目录

1. 分层抽样法

2. 条件期望法


1. 分层抽样法

题目1:如何通过分层抽样法得到 \theta = \int^{1}_{0} \int^{1}_{0} e^{​{x+y}^2} dx dy 的一个模拟估计量?

算法:

① 将抽样区间划分为 [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:试利用分层抽样法估计 \theta = E(W_1 + W_2)^{\frac{5}{4}} ,其中 W1 W2 是独立同分布的weibull(威布尔)分布,其密度函数为:f(x) = \frac{3}{2}x^{\frac{1}{2}}e^{-x^{\frac{3}{2}}}

思路:

根据之前学过的知识,生成连续型随机变量的主要方式有:逆变换法、筛选法,其中筛选法暂时想不到好的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,估计\theta = P \{ X+Y \leqslant t \}

解:

先产生随机变量X,在X = x的条件下,产生Y的随机变量;

创建序列P用于储存模拟概率,当Y > t,则直接记p = 0,如果为其他,则令 p = reX(t - Y) 反解出p;

模拟的结果为序列P的均值,标准误差为\sqrt{Var(P)/n}

 

题目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)

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值