R 如何通过optim()返回接近估计值来启用优化?

R 如何通过optim()返回接近估计值来启用优化?,r,nonlinear-optimization,mle,R,Nonlinear Optimization,Mle,首先,我需要澄清,我已经阅读了以下帖子,但我的问题仍然无法解决: 下面是进行模拟和最大似然估计的代码 #simulation #a0, a1, g1, b1 and d1 are my parameters #set true value of parameters to #simulate a set of data with size 2000 #x is the simulated data sets set.seed(5)

首先,我需要澄清,我已经阅读了以下帖子,但我的问题仍然无法解决:

  • 下面是进行模拟和最大似然估计的代码

        #simulation
        #a0, a1, g1, b1 and d1 are my parameters
        #set true value of parameters to 
        #simulate a set of data with size 2000
        #x is the simulated data sets
    
        set.seed(5)
        a0 = 2.3; a1 = 0.05; g1 = 0.68; b1 = 
        0.09; d1 = 2.0; n=2000
    
        x = h = rep(0, n)
    
        h[1] = 6
        x[1] = rpois(1,h[1])
    
         for (i in 2:n) {
    
          h[i] = (a0 + a1 *
                (abs(x[i-1]-h[i-1])-g1*(x[i-1]- 
                h[i-1]))^d1 +
                b1 * (h[i-1]^d1))^(1/d1)
          x[i] = rpois(1,h[i])
        }
    
          #this is my log-likelihood function
           ll <- function(par) {
              h.n <- rep(0,n)
              a0 <- par[1]  
              a1 <- par[2] 
              g1 <- par[3]
              b1 <- par[4]
              d1 <- par[5]
    
              h.n[1] = x[1]
              for (i in 2:n) {
    
               h.n[i] = (a0 + a1 *
                     (abs(x[i-1]-h.n[i-1])-g1* 
                      (x[i-1]-h.n[i-1]))^d1 +
                      b1 * (h.n[i-1]^d1))^(1/d1)
                }
               -sum(dpois(x, h.n, log=TRUE))
                }
    
             #as my true value are a0 = 2.3; a1 
             #= 0.05; g1 = 0.68; b1 = 0.09; d1 
             #= 2.0 
             #I put the parscale to become 
             #c(1,0.01,0.1,0.01,1)
           ps <- c(1.0, 1e-02, 1e-01, 1e-02,1.0)
    
             #optimization to check whether 
             #estimate return near to the true 
             #value
             optim(par=c(0.1,0.01,0.1,0.01,0.1), 
              ll, method = "L-BFGS-B",
              lower=c(1e-6,-10,-10,-10, 1e- 6),
              control= list(maxit=1000,
              parscale=ps,trace=1)) 
    
    所以我尝试改变下限,它返回

    > > optim(par=c(0.1,0.01,0.1,0.01,0.1), ll, method = "L-BFGS-B",lower=c(1e-6,1e-6,-10,1e-6,1e-6),control=list(maxit=1000,parscale=ps,trace=1))
    > 
    > iter   10 value 3172.782149 
    > 
    > iter   20 value 3172.371186 
    > 
    > iter   30 value 3171.952137   
    >
    > iter   40 value 3171.525942   
    >
    > iter   50 value 3171.174571 
    > 
    > iter   60 value 3171.095186 
    > 
    > iter   70 value 3171.076036 
    > 
    > iter   80 value 3171.044809 
    > 
    > iter   90 value 3171.014010 
    > 
    > iter  100 value 3170.991805 
    > 
    > iter  110 value 3170.971857 
    > 
    > iter  120 value 3170.954827 
    > 
    > iter  130 value 3170.941397 
    > 
    > iter  140 value 3170.925935 
    > 
    > iter  150 value 3170.915694  
    > 
    > iter  160 value 3170.904309 
    > 
    > iter  170 value 3170.894642
    
    > iter  180 value 3170.887122  
    
    > iter  190 value 3170.880802 
    > 
    > iter  200 value 3170.874319 
    > 
    > iter  210 value 3170.870006 
    > 
    > iter  220 value 3170.866008 
    > 
    > iter  230 value 3170.865497 
    > 
    > final  value 3170.865422  converged  
    >
    > $`par` [1] 3.242429e+05
    > 2.691999e-04 3.896417e-01 6.174022e-04 2.626361e+01
    > 
    > $value [1] 3170.865
    > 
    > $counts function gradient 
    >      291      291 
    > 
    > $convergence [1] 0
    > 
    > $message [1] "CONVERGENCE: REL_REDUCTION_OF_F <= FACTR*EPSMCH"
    
    >optim(par=c(0.1,0.01,0.1,0.01,0.1),ll,method=“L-BFGS-B”,lower=c(1e-6,1e-6,-10,1e-6,1e-6),control=list(maxit=1000,parscale=ps,trace=1))
    > 
    >iter 10数值3172.782149
    > 
    >iter 20数值3172.371186
    > 
    >iter 30值3171.952137
    >
    >iter 40值3171.525942
    >
    >iter 50值3171.174571
    > 
    >iter 60值3171.095186
    > 
    >iter 70值3171.076036
    > 
    >iter 80值3171.044809
    > 
    >iter 90值3171.014010
    > 
    >iter 100数值3170.991805
    > 
    >iter 110值3170.971857
    > 
    >iter 120数值3170.954827
    > 
    >iter 130值3170.941397
    > 
    >iter 140值3170.925935
    > 
    >iter 150值3170.915694
    > 
    >iter 160值3170.904309
    > 
    >iter 170值3170.894642
    >iter 180值3170.887122
    >iter 190值3170.880802
    > 
    >iter 200数值3170.874319
    > 
    >iter 210数值3170.870006
    > 
    >iter 220值3170.866008
    > 
    >iter 230值3170.865497
    > 
    >最终值3170.865422收敛
    >
    >$`par`[1]3.2429E+05
    >2.691999e-04 3.896417e-01 6.174022e-04 2.626361e+01
    > 
    >$value[1]3170.865
    > 
    >$counts函数梯度
    >      291      291 
    > 
    >$convergence[1]0
    > 
    
    >$message[1]“收敛性:当最大似然估计远离真实值时,有几种可能的解释:

  • 你们并没有足够的数据来得到一个准确的估计。试着使用一个更大的样本量,看看事情是否更接近

  • 您对可能性的编码不正确。这很难诊断;基本上,您只需要仔细阅读并检查编码

    • 我不熟悉你的模型,但在你的例子中,这看起来很有可能:在你的模拟中,
      h[1]
      总是
      6
      ,而
      x[1]
      是一个具有该平均值的随机值;在你的可能性中,你假设
      h[1]
      等于
      x[1]
      。这不太可能是真的
  • 您的可能性没有唯一的最大值,因为参数无法识别


  • 可能还有其他的。

    谢谢你的解释,@user2554330 1。我将尝试增加样本量。2.我将在问题中加入模型。我将6作为h[1]初始值,这样它就可以开始生成有限的数据。在可能性中,我将x[1]等于h.n[1]因此,当对可能包含异常值的真实数据进行模型拟合时,第一个h.n[1]将与图中的第一个数据点完全相同。但是,可以将h.n[1]放在图中同样为零。3.我也猜它没有唯一的最大值,但不可识别参数的含义是什么?这与stackoverflow的主题无关,但在回答您的问题时:我会将
    h[1]
    视为待估计的参数或已知值。将其设置为零会很糟糕,因为这表示
    x[1]
    始终为零,但可能不为零。“不可识别”意味着不同的参数值为数据提供完全相同的分布,因此不存在唯一的MLE。
    > > optim(par=c(0.1,0.01,0.1,0.01,0.1), ll, method = "L-BFGS-B",lower=c(1e-6,1e-6,-10,1e-6,1e-6),control=list(maxit=1000,parscale=ps,trace=1))
    > 
    > iter   10 value 3172.782149 
    > 
    > iter   20 value 3172.371186 
    > 
    > iter   30 value 3171.952137   
    >
    > iter   40 value 3171.525942   
    >
    > iter   50 value 3171.174571 
    > 
    > iter   60 value 3171.095186 
    > 
    > iter   70 value 3171.076036 
    > 
    > iter   80 value 3171.044809 
    > 
    > iter   90 value 3171.014010 
    > 
    > iter  100 value 3170.991805 
    > 
    > iter  110 value 3170.971857 
    > 
    > iter  120 value 3170.954827 
    > 
    > iter  130 value 3170.941397 
    > 
    > iter  140 value 3170.925935 
    > 
    > iter  150 value 3170.915694  
    > 
    > iter  160 value 3170.904309 
    > 
    > iter  170 value 3170.894642
    
    > iter  180 value 3170.887122  
    
    > iter  190 value 3170.880802 
    > 
    > iter  200 value 3170.874319 
    > 
    > iter  210 value 3170.870006 
    > 
    > iter  220 value 3170.866008 
    > 
    > iter  230 value 3170.865497 
    > 
    > final  value 3170.865422  converged  
    >
    > $`par` [1] 3.242429e+05
    > 2.691999e-04 3.896417e-01 6.174022e-04 2.626361e+01
    > 
    > $value [1] 3170.865
    > 
    > $counts function gradient 
    >      291      291 
    > 
    > $convergence [1] 0
    > 
    > $message [1] "CONVERGENCE: REL_REDUCTION_OF_F <= FACTR*EPSMCH"