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.
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
The columns in the modified dataset are:
|The gender of the individual|
|The age of the individual|
|The week of the drug testing|
|The treatment (Drug) and control (Placebo) groups|
|The count of white blood cells|
|The count of red blood cells|
|The presence of at least a single adverse effect|
|The number of adverse effects experienced by a single individual|
The original dataset can be found here
# Import packages import numpy as np import pandas as pd from scipy.stats import norm 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") # Start coding here... # 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") # Create a countplot of num_effects vs trx # Store the output in plot_num_eff plot_num_eff = sns.countplot(x="num_effects", data=drug_safety, hue='trx') # Set the x axis label and title plt.xlabel("Number of Adverse Effects") plt.title("Distribution of the Number of Effects Between the Groups") # 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"]] # Perform a two-sided z-test on the two proportions two_samp_z_stat, two_samp_z_p_value = proportions_ztest(yeses, n) # Round to three decimal places two_samp_z_stat = np.round(two_samp_z_stat, 3) two_samp_z_p_value = np.round(two_samp_z_p_value, 3) # Determine if num_effects and trx are independent expected, observed, stats = pingouin.chi2_independence( data=drug_safety, x="num_effects", y="trx") # Round the test statistics to three decimal places stats = stats.round(3) # Extract the Pearson row as pearson_num_effect_trx pearson_num_effect_trx = stats[stats["test"] == "pearson"] # Creating histograms to visualize the distribution of ages by treatment # Create the plot axes. Increase the figure size _, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 6)) # Set x and y axes labels xlabel = "Age (years)" ylabel = "Frequency" # The Drug group's age distribution ax1.hist(x="age", data=drug_safety[drug_safety["trx"] == "Drug"], bins=30) ax1.set_xlabel(xlabel) ax1.set_ylabel(ylabel) ax1.set_title("Distribution of Age in the Drug Group") # The Placebo group's age distribution ax2.hist(x="age", data=drug_safety[drug_safety["trx"] == "Placebo"], bins=30) ax2.set_xlabel(xlabel) ax2.set_ylabel(ylabel) ax2.set_title("Distribution of Age in the Placebo Group") # Select the age of the Drug group age_trx = drug_safety.loc[drug_safety["trx"] == "Drug", "age"] # Select the age of the Placebo group age_placebo = drug_safety.loc[drug_safety["trx"] == "Placebo", "age"] # The distributions strongly suggest a # non-parametric independent samples test. # Conduct a two-sided Wilcoxon-Mann-Whitney test # and round to three decimal places two_samp_ind_results = pingouin.mwu(age_trx, age_placebo).round(3)