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.

チ ー ズ パ
fonte
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)
R Kiselev
fonte
Ó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.

M529
fonte
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]
Entusiasta
fonte
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

Laurent Duval
fonte