在R语言和Stan中估计截断泊松分布

301 阅读2分钟

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

原文出处:拓端数据部落公众号

 

数据

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

 

 由此代码生成:

 

# 原始数据:
set.seed(321)
a <- rpois(1000, 1.3)

# 数据的截断版本:
b <- a[ a > 1]

# 图形:
data_frame(value = c(a, b),
  ggplot(aes(x = value)) +
   (binwidth = 1, colour = "w
# 模型拟合原始模型效果很好:
mean(a)
 (a, "Poisson")

# 截断版本效果一般
mean(b)
fitdistr(b, "Poisson")

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

最大似然

fitdist中使用dpoisppois函数的截断版本。

#-------------在R中使用MLE拟合-------------------
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提供数据的方式:

#-------------从R中调用Stan--------------
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")

结果提供了lambdafitdistrplus方法估计的后验分布:1.35,标准偏差为0.08。置信区间的图像:

 


最受欢迎的见解

1.R语言泊松Poisson回归模型分析案例

2.R语言进行数值模拟:模拟泊松回归模型

3.r语言泊松回归分析

4.R语言对布丰投针(蒲丰投针)实验进行模拟和动态可视化

5.用R语言模拟混合制排队随机服务排队系统

6.GARCH(1,1),MA以及历史模拟法的VaR比较

7.R语言做复杂金融产品的几何布朗运动的模拟

8.R语言进行数值模拟:模拟泊松回归模型

9.R语言对巨灾风险下的再保险合同定价研究案例:广义线性模型和帕累托分布Pareto distributions