mr_epilepsy_fullrec.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. import os
  2. import pandas as pd
  3. import mrestimator as mre
  4. import numpy as np
  5. import math
  6. import mr_utilities
  7. def mr_analysis_confint(data_path, result_path, outputfilename,
  8. recordings='all', binnings=[], ksteps=(1, 400),
  9. fit_method='offset'):
  10. if recordings == 'all':
  11. recordinglist = [dI for dI in os.listdir(data_path) if
  12. os.path.isdir(os.path.join(data_path, dI))]
  13. else:
  14. recordinglist = recordings
  15. focus_list = '../Data/patients.txt'
  16. f = open(focus_list, 'r')
  17. foci = [line.rstrip('\n').split('\t') for line in f.readlines()]
  18. # -----------------------------------------------------------------------#
  19. # Run through all recordings and binnings and perform MR estimation
  20. # -----------------------------------------------------------------------#
  21. for recording in recordinglist:
  22. outputfile = '{}{}/{}'.format(data_path, recording, outputfilename)
  23. if not os.path.isfile(outputfile):
  24. print("No binning data for recording ", recording)
  25. print(outputfile)
  26. continue
  27. data = pd.read_pickle(outputfile)
  28. patient = int(data['patient'].unique()[0])
  29. # read the location of the focus
  30. focus = 'NA'
  31. for i, idf in enumerate(foci[1:]):
  32. if int(idf[0]) == int(patient):
  33. focus = idf[1]
  34. if focus == 'NA':
  35. print('Error: patient {} not in foci list.'.format(patient))
  36. continue
  37. existing_binnings = data['binning'].tolist()
  38. if not binnings:
  39. binnings = existing_binnings
  40. for binning in binnings:
  41. binning_focus = mr_utilities.binning_focus(binning, patient)
  42. dt = data['dt'].unique()[0]
  43. activity = data[data['binning'] == binning]['activity'].tolist()[0]
  44. if mr_utilities.count_nonzero(activity) < 1000:
  45. continue
  46. # split into trials for bootstrap confidence intervals
  47. ntrials = 30
  48. len_trial = int(np.floor(len(activity) / ntrials))
  49. unusable_activity = len(activity) - ntrials * len_trial
  50. activity = activity[unusable_activity:]
  51. trials = np.reshape(activity, (ntrials, len_trial))
  52. # apply MR estimator
  53. prepared = mre.input_handler(trials)
  54. rk = mre.coefficients(prepared, dt=dt, dtunit='ms',
  55. steps=ksteps, method='sm', knownmean=None)
  56. try:
  57. maxfev = 200 * (len(rk.coefficients)+1)
  58. fit_res = mre.fit(rk, fitfunc=mr_utilities.string_to_func(
  59. fit_method), maxfev=maxfev)
  60. if not math.isnan(fit_res.tau):
  61. inconsistencies = mr_utilities.consistency_checks(
  62. activity, rk, fit_res)
  63. mr_savefile(result_path, patient, recording,
  64. focus, binning, binning_focus, ksteps,
  65. fit_method, rk, fit_res, inconsistencies)
  66. except RuntimeError:
  67. print('RUNTIME-ERROR', recording, binning)
  68. pass
  69. def mr_savefile(result_path, patient, recording, focus, binning,
  70. binning_focus, ksteps, fit_method, rk, fitres,
  71. inconsistencies):
  72. datafile_patient = result_path + 'mr_results.pkl'
  73. m_quantiles = fitres.mrequantiles
  74. tau_quantiles = fitres.tauquantiles
  75. rk_stderr = rk.stderrs
  76. save_res = dict()
  77. save_res['patient'] = patient
  78. save_res['recording'] = recording
  79. save_res['focus'] = focus
  80. save_res['binning_focus'] = binning_focus
  81. save_res['binning'] = binning
  82. save_res['kmin'] = ksteps[0]
  83. save_res['kmax'] = ksteps[1]
  84. save_res['rk'] = [list(rk.coefficients)]
  85. save_res['rk_steps'] = [list(rk.steps)]
  86. save_res['dt'] = rk.dt
  87. save_res['fit_method'] = fit_method
  88. save_res['fit_params'] = [list(fitres.popt)]
  89. save_res['m'] = fitres.mre
  90. save_res['ssres'] = fitres.ssres
  91. save_res['ssres_weighted'] = fitres.ssres*len(fitres.popt)
  92. save_res['tau'] = fitres.tau
  93. save_res['inconsistencies'] = inconsistencies
  94. save_res['rk_stderr'] = rk_stderr
  95. save_res['m_quantiles'] = m_quantiles
  96. save_res['tau_quantiles'] = tau_quantiles
  97. if os.path.isfile(datafile_patient):
  98. mr_results_patient = pd.read_pickle(datafile_patient)
  99. mr_results_patient = mr_results_patient.append(save_res,
  100. ignore_index=True)
  101. else:
  102. mr_results_patient = pd.DataFrame.from_records([save_res])
  103. mr_results_patient.to_pickle(datafile_patient)