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。可信区间的图像:


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

     
  • 相关阅读:
    PHP 开发 APP 接口 学习笔记与总结
    Java实现 LeetCode 43 字符串相乘
    Java实现 LeetCode 43 字符串相乘
    Java实现 LeetCode 43 字符串相乘
    Java实现 LeetCode 42 接雨水
    Java实现 LeetCode 42 接雨水
    Java实现 LeetCode 42 接雨水
    Java实现 LeetCode 41 缺失的第一个正数
    Java实现 LeetCode 41 缺失的第一个正数
    Java实现 LeetCode 41 缺失的第一个正数
  • 原文地址:https://www.cnblogs.com/tecdat/p/11510437.html
Copyright © 2011-2022 走看看