zoukankan      html  css  js  c++  java
  • 在R语言和Stan中估计截断泊松分布

    原文链接:http://tecdat.cn/?p=6534

     数据

     

    这是一个非常简化的例子。我产生了1,000个计数观察值,平均值为1.3。然后,如果只观察到两个或更高的那个,我将原始分布与我得到的分布进行比较。 


     由此代码生成:

     
    
    # original data:
    set.seed(321)
    a <- rpois(1000, 1.3)
    
    # truncated version of data:
    b <- a[ a > 1]
    
    # graphic:
    data_frame(value = c(a, b),
               variable =  (c("Original data", "Truncated so only observations of 2 or more show up"), c(length(a), length(b)))) %>%
      ggplot(aes(x = value)) +
       (binwidth = 1, colour = "white") +
      facet_wrap(~variable, ncol = 1) +
      ggtitle("Comparing full and truncated datasets from a Poisson distribution") +
      labs(y = "Number of observations")
    
    # fitting a model to original works well:
    mean(a)
     (a, "Poisson")
    
    # but obviously not if naively done to the truncated version:
    mean(b)
    fitdistr(b, "Poisson")

    估计lambda完整数据(a)的关键参数效果很好,估计值为1.347,刚好超过1.3的真实值的一个标准误差。

    最大似然

    需要dpoisppois函数的截断版本并在fitdist其中使用这些版本。

    #-------------MLE fitting in R-------------------
    dtruncated_poisson <- function(x, lambda) {
    }
    ptruncated_poisson <- function(x, lambda) {
    }
    
    fitdist(b, "truncated_poisson", start = c(lambda = 0.5)) 

    请注意,要执行此操作,我将下限阈值指定为1.5; 因为所有数据都是整数,这实际上意味着我们只观察2或更多的观察结果。我们还需要为估计值指定一个合理的起始值lambda- 这样做太远会导致错误。

    贝叶斯

    对于替代贝叶斯方法,Stan可以很容易地将数据和概率分布描述为截断的。除了我x在这个程序中调用的原始数据之外,我们需要告诉它有多少观察(n),lower_limit它被截断了,以及表征我们估计的参数的先验分布所需的任何东西。

    以下程序的关键部分是:

    • data块中,指定数据的x下限为lower_limit
    • model块中,指定x通过截断的分布T[lower_limit, ]
    data {
      int n;
      int lower_limit;
      int  x[n];
      real lambda_start_mu;
      real lambda_start_sigma;
    }
    
    parameters {
      reallambda;
    }
    
    model {
      lambda ~ normal(lambda_start_mu, lambda_start_sigma);
      
      for(i in 1:n){
        x[i] ~ poisson(lambda) T[lower_limit, ];
      }
    }

    以下是从R向Stan提供数据的方式:

    #-------------Calling Stan from R--------------
    data <- list(
      x = b,
      lower_limit = 2,
      n = length(),
      lambda_start_sigma = 1
    )
    
    fit <- stan("0120-trunc.stan", data = data, cores = 4)
    
    
    plot(fit) + 
      labs(y = "Estimated parameters") +
      theme_minimal(base_family = "myfont")

    这为我们提供lambda了与该fitdistrplus方法匹配的后验分布:1.35,标准偏差为0.08。可信区间的图像:


    如果您有任何疑问,请在下面发表评论。

     
  • 相关阅读:
    从零开始webpack4.x(十)区分不同环境
    从零开始webpack4.x(九)watch、resolve、小插件、跨域问题、环境变量
    从零开始webpack4.x(八)配置source-map
    从零开始webpack4.x(七)图片处理及打包文件分类
    浏览器:输入url,到页面加载的过程
    从零开始webpack4.x(六)全局变量引入
    JS 闭包
    PHP 回调函数call_user_func和 call_user_func_array()的理解
    面试总结之谈谈你对面向对象的理解
    maven私有库配置
  • 原文地址:https://www.cnblogs.com/tecdat/p/11510437.html
Copyright © 2011-2022 走看看