Hypothesis Testing in Healthcare: Drug Safety
A pharmaceutical company GlobalXYZ has just completed a randomized controlled drug trial. To promote transparency and reproducibility of the drug's outcome, they (GlobalXYZ) have presented the dataset to your organization, a non-profit that focuses primarily on drug safety.
The dataset provided contained five adverse effects, demographic data, vital signs, etc. Your organization is primarily interested in the drug's adverse reactions. It wants to know if the adverse reactions, if any, are of significant proportions. It has asked you to explore and answer some questions from the data.
The dataset drug_safety.csv was obtained from Hbiostat courtesy of the Vanderbilt University Department of Biostatistics. It contained five adverse effects: headache, abdominal pain, dyspepsia, upper respiratory infection, chronic obstructive airway disease (COAD), demographic data, vital signs, lab measures, etc. The ratio of drug observations to placebo observations is 2 to 1.
For this project, the dataset has been modified to reflect the presence and absence of adverse effects adverse_effects and the number of adverse effects in a single individual num_effects.
The columns in the modified dataset are:
| Column | Description |
|---|---|
sex | The gender of the individual |
age | The age of the individual |
week | The week of the drug testing |
trx | The treatment (Drug) and control (Placebo) groups |
wbc | The count of white blood cells |
rbc | The count of red blood cells |
adverse_effects | The presence of at least a single adverse effect |
num_effects | The number of adverse effects experienced by a single individual |
The original dataset can be found here.
Your organization has asked you to explore and answer some questions from the data collected. See the project instructions.
My goal is perform some test on a new drug. Firstly, I would import useful packages and load the dataset provided by the Vanderbilt University Department of Biostatistics.
# Import packages
import numpy as np
import pandas as pd
from statsmodels.stats.proportion import proportions_ztest
import pingouin
import seaborn as sns
import matplotlib.pyplot as plt
# Load the dataset
drug_safety = pd.read_csv("drug_safety.csv")Next, checking for missing data
# checking fo missing value
print(drug_safety.isna().sum())Since the count of white blood cells and red blood cells does not affect the performance of the tests, I would just remain unchange.
# Count the adverse_effects column values for each trx group
adv_eff_by_trx = drug_safety.groupby("trx").adverse_effects.value_counts()
# Compute total rows in each group
adv_eff_by_trx_totals = adv_eff_by_trx.groupby("trx").sum()
# Create an array of the "Yes" counts for each group
yeses = [adv_eff_by_trx["Drug"]["Yes"], adv_eff_by_trx["Placebo"]["Yes"]]
# Create an array of the total number of rows in each group
n = [adv_eff_by_trx_totals["Drug"], adv_eff_by_trx_totals["Placebo"]]Now, I would perform a two-sided z-test on the two proportions to check are the difference statistical significant.
# Perform a two-sided z-test
two_sample_results = proportions_ztest(yeses, n)
# Store the p-value
two_sample_p_value = two_sample_results[1]
print(two_sample_p_value)The p-val is 0.964, it is way greater than 0.05. Therefore, I conclude that we do not have significant evidence that there is difference between the drug and placebo groups.
Afterthat, I would like to perform a chi-square independence test to see whether the number of adverse effects is dependent to the drugs.
# Determine if num_effects and trx are independent
num_effects_groups = pingouin.chi2_independence(
data=drug_safety, x="num_effects", y="trx")
# Extract the p-value
num_effects_p_value = num_effects_groups[2]["pval"][0]
print(num_effects_p_value)The p-val is 0.615 which is greater 0.05, we can conclude that there is no significant association between drugs and number of adverse effects.
The last question is whether the age are different between two groups, to check if there is any selection bias.
Before the testing, I need to check whether the age of two groups is normally distributed, so that I can choose a suitable test.
# Create a histogram with Seaborn
sns.histplot(data=drug_safety, x="age", hue="trx")# To choose between unpaired t-test and Wilcoxon-Mann-Whitney test
normality = pingouin.normality(
data=drug_safety,
dv='age',
group='trx',
method='shapiro', # the default
alpha=0.05) # 0.05 is also the default
print(normality['pval'])