Estou fazendo alguma pesquisa, mas fiquei paralisado na fase de análise (deveria ter prestado mais atenção às minhas aulas de estatísticas).
Eu coletei dois sinais simultâneos: vazão integrada para volume e alteração na expansão torácica. Eu gostaria de comparar os sinais e, finalmente, esperar obter volume do sinal de expansão torácica. Mas primeiro tenho que alinhar / sincronizar meus dados.
Como a gravação não inicia exatamente ao mesmo tempo e a expansão do tórax é capturada por períodos mais longos, preciso encontrar os dados que correspondem aos meus dados de volume no conjunto de dados de expansão do tórax e ter uma medida de quão bem eles estão alinhados. Não tenho muita certeza de como fazer isso se os dois sinais não iniciarem exatamente ao mesmo tempo ou entre dados em diferentes escalas e em diferentes resoluções.
Anexei um exemplo dos dois sinais ( https://docs.google.com/spreadsheet/ccc?key=0As4oZTKp4RZ3dFRKaktYWEhZLXlFbFVKNmllbGVXNHc ), informe-me se houver mais alguma coisa que eu possa fornecer.
fonte
Respostas:
A pergunta pergunta como encontrar a quantidade pela qual uma série temporal ("expansão") fica atrasada para outra ("volume") quando a série é amostrada em intervalos regulares, mas diferentes .
Nesse caso, ambas as séries exibem um comportamento razoavelmente contínuo, como as figuras mostrarão. Isso implica (1) pouca ou nenhuma suavização inicial pode ser necessária e (2) a reamostragem pode ser tão simples quanto a interpolação linear ou quadrática. Quadrático pode ser um pouco melhor devido à suavidade. Após a reamostragem, o atraso é encontrado maximizando a correlação cruzada , conforme mostrado no encadeamento. Para duas séries de dados amostrados por offset, qual é a melhor estimativa do offset entre eles? .
Para ilustrar , podemos usar os dados fornecidos na pergunta, empregando
R
o pseudocódigo. Vamos começar com a funcionalidade básica, correlação cruzada e reamostragem:Este é um algoritmo bruto: um cálculo baseado em FFT seria mais rápido. Mas para esses dados (envolvendo cerca de 4000 valores), é bom o suficiente.
Baixei os dados como um arquivo CSV separado por vírgula e retirei o cabeçalho. (O cabeçalho causou alguns problemas para o R que eu não queria diagnosticar.)
NB Esta solução assume que cada série de dados está em ordem temporal, sem lacunas em nenhuma delas. Isso permite usar índices nos valores como proxies para o tempo e escalar esses índices pelas frequências de amostragem temporal para convertê-los em tempos.
Acontece que um ou ambos os instrumentos flutuam um pouco com o tempo. É bom remover essas tendências antes de prosseguir. Além disso, como há um afunilamento do sinal de volume no final, devemos cortá-lo.
Reamostro as séries menos frequentes para obter o máximo de precisão possível no resultado.
Agora a correlação cruzada pode ser calculada - por eficiência, buscamos apenas uma janela razoável de defasagens - e o atraso em que o valor máximo é encontrado pode ser identificado.
A saída nos diz que a expansão diminui o volume em 1,85 segundos. (Se os últimos 3,5 segundos de dados não foram cortados, a saída seria 1,84 segundos.)
É uma boa ideia verificar tudo de várias maneiras, de preferência visualmente. Primeiro, a função de correlação cruzada :
Em seguida, vamos registrar as duas séries no tempo e plotá-las juntas nos mesmos eixos .
Parece muito bom! No entanto, podemos ter uma noção melhor da qualidade do registro com um gráfico de dispersão . Eu vario as cores pelo tempo para mostrar a progressão.
Procuramos os pontos a serem rastreados ao longo de uma linha: variações que refletem não linearidades na resposta com atraso de expansão do volume. Embora existam algumas variações, elas são bem pequenas. No entanto, como essas variações mudam ao longo do tempo pode ter algum interesse fisiológico. O maravilhoso das estatísticas, especialmente seu aspecto exploratório e visual, é como elas tendem a criar boas perguntas e idéias, além de respostas úteis .
fonte
acf
função de R.R
quando postei essa resposta e esqueci de fornecer uma definição para essa função. Aqui está o original:normalize <- function(x) { x.max <- max(x); x.min <- min(x); dx <- x.max - x.min; if (dx==0) dx <- 1; (x-x.min) / dx }