Copyright | (c) Dominik Schrempf 2021 |
---|---|
License | GPL-3.0-or-later |
Maintainer | dominik.schrempf@gmail.com |
Stability | unstable |
Portability | portable |
Safe Haskell | None |
Language | Haskell2010 |
Creation date: Wed May 20 13:42:53 2020.
Synopsis
- newtype PName = PName {}
- newtype PDescription = PDescription {}
- data PWeight
- pWeight :: Int -> PWeight
- data PDimension
- data Proposal a = Proposal {
- prName :: PName
- prDescription :: PDescription
- prDimension :: PDimension
- prWeight :: PWeight
- prSimple :: ProposalSimple a
- prTuner :: Maybe (Tuner a)
- type KernelRatio = Log Double
- type Jacobian = Log Double
- type JacobianFunction a = a -> Jacobian
- (@~) :: Lens' b a -> Proposal a -> Proposal b
- liftProposal :: Lens' b a -> Proposal a -> Proposal b
- liftProposalWith :: JacobianFunction b -> Lens' b a -> Proposal a -> Proposal b
- type ProposalSimple a = a -> GenIO -> IO (a, KernelRatio, Jacobian)
- data Tuner a = Tuner {
- tParam :: TuningParameter
- tFunc :: TuningParameter -> ProposalSimple a
- data Tune
- createProposal :: PDescription -> (TuningParameter -> ProposalSimple a) -> PDimension -> PName -> PWeight -> Tune -> Proposal a
- type TuningParameter = Double
- tuningParameterMin :: TuningParameter
- tuningParameterMax :: TuningParameter
- tune :: (TuningParameter -> TuningParameter) -> Proposal a -> Maybe (Proposal a)
- getOptimalRate :: PDimension -> Double
- data Order
- data Cycle a
- cycleFromList :: [Proposal a] -> Cycle a
- setOrder :: Order -> Cycle a -> Cycle a
- prepareProposals :: Cycle a -> GenIO -> IO [Proposal a]
- tuneCycle :: Map (Proposal a) (TuningParameter -> TuningParameter) -> Cycle a -> Cycle a
- autoTuneCycle :: Acceptance (Proposal a) -> Cycle a -> Cycle a
- data Acceptance k
- emptyA :: Ord k => [k] -> Acceptance k
- pushA :: Ord k => k -> Bool -> Acceptance k -> Acceptance k
- resetA :: Ord k => Acceptance k -> Acceptance k
- transformKeysA :: (Ord k1, Ord k2) => [k1] -> [k2] -> Acceptance k1 -> Acceptance k2
- acceptanceRate :: Ord k => k -> Acceptance k -> Maybe (Int, Int, Double)
- acceptanceRates :: Acceptance k -> Map k (Maybe Double)
- proposalHeader :: ByteString
- proposalHLine :: ByteString
- summarizeProposal :: PName -> PDescription -> PWeight -> Maybe TuningParameter -> PDimension -> Maybe (Int, Int, Double) -> ByteString
- summarizeCycle :: Acceptance (Proposal a) -> Cycle a -> ByteString
Proposals and types
Proposal name.
newtype PDescription Source #
Proposal description.
Instances
Eq PDescription Source # | |
Defined in Mcmc.Proposal (==) :: PDescription -> PDescription -> Bool # (/=) :: PDescription -> PDescription -> Bool # | |
Ord PDescription Source # | |
Defined in Mcmc.Proposal compare :: PDescription -> PDescription -> Ordering # (<) :: PDescription -> PDescription -> Bool # (<=) :: PDescription -> PDescription -> Bool # (>) :: PDescription -> PDescription -> Bool # (>=) :: PDescription -> PDescription -> Bool # max :: PDescription -> PDescription -> PDescription # min :: PDescription -> PDescription -> PDescription # | |
Show PDescription Source # | |
Defined in Mcmc.Proposal showsPrec :: Int -> PDescription -> ShowS # show :: PDescription -> String # showList :: [PDescription] -> ShowS # |
The positive weight determines how often a Proposal
is executed per
iteration of the Markov chain.
data PDimension Source #
Proposal dimension.
The number of affected, independent parameters.
The optimal acceptance rate of low dimensional proposals is higher than for high dimensional ones.
Optimal acceptance rates are still subject to controversies. As far as I
know, research has focused on random walk proposal with a multivariate normal
distribution of dimension d
. In this case, the following acceptance rates
are desired:
- one dimension: 0.44 (numerical results);
- five and more dimensions: 0.234 (numerical results);
- infinite dimensions: 0.234 (theorem for specific target distributions).
See Handbook of Markov chain Monte Carlo, chapter 4.
Of course, many proposals may not be classical random walk proposals. For
example, the beta proposal on a simplex (beta
)
samples one new variable of the simplex from a beta distribution while
rescaling all other variables. What is the dimension of this proposal? I
don't know, but I set the dimension to 2. The reason is that if the dimension
of the simplex is 2, two variables are changed. If the dimension of the
simplex is high, one variable is changed substantially, while all others are
changed marginally.
Further, if a proposal changes a number of variables in the same way (and not independently like in a random walk proposal), I still set the dimension of the proposal to the number of variables changed.
Finally, I assume that proposals of unknown dimension have high dimension, and use the optimal acceptance rate 0.234.
A Proposal
is an instruction about how the Markov chain will traverse the
state space a
. Essentially, it is a probability mass or probability density
conditioned on the current state (i.e., a Markov kernel).
A Proposal
may be tuneable in that it contains information about how to enlarge
or shrink the step size to tune the acceptance rate.
Predefined proposals are provided. To create custom proposals, one may use
the convenience function createProposal
.
Proposal | |
|
Instances
Eq (Proposal a) Source # | |
Ord (Proposal a) Source # | |
type KernelRatio = Log Double Source #
Ratio of the proposal kernels.
Part of the MHG acceptance ratio.
See also Jacobian
.
NOTE: Actually the Jacobian
should be part of the KernelRatio
. However,
it is more declarative to have them separate. It is a constant reminder: Is
the Jacobian modifier different from 1.0?
type Jacobian = Log Double Source #
Absolute value of the determinant of the Jacobian matrix.
Part of the MHG acceptance ratio.
See also Jacobian
.
type JacobianFunction a = a -> Jacobian Source #
Function calculating the Jacobian
of a proposal.
(@~) :: Lens' b a -> Proposal a -> Proposal b infixl 7 Source #
Lift a proposal from one data type to another.
Assume the Jacobian is 1.0 (see also liftProposal
and liftProposalWith
).
For example:
scaleFirstEntryOfTuple = _1 @~ scale
liftProposal :: Lens' b a -> Proposal a -> Proposal b Source #
Lift a proposal from one data type to another.
Assume the Jacobian is 1.0 (see also (@~)
and liftProposalWith
).
liftProposalWith :: JacobianFunction b -> Lens' b a -> Proposal a -> Proposal b Source #
Lift a proposal from one data type to another.
A function to calculate the Jacobian has to be provided (see also
liftProposal
).
For further reference, please see the example
Pair
.
type ProposalSimple a = a -> GenIO -> IO (a, KernelRatio, Jacobian) Source #
Simple proposal without tuning information.
Instruction about randomly moving from the current state to a new state, given some source of randomness.
In order to calculate the Metropolis-Hastings-Green ratio, we need to know
the ratio of the backward to forward kernels (the KernelRatio
or the
probability masses or probability densities) and the Jacobian
.
For unbiased proposals, these values are 1.0 such that
proposalSimpleUnbiased x g = return (x', 1.0, 1.0)
For biased proposals, the kernel ratio is qYX / qXY, where qXY is the probability density to move from X to Y, and the absolute value of the determinant of the Jacobian matrix differs from 1.0.
Tune the acceptance rate of a Proposal
; see tune
, or autoTuneCycle
.
Tuner | |
|
Tune the proposal?
:: PDescription | Description of the proposal type and parameters. |
-> (TuningParameter -> ProposalSimple a) | Function creating a simple proposal for a given tuning parameter. The larger the tuning parameter, the larger the proposal and the lower the expected acceptance rate; and vice versa. |
-> PDimension | Dimension. |
-> PName | Name. |
-> PWeight | Weight. |
-> Tune | Activate tuning? |
-> Proposal a |
Create a tuneable proposal.
type TuningParameter = Double Source #
Tuning parameter.
tuningParameterMin :: TuningParameter Source #
Minimal tuning parameter; 1e-12
, subject to change.
>>>
tuningParameterMin
1e-5
tuningParameterMax :: TuningParameter Source #
Maximal tuning parameter; 1e12
, subject to change.
>>> tuningParameterMax
1e3
tune :: (TuningParameter -> TuningParameter) -> Proposal a -> Maybe (Proposal a) Source #
Tune a Proposal
.
The size of the proposal is proportional to the tuning parameter which has a
positive lower bound of tuningParameterMin
.
The tuning function maps the current tuning parameter to a new one.
getOptimalRate :: PDimension -> Double Source #
See PDimension
.
Cycles
Define the order in which Proposal
s are executed in a Cycle
. The total
number of Proposal
s per Cycle
may differ between Order
s (e.g., compare
RandomO
and RandomReversibleO
).
RandomO | Shuffle the |
SequentialO | The |
RandomReversibleO | Similar to |
SequentialReversibleO | Similar to |
In brief, a Cycle
is a list of proposals.
The state of the Markov chain will be logged only after all Proposal
s in
the Cycle
have been completed, and the iteration counter will be increased
by one. The order in which the Proposal
s are executed is specified by
Order
. The default is RandomO
.
No proposals with the same name and description are allowed in a Cycle
, so
that they can be uniquely identified.
prepareProposals :: Cycle a -> GenIO -> IO [Proposal a] Source #
Replicate Proposal
s according to their weights and possibly shuffle them.
tuneCycle :: Map (Proposal a) (TuningParameter -> TuningParameter) -> Cycle a -> Cycle a Source #
autoTuneCycle :: Acceptance (Proposal a) -> Cycle a -> Cycle a Source #
Acceptance rates
data Acceptance k Source #
For each key k
, store the number of accepted and rejected proposals.
Instances
Eq k => Eq (Acceptance k) Source # | |
Defined in Mcmc.Proposal (==) :: Acceptance k -> Acceptance k -> Bool # (/=) :: Acceptance k -> Acceptance k -> Bool # | |
(Ord k, Read k) => Read (Acceptance k) Source # | |
Defined in Mcmc.Proposal readsPrec :: Int -> ReadS (Acceptance k) # readList :: ReadS [Acceptance k] # readPrec :: ReadPrec (Acceptance k) # readListPrec :: ReadPrec [Acceptance k] # | |
Show k => Show (Acceptance k) Source # | |
Defined in Mcmc.Proposal showsPrec :: Int -> Acceptance k -> ShowS # show :: Acceptance k -> String # showList :: [Acceptance k] -> ShowS # | |
ToJSONKey k => ToJSON (Acceptance k) Source # | |
Defined in Mcmc.Proposal toJSON :: Acceptance k -> Value # toEncoding :: Acceptance k -> Encoding # toJSONList :: [Acceptance k] -> Value # toEncodingList :: [Acceptance k] -> Encoding # | |
(Ord k, FromJSONKey k) => FromJSON (Acceptance k) Source # | |
Defined in Mcmc.Proposal parseJSON :: Value -> Parser (Acceptance k) # parseJSONList :: Value -> Parser [Acceptance k] # |
emptyA :: Ord k => [k] -> Acceptance k Source #
In the beginning there was the Word.
Initialize an empty storage of accepted/rejected values.
pushA :: Ord k => k -> Bool -> Acceptance k -> Acceptance k Source #
For key k
, prepend an accepted (True) or rejected (False) proposal.
resetA :: Ord k => Acceptance k -> Acceptance k Source #
Reset acceptance storage.
transformKeysA :: (Ord k1, Ord k2) => [k1] -> [k2] -> Acceptance k1 -> Acceptance k2 Source #
Transform keys using the given lists. Keys not provided will not be present
in the new Acceptance
variable.
acceptanceRate :: Ord k => k -> Acceptance k -> Maybe (Int, Int, Double) Source #
Acceptance counts and rate for a specific proposal.
Return Nothing
if no proposals have been accepted or rejected (division by
zero).
acceptanceRates :: Acceptance k -> Map k (Maybe Double) Source #
Acceptance rates for all proposals.
Set rate to Nothing
if no proposals have been accepted or rejected
(division by zero).
Output
proposalHeader :: ByteString Source #
Header of proposal summaries.
proposalHLine :: ByteString Source #
Horizontal line of proposal summaries.
summarizeProposal :: PName -> PDescription -> PWeight -> Maybe TuningParameter -> PDimension -> Maybe (Int, Int, Double) -> ByteString Source #
Proposal summary.
summarizeCycle :: Acceptance (Proposal a) -> Cycle a -> ByteString Source #