DFA去趋势波动分析 实例 python

数据来源:

PhysioBank ATM

DFA去趋势波动分析 实例 python_第1张图片

下面资源还在审核的话,就用上面的链接下载

MIT- BIH 正常窦性心律数据 nsrdb-16265

针对数据ECG1和ECG2进行DFA分析。

DFA去趋势波动分析 实例 python_第2张图片

红色为ECG1基于DFA的线性拟合

蓝色为ECG2基于DFA的线性拟合

 

需要注意如下:

1. 数据以对数曲线表示。

2. 这里时间长time=3 间隔s=0.03 数据长度只取到3000 为了避免错误,请确保【数据长度>=10^time】

3. 可以基于FDA继续算ECG1和ECG2的DCCA

4. 拟合是线性的,可根据自己数据情况考虑更换二次(比如金融数据)及以上。具体方法:DFA的第三个参数:线性=1,二次=2,以此类推

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

def DFA(data,ni,fittime):
    n = len(data)//ni
    nf = int(n*ni)

    n_mean =np.mean(data[:nf])
    y = []
    y_hat = []
    for i in range(nf):
        y.append(np.sum(data[:i+1]-n_mean))
    for i in range(int(n)):
        x = np.arange(1,ni+1,1)
        y_temp = y[int(i*ni+1)-1:int((i+1)*ni)]
        coef = np.polyfit(x,y_temp,deg=fittime)
        y_hat.append(np.polyval(coef,x))
    fn = np.sqrt(sum((np.asarray(y)-np.asarray(y_hat).reshape(-1))**2)/nf)
    return fn

df = pd.read_csv('nsrdb-16265.csv')
ECG = df['ECG1'].values[:3000]

time = 3
s = 0.03
t = np.arange(1,time,s)
n = []
for i in range(len(t)):
    n.append(int(10**t[i]))
f = []
for i in range(len(n)):
    f.append(DFA(ECG,n[i],1))
coef = np.polyfit(np.log10(n),np.log10(f),1)
y_hat = np.polyval(coef,np.log10(n))
for i in range(len(n)):
    y_hat[i] = 10**y_hat[i]

plt.plot(n,y_hat,c='r')
plt.xlabel('n')
plt.ylabel('F(n)')
plt.xscale('log')
plt.yscale('log')

ECG2 = df['ECG2'].values[:3000]

f2 = []
for i in range(len(n)):
    f2.append(DFA(ECG2,n[i],1))
coef2 = np.polyfit(np.log10(n),np.log10(f2),1)
y2_hat = np.polyval(coef2,np.log10(n))
for i in range(len(n)):
    y2_hat[i] = 10**y2_hat[i]
plt.plot(n,f2,'o')
plt.plot(n,y2_hat,'b')



plt.show()

matlab对应代码:DCCA算法matlab代码【因为是收费资源,防止广告,请自行搜索】

你可能感兴趣的:(python,算法)