1
+ """
2
+ BetaFourParameters
3
+ * Parametrization a, c, \\ alpha, \\ beta
4
+ * Score
5
+ * Fisher Information
6
+ * `time_varying_params` map.
7
+ * Default link
8
+
9
+ Right now when estimating a BetaFourParameters model is recomended to provide fixed parameters a and c, dont
10
+ with the code:
11
+
12
+ ```julia
13
+ gas_beta_4 = Model([1, 2, 11, 12], [1, 2, 11, 12], BetaFourParameters, 0.0; time_varying_params=[3])
14
+ gas_beta_4.ω[1] = minimum(y) - 0.1*std(y) # parameter a
15
+ gas_beta_4.ω[2] = maximum(y) + 0.1*std(y) # parameter c
16
+ ```
17
+
18
+ This code is a simple and not very accurate heuristic on how to estimate the a and c parameters. If you have estimated
19
+ using maximum likelihood it will be probably better
20
+
21
+ The fact occurs because if in the optimization the gradient makes `c < maximum(y)` or `a > minimum(y)` then it
22
+ is impossible that y comes from the BetaFourParameters distribution leading to DomainErrors
23
+ """
24
+ BetaFourParameters
25
+
26
+ function score! (score_til:: Matrix{T} , y:: T , :: Type{BetaFourParameters} , param:: Matrix{T} , t:: Int ) where T
27
+ score_til[t, 1 ] = - (param[t, 3 ] - 1 )/ (y - param[t, 1 ]) + (param[t, 4 ] + param[t, 3 ] - 1 )/ (param[t, 2 ] - param[t, 1 ])
28
+ score_til[t, 2 ] = (param[t, 4 ] - 1 )/ (param[t, 2 ] - y) - (param[t, 4 ] + param[t, 3 ] - 1 )/ (param[t, 2 ] - param[t, 1 ])
29
+ score_til[t, 3 ] = log (y - param[t, 1 ]) - log (param[t, 2 ] - param[t, 1 ]) +
30
+ digamma (param[t, 3 ] + param[t, 4 ]) - digamma (param[t, 3 ])
31
+ score_til[t, 4 ] = log (param[t, 2 ] - y) - log (param[t, 2 ] - param[t, 1 ]) +
32
+ digamma (param[t, 3 ] + param[t, 4 ]) - digamma (param[t, 4 ])
33
+ return
34
+ end
35
+
36
+ function log_likelihood (:: Type{BetaFourParameters} , y:: Vector{T} , param:: Matrix{T} , n:: Int ) where T
37
+ loglik = 0.0
38
+ for t in 1 : n
39
+ loglik += (param[t, 3 ] - 1 )* log (y[t] - param[t, 1 ]) + (param[t, 4 ] - 1 ) * log (param[t, 2 ] - y[t]) -
40
+ (param[t, 3 ] + param[t, 4 ] - 1 ) * log (param[t, 2 ] - param[t, 1 ]) - logbeta (param[t, 3 ], param[t, 4 ])
41
+ end
42
+ return - loglik
43
+ end
44
+
45
+ # Links
46
+ function link! (param_tilde:: Matrix{T} , :: Type{BetaFourParameters} , param:: Matrix{T} , t:: Int ) where T
47
+ param_tilde[t, 1 ] = link (IdentityLink, param[t, 1 ])
48
+ param_tilde[t, 2 ] = link (IdentityLink, param[t, 2 ])
49
+ param_tilde[t, 3 ] = link (LogLink, param[t, 3 ], zero (T))
50
+ param_tilde[t, 4 ] = link (LogLink, param[t, 4 ], zero (T))
51
+ return
52
+ end
53
+ function unlink! (param:: Matrix{T} , :: Type{BetaFourParameters} , param_tilde:: Matrix{T} , t:: Int ) where T
54
+ param[t, 1 ] = unlink (IdentityLink, param_tilde[t, 1 ])
55
+ param[t, 2 ] = unlink (IdentityLink, param_tilde[t, 2 ])
56
+ param[t, 3 ] = unlink (LogLink, param_tilde[t, 3 ], zero (T))
57
+ param[t, 4 ] = unlink (LogLink, param_tilde[t, 4 ], zero (T))
58
+ return
59
+ end
60
+ function jacobian_link! (aux:: AuxiliaryLinAlg{T} , :: Type{BetaFourParameters} , param:: Matrix{T} , t:: Int ) where T
61
+ aux. jac[1 ] = jacobian_link (IdentityLink, param[t, 1 ])
62
+ aux. jac[2 ] = jacobian_link (IdentityLink, param[t, 2 ])
63
+ aux. jac[3 ] = jacobian_link (LogLink, param[t, 3 ], zero (T))
64
+ aux. jac[4 ] = jacobian_link (LogLink, param[t, 4 ], zero (T))
65
+ return
66
+ end
67
+
68
+ # utils
69
+ function update_dist (:: Type{BetaFourParameters} , param:: Matrix{T} , t:: Int ) where T
70
+ small_threshold! (param[:, 3 : 4 ], SMALL_NUM, t)
71
+ beta = Beta (param[t, 3 ], param[t, 4 ])
72
+ return LocationScale (param[t, 1 ], param[t, 2 ] - param[t, 1 ], beta)
73
+ end
74
+
75
+ function params_sdm (d:: BetaFourParameters )
76
+ return (d. μ, d. σ + d. μ, Distributions. params (d. ρ)... )
77
+ end
78
+
79
+ function num_params (:: Type{BetaFourParameters} )
80
+ return 4
81
+ end
82
+
83
+ # d = Beta(1, 1)
84
+ # d2 = LocationScale(-1, 3, d)
85
+ # maximum(d2)
86
+ # minimum(d2)
0 commit comments