Wir haben bisher immer nur Daten unserer Person verwendet um Vorhersagen zu treffen. Das macht Sinn, da die Daten der Person gut die Besonderheiten ihrer Art zu denken widerspiegeln. Zum Beispiel könnte man bei jemandem mit atypischer rechts-lateraler Sprache wahrscheinlich nicht so leicht die Sprachaktivität aus den Daten anderer Menschen dekodieren, von denen vielleicht 90% linkslateralisiert sind. Ein anderer Grund warum wir mit dem Training auf Basis unserer eigenen Daten gut abschneiden könnten ist, dass unsere Aufgaben nicht unbedingt typisch für einen bestimmten kognitiven Prozess sein müssen. So haben wir gesehen, dass unsere Aufgabe an Gesichter zu denken eher autobiographische Gedächtnisfunktionen wiederspiegeln könnte, als die typische visuelle Wahrnehmung von Gesichtern.
Trotzdem gibt es auch Vorteile eines Vorgehens, bei dem wir die Daten anderer Menschen verwenden, um die Daten unserer Versuchsperson zu dekodieren. Die Vorteile ergeben sich gerade aus den mit dieser Aufgabe verbundenen Schwierigkeiten:
Was individuelle Besonderheiten der Person angeht, so wissen wir nicht, wie repräsentativ die Daten vom Untersuchungstag auch für andere Tage sind. Müdigkeit, Nervosität, Drogenkonsum (Koffein), unbequemes Liegen, Scannerparameter wie Auflösung,TR etc. werden mit Sicherheit alle "Besonderheiten" in die Daten einführen, die eine Woche später wieder anders sind.
Was Besonderheiten der Aufgabe angeht, schauen wir uns die Rolle, die eine große Datenbank wie Neurosynth dabei spielen könnten, nächste Woche an.
In [1]:
import os
In [2]:
imgList = ['../training/%s'%x for x in os.listdir('../training/')]; imgList.sort()
In [3]:
keywords = ['face','navigation','sensorimotor','dmn','language']
In [4]:
from nilearn import image, datasets, input_data, plotting
In [5]:
import seaborn as sns
import matplotlib.pylab as plt
%matplotlib inline
In [6]:
for keyword in keywords:
plotting.plot_stat_map('../ns/%s_specificity_z_FDR_0.01.nii.gz' % keyword,title=keyword)
plt.show()
In [7]:
nsList = ['../ns/%s_specificity_z_FDR_0.01.nii.gz' % keyword for keyword in keywords ]
In [8]:
masker = input_data.NiftiMasker(mask_img='../masks/MNI152_T1_2mm_brain_mask.nii.gz').fit()
In [9]:
import pandas as pd
In [10]:
roiDf = pd.DataFrame(masker.transform(nsList),index=keywords)
In [11]:
roiDf
Out[11]:
In [12]:
for roi in roiDf.index:
thisData = roiDf.ix[roi]
thisImg = masker.inverse_transform(thisData)
plotting.plot_stat_map(thisImg,title=roi)
plt.show()
In [13]:
import pandas as pd
import numpy as np
In [14]:
def makeBigDf(imgList,masker):
bigDf = pd.DataFrame()
for img in imgList:
thisName = img.split('/')[-1].split('.')[0]
cond,num,content = thisName.split('_')
cont = '%s_%s' % (num,content)
thisDf = pd.DataFrame(masker.transform(img))
thisDf.index = [[cond],[cont]]
bigDf = pd.concat([bigDf,thisDf])
bigDf.sort_index(inplace=True)
return bigDf
In [15]:
blockDf = makeBigDf(imgList,masker)
In [16]:
blockDf
Out[16]:
In [17]:
blockDf.shape
Out[17]:
In [18]:
def makeMetric(roiDf,blockDf):
return pd.DataFrame( np.corrcoef(roiDf,blockDf)[5:,:5], index=blockDf.index, columns=roiDf.index )
In [19]:
myCorrDf = makeMetric(roiDf,blockDf)
In [20]:
myCorrDf
Out[20]:
In [21]:
plt.figure(figsize=(12,20))
sns.heatmap(myCorrDf,annot=True)
plt.show()
In [22]:
def makeCorrPred(myCorrDf):
d = {}
# da die Namen der neurosynth-Regionen und unserer Bedingungen nicht
# übereinstimmen, müssen wir hier erlären, welche neurosynth-Karte
# jeweils als richtige Antwort zählt
roiNameDict = {'face':'gesichter','navigation':'homewalk','sensorimotor':'motorik','dmn':'ruhe','language':'sprache'}
# wir gehen durch jede Zeile
for cond,num in myCorrDf.index:
# wir wählen diese Zeile aus
thisDf = myCorrDf.ix[cond].ix[num]
# wir wählen die Spalte mit dem höhsten Wert aus
winner = thisDf.idxmax()
# wir schreiben einen eintrag mit folgenden infos:
# real : die tatsächliche bedingung (aus der zeile)
# winner: die spalte mit der höchsten korrelation
# hit: wir fragen, ob real und winner identisch sind (kann wahr oder falsch sein)
winnerTranslated = roiNameDict[winner]
d[num] = {'real':cond, 'winner':winnerTranslated,'hit':cond==winnerTranslated}
# wir packen das ganze in eine tabelle, die wir nett formatieregn
predDf = pd.DataFrame(d).T
predDf.index = [predDf['real'],predDf.index]
predDf.sort_index(inplace=True)
# wir rechnen aus, in wie viel prozent der Fälle wir richig lagen
percentCorrect = np.mean( [int(x) for x in predDf['hit']] )*100
return predDf,percentCorrect
In [23]:
corrPredDf,corrPcCorrect = makeCorrPred(myCorrDf)
In [24]:
corrPredDf
Out[24]:
In [25]:
print "%i%% richtige Vorhersagen!" % corrPcCorrect
In [26]:
corrPredDf['correct'] = [int(x) for x in corrPredDf['hit']]
condPredDf = (corrPredDf.groupby(level=0).mean()*100).T
In [27]:
plt.figure(figsize=(8,4))
sns.barplot(data=condPredDf); plt.ylim(0,100); plt.ylabel('% correct');
plt.axhline(20,color='k',linewidth=1,linestyle='dashed')
plt.show()