Python

Tema 8 · QSAR – Relacions Quantitatives Estructura-Activitat

Introducció

QSAR (Quantitative Structure-Activity Relationship) és una metodologia que relaciona les propietats estructurals d'una molècula (descriptors) amb la seva activitat biològica. Mitjançant tècniques estadístiques i d'aprenentatge automàtic, es poden construir models que prediguin l'activitat de nous compostos. Amb Python, utilitzarem scikit-learn per implementar models QSAR senzills.

Objectius

  • Preparar un conjunt de dades amb descriptors (X) i activitat biològica (y)
  • Dividir les dades en entrenament i test
  • Ajustar un model de regressió lineal simple i múltiple
  • Avaluar el model amb mètriques (R², RMSE) i visualitzar-ne els resultats

Preparació de dades QSAR

Carreguem un dataset de molècules amb descriptors i activitat (IC50, pIC50):

import pandas as pd
import numpy as np

# Exemple de dataset: descriptors + activitat
df = pd.read_csv("qsar_dataset.csv")
print(df.head())

# Convertir IC50 (nM) a pIC50 (-log10(IC50 en M))
df['pIC50'] = -np.log10(df['IC50_nM'] * 1e-9)

# Seleccionar descriptors (X) i activitat (y)
X = df[['MW', 'LogP', 'HBD', 'HBA', 'ROTB', 'TPSA']]
y = df['pIC50']

print(f"Dades: {len(df)} molècules, {X.shape[1]} descriptors")

Model de regressió lineal

Construcció i avaluació d'un model QSAR amb scikit-learn:

from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score, mean_squared_error

# Dividir entrenament (80%) i test (20%)
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42
)

# Crear i entrenar el model
model = LinearRegression()
model.fit(X_train, y_train)

# Predir
y_pred = model.predict(X_test)

# Avaluar
r2 = r2_score(y_test, y_pred)
rmse = np.sqrt(mean_squared_error(y_test, y_pred))

print(f"R² = {r2:.3f}")
print(f"RMSE = {rmse:.3f}")

# Coeficients (importància dels descriptors)
coef = pd.Series(model.coef_, index=X.columns)
print("\nContribució de cada descriptor:")
print(coef.sort_values(ascending=False))

Visualització de resultats

import matplotlib.pyplot as plt

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))

# Predicció vs observat
ax1.scatter(y_test, y_pred, alpha=0.6, edgecolors='black')
ax1.plot([y.min(), y.max()], [y.min(), y.max()], 'r--', lw=2)
ax1.set_xlabel('pIC50 observat')
ax1.set_ylabel('pIC50 predit')
ax1.set_title(f'Predicció vs Observat (R²={r2:.3f})')

# Residus
residuals = y_test - y_pred
ax2.scatter(y_pred, residuals, alpha=0.6, edgecolors='black')
ax2.axhline(0, color='red', linestyle='--')
ax2.set_xlabel('pIC50 predit')
ax2.set_ylabel('Residus')
ax2.set_title('Gràfic de residus')

plt.tight_layout()
plt.savefig('qsar_results.png', dpi=150)
plt.show()

Exercicis

  1. Carrega un dataset QSAR i calcula la correlació entre cada descriptor i l'activitat. Quins descriptors són més rellevants?
  2. Prova diferents percentatges de divisió train/test (70/30, 80/20, 90/10) i compara els R² obtinguts.
  3. Afegeix descriptors nous (per exemple, nombre d'anells aromàtics) i comprova si millora el model.

Mini Projecte – Model QSAR per a inhibidors de COX-2

Construeix un model QSAR complet:

  • Utilitza un dataset públic (ChEMBL) d'inhibidors de COX-2 amb activitat IC50.
  • Calcula descriptors moleculars amb RDKit (MW, LogP, HBA, HBD, TPSA, ROTB).
  • Divideix les dades en entrenament (80%) i test (20%).
  • Entrena un model de regressió lineal i mostra les mètriques (R², RMSE).
  • Genera un gràfic de predicció vs observat i un de residus.
  • Exporta un fitxer CSV amb els valors observats, predits i residus.

Pista: assegura't que no hi hagi valors nuls abans d'entrenar.