R语言与点估计学习笔记(EM算法与Bootstrap法)

一、EM算法

      EM算法是一种在观测到数据后,用迭代法估计未知参数的方法。可以证明EM算法得到的序列是稳定单调递增的。这种算法对于截尾数据或参数中有一些我们不感兴趣的参数时特别有效。

   EM算法的步骤为:

       E-step(求期望):在给定y及theta=theta(i)的条件下,求关于完全数据对数似然关于潜在变量z的期望

       M-step(求极值):求上述期望关于theta的最大值theta(i+1)

   重复以上两步,直至收敛即可得到theta的MLE。

   从上面的算法我们可以看到对于一个参数的情况,EM仅仅只是求解MLE的一个迭代算法。M-step做得就是optimize函数做得事情。对于EM算法,我们也没有现成的求解函数(这个是自然的),我们一样可以通过人机交互的办法处理。

先举一个一元的例子:

           设一次实验可能有4个结果,发生概率分别为0.5+theta/4, 0.25-theta/4 ,0.25-theta/4 ,theta/4.其中theta在0,1之间。现进行了197次实验,结果发生的次数分别为:125,18,20,34,求theta的MLE。

           计算出theta(i+1)=(195theta(i)+68)/(197theta(i)+144)

           为什么是这个结果,请翻阅王兆军《数理统计讲义》p43-p44

          我们用简单的循环就可以解决这个问题,程序及结果如下:

>fun<-function(error=1e-7){

+theta<-0.5

+k<-1

+while(T){

+k<-k+1

+theta[k]<-(159*theta[k-1]+68)/(197*theta[k-1]+144)

+if(abs(theta[k]-theta[k-1])

+}

+list(theta<-theta[k],iter<-k)

+}

>fun()

[[1]]

[1]0.6268215

 

[[2]]

[1]9

         我们再看一个二元的简单例子:

         幼儿园里老师给a,b,c,d四个小朋友发糖吃,但老师有点偏心,不同小朋友得到糖的概率不同,p(a)=0.5,p(b)=miu, p(c)=2*miu, p(d)=0.5-3*miu 如果确定了参数miu,概率分布就知道了。我们可以通过观察样本数据来推测参数知道c和d二人得到的糖果数,也知道a与b二人的糖果数之和为h,如何来估计出参数miu呢?前面我们知道了,如果观察到a,b,c,d就可以用ML估计出miu。反之,如果miu已知,根据概率期望 a/b=0.5/miu,又有a+b=h。由两个式子可得到 a=0.5*h/(0.5+miu)和b=miu*h/(0.5+miu)。

 

># 已知条件

>

>h = 20

>c = 10

>d = 10

>

># 随机初始两个未知量

>miu = runif(1,0,1/6)

>b = round(runif(1,1,20))

>

>iter = 1

>nonstop=TRUE

>while (nonstop) {

+     # E步骤,根据假设的miu来算b

+     b = c(b,miu[iter]*h/(0.5+miu[iter]))

+     print(b)

+     # M步骤,根据上面算出的b再来计算miu

+     miu = c(miu,(b[iter+1] +c)/(6*(b[iter+1]+c+d))) 

+     print(miu)

+     # 记录循环次数

+     iter = iter + 1

+     # 如果前后两次的计算结果差距很小则退出

+     nonstop =((miu[iter]-miu[iter-1])>10^(-10))

+}

[1]3.000000 4.450531

[1]0.14310878 0.09850182

>print(cbind(miu,b))

            miu        b

[1,]0.14310878 3.000000

[2,]0.09850182 4.450531

关于EM算法,及后续的发展GME的理论你可以在多数数理统计书上找到相关结论,也可以用类似办法编写函数处理它。

二、       自助法(bootstrap)

          Bootstrap法是以原始数据为基础的模拟抽样统计推断法,可用于研究一组数据的某统计量的分布特征,特别适用于那些难以用常规方法导出对参数的区间估计、假设检验等问题。“Bootstrap”的基本思想是:在原始数据的围内作有放回的再抽样,样本含量仍为n,原始数据中每个观察单位每次被抽到的概率相等,为1,…,n,所得样本称为bootstrap样本。于是可得到参数Η的一个估计值Η(b),这样重复若干次,记为B。设B=1000,就得到该参数的1000个估计值,则参数Η的标准误的bootstrap估计。简而言之就是:既然样本是抽出来的,那我何不从样本中再抽样。

        我们知道,如果分布函数F是已知的。在理论上就能够计算出参数的估计量的均方误差.若分布函数f未知,由格里文科-康特利定理知,当M充分大时,经验分布函数以概率1一致收敛到F。

      我们举一例:利用bootstrap法估计标准正态分布随机变量的期望theta=E(X)

>gauss<-rnorm(100,2,6)

>boot<-0

>for(i in 1:1000){

+boot[i]=mean(sample(gauss,replace=T))

+}

>summary(boot)

   Min. 1st Qu. Median    Mean 3rd Qu.    Max.

 0.3345 1.9540  2.3350  2.3230 2.7020  4.2330

>summary(gauss)

   Min. 1st Qu. Median    Mean 3rd Qu.    Max.

-13.380  -2.238  2.570   2.296   6.861 16.230

>sd(boot)

[1]0.599087

>sd(gauss)/sqrt(100)

[1]0.5906275

结果分析:

方法 估计 估计的标准差
理论值 2  
矩估计 2.296 0.5906
Bootstrap算法 2.323 0.5991




      需要指出的是bootstrap法不是为了提高估计量的精度.而是一般用来对估计量的方差进行估计。

关于Bootstrap方法,R中有相应的扩展包,你可以通过??bootstrap来查看有关内容

你可能感兴趣的:(R语言,数理统计)