¿Cómo realizar una corrección con banda elástica en datos espectroscópicos?

8

Básicamente entendí cómo funciona la corrección Rubberband / Baseline.

  1. El espectro dado se divide en rangos (N).
  2. Se determinan los puntos más bajos en cada rango.
  3. La línea de base inicial se construye a partir de esos puntos.
  4. Ahora todos los puntos en el espectro se dibujan por la diferencia entre el punto más bajo en el rango actual y el punto más bajo en la línea de base.

Sin embargo, hay algunos matices que no sé cómo manejar. Por ejemplo, ¿qué pasa si uno de los puntos está exactamente en el borde entre dos rangos, etc.

Además, tengo que poder demostrar que el algoritmo que estoy escribiendo es sólido y puede ser referenciado por otros trabajos o artículos científicos.

Si alguien pudiera darme alguna referencia, estaría muy complacido.

チ ー ズ パ ン
fuente
O tal vez alguien conoce una forma mejor o similar de detectar y corregir una línea de base.
チ ー ズ パ ン

Respuestas:

6

Esto se puede hacer fácilmente en Ro Python. Hay funciones bien probadas disponibles, por lo que no tiene que preocuparse por los límites o matices. Además, ambos son gratuitos y populares entre los científicos.

Solución para R

Hay un paquete especial para manejar datos espectrales, llamado hyperSpec . La corrección de la línea base de la banda elástica ya está implementada allí (función spc.rubberband). Todos los detalles están resaltados en la documentación. El uso es bastante simple:

require(hyperSpec)
spc <- read.spe("paracetamol.SPE")
baseline <- spc.rubberband(spc)

corrected <- spc - baseline

ingrese la descripción de la imagen aquí

Solución para Python

No existe (según mi leal saber y entender) una solución lista para usar para python, pero puede usar la scipy.spatial.ConvexHullfunción para encontrar índices de todos los puntos que forman un casco convexo alrededor de su espectro. Supongamos que el espectro está contenido xy las ymatrices:

import numpy as np
from scipy.spatial import ConvexHull

def rubberband(x, y):
    # Find the convex hull
    v = ConvexHull(np.array(zip(x, y))).vertices

La matriz vcontiene índices de los puntos de vértice, dispuestos en la dirección CCW, por ejemplo [892, 125, 93, 0, 4, 89, 701, 1023]. Tenemos que extraer la parte donde vestá ascendiendo, por ejemplo, 0-1023.

    # Rotate convex hull vertices until they start from the lowest one
    v = np.roll(v, -v.argmin())
    # Leave only the ascending part
    v = v[:v.argmax()]

    # Create baseline using linear interpolation between vertices
    return np.interp(x, x[v], y[v])

Ahora la línea de base se corrige así:

y = y - rubberband(x, y)
R Kiselev
fuente
¡Buena respuesta, y bilingüe también! :-)
Peter K.
1

Puede haber muchas técnicas. Tu idea me parece buena.

Otras dos ideas:

  1. Haga una FFT de sus datos y filtre las frecuencias más bajas. Esto también elimina las modulaciones de línea de base. Ciertamente, debe encontrar el ancho de filtro correcto a mano o de una suposición educada de los datos.

  2. Utilice las funciones de coseno con múltiples longitudes de onda largas y realice un ajuste lineal a sus datos. También puede lanzar los picos a través de un filtro simple o ponderando los puntos de datos con su intensidad de señal.

M529
fuente
1

Solución en python usando el algoritmo Modpoly e Imodpoly.

Biblioteca de Python para corrección / eliminación de línea de base. Tiene el algoritmo Modpoly e IModploy que puede devolver resultados corregidos de línea de base cuando ingresa los valores originales como una lista de Python o series de pandas y especifica el grado polinómico. Instalar la biblioteca como pip install BaselineRemoval. Debajo hay un ejemplo

from BaselineRemoval import BaselineRemoval    
input_array=[10,20,1.5,5,2,9,99,25,47]
polynomial_degree=2

baseObj=BaselineRemoval(input_array,polynomial_degree)
Modpoly_output=baseObj.ModPoly()
Imodpoly_output=baseObj.IModPoly()

print('Original input:',input_array)
print('Modpoly base corrected values:',Modpoly_output)
print('IModPoly base corrected values:',Imodpoly_output)

Original input: [10, 20, 1.5, 5, 2, 9, 99, 25, 47]
Modpoly output: [-1.98455800e-04  1.61793368e+01  1.08455179e+00  5.21544654e+00
  7.20210508e-02  2.15427531e+00  8.44622093e+01 -4.17691125e-03
  8.75511661e+00]
Imodpoly output: [-0.84912125 15.13786196 -0.11351367  3.89675187 -1.33134142  0.70220645
 82.99739548 -1.44577432  7.37269705]
Entusiasta
fuente
0

[EDITAR 2018/03/24] Desde la respuesta, se han registrado varios usos en datos espectrales

Si sus picos espectrales son relativamente finos, y casi positivos por encima de una línea de base con un comportamiento más de baja frecuencia, sugiero probar BEADS (Estimación y Denoising de línea de base con dispersión ) , un algoritmo basado en la escasez de datos y Algunos de sus derivados. Funciona bien con datos cromatográficos. El código de Matlab está disponible , y la página BEADS reúne códigos R o C ++ y usos conocidos . Aquí puede encontrar usos para espectros Raman, espectro astronómico de galaxia hiperespectral, espectroscopía de absorción de rayos X (XAS), difracción de rayos X (XRD) y mediciones combinadas de XAS / XRD.

Cromatografía con línea base simulada

Línea de base y ruido corregido

Laurent Duval
fuente