python 提取并绘制pystan3预测

yuvru6vn  于 2022-10-30  发布在  Python
关注(0)|答案(1)|浏览(161)

我接到一个研究项目的任务,要把一个R-stan脚本转换成python pystan 3。写R代码的同事已经离开很久了,帮不上什么忙,所以我只能靠自己的设备了。
这是stan-model代码,我的python实现的stan调用和一些演示数据。我可以运行模型,但我不知道如何在x-y图表上绘制预测和观察变量,并提取给定x值的预测变量。我知道我可以将fit对象转换为 Dataframe ,但列的含义对我来说很模糊,我根本不明白什么是依赖性的。数据框架中的独立/预测变量。我在论坛上撞破了脑袋,但我找不到任何适合我的答案(至少不是以我的经验水平)。提前谢谢你。

  1. import stan
  2. import numpy as np
  3. model_code_2s = '''
  4. data {
  5. int<lower=0> N; // number of measurements
  6. vector[N] h;
  7. vector[N] Q_meas;
  8. vector<lower=0>[N] Q_error;
  9. real mu_a1;
  10. real sigma_a1;
  11. real mu_b1;
  12. real sigma_b1;
  13. real mu_c1;
  14. real sigma_c1;
  15. real mu_k1;
  16. real sigma_k1;
  17. real mu_a2;
  18. real sigma_a2;
  19. real mu_c2;
  20. real sigma_c2;
  21. int<lower=0> N_ext;
  22. vector[N_ext] h_ext;
  23. }
  24. parameters {
  25. real<lower=0> a1;
  26. real<upper=min(h)> b1;
  27. real<lower=0> c1;
  28. real<lower=0> a2;
  29. real<lower=0> c2;
  30. real<lower=b1> k1;
  31. real<lower=0> sigma;
  32. }
  33. transformed parameters {
  34. real b2 = k1 - pow(a1/a2,1/c2)*pow(k1-b1,c1/c2);
  35. vector[N] log_mu;
  36. for (i in 1:N) {
  37. if (h[i] <= k1) {
  38. log_mu[i] = log(a1) + c1*log(h[i]-b1);
  39. } else {
  40. log_mu[i] = log(a2) + c2*log(h[i]-b2);
  41. }
  42. }
  43. vector[N] mu = exp(log_mu);
  44. vector[N] sigma_mu = mu*sigma;
  45. vector[N_ext] mu_ext;
  46. for (i in 1:N_ext) {
  47. if (h_ext[i] <= k1) {
  48. mu_ext[i] = a1*(h_ext[i] - b1)^c1;
  49. } else {
  50. mu_ext[i] = a2*(h_ext[i] - b2)^c2;
  51. }
  52. }
  53. }
  54. model {
  55. // priors
  56. a1 ~ normal(mu_a1, sigma_a1);
  57. b1 ~ normal(mu_b1, sigma_b1);
  58. c1 ~ normal(mu_c1, sigma_c1);
  59. k1 ~ normal(mu_k1, sigma_k1);
  60. a2 ~ normal(mu_a2, sigma_a2);
  61. c2 ~ normal(mu_c2, sigma_c2);
  62. sigma ~ uniform(0,10000);
  63. // likelihood
  64. Q_meas ~ normal(mu, ((sigma_mu)^2 + Q_error^2)^0.5);
  65. }
  66. generated quantities {
  67. vector[N] Q_res; // residuals Q_res = Q_meas - Q_mu (accounting for uncertainty in Q_meas)
  68. for (i in 1:N) {
  69. Q_res[i] = normal_rng(Q_meas[i],Q_error[i]) - normal_rng(mu[i],sigma_mu[i]);
  70. }
  71. vector[N_ext] Q_ext;
  72. for (i in 1:N_ext) {
  73. if (h_ext[i] <= k1) {
  74. Q_ext[i] = normal_rng(a1*(h_ext[i]-b1)^c1,mu_ext[i]*sigma);
  75. } else {
  76. Q_ext[i] = normal_rng(a2*(h_ext[i]-b2)^c2,mu_ext[i]*sigma);
  77. }
  78. }
  79. }
  80. '''
  81. h = [3600.0, 2000.0, 1400.0, 1300.0]
  82. Q_meas = [1110.2, 194.4, 90.6, 69.1]
  83. Q_error = [61.3, 8.7, 4.8, 3.7]
  84. N = len(h)
  85. h_ext = np.arange(1300.0, 3600.0, 10) # min(h) to max(h) with 0.1 step
  86. N_ext = len(h_ext)
  87. data_to_fit = {
  88. 'N': N,
  89. 'h': h,
  90. 'Q_meas': Q_meas,
  91. 'Q_error': Q_error,
  92. 'mu_a1': 20,
  93. 'sigma_a1': 10,
  94. 'mu_b1': 0,
  95. 'sigma_b1': 5,
  96. 'mu_c1': 2,
  97. 'sigma_c1': 0.5,
  98. 'mu_k1': 4,
  99. 'sigma_k1': 2,
  100. 'mu_a2': 20,
  101. 'sigma_a2': 10,
  102. 'mu_c2': 2,
  103. 'sigma_c2': 0.5,
  104. 'N_ext': N_ext,
  105. 'h_ext': h_ext
  106. }
  107. posterior = stan.build(model_code_2s, data = data_to_fit, random_seed = 42)
  108. fit = posterior.sample(num_chains = 4, num_samples = 5000, num_warmup = 1000)
d4so4syb

d4so4syb1#

首先,如果您不想看到'''之间的文本,可以省略它。它是一个多行注解。
这是一个编码示例,其中的python变量名实际上没有什么帮助,因此不容易理解这些值代表什么。
为了解释因变量、自变量和预测变量,我将提供一个简单的例子。
假设一个地方的温度取决于离海平面的距离、纬度和经度、月份以及其他变量。
给定这些变量的值,系统将能够学习和预测温度。
因此,温度是目标依赖变量,而其他变量是独立变量。
有关这些问题的详细解释,您可以在Stack Exchange的Cross Validated站点中找到更多信息。
现在,关于可视化,您可能需要检查ArviZSeaBorn库。

相关问题