Statsmodels: Statistical Modeling and Econometrics
Overview
Statsmodels is Python's premier library for statistical modeling, providing tools for estimation, inference, and diagnostics across a wide range of statistical methods. Apply this skill for rigorous statistical analysis, from simple linear regression to complex time series models and econometric analyses.
When to Use This Skill
This skill should be used when:
- Fitting regression models (OLS, WLS, GLS, quantile regression)
- Performing generalized linear modeling (logistic, Poisson, Gamma, etc.)
- Analyzing discrete outcomes (binary, multinomial, count, ordinal)
- Conducting time series analysis (ARIMA, SARIMAX, VAR, forecasting)
- Running statistical tests and diagnostics
- Testing model assumptions (heteroskedasticity, autocorrelation, normality)
- Detecting outliers and influential observations
- Comparing models (AIC/BIC, likelihood ratio tests)
- Estimating causal effects
- Producing publication-ready statistical tables and inference
Quick Start Guide
Linear Regression (OLS)
import statsmodels.api as sm
import numpy as np
import pandas as pd
# Prepare data - ALWAYS add constant for intercept
X = sm.add_constant(X_data)
# Fit OLS model
model = sm.OLS(y, X)
results = model.fit()
# View comprehensive results
print(results.summary())
# Key results
print(f"R-squared: {results.rsquared:.4f}")
print(f"Coefficients:\\n{results.params}")
print(f"P-values:\\n{results.pvalues}")
# Predictions with confidence intervals
predictions = results.get_prediction(X_new)
pred_summary = predictions.summary_frame()
print(pred_summary) # includes mean, CI, prediction intervals
# Diagnostics
from statsmodels.stats.diagnostic import het_breuschpagan
bp_test = het_breuschpagan(results.resid, X)
print(f"Breusch-Pagan p-value: {bp_test[1]:.4f}")
# Visualize residuals
import matplotlib.pyplot as plt
plt.scatter(results.fittedvalues, results.resid)
plt.axhline(y=0, color='r', linestyle='--')
plt.xlabel('Fitted values')
plt.ylabel('Residuals')
plt.show()
Logistic Regression (Binary Outcomes)
from statsmodels.discrete.discrete_model import Logit
# Add constant
X = sm.add_constant(X_data)
# Fit logit model
model = Logit(y_binary, X)
results = model.fit()
print(results.summary())
# Odds ratios
odds_ratios = np.exp(results.params)
print("Odds ratios:\\n", odds_ratios)
# Predicted probabilities
probs = results.predict(X)
# Binary predictions (0.5 threshold)
predictions = (probs > 0.5).astype(int)
# Model evaluation
from sklearn.metrics import classification_report, roc_auc_score
print(classification_report(y_binary, predictions))
print(f"AUC: {roc_auc_score(y_binary, probs):.4f}")
# Marginal effects
marginal = results.get_margeff()
print(marginal.summary())
Time Series (ARIMA)
from statsmodels.tsa.arima.model import ARIMA
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
# Check stationarity
from statsmodels.tsa.stattools import adfuller
adf_result = adfuller(y_series)
print(f"ADF p-value: {adf_result[1]:.4f}")
if adf_result[1] > 0.05:
# Series is non-stationary, difference it
y_diff = y_series.diff().dropna()
# Plot ACF/PACF to identify p, q
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 8))
plot_acf(y_diff, lags=40, ax=ax1)
plot_pacf(y_diff, lags=40, ax=ax2)
plt.show()
# Fit ARIMA(p,d,q)
model = ARIMA(y_series, order=(1, 1, 1))
results = model.fit()
print(results.summary())
# Forecast
forecast = results.forecast(steps=10)
forecast_obj = results.get_forecast(steps=10)
forecast_df = forecast_obj.summary_frame()
print(forecast_df) # includes mean and confidence intervals
# Residual diagnostics
results.plot_diagnostics(figsize=(12, 8))
plt.show()
Generalized Linear Models (GLM)
import statsmodels.api as sm
# Poisson regression for count data
X = sm.add_constant(X_data)
model = sm.GLM(y_counts, X, family=sm.families.Poisson())
results = model.fit()
print(results.summary())
# Rate ratios (for Poisson with log link)
rate_ratios = np.exp(results.params)
print("Rate ratios:\\n", rate_ratios)
# Check overdispersion
overdispersion = results.pearson_chi2 / results.df_resid
print(f"Overdispersion: {overdispersion:.2f}")
if overdispersion > 1.5:
# Use Negative Binomial instead
from statsmodels.discrete.count_model import NegativeBinomial
nb_model = NegativeBinomial(y_counts, X)
nb_results = nb_model.fit()
print(nb_results.summary())
Core Statistical Modeling Capabilities
1. Linear Regression Models
Comprehensive suite of linear models for continuous outcomes with various error structures.
Available models:
- OLS: Standard linear regression with i.i.d. errors
- WLS: Weighted least squares for heteroskedastic errors
- GLS: Generalized least squares for arbitrary covariance structure
- GLSAR: GLS with autoregressive errors for time series
- Quantile Regression: Conditional quantiles (robust to outliers)
- Mixed Effects: Hierarchical/multilevel models with random effects
- Recursive/Rolling: Time-varying parameter estimation
Key features:
- Comprehensive diagnostic tests
- Robust standard errors (HC, HAC, cluster-robust)
- Influence statistics (Cook's distance, leverage, DFFITS)
- Hypothesis testing (F-tests, Wald tests)
- Model comparison (AIC, BIC, likelihood ratio tests)
- Prediction with confidence and prediction intervals
When to use: Continuous outcome variable, want inference on coefficients, need diagnostics
Reference: See references/linear_models.md for detailed guidance on model selection, diagnostics, and best practices.
2. Generalized Linear Models (GLM)
Flexible framework extending linear models to non-normal distributions.
Distribution families:
- Binomial: Binary outcomes or proportions (logistic regression)
- Poisson: Count data
- Negative Binomial: Overdispersed counts
- Gamma: Positive continuous, right-skewed data
- Inverse Gaussian: Positive continuous with specific variance structure
- Gaussian: Equivalent to OLS
- Tweedie: Flexible family for semi-continuous data
Link functions:
- Logit, Probit, Log, Identity, Inverse, Sqrt, CLogLog, Power
- Choose based on interpretation needs and model fit
Key features:
- Maximum likelihood estimation via IRLS
- Deviance and Pearson residuals
- Goodness-of-fit statistics
- Pseudo R-squared measures
- Robust standard errors
When to use: Non-normal outcomes, need flexible variance and link specifications
Reference: See references/glm.md for family selection, link functions, interpretation, and diagnostics.
3. Discrete Choice Models
Models for categorical and count outcomes.
Binary models:
- Logit: Logistic regression (odds ratios)
- Probit: Probit regression (normal distribution)
Multinomial models:
- MNLogit: Unordered categories (3+ levels)
- Conditional Logit: Choice models with alternative-specific variables
- Ordered Model: Ordinal outcomes (ordered categories)
Count models:
- Poisson: Standard count model
- Negative Binomial: Overdispersed counts
- Zero-Inflated: Excess zeros (ZIP, ZINB)
- Hurdle Models: Two-stage models for zero-heavy data
Key features:
- Maximum likelihood estimation
- Marginal effects at means or average marginal effects
- Model comparison via AIC/BIC
- Predicted probabilities and classification
- Goodness-of-fit tests
When to use: Binary, categorical, or count outcomes
Reference: See references/discrete_choice.md for model selection, interpretation, and evaluation.
4. Time Series Analysis
Comprehensive time series modeling and forecasting capabilities.
Univariate models:
- AutoReg (AR): Autoregressive models
- ARIMA: Autoregressive integrated moving average
- SARIMAX: Seasonal ARIMA with exogenous variables
- Exponential Smoothing: Simple, Holt, Holt-Winters
- ETS: Innovations state space models
Multivariate models:
- VAR: Vector autoregression
- VARMAX: VAR with MA and exogenous variables
- Dynamic Factor Models: Extract common factors
- VECM: Vector error correction models (cointegration)
Advanced models:
- State Space: Kalman filtering, custom specifications
- Regime Switching: Markov switching models
- ARDL: Autoregressive distributed lag
Key features:
- ACF/PACF analysis for model identification
- Stationarity tests (ADF, KPSS)
- Forecasting with prediction intervals
- Residual diagnostics (Ljung-Box, heteroskedasticity)
- Granger causality testing
- Impulse response functions (IRF)
- Forecast error variance decomposition (FEVD)
When to use: Time-ordered data, forecasting, understanding temporal dynamics
Reference: See references/time_series.md for model selection, diagnostics, and forecasting methods.
5. Statistical Tests and Diagnostics
Extensive testing and diagnostic capabilities for model validation.
Residual diagnostics:
- Autocorrelation tests (Ljung-Box, Durbin-Watson, Breusch-Godfrey)
- Heteroskedasticity tests (Breusch-Pagan, White, ARCH)
- Normality tests (Jarque-Bera, Omnibus, Anderson-Darling, Lilliefors)
- Specification tests (RESET, Harvey-Collier)
Influence and outliers:
- Leverage (hat values)
- Cook's distance
- DFFITS and DFBETAs
- Studentized residuals
- Influence plots
Hypothesis testing:
- t-tests (one-sample, two-sample, paired)
- Proportion tests
- Chi-square tests
- Non-parametric tests (Mann-Whitney, Wilcoxon, Kruskal-Wallis)
- ANOVA (one-way, two-way, repeated measures)
Multiple comparisons:
- Tukey's HSD
- Bonferroni correction
- False Discovery Rate (FDR)
Effect sizes and power:
- Cohen's d, eta-squared
- Power analysis for t-tests, proportions
- Sample size calculations
Robust inference:
- Heteroskedasticity-consistent SEs (HC0-HC3)
- HAC standard errors (Newey-West)
- Cluster-robust standard errors
When to use: Validating assumptions, detecting problems, ensuring robust inference
Reference: See references/stats_diagnostics.md for comprehensive testing and diagnostic procedures.
Formula API (R-style)
Statsmodels supports R-style formulas for intuitive model specification:
import statsmodels.formula.api as smf
# OLS with formula
results = smf.ols('y ~ x1 + x2 + x1:x2', data=df).fit()
# Categorical variables (automatic dummy coding)
results = smf.ols('y ~ x1 + C(category)', data=df).fit()
# Interactions
results = smf.ols('y ~ x1 * x2', data=df).fit() # x1 + x2 + x1:x2
# Polynomial terms
results = smf.ols('y ~ x + I(x**2)', data=df).fit()
# Logit
results = smf.logit('y ~ x1 + x2 + C(group)', data=df).fit()
# Poisson
results = smf.poisson('count ~ x1 + x2', data=df).fit()
# ARIMA (not available via formula, use regular API)
Model Selection and Comparison
Information Criteria
# Compare models using AIC/BIC
models = {
'Model 1': model1_results,
'Model 2': model2_results,
'Model 3': model3_results
}
comparison = pd.DataFrame({
'AIC': {name: res.aic for name, res in models.items()},
'BIC': {name: res.bic for name, res in models.items()},
'Log-Likelihood': {name: res.llf for name, res in models.items()}
})
print(comparison.sort_values('AIC'))
# Lower AIC/BIC indicates better model
Likelihood Ratio Test (Nested Models)
# For nested models (one is subset of the other)
from scipy import stats
lr_stat = 2 * (full_model.llf - reduced_model.llf)
df = full_model.df_model - reduced_model.df_model
p_value = 1 - stats.chi2.cdf(lr_stat, df)
print(f"LR statistic: {lr_stat:.4f}")
print(f"p-value: {p_value:.4f}")
if p_value < 0.05:
print("Full model significantly better")
else:
print("Reduced model preferred (parsimony)")
Cross-Validation
from sklearn.model_selection import KFold
from sklearn.metrics import mean_squared_error
kf = KFold(n_splits=5, shuffle=True, random_state=42)
cv_scores = []
for train_idx, val_idx in kf.split(X):
X_train, X_val = X.iloc[train_idx], X.iloc[val_idx]
y_train, y_val = y.iloc[train_idx], y.iloc[val_idx]
# Fit model
model = sm.OLS(y_train, X_train).fit()
# Predict
y_pred = model.predict(X_val)
# Score
rmse = np.sqrt(mean_squared_error(y_val, y_pred))
cv_scores.append(rmse)
print(f"CV RMSE: {np.mean(cv_scores):.4f} ± {np.std(cv_scores):.4f}")
Best Practices
Data Preparation
- Always add constant: Use
sm.add_constant() unless excluding intercept
- Check for missing values: Handle or impute before fitting
- Scale if needed: Improves convergence, interpretation (but not required for tree models)
- Encode categoricals: Use formula API or manual dummy coding
Model Building
- Start simple: Begin with basic model, add complexity as needed
- Check assumptions: Test residuals, heteroskedasticity, autocorrelation
- Use appropriate model: Match model to outcome type (binary→Logit, count→Poisson)
- Consider alternatives: If assumptions violated, use robust methods or different model
Inference
- Report effect sizes: Not just p-values
- Use robust SEs: When heteroskedasticity or clustering present
- Multiple comparisons: Correct when testing many hypotheses
- Confidence intervals: Always report alongside point estimates
Model Evaluation
- Check residuals: Plot residuals vs fitted, Q-Q plot
- Influence diagnostics: Identify and investigate influential observations
- Out-of-sample validation: Test on holdout set or cross-validate
- Compare models: Use AIC/BIC for non-nested, LR test for nested
Reporting
- Comprehensive summary: Use
.summary() for detailed output
- Document decisions: Note transformations, excluded observations
- Interpret carefully: Account for link functions (e.g., exp(β) for log link)
- Visualize: Plot predictions, confidence intervals, diagnostics
Common Workflows
Workflow 1: Linear Regression Analysis
- Explore data (plots, descriptives)
- Fit initial OLS model
- Check residual diagnostics
- Test for heteroskedasticity, autocorrelation
- Check for multicollinearity (VIF)
- Identify influential observations
- Refit with robust SEs if needed
- Interpret coefficients and inference
- Validate on holdout or via CV
Workflow 2: Binary Classification
- Fit logistic regression (Logit)
- Check for convergence issues
- Interpret odds ratios
- Calculate marginal effects
- Evaluate classification performance (AUC, confusion matrix)
- Check for influential observations
- Compare with alternative models (Probit)
- Validate predictions on test set
Workflow 3: Count Data Analysis
- Fit Poisson regression
- Check for overdispersion
- If overdispersed, fit Negative Binomial
- Check for excess zeros (consider ZIP/ZINB)
- Interpret rate ratios
- Assess goodness of fit
- Compare models via AIC
- Validate predictions
Workflow 4: Time Series Forecasting
- Plot series, check for trend/seasonality
- Test for stationarity (ADF, KPSS)
- Difference if non-stationary
- Identify p, q from ACF/PACF
- Fit ARIMA or SARIMAX
- Check residual diagnostics (Ljung-Box)
- Generate forecasts with confidence intervals
- Evaluate forecast accuracy on test set
Reference Documentation
This skill includes comprehensive reference files for detailed guidance:
references/linear_models.md
Detailed coverage of linear regression models including:
- OLS, WLS, GLS, GLSAR, Quantile Regression
- Mixed effects models
- Recursive and rolling regression
- Comprehensive diagnostics (heteroskedasticity, autocorrelation, multicollinearity)
- Influence statistics and outlier detection
- Robust standard errors (HC, HAC, cluster)
- Hypothesis testing and model comparison
references/glm.md
Complete guide to generalized linear models:
- All distribution families (Binomial, Poisson, Gamma, etc.)
- Link functions and when to use each
- Model fitting and interpretation
- Pseudo R-squared and goodness of fit
- Diagnostics and residual analysis
- Applications (logistic, Poisson, Gamma regression)
references/discrete_choice.md
Comprehensive guide to discrete outcome models:
- Binary models (Logit, Probit)
- Multinomial models (MNLogit, Conditional Logit)
- Count models (Poisson, Negative Binomial, Zero-Inflated, Hurdle)
- Ordinal models
- Marginal effects and interpretation
- Model diagnostics and comparison
references/time_series.md
In-depth time series analysis guidance:
- Univariate models (AR, ARIMA, SARIMAX, Exponential Smoothing)
- Multivariate models (VAR, VARMAX, Dynamic Factor)
- State space models
- Stationarity testing and diagnostics
- Forecasting methods and evaluation
- Granger causality, IRF, FEVD
references/stats_diagnostics.md
Comprehensive statistical testing and diagnostics:
- Residual diagnostics (autocorrelation, heteroskedasticity, normality)
- Influence and outlier detection
- Hypothesis tests (parametric and non-parametric)
- ANOVA and post-hoc tests
- Multiple comparisons correction
- Robust covariance matrices
- Power analysis and effect sizes
When to reference:
- Need detailed parameter explanations
- Choosing between similar models
- Troubleshooting convergence or diagnostic issues
- Understanding specific test statistics
- Looking for code examples for advanced features
Search patterns:
# Find information about specific models
grep -r "Quantile Regression" references/
# Find diagnostic tests
grep -r "Breusch-Pagan" references/stats_diagnostics.md
# Find time series guidance
grep -r "SARIMAX" references/time_series.md
Common Pitfalls to Avoid
- Forgetting constant term: Always use
sm.add_constant() unless no intercept desired
- Ignoring assumptions: Check residuals, heteroskedasticity, autocorrelation
- Wrong model for outcome type: Binary→Logit/Probit, Count→Poisson/NB, not OLS
- Not checking convergence: Look for optimization warnings
- Misinterpreting coefficients: Remember link functions (log, logit, etc.)
- Using Poisson with overdispersion: Check dispersion, use Negative Binomial if needed
- Not using robust SEs: When heteroskedasticity or clustering present
- Overfitting: Too many parameters relative to sample size
- Data leakage: Fitting on test data or using future information
- Not validating predictions: Always check out-of-sample performance
- Comparing non-nested models: Use AIC/BIC, not LR test
- Ignoring influential observations: Check Cook's distance and leverage
- Multiple testing: Correct p-values when testing many hypotheses
- Not differencing time series: Fit ARIMA on non-stationary data
- Confusing prediction vs confidence intervals: Prediction intervals are wider
Getting Help
For detailed documentation and examples:
1---2name: statsmodels3description: Statistical models library for Python. Use when you need specific model classes (OLS, GLM, mixed models, ARIMA) with detailed diagnostics, residuals, and inference. Best for econometrics, time series, rigorous inference with coefficient tables. For guided statistical test selection with APA reporting use statistical-analysis.4license: BSD-3-Clause license5---6
7# Statsmodels: Statistical Modeling and Econometrics
8
9## Overview
10
11Statsmodels is Python's premier library for statistical modeling, providing tools for estimation, inference, and diagnostics across a wide range of statistical methods. Apply this skill for rigorous statistical analysis, from simple linear regression to complex time series models and econometric analyses.
12
13## When to Use This Skill
14
15This skill should be used when:
16- Fitting regression models (OLS, WLS, GLS, quantile regression)
17- Performing generalized linear modeling (logistic, Poisson, Gamma, etc.)
18- Analyzing discrete outcomes (binary, multinomial, count, ordinal)
19- Conducting time series analysis (ARIMA, SARIMAX, VAR, forecasting)
20- Running statistical tests and diagnostics
21- Testing model assumptions (heteroskedasticity, autocorrelation, normality)
22- Detecting outliers and influential observations
23- Comparing models (AIC/BIC, likelihood ratio tests)
24- Estimating causal effects
25- Producing publication-ready statistical tables and inference
26
27## Quick Start Guide
28
29### Linear Regression (OLS)
30
31```python
32import statsmodels.api as sm
33import numpy as np
34import pandas as pd
35
36# Prepare data - ALWAYS add constant for intercept
37X = sm.add_constant(X_data)
38
39# Fit OLS model
40model = sm.OLS(y, X)
41results = model.fit()
42
43# View comprehensive results
44print(results.summary())
45
46# Key results
47print(f"R-squared: {results.rsquared:.4f}")
48print(f"Coefficients:\\n{results.params}")
49print(f"P-values:\\n{results.pvalues}")
50
51# Predictions with confidence intervals
52predictions = results.get_prediction(X_new)
53pred_summary = predictions.summary_frame()
54print(pred_summary) # includes mean, CI, prediction intervals
55
56# Diagnostics
57from statsmodels.stats.diagnostic import het_breuschpagan
58bp_test = het_breuschpagan(results.resid, X)
59print(f"Breusch-Pagan p-value: {bp_test[1]:.4f}")
60
61# Visualize residuals
62import matplotlib.pyplot as plt
63plt.scatter(results.fittedvalues, results.resid)
64plt.axhline(y=0, color='r', linestyle='--')
65plt.xlabel('Fitted values')
66plt.ylabel('Residuals')
67plt.show()
68```
69
70### Logistic Regression (Binary Outcomes)
71
72```python
73from statsmodels.discrete.discrete_model import Logit
74
75# Add constant
76X = sm.add_constant(X_data)
77
78# Fit logit model
79model = Logit(y_binary, X)
80results = model.fit()
81
82print(results.summary())
83
84# Odds ratios
85odds_ratios = np.exp(results.params)
86print("Odds ratios:\\n", odds_ratios)
87
88# Predicted probabilities
89probs = results.predict(X)
90
91# Binary predictions (0.5 threshold)
92predictions = (probs > 0.5).astype(int)
93
94# Model evaluation
95from sklearn.metrics import classification_report, roc_auc_score
96
97print(classification_report(y_binary, predictions))
98print(f"AUC: {roc_auc_score(y_binary, probs):.4f}")
99
100# Marginal effects
101marginal = results.get_margeff()
102print(marginal.summary())
103```
104
105### Time Series (ARIMA)
106
107```python
108from statsmodels.tsa.arima.model import ARIMA
109from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
110
111# Check stationarity
112from statsmodels.tsa.stattools import adfuller
113
114adf_result = adfuller(y_series)
115print(f"ADF p-value: {adf_result[1]:.4f}")
116
117if adf_result[1] > 0.05:
118 # Series is non-stationary, difference it
119 y_diff = y_series.diff().dropna()
120
121# Plot ACF/PACF to identify p, q
122fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 8))
123plot_acf(y_diff, lags=40, ax=ax1)
124plot_pacf(y_diff, lags=40, ax=ax2)
125plt.show()
126
127# Fit ARIMA(p,d,q)
128model = ARIMA(y_series, order=(1, 1, 1))
129results = model.fit()
130
131print(results.summary())
132
133# Forecast
134forecast = results.forecast(steps=10)
135forecast_obj = results.get_forecast(steps=10)
136forecast_df = forecast_obj.summary_frame()
137
138print(forecast_df) # includes mean and confidence intervals
139
140# Residual diagnostics
141results.plot_diagnostics(figsize=(12, 8))
142plt.show()
143```
144
145### Generalized Linear Models (GLM)
146
147```python
148import statsmodels.api as sm
149
150# Poisson regression for count data
151X = sm.add_constant(X_data)
152model = sm.GLM(y_counts, X, family=sm.families.Poisson())
153results = model.fit()
154
155print(results.summary())
156
157# Rate ratios (for Poisson with log link)
158rate_ratios = np.exp(results.params)
159print("Rate ratios:\\n", rate_ratios)
160
161# Check overdispersion
162overdispersion = results.pearson_chi2 / results.df_resid
163print(f"Overdispersion: {overdispersion:.2f}")
164
165if overdispersion > 1.5:
166 # Use Negative Binomial instead
167 from statsmodels.discrete.count_model import NegativeBinomial
168 nb_model = NegativeBinomial(y_counts, X)
169 nb_results = nb_model.fit()
170 print(nb_results.summary())
171```
172
173## Core Statistical Modeling Capabilities
174
175### 1. Linear Regression Models
176
177Comprehensive suite of linear models for continuous outcomes with various error structures.
178
179**Available models:**
180- **OLS**: Standard linear regression with i.i.d. errors
181- **WLS**: Weighted least squares for heteroskedastic errors
182- **GLS**: Generalized least squares for arbitrary covariance structure
183- **GLSAR**: GLS with autoregressive errors for time series
184- **Quantile Regression**: Conditional quantiles (robust to outliers)
185- **Mixed Effects**: Hierarchical/multilevel models with random effects
186- **Recursive/Rolling**: Time-varying parameter estimation
187
188**Key features:**
189- Comprehensive diagnostic tests
190- Robust standard errors (HC, HAC, cluster-robust)
191- Influence statistics (Cook's distance, leverage, DFFITS)
192- Hypothesis testing (F-tests, Wald tests)
193- Model comparison (AIC, BIC, likelihood ratio tests)
194- Prediction with confidence and prediction intervals
195
196**When to use:** Continuous outcome variable, want inference on coefficients, need diagnostics
197
198**Reference:** See `references/linear_models.md` for detailed guidance on model selection, diagnostics, and best practices.
199
200### 2. Generalized Linear Models (GLM)
201
202Flexible framework extending linear models to non-normal distributions.
203
204**Distribution families:**
205- **Binomial**: Binary outcomes or proportions (logistic regression)
206- **Poisson**: Count data
207- **Negative Binomial**: Overdispersed counts
208- **Gamma**: Positive continuous, right-skewed data
209- **Inverse Gaussian**: Positive continuous with specific variance structure
210- **Gaussian**: Equivalent to OLS
211- **Tweedie**: Flexible family for semi-continuous data
212
213**Link functions:**
214- Logit, Probit, Log, Identity, Inverse, Sqrt, CLogLog, Power
215- Choose based on interpretation needs and model fit
216
217**Key features:**
218- Maximum likelihood estimation via IRLS
219- Deviance and Pearson residuals
220- Goodness-of-fit statistics
221- Pseudo R-squared measures
222- Robust standard errors
223
224**When to use:** Non-normal outcomes, need flexible variance and link specifications
225
226**Reference:** See `references/glm.md` for family selection, link functions, interpretation, and diagnostics.
227
228### 3. Discrete Choice Models
229
230Models for categorical and count outcomes.
231
232**Binary models:**
233- **Logit**: Logistic regression (odds ratios)
234- **Probit**: Probit regression (normal distribution)
235
236**Multinomial models:**
237- **MNLogit**: Unordered categories (3+ levels)
238- **Conditional Logit**: Choice models with alternative-specific variables
239- **Ordered Model**: Ordinal outcomes (ordered categories)
240
241**Count models:**
242- **Poisson**: Standard count model
243- **Negative Binomial**: Overdispersed counts
244- **Zero-Inflated**: Excess zeros (ZIP, ZINB)
245- **Hurdle Models**: Two-stage models for zero-heavy data
246
247**Key features:**
248- Maximum likelihood estimation
249- Marginal effects at means or average marginal effects
250- Model comparison via AIC/BIC
251- Predicted probabilities and classification
252- Goodness-of-fit tests
253
254**When to use:** Binary, categorical, or count outcomes
255
256**Reference:** See `references/discrete_choice.md` for model selection, interpretation, and evaluation.
257
258### 4. Time Series Analysis
259
260Comprehensive time series modeling and forecasting capabilities.
261
262**Univariate models:**
263- **AutoReg (AR)**: Autoregressive models
264- **ARIMA**: Autoregressive integrated moving average
265- **SARIMAX**: Seasonal ARIMA with exogenous variables
266- **Exponential Smoothing**: Simple, Holt, Holt-Winters
267- **ETS**: Innovations state space models
268
269**Multivariate models:**
270- **VAR**: Vector autoregression
271- **VARMAX**: VAR with MA and exogenous variables
272- **Dynamic Factor Models**: Extract common factors
273- **VECM**: Vector error correction models (cointegration)
274
275**Advanced models:**
276- **State Space**: Kalman filtering, custom specifications
277- **Regime Switching**: Markov switching models
278- **ARDL**: Autoregressive distributed lag
279
280**Key features:**
281- ACF/PACF analysis for model identification
282- Stationarity tests (ADF, KPSS)
283- Forecasting with prediction intervals
284- Residual diagnostics (Ljung-Box, heteroskedasticity)
285- Granger causality testing
286- Impulse response functions (IRF)
287- Forecast error variance decomposition (FEVD)
288
289**When to use:** Time-ordered data, forecasting, understanding temporal dynamics
290
291**Reference:** See `references/time_series.md` for model selection, diagnostics, and forecasting methods.
292
293### 5. Statistical Tests and Diagnostics
294
295Extensive testing and diagnostic capabilities for model validation.
296
297**Residual diagnostics:**
298- Autocorrelation tests (Ljung-Box, Durbin-Watson, Breusch-Godfrey)
299- Heteroskedasticity tests (Breusch-Pagan, White, ARCH)
300- Normality tests (Jarque-Bera, Omnibus, Anderson-Darling, Lilliefors)
301- Specification tests (RESET, Harvey-Collier)
302
303**Influence and outliers:**
304- Leverage (hat values)
305- Cook's distance
306- DFFITS and DFBETAs
307- Studentized residuals
308- Influence plots
309
310**Hypothesis testing:**
311- t-tests (one-sample, two-sample, paired)
312- Proportion tests
313- Chi-square tests
314- Non-parametric tests (Mann-Whitney, Wilcoxon, Kruskal-Wallis)
315- ANOVA (one-way, two-way, repeated measures)
316
317**Multiple comparisons:**
318- Tukey's HSD
319- Bonferroni correction
320- False Discovery Rate (FDR)
321
322**Effect sizes and power:**
323- Cohen's d, eta-squared
324- Power analysis for t-tests, proportions
325- Sample size calculations
326
327**Robust inference:**
328- Heteroskedasticity-consistent SEs (HC0-HC3)
329- HAC standard errors (Newey-West)
330- Cluster-robust standard errors
331
332**When to use:** Validating assumptions, detecting problems, ensuring robust inference
333
334**Reference:** See `references/stats_diagnostics.md` for comprehensive testing and diagnostic procedures.
335
336## Formula API (R-style)
337
338Statsmodels supports R-style formulas for intuitive model specification:
339
340```python
341import statsmodels.formula.api as smf
342
343# OLS with formula
344results = smf.ols('y ~ x1 + x2 + x1:x2', data=df).fit()
345
346# Categorical variables (automatic dummy coding)
347results = smf.ols('y ~ x1 + C(category)', data=df).fit()
348
349# Interactions
350results = smf.ols('y ~ x1 * x2', data=df).fit() # x1 + x2 + x1:x2
351
352# Polynomial terms
353results = smf.ols('y ~ x + I(x**2)', data=df).fit()
354
355# Logit
356results = smf.logit('y ~ x1 + x2 + C(group)', data=df).fit()
357
358# Poisson
359results = smf.poisson('count ~ x1 + x2', data=df).fit()
360
361# ARIMA (not available via formula, use regular API)
362```
363
364## Model Selection and Comparison
365
366### Information Criteria
367
368```python
369# Compare models using AIC/BIC
370models = {
371 'Model 1': model1_results,
372 'Model 2': model2_results,
373 'Model 3': model3_results
374}
375
376comparison = pd.DataFrame({
377 'AIC': {name: res.aic for name, res in models.items()},
378 'BIC': {name: res.bic for name, res in models.items()},
379 'Log-Likelihood': {name: res.llf for name, res in models.items()}
380})
381
382print(comparison.sort_values('AIC'))
383# Lower AIC/BIC indicates better model
384```
385
386### Likelihood Ratio Test (Nested Models)
387
388```python
389# For nested models (one is subset of the other)
390from scipy import stats
391
392lr_stat = 2 * (full_model.llf - reduced_model.llf)
393df = full_model.df_model - reduced_model.df_model
394p_value = 1 - stats.chi2.cdf(lr_stat, df)
395
396print(f"LR statistic: {lr_stat:.4f}")
397print(f"p-value: {p_value:.4f}")
398
399if p_value < 0.05:
400 print("Full model significantly better")
401else:
402 print("Reduced model preferred (parsimony)")
403```
404
405### Cross-Validation
406
407```python
408from sklearn.model_selection import KFold
409from sklearn.metrics import mean_squared_error
410
411kf = KFold(n_splits=5, shuffle=True, random_state=42)
412cv_scores = []
413
414for train_idx, val_idx in kf.split(X):
415 X_train, X_val = X.iloc[train_idx], X.iloc[val_idx]
416 y_train, y_val = y.iloc[train_idx], y.iloc[val_idx]
417
418 # Fit model
419 model = sm.OLS(y_train, X_train).fit()
420
421 # Predict
422 y_pred = model.predict(X_val)
423
424 # Score
425 rmse = np.sqrt(mean_squared_error(y_val, y_pred))
426 cv_scores.append(rmse)
427
428print(f"CV RMSE: {np.mean(cv_scores):.4f} ± {np.std(cv_scores):.4f}")
429```
430
431## Best Practices
432
433### Data Preparation
434
4351. **Always add constant**: Use `sm.add_constant()` unless excluding intercept
4362. **Check for missing values**: Handle or impute before fitting
4373. **Scale if needed**: Improves convergence, interpretation (but not required for tree models)
4384. **Encode categoricals**: Use formula API or manual dummy coding
439
440### Model Building
441
4421. **Start simple**: Begin with basic model, add complexity as needed
4432. **Check assumptions**: Test residuals, heteroskedasticity, autocorrelation
4443. **Use appropriate model**: Match model to outcome type (binary→Logit, count→Poisson)
4454. **Consider alternatives**: If assumptions violated, use robust methods or different model
446
447### Inference
448
4491. **Report effect sizes**: Not just p-values
4502. **Use robust SEs**: When heteroskedasticity or clustering present
4513. **Multiple comparisons**: Correct when testing many hypotheses
4524. **Confidence intervals**: Always report alongside point estimates
453
454### Model Evaluation
455
4561. **Check residuals**: Plot residuals vs fitted, Q-Q plot
4572. **Influence diagnostics**: Identify and investigate influential observations
4583. **Out-of-sample validation**: Test on holdout set or cross-validate
4594. **Compare models**: Use AIC/BIC for non-nested, LR test for nested
460
461### Reporting
462
4631. **Comprehensive summary**: Use `.summary()` for detailed output
4642. **Document decisions**: Note transformations, excluded observations
4653. **Interpret carefully**: Account for link functions (e.g., exp(β) for log link)
4664. **Visualize**: Plot predictions, confidence intervals, diagnostics
467
468## Common Workflows
469
470### Workflow 1: Linear Regression Analysis
471
4721. Explore data (plots, descriptives)
4732. Fit initial OLS model
4743. Check residual diagnostics
4754. Test for heteroskedasticity, autocorrelation
4765. Check for multicollinearity (VIF)
4776. Identify influential observations
4787. Refit with robust SEs if needed
4798. Interpret coefficients and inference
4809. Validate on holdout or via CV
481
482### Workflow 2: Binary Classification
483
4841. Fit logistic regression (Logit)
4852. Check for convergence issues
4863. Interpret odds ratios
4874. Calculate marginal effects
4885. Evaluate classification performance (AUC, confusion matrix)
4896. Check for influential observations
4907. Compare with alternative models (Probit)
4918. Validate predictions on test set
492
493### Workflow 3: Count Data Analysis
494
4951. Fit Poisson regression
4962. Check for overdispersion
4973. If overdispersed, fit Negative Binomial
4984. Check for excess zeros (consider ZIP/ZINB)
4995. Interpret rate ratios
5006. Assess goodness of fit
5017. Compare models via AIC
5028. Validate predictions
503
504### Workflow 4: Time Series Forecasting
505
5061. Plot series, check for trend/seasonality
5072. Test for stationarity (ADF, KPSS)
5083. Difference if non-stationary
5094. Identify p, q from ACF/PACF
5105. Fit ARIMA or SARIMAX
5116. Check residual diagnostics (Ljung-Box)
5127. Generate forecasts with confidence intervals
5138. Evaluate forecast accuracy on test set
514
515## Reference Documentation
516
517This skill includes comprehensive reference files for detailed guidance:
518
519### references/linear_models.md
520Detailed coverage of linear regression models including:
521- OLS, WLS, GLS, GLSAR, Quantile Regression
522- Mixed effects models
523- Recursive and rolling regression
524- Comprehensive diagnostics (heteroskedasticity, autocorrelation, multicollinearity)
525- Influence statistics and outlier detection
526- Robust standard errors (HC, HAC, cluster)
527- Hypothesis testing and model comparison
528
529### references/glm.md
530Complete guide to generalized linear models:
531- All distribution families (Binomial, Poisson, Gamma, etc.)
532- Link functions and when to use each
533- Model fitting and interpretation
534- Pseudo R-squared and goodness of fit
535- Diagnostics and residual analysis
536- Applications (logistic, Poisson, Gamma regression)
537
538### references/discrete_choice.md
539Comprehensive guide to discrete outcome models:
540- Binary models (Logit, Probit)
541- Multinomial models (MNLogit, Conditional Logit)
542- Count models (Poisson, Negative Binomial, Zero-Inflated, Hurdle)
543- Ordinal models
544- Marginal effects and interpretation
545- Model diagnostics and comparison
546
547### references/time_series.md
548In-depth time series analysis guidance:
549- Univariate models (AR, ARIMA, SARIMAX, Exponential Smoothing)
550- Multivariate models (VAR, VARMAX, Dynamic Factor)
551- State space models
552- Stationarity testing and diagnostics
553- Forecasting methods and evaluation
554- Granger causality, IRF, FEVD
555
556### references/stats_diagnostics.md
557Comprehensive statistical testing and diagnostics:
558- Residual diagnostics (autocorrelation, heteroskedasticity, normality)
559- Influence and outlier detection
560- Hypothesis tests (parametric and non-parametric)
561- ANOVA and post-hoc tests
562- Multiple comparisons correction
563- Robust covariance matrices
564- Power analysis and effect sizes
565
566**When to reference:**
567- Need detailed parameter explanations
568- Choosing between similar models
569- Troubleshooting convergence or diagnostic issues
570- Understanding specific test statistics
571- Looking for code examples for advanced features
572
573**Search patterns:**
574```bash
575# Find information about specific models
576grep -r "Quantile Regression" references/
577
578# Find diagnostic tests
579grep -r "Breusch-Pagan" references/stats_diagnostics.md
580
581# Find time series guidance
582grep -r "SARIMAX" references/time_series.md
583```
584
585## Common Pitfalls to Avoid
586
5871. **Forgetting constant term**: Always use `sm.add_constant()` unless no intercept desired
5882. **Ignoring assumptions**: Check residuals, heteroskedasticity, autocorrelation
5893. **Wrong model for outcome type**: Binary→Logit/Probit, Count→Poisson/NB, not OLS
5904. **Not checking convergence**: Look for optimization warnings
5915. **Misinterpreting coefficients**: Remember link functions (log, logit, etc.)
5926. **Using Poisson with overdispersion**: Check dispersion, use Negative Binomial if needed
5937. **Not using robust SEs**: When heteroskedasticity or clustering present
5948. **Overfitting**: Too many parameters relative to sample size
5959. **Data leakage**: Fitting on test data or using future information
59610. **Not validating predictions**: Always check out-of-sample performance
59711. **Comparing non-nested models**: Use AIC/BIC, not LR test
59812. **Ignoring influential observations**: Check Cook's distance and leverage
59913. **Multiple testing**: Correct p-values when testing many hypotheses
60014. **Not differencing time series**: Fit ARIMA on non-stationary data
60115. **Confusing prediction vs confidence intervals**: Prediction intervals are wider
602
603## Getting Help
604
605For detailed documentation and examples:
606- Official docs: https://www.statsmodels.org/stable/
607- User guide: https://www.statsmodels.org/stable/user-guide.html
608- Examples: https://www.statsmodels.org/stable/examples/index.html
609- API reference: https://www.statsmodels.org/stable/api.html
610