How to Perform a Likelihood Ratio Test in Python

Spread the love

The likelihood ratio test (LRT) is a statistical test used to compare the goodness of fit of two statistical models — a null model and an alternative model. The null model is a special case of the alternative model. The likelihood ratio test is based on the likelihood ratio, which expresses how many times more likely the observed data is under one model than the other. This test helps us decide whether the additional parameters in the alternative model significantly improve the fit of the model.

In this extensive guide, we will learn how to perform a likelihood ratio test in Python, diving deep into each step, understanding the theory behind the process, and then applying it to practical examples.

Part 1: Understanding Likelihood Ratio Test

Before we delve into the practical implementation of the LRT in Python, it is essential to understand the theory behind the LRT.

A likelihood ratio test is a hypothesis test that compares the goodness of fit of two models. In this test, we have a null model (H0) and an alternative model (H1). The null model represents a simplified version (with fewer parameters), while the alternative model is a more complex version (with more parameters).

We compute the likelihoods of both models and take the ratio of the two. The resulting value, the likelihood ratio, is then used to compute a test statistic, which is distributed approximately as a chi-square distribution. If the chi-square test statistic is sufficiently large, this leads to the rejection of the null hypothesis in favor of the alternative model.

Part 2: Implementing a Likelihood Ratio Test in Python

Now that we have a theoretical understanding of the LRT, let’s look at how to implement it in Python.

Let’s assume we have a dataset and we want to see if a more complex model significantly improves the fit compared to a simpler one. We will use Python’s Statsmodels library for model fitting, which provides extensive possibilities for statistical modeling.

Step 1: Import Necessary Libraries

First, we need to import the necessary libraries for our task.

import numpy as np
import pandas as pd
import statsmodels.api as sm
import scipy.stats as stats

Step 2: Load and Preprocess Data

Next, we will load and preprocess our data. The exact steps depend on your specific dataset and the problem you’re trying to solve. Here, let’s assume that we have a dataset ‘data.csv’ with two independent variables ‘X1’ and ‘X2’ and one dependent variable ‘Y’. We load it using pandas and split the independent and dependent variables.

# Load the dataset
data = pd.read_csv('data.csv')

# Split independent and dependent variables
X = data[['X1', 'X2']]
Y = data['Y']

Step 3: Create Null and Alternative Models

Our null model will include ‘X1’ as the independent variable, while our alternative model will include both ‘X1’ and ‘X2’. For each model, we add a constant to the independent variables, fit the model, and then print out the summary of the model.

# Add constant to independent variables
X1 = sm.add_constant(data['X1'])
X = sm.add_constant(X)

# Null model
model_null = sm.OLS(Y, X1)
results_null =


# Alternative model
model_alt = sm.OLS(Y, X)
results_alt =


Step 4: Perform the Likelihood Ratio Test

First, we compute the likelihood ratio, which is -2 times the log of the ratio of the likelihoods of the null model to the alternative model.

LR = -2 * (results_null.llf - results_alt.llf)

Next, we need to know the number of degrees of freedom for the chi-square distribution. This is equal to the difference in the number of parameters in the two models.

df = results_alt.df_model - results_null.df_model

Finally, we compare our likelihood ratio to the chi-square distribution with the appropriate degrees of freedom. This gives us the p-value for our likelihood ratio test.

p_value = stats.chi2.sf(LR, df)

If the p-value is small (typically less than 0.05), we can reject the null hypothesis in favor of the alternative hypothesis, indicating that the additional parameters in the alternative model significantly improve the fit of the model.


In this guide, we have detailed how to perform a likelihood ratio test in Python. This test is a powerful tool in statistical modeling, allowing us to compare different models and determine if adding more parameters significantly improves our model. As always, it is crucial to understand the underlying assumptions and limitations of any statistical test, and the LRT is no exception.

Remember, the choice of the null and alternative models depends on the research question and the specific data at hand. The LRT is just one tool in a broad toolbox of statistical methods. Other tests might be more appropriate depending on the context and the specific hypotheses you are investigating. In any case, Python and its scientific computing libraries provide the tools you need to perform these analyses.

Leave a Reply