Como executar uma correção de borracha em dados espectroscópicos?


8

Eu basicamente entendi como funciona a correção Rubberband / Baseline.

  1. O espectro fornecido é dividido em faixas (N).
  2. Os pontos mais baixos em cada intervalo são determinados.
  3. A linha de base inicial é construída a partir desses pontos.
  4. Agora todos os pontos do espectro são reduzidos pela diferença entre o ponto mais baixo na faixa atual e o ponto mais baixo na linha de base.

Existem algumas nuances, porém, que eu não sei como lidar. Por exemplo, e se um dos pontos estiver exatamente na borda entre dois intervalos, etc.

Além disso, tenho que poder provar que o algoritmo que estou escrevendo é sólido e pode ser referenciado por outros trabalhos ou artigos científicos.

Se alguém pudesse me dar alguma referência, eu ficaria muito satisfeito.


Ou talvez alguém conheça uma maneira melhor ou semelhante de detectar e corrigir uma linha de base.
31512

Respostas:


6

Isso pode ser feito facilmente em Rou Python. Existem funções bem testadas disponíveis, para que você não precise se preocupar com limites ou nuances. Além disso, ambos são gratuitos e populares entre os cientistas.

Solução para R

Há um pacote especial para lidar com dados espectrais, chamado hyperSpec . A correção da linha de base do elástico já está implementada lá (função spc.rubberband). Todos os detalhes estão destacados na documentação. O uso é bem simples:

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

corrected <- spc - baseline

insira a descrição da imagem aqui

Solução para Python

Não existe (de acordo com o meu conhecimento) uma solução pronta para uso para python, mas você pode usar a scipy.spatial.ConvexHullfunção para encontrar índices de todos os pontos que formam um casco convexo em torno de seu espectro. Suponha que o espectro esteja contido em xe ymatrizes:

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

A matriz vcontém índices dos pontos do vértice, dispostos na direção anti-horário, por exemplo [892, 125, 93, 0, 4, 89, 701, 1023]. Temos que extrair parte de onde vestá subindo, por exemplo, 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])

Agora a linha de base é corrigida assim:

y = y - rubberband(x, y)

Ótima resposta e bilíngue também! :-)
Peter K.

1

Pode haver muitas técnicas. Sua ideia me parece boa.

Duas outras idéias:

  1. Faça uma FFT dos seus dados e filtre as frequências mais baixas. Isso também remove as modulações da linha de base. Certamente, você precisa encontrar a largura correta do filtro manualmente ou a partir de uma estimativa fundamentada dos dados.

  2. Use as funções Cosine com vários comprimentos de onda longos e faça um ajuste linear aos seus dados. Você também pode eliminar os picos através de um filtro simples ou ponderando os pontos de dados com a força do sinal.


1

Solução em python usando os algoritmos Modpoly e Imodpoly.

Biblioteca Python para correção / remoção da linha de base. Possui o algoritmo Modpoly e IModploy, que pode retornar resultados corrigidos da linha de base quando você insere os valores originais como uma lista de python ou séries de pandas e especifica o grau polinomial. Instale a biblioteca como pip install BaselineRemoval. Abaixo está um exemplo

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]

0

[EDIT 2018/03/24] Desde a resposta, vários usos em dados espectrais foram registrados

Se seus picos espectrais são relativamente finos e quase positivos acima de uma linha de base com um comportamento de frequência mais baixa, sugiro que tente o BEADS (Estimativa de linha de base e denoising com escassez) , um algoritmo baseado na escassez de dados e alguns de seus derivados. Funciona bem com dados cromatográficos. O código Matlab está disponível e a página BEADS reúne códigos R ou C ++ e usos conhecidos . Aqui você pode encontrar usos para espectros Raman, espectro astronômico de galáxia hiperespectral, espectroscopia de absorção de raios X (XAS), difração de raios X (XRD) e medições combinadas de XAS / XRD.

Cromatografia com linha de base simulada

Linha de base e ruído corrigidos

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.