¿Qué hace scikit-bio?
Descripción general
scikit-bio es una biblioteca completa de Python para trabajar con datos biológicos. Aplica esta habilidad para análisis bioinformáticos que abarcan manipulación de secuencias, alineamiento, filogenética, ecología microbiana y estadística multivariante.
Cuándo usar esta habilidad
Esta habilidad debe usarse cuando el usuario:
- Trabaja con secuencias biológicas (ADN, ARN, proteínas)
- Necesita leer/escribir formatos de archivo biológicos (FASTA, FASTQ, GenBank, Newick, BIOM, etc.)
- Realiza alineamientos de secuencias o búsqueda de motivos
- Construye o analiza árboles filogenéticos
- Calcula métricas de diversidad (diversidad alfa/beta, distancias UniFrac)
- Realiza análisis de ordenación (PCoA, CCA, RDA)
- Ejecuta pruebas estadísticas sobre datos biológicos/ecológicos (PERMANOVA, ANOSIM, Mantel)
- Analiza datos de microbiomas o ecología de comunidades
- Trabaja con embeddings de proteínas de modelos de lenguaje
- Necesita manipular tablas de datos biológicos
Capacidades principales
1. Manipulación de secuencias
Trabaja con secuencias biológicas usando clases especializadas para datos de ADN, ARN y proteínas.
Operaciones clave:
- Leer/escribir secuencias de formatos FASTA, FASTQ, GenBank, EMBL
- Segmentación, concatenación y búsqueda de secuencias
- Complemento inverso, transcripción (ADN→ARN) y traducción (ARN→proteína)
- Encontrar motivos y patrones usando regex
- Calcular distancias (Hamming, basadas en k-mer)
- Manejar puntuaciones de calidad y metadatos de secuencia
Patrones comunes:
import skbio
# Leer secuencias de archivo
seq = skbio.DNA.read('input.fasta')
# Operaciones de secuencia
rc = seq.reverse_complement()
rna = seq.transcribe()
protein = rna.translate()
# Encontrar motivos
motif_positions = seq.find_with_regex('ATG[ACGT]{3}')
# Verificar propiedades
has_degens = seq.has_degenerates()
seq_no_gaps = seq.degap()
Notas importantes:
- Usa las clases
DNA,RNA,Proteinpara secuencias gramaticales con validación - Usa la clase
Sequencepara secuencias genéricas sin restricciones de alfabeto - Las puntuaciones de calidad se cargan automáticamente de archivos FASTQ en metadatos posicionales
- Tipos de metadatos: a nivel de secuencia (ID, descripción), posicional (por base), de intervalo (regiones/características)
2. Alineamiento de secuencias
Realiza alineamientos de secuencias pareados y múltiples usando el motor pair_align (introducido en scikit-bio 0.7.0), un alineador versátil y eficiente de programación dinámica.
Capacidades clave:
- Alineamiento global, local y semi-global (extremos libres configurables) en una sola función
- Envoltorios convenientes
pair_align_nucl(similar a BLASTN) ypair_align_prot(similar a BLASTP) - Puntuación configurable: tupla de coincidencia/discrepancia o matriz de sustitución nombrada; penalizaciones de gap lineales o afines
- Los resultados
PairAlignPathllevan cadenas CIGAR y se convierten en secuencias alineadas - Almacenamiento y manipulación de alineamientos múltiples con
TabularMSA
Patrones comunes:
from skbio import DNA, Protein
from skbio.alignment import pair_align_nucl, pair_align_prot, pair_align, TabularMSA
# Alineamiento de nucleótidos con valores predeterminados similares a BLASTN
seq1, seq2 = DNA('ACTACCAGATTACTTACGGATCAGG'), DNA('CGAAACTACTAGATTACGGATCTTA')
aln = pair_align_nucl(seq1, seq2)
aln.score # puntuación de alineamiento (float)
path = aln.paths[0] # PairAlignPath (repr muestra CIGAR)
aligned_seqs = path.to_aligned((seq1, seq2)) # lista de cadenas con gaps
# Construir un TabularMSA desde la ruta de alineamiento + secuencias originales
msa = TabularMSA.from_path_seqs(path, (seq1, seq2))
# Personalizar el algoritmo mediante pair_align (mode='global' por defecto)
aln = pair_align(seq1, seq2, mode='local') # Smith-Waterman
aln = pair_align(seq1, seq2, sub_score=(2, -3), gap_cost=(5, 2)) # gaps afines
aln = pair_align(seq1, seq2, sub_score='NUC.4.4', gap_cost=3) # matriz de sustitución, gap lineal
# Alineamiento de proteínas (similar a BLASTP, BLOSUM62)
aln = pair_align_prot(Protein('HEAGAWGHEE'), Protein('PAWHEAE'))
# Leer un alineamiento múltiple de archivo y resumir
msa = TabularMSA.read('alignment.fasta', constructor=DNA)
consensus = msa.consensus()
Notas importantes:
pair_alignreemplaza el envoltorio SSW eliminado (local_pairwise_align_ssw,StripedSmithWaterman) y los alineadores Python puros obsoletos (global_pairwise_align,local_pairwise_align_nucleotide, etc.)- El resultado es un
PairAlignResultque también se desempaqueta comoscore, paths, matrices(usakeep_matrices=Truepara retener la matriz DP) sub_scoreacepta una tupla(match, mismatch)o un nombre de matriz (por ejemplo,'NUC.4.4','BLOSUM62');gap_costacepta un solo número (lineal) o una tupla(open, extend)(afín)- Analiza cadenas CIGAR externas con
PairAlignPath.from_cigar('1I8M2D5M2I'); puntúa un alineamiento existente conalign_score(...)y construye una matriz de distancias desde un MSA conalign_dists(...)
3. Árboles filogenéticos
Construye, manipula y analiza árboles filogenéticos que representan relaciones evolutivas.
Capacidades clave:
- Construcción de árboles a partir de matrices de distancias (UPGMA/WPGMA, Neighbor Joining, GME, BME)
- Reordenamiento de árboles con intercambio de vecinos más cercanos (
nni) - Manipulación de árboles (poda, reenraizamiento, recorrido)
- Cálculos de distancias (patrística mediante
cophenet, Robinson-Foulds mediantecompare_rfd) - Visualización ASCII
- E/S de formato Newick
Patrones comunes:
from skbio import TreeNode
from skbio.tree import nj, upgma, gme, bme, rf_dists
# Leer árbol de archivo
tree = TreeNode.read('tree.nwk')
# Construir árbol a partir de matriz de distancias
tree = nj(distance_matrix)
# Operaciones con árboles
subtree = tree.shear(['taxon1', 'taxon2', 'taxon3'])
tips = [node for node in tree.tips()]
lca = tree.lca(['taxon1', 'taxon2'])
# Calcular distancias
patristic_dist = tree.find('taxon1').distance(tree.find('taxon2'))
cophenetic_dm = tree.cophenet() # matriz de distancia patrística entre puntas
# Comparar dos árboles (Robinson-Foulds)
rf_distance = tree.compare_rfd(other_tree)
# Distancias RF pareadas entre muchos árboles -> DistanceMatrix
rf_dm = rf_dists([tree, other_tree, third_tree])
Notas importantes:
- Usa
nj()para neighbor joining (método filogenético clásico) - Usa
upgma()para UPGMA/WPGMA (asume reloj molecular) - GME y BME son altamente escalables para árboles grandes; refina la topología con
nni() cophenet()(anteriormentetip_tip_distances) devuelve la matriz de distancia patrística;compare_rfd()es el método Robinson-Foulds (compare_wrfd/compare_cophenetpara variantes ponderadas/cophenéticas)lca()es el ancestro común más bajo;lowest_common_ancestorsigue siendo un alias- Los árboles pueden tener raíz o no; algunas métricas requieren raíz específica
4. Análisis de diversidad
Calcula métricas de diversidad alfa y beta para ecología microbiana y análisis de comunidades.
Capacidades clave:
- Diversidad alfa: riqueza (
sobs,observed_features,chao1,ace), Shannon, Simpson, números de Hill (hill), PD de Faith (faith_pd), PD generalizada (phydiv), uniformidad de Pielou - Diversidad beta: Bray-Curtis, Jaccard, UniFrac ponderado/no ponderado, distancias Euclidianas
- Métricas de diversidad filogenética (requieren entrada de árbol)
- Rarefacción y submuestreo
- Integración con ordenación y pruebas estadísticas
Patrones comunes:
from skbio.diversity import alpha_diversity, beta_diversity
# Diversidad alfa (las métricas filogenéticas toman taxa= para mapear nombres de puntas)
alpha = alpha_diversity('shannon', counts_matrix, ids=sample_ids)
faith_pd = alpha_diversity('faith_pd', counts_matrix, ids=sample_ids,
tree=tree, taxa=feature_ids)
# Diversidad beta
bc_dm = beta_diversity('braycurtis', counts_matrix, ids=sample_ids)
unifrac_dm = beta_diversity('unweighted_unifrac', counts_matrix,
ids=sample_ids, tree=tree, taxa=feature_ids)
# Obtener métricas disponibles
from skbio.diversity import get_alpha_diversity_metrics
print(get_alpha_diversity_metrics())
Notas importantes:
- Los conteos deben ser enteros que representan abundancias, no frecuencias relativas
- El argumento de métrica filogenética es
taxa=(renombrado deotu_idsen 0.6.0; el nombre antiguo es un alias obsoleto);observed_otusahora esobserved_features(osobs) counts_matrixpuede ser cualquier entrada similar a una tabla (array NumPy, DataFrame de pandas/polars, tabla BIOM o AnnData) a través del sistema de despacho- Las métricas filogenéticas (PD de Faith, UniFrac) requieren árbol y mapeo de taxones a puntas
- Usa
partial_beta_diversity()para pares de muestras específicos, oblock_beta_diversity()para cálculos grandes descompuestos en bloques - La diversidad alfa devuelve un
pandas.Series, la diversidad beta devuelve unaDistanceMatrix
5. Métodos de ordenación
Reduce datos biológicos de alta dimensión a espacios de menor dimensión visualizables.
Capacidades clave:
- PCoA (Análisis de Coordenadas Principales) a partir de matrices de distancias
- CA (Análisis de Correspondencias) para tablas de contingencia
- CCA (Análisis de Correspondencias Canónico) con restricciones ambientales
- RDA (Análisis de Redundancia) para relaciones lineales
- Proyección Biplot para interpretación de características
Patrones comunes:
from skbio.stats.ordination import pcoa, cca
import skbio
# PCoA desde matriz de distancias (limitar dimensiones para matrices grandes)
pcoa_results = pcoa(distance_matrix, dimensions=3)
pc1 = pcoa_results.samples['PC1']
pc2 = pcoa_results.samples['PC2']
# Gráfico de dispersión integrado coloreado por columna de metadatos
fig = pcoa_results.plot(sample_metadata, column='bodysite')
# CCA con variables ambientales
cca_results = cca(species_matrix, environmental_matrix)
# Guardar/cargar resultados de ordenación
pcoa_results.write('ordination.txt')
results = skbio.OrdinationResults.read('ordination.txt')
Notas importantes:
- PCoA funciona con cualquier matriz de distancia/disimilitud; pasa
dimensionscomo un entero (recuento) o un flotante en (0, 1] (fracción de varianza acumulada a retener) OrdinationResultsexpone atributos basados en pandas:samples,features,eigvals,proportion_explained,biplot_scores,sample_constraints- CCA revela los impulsores ambientales de la composición de la comunidad
OrdinationResults.plot()produce una figura matplotlib; los resultados también se integran con seaborn/plotly
6. Pruebas estadísticas
Realiza pruebas de hipótesis específicas para datos ecológicos y biológicos.
Capacidades clave:
- PERMANOVA: prueba diferencias grupales usando matrices de distancias
- ANOSIM: prueba alternativa para diferencias grupales
- PERMDISP: prueba homogeneidad de dispersiones grupales
- Prueba de Mantel: correlación entre matrices de distancias
- Bioenv: encuentra variables ambientales correlacionadas con distancias
- Abundancia diferencial:
ancom,dirmult_ttestydirmult_lme(efectos mixtos longitudinales) enskbio.stats.composition
Patrones comunes:
from skbio.stats.distance import permanova, anosim, mantel
# Probar si los grupos difieren significativamente
permanova_results = permanova(distance_matrix, grouping, permutations=999)
print(f"valor p: {permanova_results['p-value']}")
# Prueba ANOSIM
anosim_results = anosim(distance_matrix, grouping, permutations=999)
# Prueba de Mantel entre dos matrices de distancias
mantel_results = mantel(dm1, dm2, method='pearson', permutations=999)
print(f"Correlación: {mantel_results[0]}, valor p: {mantel_results[1]}")
# Abundancia diferencial en una tabla de características (se recomiendan conteos brutos)
from skbio.stats.composition import dirmult_ttest
da = dirmult_ttest(counts_table, grouping, treatment='caseA', reference='control')
Notas importantes:
- Las pruebas de permutación proporcionan pruebas de significancia no paramétricas
- Usa 999+ permutaciones para valores p robustos
- PERMANOVA es sensible a diferencias de dispersión; combínalo con PERMDISP
- Las pruebas de Mantel evalúan la correlación de matrices (por ejemplo, distancia geográfica vs genética)
- Proporciona pruebas de abundancia diferencial con conteos brutos, no proporciones pre-normalizadas, para preservar la información de magnitud
7. E/S de archivos y conversión de formatos
Lee y escribe 19+ formatos de archivo biológicos con detección automática de formato.
Formatos compatibles:
- Secuencias: FASTA, FASTQ, GenBank, EMBL, QSeq
- Alineamientos: Clustal, PHYLIP, Stockholm
- Árboles: Newick
- Tablas: BIOM (HDF5 y JSON)
- Distancias: matrices cuadradas delimitadas
- Análisis: BLAST+6/7, GFF3, resultados de ordenación
- Metadatos: TSV/CSV con validación
Patrones comunes:
import skbio
# Leer con detección automática de formato
seq = skbio.DNA.read('file.fasta', format='fasta')
tree = skbio.TreeNode.read('tree.nwk')
# Escribir a archivo
seq.write('output.fasta', format='fasta')
# Generador para archivos grandes (eficiente en memoria)
for seq in skbio.io.read('large.fasta', format='fasta', constructor=skbio.DNA):
process(seq)
# Convertir formatos
seqs = list(skbio.io.read('input.fastq', format='fastq', constructor=skbio.DNA))
skbio.io.write(seqs, format='fasta', into='output.fasta')
Notas importantes:
- Usa generadores para archivos grandes para evitar problemas de memoria
- El formato se puede detectar automáticamente cuando se especifica el parámetro
into - Algunos objetos se pueden escribir en múltiples formatos
- Soporte para pipes de stdin/stdout con
verify=False
8. Matrices de distancias
Crea y manipula matrices de distancia/disimilitud con métodos estadísticos.
Capacidades clave:
- Almacenar datos simétricos (
DistanceMatrix, diagonal hueca) o pareados generales (PairwiseMatrix) - Indexación y segmentación basada en IDs
- Integración con diversidad, ordenación y pruebas estadísticas
- Leer/escribir formato de texto delimitado
Patrones comunes:
from skbio import DistanceMatrix
import numpy as np
# Crear desde array
data = np.array([[0, 1, 2], [1, 0, 3], [2, 3, 0]])
dm = DistanceMatrix(data, ids=['A', 'B', 'C'])
# Acceder a distancias
dist_ab = dm['A', 'B']
row_a = dm['A']
# Leer de archivo
dm = DistanceMatrix.read('distances.txt')
# Usar en análisis posteriores
pcoa_results = pcoa(dm)
permanova_results = permanova(dm, grouping)
Notas importantes:
DistanceMatriximpone simetría y una diagonal cero (hueca); es una subclase deSymmetricMatrixPairwiseMatrix(renombrado deDissimilarityMatrix, que se mantiene como alias obsoleto) permite valores generales/asimétricos- Los IDs permiten la integración con metadatos y conocimiento biológico
9. Tablas BIOM
Lee, escribe y manipula tablas de características biológicas en formato BIOM.
Operaciones clave:
- Leer tablas BIOM (HDF5 y JSON)
- Agregar/eliminar observaciones (características) y muestras
- Filtrar y subconfigurar
- Calcular métricas de resumen (frecuencias, densidades, número de observaciones)
- Convertir entre representaciones densas y dispersas
- Soporte para integración con pandas y polars
Patrones comunes:
from skbio import BiomTable
# Leer tabla BIOM
table = BiomTable.read('feature-table.biom')
# Resumen básico
print(table.summary())
# Longitud total de observaciones, número de observaciones, etc.
# Filtrar por frecuencia de observación
filtered = table.filter(lambda v, id_, md: v.sum() > 10, axis='observation')
# Convertir a/desde DataFrame de pandas
df = table.to_dataframe()
table2 = BiomTable.from_dataframe(df)
# Subconjunto por IDs de muestra
samples_subset = table.subset_samples_by_ids(['S1', 'S2', 'S3'])
Notas importantes:
- El formato BIOM (HDF5) es la representación de tabla estándar en microbioma
- El formato BIOM JSON es legible por humanos pero menos eficiente para archivos grandes
- Las tablas BIOM pueden contener metadatos enriquecidos: taxonomía de características, información de muestras
BiomTableproporciona acceso rápido a través de numpy/pandas, maneja matrices dispersas
Integración con formatos de datos
scikit-bio funciona sin problemas con todo el ecosistema científico de Python.
Integraciones compatibles:
- NumPy: arrays para matrices de conteo, matrices de distancias
- pandas: DataFrames para metadatos de muestras, resultados de diversidad
- polars: soporte alternativo de DataFrame para conjuntos de datos grandes
- BIOM: formato estándar de microbioma con
read()/write() - AnnData: integración con scanpy/single-cell (a través del sistema de despacho)
- matplotlib/plotly: visualización de resultados de ordenación y diversidad
Ejemplos de integración:
import pandas as pd
import skbio
# Metadatos de muestras desde pandas
metadata = pd.read_csv('sample_metadata.tsv', sep='\t', index_col=0)
# Usar con análisis scikit-bio
pcoa_results = pcoa(distance_matrix)
fig = pcoa_results.plot(metadata, column='treatment')
# Tabla BIOM a/desde DataFrame
import skbio
from skbio import BiomTable
biom_table = BiomTable.from_dataframe(df)
Instalación
scikit-bio se instala fácilmente con pip o conda. El paquete se publica en PyPI y Anaconda Cloud.
Nota de instalación para usuarios de esta habilidad:
# Instalar desde PyPI
pip install scikit-bio
# Instalar desde conda
conda install -c conda-forge scikit-bio
Soporte de versión
Esta habilidad soporta scikit-bio 0.6.x y 0.7.x. Las características de la versión 0.7.0 (pair_align, pair_align_nucl/prot, etc.) se documentan donde son relevantes.
Notas importantes
- Todos los conteos deben ser enteros no negativos que representan abundancias, no frecuencias relativas ni transformaciones
- Para datos de abundancia diferencial, los valores p pueden requerir corrección por comparaciones múltiples
- Las métricas de diversidad basadas en filogenia requieren un árbol con puntas que coincidan con los nombres de las características
- Los análisis de ordenación pueden consumir mucha memoria para conjuntos de datos grandes; considera usar
dimensionso submuestreo - Las pruebas de permutación (PERMANOVA, ANOSIM) proporcionan valores p no paramétricos; valores semilla reproducibles pueden establecerse con
np.random.seed() - Para grandes FASTA/FASTQ, usa patrones de iterador en lugar de cargar todos los registros en la memoria
- Esta habilidad asume que scikit-bio está instalado con todas las dependencias opcionales (polars, h5py) para máxima funcionalidad
Referencias
- Documentación oficial: https://scikit.bio
- Documentos fuente de scikit-bio
- Equipo de desarrollo del Laboratorio Knight y colaboradores