Pracownia Sygnałów Biologicznych/Zajecia 8

Z Brain-wiki
Wersja z dnia 09:16, 3 cze 2026 autorstwa Jarekz (dyskusja | edycje) (→‎Analiza GSR za pomocą biblioteki neurokit2)
(różn.) ← poprzednia wersja | przejdź do aktualnej wersji (różn.) | następna wersja → (różn.)

Reakcja skórno-galwaniczna

Wstęp

Prezentacja: Media:GSR.pdf

Reakcja skórno-galwaniczna (ang. galvanic skin response — GSR), nazywana czasami reakcją elektrodermalną, reakcją elektryczną skóry, reakcją psychogalwaniczną, jest zmianą właściwości elektrycznych skóry pod wpływem stanu psychologicznego. Wielkością mierzoną jest oporność skóry lub odwrotność oporności, czyli przewodnictwo. Z definicji oporu elektrycznego, opór (R) jest równy stosunkowi napięcia (V) do prądu przepływającego przez opór: R = V/I. Wzmacniacz podaje stałe napięcie pomiędzy elektrodami i mierzy natężenie przepływającego prądu elektrycznego. Na podstawie zmian natężenia prądu, wyznaczamy zmiany w przewodnictwie skóry. W zapisie przewodnictwa skóry możemy wyróżnić składową stałą (tzw. baseline level) oraz składową zmienną, reagującą na różne rodzaje bodźców zewnętrznych. Składową zmienną nazywa się czasem reakcją GSR i my też będziemy stosować od tej pory to pojęcie. Przykład reakcji GSR jest pokazany na rys. 1

Reakcja skórno-galwaniczna w sygnale 60 s. Sygnał był mierzony pomiędzy palcem środkowym i wskazującym.

Również przy braku bodźców zewnętrznych obserwuje się spontaniczne reakcje GSR występujące z typową częstością 1-3/minutę. Parametrami do opisu reakcji GSR są:

  • Amplituda: różnica pomiędzy składową stałą a wartością GSR w maksimum odpowiedzi
  • Opóźnienie (latencja): czas pomiędzy bodźcem a początkiem odpowiedzi. Typowe wartości: 3 sekundy lub mniej.
  • Czas narastania: czas pomiędzy początkiem odpowiedzi GSR a jej maksimum. Typowe wartości: 1-3 sekundy.
  • Czas połowicznego zaniku: czas pomiędzy maksimum odpowiedzi GSR i punktem, w którym wartość odpowiedzi malej o połowę. Typowe wartości: 2-10 sekund.

Najbardziej uznany model reakcji GSR zakłada, że wzrost przewodnictwa skóry następuje w wyniku wydzielania potu i wypełniania duktów potowych w skórze. Przewodnictwo wraca do poziomu odniesienia, gdy płyn wydzielony na powierzchnię skóry jest z powrotem wchłonięty przez gruczoły potowe. W modelu tym, dukty potowe odgrywają rolę zmiennych oporników. Ich opór maleje wraz z wypełnieniem. Amplituda GSR zależy od ilości potu dostarczonego do duktów oraz od liczby pobudzonych gruczołów potowych. Np. w skórze dłoni występuje ponad 2000 gruczołów potowych w jednym cm2.

Aktywacja kanałów potowych jest kontrolowana przez część współczulną autonomicznego układu nerwowego. Gruczoły potowe dostają cholinergiczne wejścia, które zmieniają napięcie błonowe komórek i regulują ich aktywność. W związku z elektryczną naturą procesów kontroli i działania gruczołów potowych, ich funkcjonowanie może być rejestrowane w postaci potencjałów elektrycznych, podobnie jak zapisy EKG czy EMG.

Eksperymenty Junga i Mathisona

Pierwsze opisy zastosowania aparatury GSR w psychoanalizie pojawiły się w książce Carla Gustava Junga, dotyczącej analizy słów. Osoba badana podłączona była do aparatury mierzącej zmiany przewodnictwa skóry, poprzez elektrody umieszczone na dłoni. Słowa z listy były czytane na głos osobie badanej. Jeśli słowo zawierało ładunek emocjonalny, powodowało ono zmianę przewodnictwa skóry i wychylenie się igły galwanometru. Wszystkie słowa które powodowały odpowiedź odbiegającą znacznie od normy były wskazaniem na możliwe obszary konfliktu wewnętrznego u pacjenta. Jung wykorzystywał reakcje GSR jako metodę dodatkową, wspomagającą jego własne obserwacje dotyczące źródeł konfliktów wewnętrznych u pacjentów. Konstrukcja przenośnych wzmacniaczy do GSR spowodowała wzrost zainteresowania tą metodą i jej wykorzystanie jako „detektor kłamstw”. Podstawą ich działania jest założenie, ze odpowiedź na pytanie niezgodnie z prawdą powoduje wewnętrzny konflikt i reakcje układu autonomicznego, która nie podlega kontroli świadomości. W praktyce, w sądownictwie, badanie detektorem kłamstw nie jest uznawane za dowód. Wykorzystując detektor kłamstw, Volney Mathison zauważył, że niektóre wspomnienia lub zmiany nastroju powodują znaczną reakcje GSR. Opracował on listę słów używaną w połączeniu z pomiarem GSR. Przy niektórych słowach pojawiała się bardzo silna reakcja GSR, która wskazywała, że dane słowo jest powiązane z silnymi emocjami mającymi swoje korzenie w podświadomości. Najczęściej, badany zupełnie nie zdawał sobie sprawy, że wywołał tak silną reakcję w układzie pomiarowym.

Biofeedback

Biofeedback (biologiczne sprzężenie zwrotne) jest techniką samoregulacji. Na podstawie pomiaru stanu fizjologicznego osoby badanej i dostarczania mu zwrotnej informacji o jego zmianach, osoba badane może nauczyć się świadomie modyfikować funkcje, które normalnie nie są kontrolowane świadomie. Zastosowanie pomiaru przewodnictwa skóry w biofeedbacku opiera się na następujących obserwacjach:

  • Niski poziom pobudzenia kory mózgowej jest potrzebny do odczuwania stanu relaksu, w stanie hipnozy oraz do lepszego odczuwania swojej nieświadomości.
  • Wysoki poziom pobudzenia kory mózgowej zapewnia szybszy refleks, koncentrację, zdolność szybszego czytania i lepszego zapamiętywania.
  • Poziom pobudzenia kory mózgowej i przewodnictwo skóry są ze sobą związane. Pobudzenie kory mózgowej jest odzwierciedlone we wzroście przewodnictwa skóry, a obniżenie poziomu pobudzenia kory mózgowej jest związane z obniżeniem przewodnictwa skóry.

Za pomocą czułej metody mierzącej i przekazującej poziom pobudzenia, może on być świadomie kontrolowany w szerokim zakresie. Metoda ta jest wykorzystywana w psychologii, medycynie, sporcie i biznesie.

Dodatkowa lektura

Polecamy zapoznanie się z rozdziałem 27 książki dostępnej pod adresem [1].

Ćwiczenia

Ćwiczenie I: "Wykrywacz kłamstwa"?

ONLINE:

Użyj kabla do pomiaru GSR z pięcioma stykami. Załóż elektrody na palec wskazujący i środkowy. Kontakty powinny znajdować się po wewnętrznej stronie dłoni, gdyż jest tam większa ilość kanałów potowych.

  • Użyj programu w psychopy z listą ~30 pytań i tagami do oznacznia momentu wyświetlenia pytania, momentu i typu odpowiedzi, i uruchamiania następnego pytania. Klawiaturę obsługuje eksperymentator, osoba badana obserwuje ekran i opowiada na pytania na głos Tak lub Nie.
  • Po zadaniu pytania obserwuj reakcje skórno-galwaniczną. Poczekaj aż przewodnictwo wróci do poziomu odniesienia, zanim wciśniesz przycisk uruchamiający następne pytanie. Eksperymentator odczytuje pytanie.
  • Skonfiguruj program do rejestracji i przeglądania mierzonego sygnału w czasie rzeczywistym.
  • Przekaż osobie badanej, siedziała spokojnie i odpowiadała na zadawane pytanie „Tak” lub „Nie”.Osoba badana powinna samodzielnie wybrać czy odpowie zgodnie z prawdą. Należy postarać się aby odpowiedzi prawdziwych i fałszywych było tyle samo.
  • Gdy zadasz wszystkie pytania i zapiszesz ostatnią reakcję zatrzymaj rejestrację.

OFFLINE:

  • Wczytać sygnał i tagi do pythona. Osoba badana powina dla każdej odpowiedzi dodać informację czy odpowiadała zgodnie z prawdą.
  • podziel sygnały na grupę Prawda i Fałsz wycinając 12s od zadania pytania/względem udzielenia odpowiedzi (-5 +7s względem tego momentu).
  • Dla każdej odpowiedzi GSR oszacuj latencję, amplitudę, czas narastania i czas połowicznego zaniku. Zbadaj rozrzut wyników. Jeśli odpowiedzi są podobne, uśrednij wyniki i wyznacz średnią latencję, amplitudę, czas narastania i czas połowicznego zaniku. Czy są jakieś różnice pomiędzy grupą Prawda i Fałsz?

Lista pytań:

  1. Czy mieszkasz w Warszawie?
  2. Czy lubisz brokuły?
  3. Czy masz kota?
  4. Czy urodziłeś/aś się w Polsce?
  5. Czy jeździsz na łyżwach?
  6. Czy masz brata?
  7. Czy byłeś/aś w Hiszpanii?
  8. Czy studiujesz na UW?
  9. Czy dzisiaj jest wtorek?
  10. Czy lubisz pizzę?

Ćwiczenie III (Analiza składowej zmiennej dla obrazów z zawartością neutralną i emocjonalną)

W tym samym układzie doświadczalnym jak w Ćwiczeniu I i II wykonaj następujący eksperyment.

  • Przekaż osobie badanej, by siedziała spokojnie.
  • Rozpocznij rejestrację sygnału
  • Uruchom program ..... wyświetlający losowo obrazy o zawartości neutralnej i emocjonalnej. Wyświetlaj obrazki naciskając klawisz klawiatury. Po wyświetleniu obrazka obserwuj reakcje skórno-galwaniczną. Poczekaj aż przewodnictwo wróci do poziomu odniesienia, zanim wyświetlisz następny obrazek.
  • Gdy pojawi się napis „Koniec”, odczekaj 10 sekund i zatrzymaj rejestrację.
  • Odczytaj momenty wyświetlania obrazów neutralnych i emocjonalnych zapisane przez program. Na podstawie tych danych, dla każdej odpowiedzi na obraz emocjonalny oszacuj latencję, amplitudę, czas narastania bez czasu połowicznego zaniku. Zbadaj rozrzut wyników. Jeśli odpowiedzi są podobne, uśrednij wyniki i wyznacz średnią latencję, amplitudę, czas narastania.
  • Porównaj uśrednione parametry odpowiedzi GSR dla obrazów emocjonalnych i słów neutralnych otrzymanych w Ćwiczeniu II.

Analiza GSR

Przeliczenie danych surowych wzmacniacza TMSi Porti7 na jednostki fizyczne

Wzmacniacz TMSi Porti7 rejestruje sygnał GSR na kanale AUX z rozdzielczością 1,4305 µV/bit i zasila elektrody stałym prądem I = 1 µA. Przeliczenie surowych próbek na fizjologicznie użyteczne jednostki wymaga dwóch kroków: bity → napięcie → przewodnictwo.

Krok 1: surowe próbki → napięcie

[math]V\,[\mathrm{V}] = \mathrm{raw} \times 1{,}4305 \times 10^{-6}[/math]

Krok 2: napięcie → opór skóry

Z prawa Ohma ([math]I = 1\,\mu\mathrm{A} = 10^{-6}\,\mathrm{A}[/math]):

[math]R\,[\Omega] = \frac{V\,[\mathrm{V}]}{I\,[\mathrm{A}]} = \frac{\mathrm{raw} \times 1{,}4305 \times 10^{-6}}{1 \times 10^{-6}} = \mathrm{raw} \times 1{,}4305[/math]

Czynniki [math]10^{-6}[/math] skracają się, ponieważ prąd wynosi dokładnie 1 µA.

Krok 3: opór → przewodnictwo skóry

Jednostką fizjologicznie użyteczną jest mikrosiemens [µS]:

[math]G\,[\mu\mathrm{S}] = \frac{10^6}{R\,[\Omega]} = \frac{10^6}{\mathrm{raw} \times 1{,}4305}[/math]

Wzór skrócony (jedna linia):

[math]G\,[\mu\mathrm{S}] = \frac{I\,[\mu\mathrm{A}]}{V\,[\mathrm{V}]} = \frac{1}{\mathrm{raw} \times 1{,}4305 \times 10^{-6}}[/math]

Sprawdzenie sensowności wyników

Typowe wartości przewodnictwa skóry wynoszą 0,1–20 µS (opór 50 kΩ–10 MΩ). Przykład dla [math]R = 50\,\mathrm{k}\Omega[/math]:

[math]\mathrm{raw} = \frac{50\,000}{1{,}4305} \approx 34\,954\,\mathrm{bity} \quad \Rightarrow \quad G \approx 20\,\mu\mathrm{S}[/math]

co mieści się w oczekiwanym zakresie fizjologicznym.

Implementacja w Pythonie

import numpy as np

LSB_V = 1.4305e-6   # V/bit  (rozdzielczość kanału AUX Porti7)
I_A   = 1e-6        # A      (prąd stały wzmacniacza GSR)

def raw_to_voltage(raw):
    """Surowe próbki → napięcie [V]"""
    return raw * LSB_V

def raw_to_resistance(raw):
    """Surowe próbki → opór skóry [Ω]"""
    return raw_to_voltage(raw) / I_A    # = raw * 1.4305

def raw_to_conductance_uS(raw):
    """Surowe próbki → przewodnictwo skóry [µS]"""
    return (I_A / raw_to_voltage(raw)) * 1e6
    # równoważnie: return 1e6 / (raw * 1.4305)

Uwaga dotycząca wartości prądu

Wartość prądu 1 µA wymaga weryfikacji w dokumentacji TMSi Porti7, konkretnie w specyfikacji kanałów AUX skonfigurowanych dla trybu GSR. Jeśli rzeczywisty prąd różni się od założonej wartości, wyniki skalują się liniowo zgodnie z ogólnym wzorem:

[math]G\,[\mu\mathrm{S}] = \frac{I\,[\mu\mathrm{A}]} {\mathrm{raw} \times 1{,}4305 \times 10^{-6}}[/math]

Link do funkcji analizy EDA (GSR) w neurokit2

Analiza w neurokit

Hierarchia funkcji – pipeline i elementy składowe

Biblioteka NeuroKit2 organizuje analizę EDA na dwóch poziomach.

Poziom 1 – kompletny pipeline (eda_process) wykonuje całą analizę jednym wywołaniem, wewnętrznie wywołując kolejno wszystkie funkcje niższego poziomu.

Poziom 2 – funkcje składowe realizują poszczególne kroki przetwarzania i mogą być wywoływane niezależnie, gdy potrzebna jest pełna kontrola nad parametrami.

eda_simulate()        ← generowanie sygnału syntetycznego (do testów)

eda_process()         ← GŁÓWNA FUNKCJA: pełny pipeline
├── eda_clean()            krok 1: filtracja (preprocessing)
├── eda_phasic()           krok 2: dekompozycja na SCL + SCR
└── eda_peaks()            krok 3: detekcja pików SCR
    ├── eda_findpeaks()         (funkcja niskopoziomowa)
    └── eda_fixpeaks()          (korekcja wyników)

eda_analyze()         ← analiza cech (po eda_process)
├── eda_eventrelated()     analiza związana z bodźcami (epoki < 10 s)
└── eda_intervalrelated()  analiza długich nagrań
    ├── eda_sympathetic()       indeks aktywności SNS
    └── eda_autocor()           autokorelacja

eda_plot()            ← wizualizacja wyników eda_process()

eda_simulate() – sygnał syntetyczny

Służy do generowania sygnału testowego przed analizą danych rzeczywistych.

eda = nk.eda_simulate(duration=30, sampling_rate=1000,
                      scr_number=5, noise=0.01, drift=-0.01)

Kluczowe parametry: czas trwania (duration), częstotliwość próbkowania (sampling_rate), liczba pików SCR (scr_number), poziom szumu (noise), dryft liniowy sygnału (drift). Parametr drift odpowiada powolnej zmianie składowej tonicznej (SCL) – warto eksperymentować z jego wpływem na wyniki dekompozycji.

eda_process() – główna funkcja pipeline'u

signals, info = nk.eda_process(eda_signal, sampling_rate=1000, method='neurokit')

Zwraca DataFrame z kolumnami: EDA_Raw, EDA_Clean, EDA_Tonic (SCL), EDA_Phasic (SCR), a także znaczniki pików: SCR_Onsets, SCR_Peaks, SCR_Amplitude, SCR_RiseTime, SCR_Recovery. Odpowiadają one parametrom GSR opisywanym w teorii: amplitudzie, czasowi narastania i czasowi połowicznego zaniku.

Argument method ('neurokit' lub 'biosppy') wpływa na parametry filtracji w kroku eda_clean().

eda_clean() – preprocessing: filtracja dolnoprzepustowa

To jest pierwszy i krytyczny krok przetwarzania sygnału. Sygnał EDA zawiera szybkie artefakty ruchowe i szumy elektryczne, których nie ma w biologicznym sygnale przewodnictwa skóry (pasmo fizjologiczne SCR: 0–2 Hz; SCL zmienia się jeszcze wolniej).

eda_cleaned = nk.eda_clean(eda_signal, sampling_rate=1000, method='neurokit')
Metoda Typ filtra Rząd Częstotliwość odcięcia
'neurokit' (domyślna) Butterworth dolnoprzepustowy 4 3 Hz
'biosppy' Butterworth dolnoprzepustowy 4 5 Hz

Uwaga praktyczna: przy sygnałach z urządzeń wearable (np. Empatica E4) o częstotliwości próbkowania poniżej 7 Hz filtrowanie jest automatycznie pomijane, bo częstotliwość Nyquista jest już poniżej zakresu artefaktów do usunięcia.

Wybór metody ma znaczenie: BioSPPy z odcięciem 5 Hz przepuszcza nieco więcej szybkozmiennych składowych niż domyślny NeuroKit (3 Hz). W praktyce różnica jest niewielka, ale widoczna przy porównaniu wizualnym.

eda_phasic() – dekompozycja na składową toniczną (SCL) i fazową (SCR)

To jest najważniejszy krok analityczny. Wydzielamy dwie odrębne biologicznie składowe: wolnozmienny poziom przewodnictwa (SCL, skin conductance level) i szybkie odpowiedzi na bodźce (SCR, skin conductance response).

components = nk.eda_phasic(eda_cleaned, sampling_rate=1000, method='highpass')
# Wynik: DataFrame z kolumnami EDA_Tonic i EDA_Phasic

Dostępne metody dekompozycji:

Metoda Zasada działania Kluczowe parametry
'highpass' (domyślna) Filtr górnoprzepustowy Butterworth, odcięcie 0,05 Hz (metoda Biopac Acqknowledge) cutoff (domyślnie 0,05 Hz)
'smoothmedian' Wygładzanie medianą – usuwa wolnozmienne składowe; phasic = sygnał − wygładzony (metoda Biopac Acqknowledge) smoothing_factor (domyślnie 4 s)
'cvxEDA' Optymalizacja wypukła (Greco 2016); wymaga pakietu cvxopt
'sparsEDA' Rzadka dekonwolucja nieujemna (Hernando-Gallego 2017); eksperymentalna

Kluczowe uwagi dotyczące przetwarzania sygnałów:

  • Metoda 'highpass' z odcięciem 0,05 Hz to filtr górnoprzepustowy – wszystko poniżej 0,05 Hz traktowane jest jako składowa toniczna (SCL). Wybór wynika z charakterystyki czasowej SCR: odpowiedź trwa kilka sekund (pasmo ~0,05–2 Hz), natomiast SCL zmienia się na skali dziesiątek sekund–minut.
  • Metoda 'smoothmedian' jest obliczeniowo kosztowna; parametr smoothing_factor (w sekundach) decyduje o szerokości okna wygładzania – większa wartość daje szybsze obliczenia, ale mniej precyzyjne wydzielenie SCL.
  • Metody 'cvxEDA' i 'sparsEDA' są bardziej zaawansowane i dają fizycznie interpretowalne modele generatywne sygnału, ale są wolniejsze.

eda_peaks() / eda_findpeaks() – detekcja pików SCR

info, peaks_signals = nk.eda_peaks(eda_phasic, sampling_rate=1000,
                                    method='neurokit', amplitude_min=0.1)

Funkcja eda_peaks() jest interfejsem wysokopoziomowym wywołującym wewnętrznie eda_findpeaks() (znajdowanie) i eda_fixpeaks() (korekcja). Można też wywołać je bezpośrednio.

Parametr amplitude_min=0.1 (dla metod 'neurokit' i 'kim2004'): wyklucza piki, których amplituda jest mniejsza niż 10% maksymalnej amplitudy w sygnale. Regulowanie tego progu pozwala odfiltrować drobne fluktuacje.

Dostępne metody detekcji: 'neurokit' (domyślna), 'gamboa2008', 'kim2004', 'vanhalem2020', 'nabian2018'.

eda_analyze() – analiza cech

Funkcja automatycznie wybiera tryb analizy na podstawie długości danych:

results = nk.eda_analyze(data, sampling_rate=1000, method='auto')
# method='auto': event-related dla epok < 10 s, interval-related dla dłuższych

eda_eventrelated() – analiza po bodźcach

Stosowana do analizy odpowiedzi na krótkie bodźce (epoki ~2–7 s). Oblicza dla każdej epoki: obecność SCR, amplitudę, czas piku, SCR_RiseTime, SCR_RecoveryTime. Odpowiada bezpośrednio parametrom mierzonym ręcznie w Ćwiczeniu I i III – latencji, amplitudzie, czasowi narastania i czasowi połowicznego zaniku.

eda_intervalrelated() – analiza długich nagrań

Stosowana dla danych trwających powyżej ~10 s (nagrania spoczynkowe, długie bloki eksperymentalne). Oblicza: liczbę i średnią amplitudę SCR (SCR_Peaks_N, SCR_Peaks_Amplitude_Mean), odchylenie standardowe SCL (EDA_Tonic_SD), a przy wystarczającej długości nagrania – indeks aktywności układu współczulnego i autokorelację.

eda_sympathetic() – indeks aktywności układu współczulnego

result = nk.eda_sympathetic(eda_signal, sampling_rate=1000,
                             frequency_band=[0.045, 0.25], method='posada')

Oblicza moc widmową sygnału EDA w paśmie 0,045–0,25 Hz, które według Posada-Quintero et al. (2016) odzwierciedla dynamikę składowej współczulnej. Wymaga nagrania o długości co najmniej 64 sekund (wynika z wymaganej rozdzielczości częstotliwościowej estymacji widma).

Zwraca EDA_Sympathetic (moc bezwzględna) oraz EDA_SympatheticN (moc znormalizowana przez całkowitą moc sygnału).

eda_autocor() – autokorelacja sygnału EDA

autocor = nk.eda_autocor(eda_cleaned, sampling_rate=1000, lag=4)

Oblicza autokorelację z domyślnym przesunięciem (lag) 4 sekund – wartość zalecana przez van Halem et al. (2020), aby uniknąć trywialnie wysokich autokorelacji przy małych przesunięciach (sygnał EDA jest bardzo gładki). Wymaga nagrania dłuższego niż 30 s.

eda_plot() – wizualizacja

nk.eda_plot(signals, info)

Wizualizuje wyniki eda_process() w trzech panelach: sygnał surowy i wyczyszczony, składowa toniczna (SCL), składowa fazowa (SCR) z zaznaczonymi onsetami i pikami. Argument static=False przełącza na interaktywny wykres Plotly.

Podsumowanie: kiedy używać której funkcji

Cel Funkcja
Szybka analiza, wszystkie parametry domyślne eda_process()
Porównanie metod filtracji eda_clean() z różnymi method
Porównanie metod dekompozycji SCL/SCR eda_phasic() z różnymi method
Analiza odpowiedzi na bodźce (jak w Ćw. I i III) eda_process() + eda_analyze() na epokach
Analiza nagrania spoczynkowego eda_process() + eda_intervalrelated()
Indeks aktywacji SNS (długie nagranie ≥ 64 s) eda_sympathetic()
Testowanie kodu przed pomiarem rzeczywistym eda_simulate()