求推荐支持多主体拟合等特性的R/Python隐马尔可夫模型(HMM)包
Great question! Let's break down the best tools in R and Python that check all your boxes for a multi-subject (panel/longitudinal data) HMM with discrete multivariate emissions, covariate-driven transition probabilities, and parameter constraints:
R Packages
depmixS4
This is the go-to package for flexible HMMs in R, and it directly supports every feature you need:
- Multi-subject support: Use the
groupparameter to specify your panel data's subject identifiers, fitting either shared-parameter or mixed-effect HMMs across subjects. - Discrete multivariate emissions: Supports
multinomialandcategoricalfamilies for multi-output discrete data; you can define separate emission models for each output variable. - Covariate-dependent transitions: Define transition probabilities using formula syntax (e.g.,
transition = ~ age + treatment) — the package uses logit links to map linear covariate combinations to valid probabilities. - Parameter constraints: Use the
constraintsargument to fix parameters, enforce equality across states/subjects, or define custom linear constraints. You can also manually adjust parameters withsetpars()for more complex rules.
Quick code snippet to illustrate the setup:
library(depmixS4) # Assume your data has: id (subject ID), y1/y2 (discrete outputs), cov1/cov2 (covariates) hmm_model <- depmix( response = list(y1 ~ 1, y2 ~ 1), data = your_panel_data, nstates = 2, family = list(multinomial(), multinomial()), # Multivariate discrete emissions transition = ~ cov1 + cov2, # Covariates drive transitions group = id # Multi-subject panel structure ) # Add constraint: state 1→2 and state 2→1 share the same cov1 coefficient constraint_mat <- matrix(c(NA, 1, 1, NA), nrow = 2) hmm_model <- setpars(hmm_model, constraints = list(transition = constraint_mat)) # Fit the model fit_model <- fit(hmm_model) summary(fit_model)
mHMMbayes
If you prefer a Bayesian framework, this package is built explicitly for multi-subject HMMs:
- Native support for longitudinal/panel data, with options to model subject-specific random effects alongside shared group-level parameters.
- Handles discrete multivariate emissions out of the box.
- Covariates can be included in transition probability models using logit-transformed linear predictors.
- Parameter constraints are enforced via custom prior distributions (e.g., fixing a parameter to a value by setting a narrow prior, or linking parameters across states/subjects through hierarchical priors).
Python Packages
hmmlearn (Customized)
While hmmlearn doesn't natively support covariate-driven transitions or multi-subject models, it's highly extensible to meet your needs:
- Multi-subject handling: Group your panel data by subject, and either fit separate models with shared parameters or build a joint model that pools information across subjects.
- Discrete multivariate emissions: Combine your multi-output discrete data into a single categorical variable (mapping each combination to a unique level) or define a custom emission probability function.
- Covariate-dependent transitions: Override the
_compute_transition_matrixmethod to calculate transition probabilities using a logistic regression (or other link function) that incorporates your covariates. - Parameter constraints: Use scipy's optimization constraints in the
fit()method to fix parameters or enforce equality/inequality rules.
PyMC3/PyMC4 (Probabilistic Programming)
For maximum flexibility, use a probabilistic programming framework to build a fully custom HMM:
- Multi-subject support: Implement hierarchical models to share group-level parameters while allowing subject-specific variation (e.g., random effects for transition coefficients).
- Discrete multivariate emissions: Define joint categorical distributions for your multi-output data, or model each output separately with correlated emission probabilities.
- Covariate-driven transitions: Directly model transition probabilities as functions of covariates (e.g., using
tt.nnet.sigmoidto convert linear covariate combinations to valid probabilities). - Parameter constraints: Explicitly define equality/inequality constraints between parameters, or fix parameters to specific values during model setup.
Here's a simplified skeleton of a PyMC3 model:
import pymc3 as pm import theano.tensor as tt import numpy as np # Assume covariates_data is a (n_samples, n_covariates) array, observed_data is multi-output discrete n_states = 2 n_outputs = 2 with pm.Model() as hierarchical_hmm: # Covariate coefficients for transition probabilities (state x state x covariate) beta = pm.Normal("beta", mu=0, sd=1, shape=(n_states, n_states, covariates_data.shape[1])) # Calculate transition probabilities using logit link trans_probs = tt.nnet.sigmoid(tt.dot(covariates_data, beta)) # Emission probabilities for each state and output emission_probs = pm.Dirichlet("emission_probs", a=np.ones((n_states, n_outputs)), shape=(n_states, n_outputs)) # Initial state distribution init_dist = pm.Dirichlet("init_dist", a=np.ones(n_states)) # Hidden Markov Model states = pm.HiddenMarkovModel( "states", trans_probs=trans_probs, emission_probs=emission_probs, init_dist=init_dist, observed=observed_data ) # Sample from posterior (Bayesian inference) trace = pm.sample(2000, tune=1000)
内容的提问来源于stack exchange,提问作者Joep van der Plas

