DFA去趋势波动分析 实例 python

数据来源:

PhysioBank ATM

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

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

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

红色为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代码【因为是收费资源,防止广告,请自行搜索】

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值