Ce laboratoire a pour but de vous initier à la manipulation d’informations multidimensionnelles avec Matlab. Nous allons pour cela analyser des données électrophysiologiques de décharges d’activité neuronale. Nous allons effectuer différentes opérations visant à visualiser, résumer et modéliser ces données. Les données sont tirée de l’expérience de Georgopoulos1982 sur l’encodage neuronale du mouvement du bras chez un macaque avec des implants neuronaux. L’animal commence l’expérience en fixant un curseur au centre d’une cible, ensuite il doit rejoindre des cibles périphériques apparaissent dans une des 8 directions arrangé en cercle. Une fois la cible apparue, l’animal doit attendre ( 100-1500 ms) le signal de départ avant d’aller rejoindre la cible pour une durée de 500ms, ensuite il retourne au point de départ (au centre). Cette séquence de mouvement est appelée essai et dans cette expérience il y en a 47. Le but de l’expérience de Georgopoulos et collègues est de déterminer l’orientation spatiale préférentielle du neurone en question dans la région MI, et qu’il est possible de prédire la direction du mouvement à partir d’enregistrements physiologiques. Leurs résultats indiquent qu’il y a bel et bien une préférence vers les angles de mouvement entre 90 et 180 degrés. Durant ce travail nous allons reproduire certaines des analyses de données et la visualisation des résultats de cette expérience.
Pour réaliser ce laboratoire, il est nécessaire de récupérer les resources suivantes sur studium:
Chap17_Data.mat: le jeu de données tiré de Georgopoulos1982.
Les scripts diagramme_dispersion.m
et diagramme_dispersion_essais.m
pour la Section 1.
Les scripts histogramme_essai1.m
, histogramme_essais.m
pour la Section 2.
Notez que le laboratoire est noté. Il faudra remettre un rapport détaillé incluant une réponse pour l’ensemble des questions numérotées ci dessous. Chaque réponse fera typiquement quelques lignes, incluant du code et une figure si demandé dans l’énoncé.
Ne pas tenir compte et ne pas executer cette partie du code:
In [1]:
%matplotlib inline
from pymatbridge import Octave
octave = Octave()
octave.start()
%load_ext pymatbridge
Nous allons commencer par effectuer un diagramme de dispersion (scatter plot) de l’activation d’un neurone tout au long de la durée d’un essai. Voir le script pour suivre ces étapes.
In [2]:
%%matlab
load('Chap17_Data')
In [3]:
%%matlab
whos
Les variables sont `direction`, `go`, `intruction`, `spike` et `unit`. La variable `spike` est de type structure et de taille 1x47
In [4]:
%%matlab
fieldnames(spike)
Le champ "spikes(1).times" contient les temps de décharges de potentiels d’action pour
le premier essai. La commande permet de déterminer la taille de ce
vecteur, c’est à dire le nombre de décharges détectées:
In [5]:
%%matlab
size(spike(1).times)
In [6]:
%%matlab
size(spike(2).times) %nb de décharges pour l'essai 2
Il y a 51 décharges pour l'essai 2.
In [7]:
%%matlab
size(spike(10).times) %nb de décharges pour l'essai 10
Il y a 85 décharges pour l'essai 10.
>> spike(1).times
-0.9893
-0.9402
-0.9158
(...)
L'unité est en secondes et les valeurs négatives indiquent un temps de décharge qui précède le signal de départ le de l'expérience
In [8]:
%%matlab
t1 = spike(1).times;
t2 = spike(2).times;
In [9]:
%%matlab
figure
hold on
Attention à la deuxième instruction! Elle permet de dessiner
plusieurs objets sur une même figure, l’un à la suite de l’autre,
sans ré-initialiser la figure.
In [10]:
%%matlab
for num_temps = 1:length(t1)
line([t1(num_temps) t1(num_temps)], [0 1])
end
Notez l’utilisation de la commande line.
In [17]:
%%matlab
for num_temps = 1:length(t1)
line([t1(num_temps) t1(num_temps)], [0 1])
end
xlabel('Temp (sec)');
%Idem pour l’axe des y:
ylabel('Essai #')
%Enfin, on fixe les limites de l’axe des y
ylim([0 3])
% save the result
print('figure_dispersion.png','-dpng')
In [18]:
%%matlab
for num_temps = 1:length(t1)
line([t1(num_temps) t1(num_temps)], [0 0.5])
end
xlabel('Temp (sec)')
%Idem pour l’axe des y:
ylabel('Essai #')
%Enfin, on fixe les limites de l’axe des y
ylim([0 3])
In [14]:
%%matlab
% Charger les donnees
load('Chap17_Data')
% Preparer une figure
figure
% permettre la superposition de plusieurs graphiques dans la meme figure
hold on
% Donner un label à l'axe des x
xlabel('Temp (sec)');
% Donner un label à l'axe des y
ylabel('Essai #');
% Ajuster les limites de l'axe des y
ylim([0 length(spike)]);
for num_spike = 1:length(spike) %faire une boucle pour tout les essaies
t = spike(num_spike).times; %definir la variable pour chaque essai
for num_temps=1:length(t) %faire une boucle pour tous les points temps
line([t(num_temps) t(num_temps)], [0+(num_spike-1) 1+(num_spike-1)]); %dessiner une line pour chaque point temps t1(i) avec longueur de 1
end
end
Nous allons continuer l’exploration des données à travers un histogramme
qui résumerait la somme des activations dans un intervalle de temps
donné. Voir le script histograme_essai1.m
pour reproduire les commandes suivantes:
In [19]:
%%matlab
clear
In [20]:
%%matlab
load('Chap17_Data')
In [21]:
%%matlab
centres = [-0.95:0.1:0.95];
In [22]:
%%matlab
histo = zeros(1,length(centres));
In [23]:
%%matlab
histo = hist(spike(1).times,centres);
In [24]:
%%matlab
whos histo % elle est de taille 1x20
In [25]:
%%matlab
min(histo)
max(histo)
mean(histo)
In [26]:
%%matlab
bar(centres,histo);
%Ajuster les limites de l’axe des x
xlim([-1.1 1]);
xlabel('Temps (sec)'); %Donner un label à l’axe des x
ylabel('# essai');%Donner un label à l’axe des y
In [23]:
%%matlab
%Charger les donnees
load('Chap17_Data')
% Definir les centres des intervalles pour l'histogramme
centres = [-0.95:0.1:0.95];
% Initialiser une matrice de zéros histo dont la longueur est égale au nombre d'intervalles:
histo = zeros(length(centres),1);
% Faire une boucle à travers tous les essais et recuperer le nombre de decharges par intervalle avec la fonction histc
for jj = 1:47
histo=histo+histc(spike(jj).times,centres);
end
% Dessiner l'histograme avec la fonction bar
bar(centres,histo);
%Ajuster les limites de l'axe des x
xlim([-1.1 1]);
%Donner un label à l’axe des x
xlabel('Temps (sec)');
%Donner un label à l’axe des y
ylabel('# essai');
Nous allons maintenant implémenter une régression à l’aide de Matlab.
In [27]:
%%matlab
clear
In [28]:
%%matlab
x = [ 165 165 157 170 175 165 182 178 ]';
y = [ 47 56 49 60 82 52 78 90 ]';
In [29]:
%%matlab
whos
Les variables x et y sont tout deux des vecteurs de 1 colonne et 8 lignes. L'operation `'` transposer un vecteur ligne en colonne ou le contraire.
In [30]:
%%matlab
ftheta = inline('theta(1)+theta(2)*x','theta','x');
In [6]:
%%matlab
whos ftheta
`ftheta` est une fonction en ligne (*inline*).
In [32]:
%%matlab
% theta_chap = nlinfit(x, y, ftheta, [1 1] );
theta_chap = [-237.5729 1.7794];
Le paramètre `theta_chap` vaut [-237.5729 1.7794]. L'argument [1 1] est une valeur initiale de la méthode qui cherche la valeur `theta_chap`. En répétant l'expérience pour plusieurs valeurs ([2 2], [30 30], [-30 -30]) on voit que la résultat `theta_chap` ne semble pas dépendre ici de ce paramètre.
In [33]:
%%matlab
figure
plot(x,y,'b.');
hold on
plot(x,ftheta(theta_chap,x),'r');
In [36]:
%%matlab
figure
plot(x,y,'b.');
hold on
plot(x,ftheta(theta_chap,x),'r');
ylim([40 95])
xlabel('taille')
ylabel('poids')
print('regression_notes.png','-dpng')
In [39]:
%%matlab
clear
x = 0:0.1:30;
y = cos(x) + randn(1,301);
In [41]:
%%matlab
size(x)
size(y)
Les variables `x` et `y` sont des vecteurs lignes de longueur 301.
In [43]:
%%matlab
help randn
La commande `randn` permet de simuler du bruit suivant une distribution normale (Gaussienne) de moyenne nulle et de variance 1.
In [44]:
%%matlab
figure
plot(x,y,'.')
print('donnees_cosinus.png','-dpng')
In [46]:
%%matlab
ftheta = inline('theta(1)+theta(2)*cos(x-theta(3))','theta','x');
In [48]:
%%matlab
ftheta([0 1 1],0)
In [49]:
%%matlab
theta_chap = nlinfit(x, y, ftheta, [0 1 1] );
La variable `theta_chap` vaut [-0.0216 1.1005 0.1539].
L'argument [0 1 1] jour le même rôle que le paramètre [1 1] à la question 4. En utilisant une valeur différente du paramètre (par exemple [0 1 10]) on trouve une valeur différente pour `theta_chap`. C'est parce que la fonction `ftheta` est périodique, et il existe donc une infinité de valeurs d'entrée qui donnent la même sortie.
In [50]:
%%matlab
figure
plot(x,y,'b');
hold on
plot(x,ftheta(theta_chap,x),'r');
In [ ]:
Faites une sauvegarde de cette image, dans un fichier .