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
- Carrega un dataset QSAR i calcula la correlació entre cada descriptor i l'activitat. Quins descriptors són més rellevants?
- Prova diferents percentatges de divisió train/test (70/30, 80/20, 90/10) i compara els R² obtinguts.
- 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.