Code
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import os
import jsonEn este notebook se realiza una comparativa entre diferentes alternativas de inteligencia artificial (IA) aplicados a la propuesta de reutilización de fármacos para el tratamiento del Alzheimer. El objetivo de este análisis es contrastar metodologías que puedan identificar fármacos existentes que puedan ser reutilizados de manera efectiva en el tratamiento de esta enfermedad neurodegenerativa.
Replicamos el enfoque utilizado en el artículo Leveraging generative AI to prioritize drug repurposing candidates for Alzheimer’s disease with real-world clinical validation (Yan et al., 2024) utilizando los modelos de inteligencia artificial ChatGPT y Gemini. Los prompts fueron extraídos directamente de dicho artículo, y los aplicamos a ambos modelos para realizar la comparativa de candidatos para el repurposing de fármacos en el tratamiento del Alzheimer.
Prompt 1:
“Please provide a list of the 20 most promising drugs for repurposing in the treatment of Alzheimer’s disease based on their potential efficacy, and indicate the diseases they were originally developed to treat. Please use the JSON format to include the “Drug” and “Disease” keys.”
Prompt 2:
“Please check if the generated list meets the requirement: 1) exclude the drugs that were originally designed for Alzheimer’s disease, 2) 20 distinct drugs, and 3) in JSON format. If not, please regenerate the list that meets the requirement.”
Cita del artículo:
Yan, C., Grabowska, M.E., Dickson, A.L. et al. Leveraging generative AI to prioritize drug repurposing candidates for Alzheimer’s disease with real-world clinical validation. npj Digit. Med. 7, 46 (2024). https://doi.org/10.1038/s41746-024-01038-3
Habiendo obtenido las respuestas fuimos guardando en archivos json las respuestas. Debido a la naturaleza probabilística
En este análisis no se llevó a cabo la validación de las drogas propuestas como en el artículo citado. Sólo se plantea una comaparativa de las respuestas obtemidas.
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import os
import jsondf_chatgpt = pd.DataFrame()
directory = "ChatGPT"
json_files = [f for f in os.listdir(directory) if f.endswith('.json')]
for file in json_files:
file_path = os.path.join(directory, file)
with open(file_path, 'r') as f:
data = json.load(f)
df_chatgpt = pd.concat([df_chatgpt, pd.json_normalize(data)], ignore_index=True)
df_chatgpt.head(10)| Drug | Disease | |
|---|---|---|
| 0 | Metformin | Type 2 Diabetes |
| 1 | Losartan | Hypertension |
| 2 | Simvastatin | Hypercholesterolemia |
| 3 | Candesartan | Hypertension |
| 4 | Diltiazem | Hypertension and Angina |
| 5 | Propranolol | Hypertension and Anxiety |
| 6 | Pioglitazone | Type 2 Diabetes |
| 7 | Rifampin | Tuberculosis |
| 8 | Minocycline | Bacterial Infections |
| 9 | Furosemide | Edema and Hypertension |
La tabla muestra una lista de 10 fármacos con su respectiva enfermedad original para la cual fueron desarrollados. Cada fila incluye el nombre del fármaco y la enfermedad específica que se buscaba tratar al momento de su desarrollo.
df_chatgpt.describe()| Drug | Disease | |
|---|---|---|
| count | 100 | 100 |
| unique | 60 | 47 |
| top | Metformin | Type 2 Diabetes |
| freq | 5 | 12 |
Podemos ver que de las 100 drogas que propuso ChatGPT 60 son úinicas y refieren a 47 enfermedades diferentes.
La droga más frecuente es metformina y el la enfermedad que tratan más frecuentemente es diabetes de tipo 2.
plt.figure(figsize=(10,10))
sns.set_style("darkgrid")
sns.histplot(df_chatgpt, y="Drug",)
# plt.xticks(rotation=90)
plt.tight_layout()
plt.show()df_gemini = pd.DataFrame()
directory = "Gemini"
json_files = [f for f in os.listdir(directory) if f.endswith('.json')]
for file in json_files:
file_path = os.path.join(directory, file)
with open(file_path, 'r') as f:
data = json.load(f)
df_gemini = pd.concat([df_gemini, pd.json_normalize(data)], ignore_index=True)
df_gemini.head(10)| Drug | Disease | |
|---|---|---|
| 0 | Bevacizumab | Cancer |
| 1 | Simvastatin | Hypercholesterolemia |
| 2 | Metformin | Type 2 Diabetes |
| 3 | Fluoxetine | Depression |
| 4 | Lithium | Bipolar Disorder |
| 5 | Minocycline | Acne |
| 6 | Ibuprofen | Pain and Inflammation |
| 7 | Celecoxib | Osteoarthritis |
| 8 | Rapamycin | Organ Transplant Rejection |
| 9 | Exenatide | Type 2 Diabetes |
df_gemini.describe()| Drug | Disease | |
|---|---|---|
| count | 100 | 100 |
| unique | 30 | 20 |
| top | Bevacizumab | Alzheimer's Disease |
| freq | 5 | 16 |
Podemos ver que de las 100 drogas que propuso Gemini 30 son úinicas y refieren a 20 enfermedades diferentes.
Esto nos da indicios de que es mucho menor la variabilidad de Gemini respecto a ChatGPT.
La droga más frecuente es metformina y el la enfermedad que tratan más frecuentemente es diabetes de tipo 2.
plt.figure(figsize=(10,10))
sns.set_style("darkgrid")
sns.histplot(df_gemini, y="Drug",)
plt.xticks(rotation=90)
plt.tight_layout()
plt.show()Es una propuesta de la división de Inteligencia Artificial para la Medicina y la Ciencia de Harvard que presetna un modelo para identificar oportunidades terapéuticas para enfermedades raras.
Fue pre entrenado con un grafo de conocimiento de 17.080 enfermedades y 7.957 candidatos terapéuticos.
Además desarrollaron una
Citas:
df_txgnn = pd.read_csv("txgnn.csv")
df_txgnn| Drug | |
|---|---|
| 0 | Tacrine |
| 1 | Rivastigmine |
| 2 | Acetylcarnitine |
| 3 | Galantamine |
| 4 | Epicriptine |
| 5 | Ipidacrine |
| 6 | Donepezil |
| 7 | Pramiracetam |
| 8 | Nifurtimox |
| 9 | Deutetrabenazine |
| 10 | Levomethadone |
| 11 | Tetrabenazine |
| 12 | Adenosine phosphate |
| 13 | Istradefylline |
| 14 | Piribedil |
| 15 | Safinamide |
| 16 | Valbenazine |
| 17 | Chlorpromazine |
| 18 | Opicapone |
| 19 | Cenegermin |
A continuación se presenta el número de drogas que comparten los diferentes sets de datos obtenidos por cada herramienta.
from collections import Counter
set_chatgpt = set(df_chatgpt['Drug'])
set_gemini = set(df_gemini['Drug'])
set_txgnn = set(df_txgnn['Drug'])
intersection_chatgpt_gemini = len(set_chatgpt & set_gemini)
intersection_chatgpt_txgnn = len(set_chatgpt & set_txgnn)
intersection_gemini_txgnn = len(set_gemini & set_txgnn)
intersection_all = len(set_chatgpt & set_gemini & set_txgnn)
intersections = Counter({
'ChatGPT & Gemini': intersection_chatgpt_gemini,
'ChatGPT & TXGNN': intersection_chatgpt_txgnn,
'Gemini & TXGNN': intersection_gemini_txgnn,
'ChatGPT & Gemini & TXGNN': intersection_all
})
labels = list(intersections.keys())
values = list(intersections.values())
plt.bar(labels, values)
plt.title('Número de medicamentos compartidos entre los DataFrames')
plt.xlabel('Intersecciones')
plt.ylabel('Cantidad de medicamentos compartidos')
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()from wordcloud import WordCloud
intersection_chatgpt_gemini = set_chatgpt & set_gemini
intersection_chatgpt_txgnn = set_chatgpt & set_txgnn
intersection_gemini_txgnn = set_gemini & set_txgnn
intersection_all = set_chatgpt & set_gemini & set_txgnn
def create_wordcloud(intersection):
wordcloud = WordCloud(width=800, height=400, background_color='white',
max_font_size=100, min_font_size=10).generate(' '.join(intersection))
plt.figure(figsize=(10, 5))
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off')
plt.show()create_wordcloud(intersection_chatgpt_gemini)create_wordcloud(intersection_chatgpt_txgnn)create_wordcloud(intersection_gemini_txgnn)Consideramos interesante contrastar las respuestas de ChatGPT con otro desorden, en este caso la Leucodistrofia. Utilizamos los mismos prompts metodología, reemplazando Alzheimer por Leukodistrophy.
df_leuko = pd.DataFrame()
directory = "Leukodystrophy"
json_files = [f for f in os.listdir(directory) if f.endswith('.json')]
for file in json_files:
file_path = os.path.join(directory, file)
with open(file_path, 'r') as f:
data = json.load(f)
df_leuko = pd.concat([df_leuko, pd.json_normalize(data)], ignore_index=True)
df_leuko.head(10)| Drug | Disease | |
|---|---|---|
| 0 | Minocycline | Bacterial Infections |
| 1 | Simvastatin | Hypercholesterolemia |
| 2 | N-Acetylcysteine | Acetaminophen Overdose |
| 3 | Metformin | Type 2 Diabetes |
| 4 | Valproic Acid | Epilepsy |
| 5 | Erythropoietin | Anemia |
| 6 | Pyrimethamine | Malaria |
| 7 | Cladribine | Multiple Sclerosis |
| 8 | Fingolimod | Multiple Sclerosis |
| 9 | Dexamethasone | Inflammatory Disorders |
df_leuko.describe()| Drug | Disease | |
|---|---|---|
| count | 80 | 80 |
| unique | 52 | 63 |
| top | Metformin | Hypercholesterolemia |
| freq | 4 | 5 |
set_leuko = set(df_leuko['Drug'])
intersection_ad_leuko = len(set_chatgpt & set_leuko)
intersections = Counter({
'Alzheimer y Leukodystrophy': intersection_ad_leuko
})
labels = list(intersections.keys())
values = list(intersections.values())
plt.figure(figsize=(5,5))
plt.bar(labels, values)
plt.title('Número de medicamentos compartidos entre las enfermedades')
plt.xlabel('Intersecciones')
plt.ylabel('Cantidad de medicamentos compartidos')
plt.xticks(rotation=45)
plt.show()intersection_ad_leuko = set_chatgpt & set_leuko
create_wordcloud(intersection_ad_leuko)df_filtrado = df_leuko[(df_leuko['Drug'].isin(intersection_ad_leuko))]
df_filtrado.drop_duplicates()| Drug | Disease | |
|---|---|---|
| 0 | Minocycline | Bacterial Infections |
| 1 | Simvastatin | Hypercholesterolemia |
| 3 | Metformin | Type 2 Diabetes |
| 4 | Valproic Acid | Epilepsy |
| 10 | Itraconazole | Fungal Infections |
| 12 | Riluzole | Amyotrophic Lateral Sclerosis (ALS) |
| 17 | Hydroxychloroquine | Malaria and Autoimmune Disorders |
| 19 | Atorvastatin | Hypercholesterolemia |
| 21 | Metformin | Type 2 diabetes |
| 23 | Hydroxychloroquine | Malaria and autoimmune diseases |
| 29 | Riluzole | Amyotrophic lateral sclerosis |
| 48 | Sildenafil | Erectile Dysfunction and Pulmonary Hypertension |
| 49 | Valproic Acid | Epilepsy and Bipolar Disorder |
| 59 | Propranolol | Hypertension and Anxiety |
| 69 | Riluzole | Amyotrophic Lateral Sclerosis |
| 72 | Lithium | Bipolar Disorder |
| 79 | Nimodipine | Subarachnoid Hemorrhage |