R學習之統計算法與R優化包(矩估計法也即Newton) --(R語言編程)-----數模

矩估計說明:

就是把求方程解的Newton法過渡到統計學裏面,達到參數估計的目的,其實也是對於方程的求解。
直接上例題
這裏寫圖片描述

R代碼

#矩估計
#下面是之前的Newtons代碼
Newtons<-function(fun,x,ep=1e-5,it_max=100){#itmax表示最大迭代次數
  index<-0;k<-1
  while(k<=it_max){
    x1<-x;obj<-fun(x);
    x<-x-solve(obj$j,obj$f)
    norm<-sqrt((x-x1)%*%(x-x1))
    if(norm<ep){
      index<-1;break
    }
    k=k+1
  }
  obj<-fun(x)
  list(root=x,it=k,index=index,Fval=obj$f)
}

#二項分佈B(n,p),n*p-mean(x)=0,n*p*(1-p)-sum((x-mean(x))^2/m-1=0
bifun<-function(p){
  f=c(p[1]*p[2]-mean(k),p[1]*p[2]*(1-p[2])-sum((k-mean(k))^2)/(length(k)-1))
  j=matrix(c(p[2],p[1],p[2]*(1-p[2]),p[1]-2*p[1]*p[2]),nrow = 2,byrow = T)
  list(f=f,j=j)
}

k=rbinom(1000,20,0.7)
Newtons(bifun,c(10,0.5))

結果

> #矩估計
> Newtons<-function(fun,x,ep=1e-5,it_max=100){#itmax表示最大迭代次數
+   index<-0;k<-1
+   while(k<=it_max){
+     x1<-x;obj<-fun(x);
+     x<-x-solve(obj$j,obj$f)
+     norm<-sqrt((x-x1)%*%(x-x1))
+     if(norm<ep){
+       index<-1;break
+     }
+     k=k+1
+   }
+   obj<-fun(x)
+   list(root=x,it=k,index=index,Fval=obj$f)
+ }
> 
> #二項分佈B(n,p),n*p-mean(x)=0,n*p*(1-p)-sum((x-mean(x))^2/m-1=0
> bifun<-function(p){
+   f=c(p[1]*p[2]-mean(k),p[1]*p[2]*(1-p[2])-sum((k-mean(k))^2)/(length(k)-1))
+   j=matrix(c(p[2],p[1],p[2]*(1-p[2]),p[1]-2*p[1]*p[2]),nrow = 2,byrow = T)
+   list(f=f,j=j)
+ }
> 
> k=rbinom(1000,20,0.7)
> Newtons(bifun,c(10,0.5))
$`root`
[1] 20.3717921  0.6860467

$it
[1] 6

$index
[1] 1

$Fval
[1] 1.776357e-15 0.000000e+00

結果20.3717921 0.6860467,與20 0.7差不多!!!

DONE!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章