@@ -7,31 +7,32 @@ import ..ForwardDiff
7
7
import NamedArrays
8
8
import StatsBase
9
9
import Printf
10
+ import StatsAPI
10
11
11
12
12
13
"""
13
14
ModeResult{
14
- V<:NamedArrays.NamedArray,
15
- M<:NamedArrays.NamedArray,
16
- O<:Optim.MultivariateOptimizationResults,
15
+ V<:NamedArrays.NamedArray,
16
+ M<:NamedArrays.NamedArray,
17
+ O<:Optim.MultivariateOptimizationResults,
17
18
S<:NamedArrays.NamedArray
18
19
}
19
20
20
21
A wrapper struct to store various results from a MAP or MLE estimation.
21
22
"""
22
23
struct ModeResult{
23
- V<: NamedArrays.NamedArray ,
24
+ V<: NamedArrays.NamedArray ,
24
25
O<: Optim.MultivariateOptimizationResults ,
25
26
M<: OptimLogDensity
26
27
} <: StatsBase.StatisticalModel
27
28
" A vector with the resulting point estimates."
28
- values :: V
29
+ values:: V
29
30
" The stored Optim.jl results."
30
- optim_result :: O
31
+ optim_result:: O
31
32
" The final log likelihood or log joint, depending on whether `MAP` or `MLE` was run."
32
- lp :: Float64
33
+ lp:: Float64
33
34
" The evaluation function used to calculate the output."
34
- f :: M
35
+ f:: M
35
36
end
36
37
# ############################
37
38
# Various StatsBase methods #
@@ -50,14 +51,23 @@ function Base.show(io::IO, m::ModeResult)
50
51
show (io, m. values. array)
51
52
end
52
53
53
- function StatsBase. coeftable (m:: ModeResult )
54
+ function StatsBase. coeftable (m:: ModeResult ; level :: Real = 0.95 )
54
55
# Get columns for coeftable.
55
- terms = StatsBase. coefnames (m)
56
- estimates = m. values. array[:,1 ]
56
+ terms = string .( StatsBase. coefnames (m) )
57
+ estimates = m. values. array[:, 1 ]
57
58
stderrors = StatsBase. stderror (m)
58
- tstats = estimates ./ stderrors
59
-
60
- StatsBase. CoefTable ([estimates, stderrors, tstats], [" estimate" , " stderror" , " tstat" ], terms)
59
+ zscore = estimates ./ stderrors
60
+ p = map (z -> StatsAPI. pvalue (Normal (), z; tail= :both ), zscore)
61
+
62
+ # Confidence interval (CI)
63
+ q = quantile (Normal (), (1 + level) / 2 )
64
+ ci_low = estimates .- q .* stderrors
65
+ ci_high = estimates .+ q .* stderrors
66
+
67
+ StatsBase. CoefTable (
68
+ [estimates, stderrors, zscore, p, ci_low, ci_high],
69
+ [" Coef." , " Std. Error" , " z" , " Pr(>|z|)" , " Lower 95%" , " Upper 95%" ],
70
+ terms)
61
71
end
62
72
63
73
function StatsBase. informationmatrix (m:: ModeResult ; hessian_function= ForwardDiff. hessian, kwargs... )
@@ -113,7 +123,7 @@ mle = optimize(model, MLE())
113
123
mle = optimize(model, MLE(), NelderMead())
114
124
```
115
125
"""
116
- function Optim. optimize (model:: Model , :: MLE , options:: Optim.Options = Optim. Options (); kwargs... )
126
+ function Optim. optimize (model:: Model , :: MLE , options:: Optim.Options = Optim. Options (); kwargs... )
117
127
return _mle_optimize (model, options; kwargs... )
118
128
end
119
129
function Optim. optimize (model:: Model , :: MLE , init_vals:: AbstractArray , options:: Optim.Options = Optim. Options (); kwargs... )
@@ -123,11 +133,11 @@ function Optim.optimize(model::Model, ::MLE, optimizer::Optim.AbstractOptimizer,
123
133
return _mle_optimize (model, optimizer, options; kwargs... )
124
134
end
125
135
function Optim. optimize (
126
- model:: Model ,
127
- :: MLE ,
128
- init_vals:: AbstractArray ,
129
- optimizer:: Optim.AbstractOptimizer ,
130
- options:: Optim.Options = Optim. Options ();
136
+ model:: Model ,
137
+ :: MLE ,
138
+ init_vals:: AbstractArray ,
139
+ optimizer:: Optim.AbstractOptimizer ,
140
+ options:: Optim.Options = Optim. Options ();
131
141
kwargs...
132
142
)
133
143
return _mle_optimize (model, init_vals, optimizer, options; kwargs... )
@@ -159,7 +169,7 @@ map_est = optimize(model, MAP(), NelderMead())
159
169
```
160
170
"""
161
171
162
- function Optim. optimize (model:: Model , :: MAP , options:: Optim.Options = Optim. Options (); kwargs... )
172
+ function Optim. optimize (model:: Model , :: MAP , options:: Optim.Options = Optim. Options (); kwargs... )
163
173
return _map_optimize (model, options; kwargs... )
164
174
end
165
175
function Optim. optimize (model:: Model , :: MAP , init_vals:: AbstractArray , options:: Optim.Options = Optim. Options (); kwargs... )
@@ -169,11 +179,11 @@ function Optim.optimize(model::Model, ::MAP, optimizer::Optim.AbstractOptimizer,
169
179
return _map_optimize (model, optimizer, options; kwargs... )
170
180
end
171
181
function Optim. optimize (
172
- model:: Model ,
173
- :: MAP ,
174
- init_vals:: AbstractArray ,
175
- optimizer:: Optim.AbstractOptimizer ,
176
- options:: Optim.Options = Optim. Options ();
182
+ model:: Model ,
183
+ :: MAP ,
184
+ init_vals:: AbstractArray ,
185
+ optimizer:: Optim.AbstractOptimizer ,
186
+ options:: Optim.Options = Optim. Options ();
177
187
kwargs...
178
188
)
179
189
return _map_optimize (model, init_vals, optimizer, options; kwargs... )
@@ -190,43 +200,43 @@ end
190
200
Estimate a mode, i.e., compute a MLE or MAP estimate.
191
201
"""
192
202
function _optimize (
193
- model:: Model ,
194
- f:: OptimLogDensity ,
195
- optimizer:: Optim.AbstractOptimizer = Optim. LBFGS (),
196
- args... ;
203
+ model:: Model ,
204
+ f:: OptimLogDensity ,
205
+ optimizer:: Optim.AbstractOptimizer = Optim. LBFGS (),
206
+ args... ;
197
207
kwargs...
198
208
)
199
209
return _optimize (model, f, DynamicPPL. getparams (f), optimizer, args... ; kwargs... )
200
210
end
201
211
202
212
function _optimize (
203
- model:: Model ,
204
- f:: OptimLogDensity ,
205
- options:: Optim.Options = Optim. Options (),
206
- args... ;
213
+ model:: Model ,
214
+ f:: OptimLogDensity ,
215
+ options:: Optim.Options = Optim. Options (),
216
+ args... ;
207
217
kwargs...
208
218
)
209
219
return _optimize (model, f, DynamicPPL. getparams (f), Optim. LBFGS (), args... ; kwargs... )
210
220
end
211
221
212
222
function _optimize (
213
- model:: Model ,
214
- f:: OptimLogDensity ,
215
- init_vals:: AbstractArray = DynamicPPL. getparams (f),
216
- options:: Optim.Options = Optim. Options (),
217
- args... ;
223
+ model:: Model ,
224
+ f:: OptimLogDensity ,
225
+ init_vals:: AbstractArray = DynamicPPL. getparams (f),
226
+ options:: Optim.Options = Optim. Options (),
227
+ args... ;
218
228
kwargs...
219
229
)
220
230
return _optimize (model, f, init_vals, Optim. LBFGS (), options, args... ; kwargs... )
221
231
end
222
232
223
233
function _optimize (
224
- model:: Model ,
225
- f:: OptimLogDensity ,
226
- init_vals:: AbstractArray = DynamicPPL. getparams (f),
227
- optimizer:: Optim.AbstractOptimizer = Optim. LBFGS (),
228
- options:: Optim.Options = Optim. Options (),
229
- args... ;
234
+ model:: Model ,
235
+ f:: OptimLogDensity ,
236
+ init_vals:: AbstractArray = DynamicPPL. getparams (f),
237
+ optimizer:: Optim.AbstractOptimizer = Optim. LBFGS (),
238
+ options:: Optim.Options = Optim. Options (),
239
+ args... ;
230
240
kwargs...
231
241
)
232
242
# Convert the initial values, since it is assumed that users provide them
@@ -243,7 +253,7 @@ function _optimize(
243
253
@warn " Optimization did not converge! You may need to correct your model or adjust the Optim parameters."
244
254
end
245
255
246
- # Get the VarInfo at the MLE/MAP point, and run the model to ensure
256
+ # Get the VarInfo at the MLE/MAP point, and run the model to ensure
247
257
# correct dimensionality.
248
258
@set! f. varinfo = DynamicPPL. unflatten (f. varinfo, M. minimizer)
249
259
@set! f. varinfo = invlink!! (f. varinfo, model)
0 commit comments