import pandas as pd
import numpy as np
import os
from matplotlib import pyplot as plt
from scipy.stats import levene, stats
# 获取所有的文件夹名字
subID_list = []
for subID in os.listdir('data/rpData'):
subID_list.append(subID)
# 计算每个被试FD_Power平均值
AVG = {}
# 提取出需要的数据
for subID in subID_list:
txt = open("data/rpData/" + subID + "/FD_Power_" + subID + ".txt", encoding="utf-8")
FD_Power = txt.readlines()
FD_Power_new = []
# 字符串处理与转化
for i in FD_Power:
i = i.strip()
i_new = float(i)
FD_Power_new.append(i_new)
avg = np.mean(FD_Power_new)
AVG[subID] = avg
print(AVG)
# 读取csv,标记年轻组与老年组
SubInfor = pd.read_excel('data/SubInfor.xlsx')
Young_list = []
Old_list = []
for row in SubInfor.itertuples():
# 例子:Pandas(Index=0, SubID='sub-032302', Gender=1, Age=20, Group=1, Group1='Young', STAI_Trait_Anxiety=49)
if row[4] == 1:
Young_list.append(row[1])
else:
Old_list.append(row[1])
# 根据AVG和中老年SubID,分别提取不同年龄段的平均FD_Power
young_FD_power = []
for young_sub in Young_list:
young_FD_power.append(AVG[young_sub])
print(young_FD_power)
old_FD_power = []
for old_sub in Old_list:
old_FD_power.append(AVG[old_sub])
print(old_FD_power)
# Levene检验 (方差齐性检验)
stat, p = levene(young_FD_power, old_FD_power)
print('方差齐性检验结果:F值为:' + str(stat) + 'p值为:' + str(p))
# 方差齐性检验结果:F值为:15.85966785307698p值为:0.0001109705264578573
# 其中p<0.05 说明young和old存在差异
# 检查是否为正态分布
u1 = np.mean(young_FD_power) # 计算均值
std1 = np.std(young_FD_power) # 计算标准差
print(stats.kstest(young_FD_power, 'norm', (u1, std1)))
# KstestResult(statistic=0.05228502209126418, pvalue=0.9495551314528264)
u2 = np.mean(old_FD_power) # 计算均值
std2 = np.std(old_FD_power) # 计算标准差
print(stats.kstest(old_FD_power, 'norm', (u2, std2)))
# KstestResult(statistic=0.11096369710137988, pvalue=0.6110574979367929)
# p值均>0.05 满足正态分布 可以进行t检验
# t检验
print(stats.ttest_ind(young_FD_power, old_FD_power))
# Ttest_indResult(statistic=-11.105620650834894, pvalue=9.295974550206417e-21)
# p值<0.05 说明存在差异
# 绘制箱线图
data = pd.concat(
[pd.DataFrame({"Young": young_FD_power}),
pd.DataFrame({"Old": old_FD_power})], axis=1)
data.boxplot()
plt.title("YO_boxplot")
plt.savefig("YO_boxplot.png")
plt.show()
# 计算相关性
# 由于本题中,提取列表时和读取excel时都是按照subID升序读取的,所以得分和头动值一一对应
STAI_Trait_Anxiety = []
for row in SubInfor.itertuples():
STAI_Trait_Anxiety.append(row[6])
print(STAI_Trait_Anxiety)
avg = list(AVG.values())
print(avg)
data2 = pd.concat(
[pd.DataFrame({"STAI_Trait_Anxiety": STAI_Trait_Anxiety}),
pd.DataFrame({"avg": avg})], axis=1)
corr = data2.corr().values[0][1]
print(corr)
plt.xlabel('STAI_Trait_Anxiety')
plt.ylabel('FD_Power')
plt.scatter(STAI_Trait_Anxiety, avg, alpha=0.4)
plt.title('FD_STAIT = ' + str(corr))
plt.savefig('FD_STAIT.png')
plt.show()
前面数据处理部分可以掠过,主要看后面的代码就可以。