<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl">
	<id>http://brain.fuw.edu.pl/edu/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Maciek</id>
	<title>Brain-wiki - Wkład użytkownika [pl]</title>
	<link rel="self" type="application/atom+xml" href="http://brain.fuw.edu.pl/edu/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Maciek"/>
	<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php/Specjalna:Wk%C5%82ad/Maciek"/>
	<updated>2026-04-09T03:15:30Z</updated>
	<subtitle>Wkład użytkownika</subtitle>
	<generator>MediaWiki 1.34.1</generator>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG_2/ERDS&amp;diff=11519</id>
		<title>Pracownia EEG 2/ERDS</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG_2/ERDS&amp;diff=11519"/>
		<updated>2025-12-09T09:58:49Z</updated>

		<summary type="html">&lt;p&gt;Maciek: /* wersja 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Pracownia EEG 2|Pracownia EEG 2]] / ERD/S&lt;br /&gt;
&lt;br /&gt;
=Wstęp=&lt;br /&gt;
Wśród badań wykonywanych z wykorzystaniem rejestracji EEG czy MEG można wyróżnić badania spoczynkowe, gdzie rejestrowana jest spontaniczna aktywność mózgu oraz badania zmian aktywności pod wpływem różnych bodźców, przy czym bodźce te mogą być pochodzenia egzo- lub endogennego. Reakcja na bodziec może wykazywać stały związek fazowy z momentem wystąpienia bodźca &amp;amp;mdash; w takiej sytuacji mówimy o potencjałach lub polach wywołanych (ang. ''event related potential'', ''ERP'' i ''event related field'', ''ERF'') &amp;amp;mdash; lub też może nie być fazowo związana z bodźcem.&lt;br /&gt;
&lt;br /&gt;
Niniejsza część pracowni poświęcona jest metodologii badania reakcji mózgu na bodźce, które są czasowo ale niekoniecznie fazowo związane z bodźcem.&lt;br /&gt;
&lt;br /&gt;
=Zmiany pasmowej mocy sygnału EEG=&lt;br /&gt;
Pierwsze rezultaty opisujące zmiany w mocy pasmowej sygnału EEG (spadek mocy rytmu alfa) związane z reakcją na bodziec zostały opisane w pracy doktorskiej Adolf Becka zatytułowanej &amp;amp;bdquo;Oznaczenie lokalizacyi w mózgu i rdzeniu za pomocą zjawisk elektrycznych&amp;amp;rdquo; (Beck,  1891). &lt;br /&gt;
Ilościowe badania zjawisk modulacji mocy sygnału EEG w reakcji na bodźce rozpoczęto stosunkowo niedawno. Począwszy od pracy (Pfurtscheller, 1979) zjawiska te zaczęto nazywać ''Event Related Desynchronization'' (ERD) &amp;amp;mdash; czyli desynchronizacja związana z bodźcem. Termin ERD dotyczy spadku mocy. Przez analogię w późniejszych pracach terminem ''Event Related Synchronization'' (ERS) opisywane są efekty polegające na wzroście mocy. W większości paradygmatów eksperymentalnych zjawiska ERD i ERS są małe w porównaniu ze zmiennością mocy sygnału EEG związanej ze spontaniczną aktywnością mózgu. W celu ich ilościowego badania wymagane jest zarejestrowanie wielu realizacji reakcji na bodziec i poddanie ich analizie statystycznej. &lt;br /&gt;
&lt;br /&gt;
[[Plik:Paradygmat erds.gif|thumb|800px|center]]&lt;br /&gt;
==Interpretacja fizjologiczna==&lt;br /&gt;
[[Plik:EEG_synchronicznosc.png|600px|thumb|right|Synchronicznie pobudzana grupa neuronów piramidalnych kory tworzy warstwę dipolową.]]&lt;br /&gt;
[[Plik:Mapka_tf_erds.png|600px|thumb|right|Przykładowa mapa zjawiska synchronizacji i desynchronizacji sygnału EEG w przestrzeni czas-częstość dla sygnału zearejestrowanego przez elektrodę C3. Osoba badana wykonywała szybki ruch palcem w momencie oznaczonym 0. Kolory odpowiadają procentowej zmianie mocy względem poprzedzającego okresu 2 s, zgodnie ze skalą barw umieszczoną po prawej stronie.  Na poziomej osi — czas w s, na pionowej częstość w Hz.]]&lt;br /&gt;
Terminy ERD i ERS mają swoje źródło w fizjologicznej interpretacji zmian mocy sygnału w określonych pasmach częstości.  Źródłem mierzalnego na powierzchni głowy sygnału elektrycznego lub magnetycznego jest synchroniczna aktywność wielu neuronów (głównie piramidalnych kory). Szacuje się, że wpływ na wielkość sygnału EEG lub MEG ma głównie stopień synchronizacji neuronów wytwarzających ten sygnał, a w drugiej kolejności ich ilość (Nunez, 1981). Tak więc wzrost mocy w pewnym paśmie (np. alfa ERS) interpretowany jest jako wzrost synchronizacji aktywności neuronów generujących aktywność EEG w tym paśmie, zaś spadek mocy (np. alfa ERD) interpretowany jest jako spadek synchronizacji neuronów generujących aktywność EEG w tym paśmie częstości. Przy takiej interpretacji należy pamiętać o skali w jakiej dokonywany jest pomiar. Zarówno elektrody EEG jak i cewki MEG mierzą sygnały średnie pochodzące od olbrzymich ilości neuronów. Zatem zmiana mocy w tym sygnale odpowiada desynchronizacji lub synchronizacji w skali makroskopowej (rzędu 10&amp;lt;sup&amp;gt;6&amp;lt;/sup&amp;gt;-10&amp;lt;sup&amp;gt;8&amp;lt;/sup&amp;gt; neuronów). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zjawiska ERD i ERS badane były zarówno w eksperymentach motorycznych (Pfurtscheller, 1994, Pfurtscheller, 1996a, Pfurtscheller, 1996b , Pfurtscheller, 1999) jak i kognitywistycznych  (Tallon Baudry, 1996, Tallon, 1999, Kaiser, 2003).&lt;br /&gt;
Wnioski płynące z tych prac są takie, że znaczenie zjawisk ERD i ERS zależy od pasma częstości, w którym one występują. Aktywność w paśmie alfa wiązana jest ze stanem spoczynkowym, ERD w paśmie alfa i beta wiązane jest z pobudzeniem danego rejonu kory mózgowej, w którym zjawisko to zachodzi. ERS w paśmie alfa i beta następujący po ERD w tym samym paśmie częstości interpretowany jest najczęściej jako przejaw inhibicji lub kasowania poprzedniego stanu. Z kolei zwiększona aktywność w paśmie gamma jest interpretowana jako przejaw funkcjonalnej aktywacji danego fragmentu kory. Nowe wyniki pojawiają się na bieżąco i stawiane są nowe pytania co do możliwych interpretacji poszczególnych zjawisk  np. (Crone, 2010).&lt;br /&gt;
&lt;br /&gt;
Oprócz motywacji czysto poznawczych, badania zjawisk ERD i ERS stymulowane są przez praktyczne możliwości ich wykorzystania w diagnostyce epilepsji, gdzie są nadzieje na zastosowanie tej techniki w miejsce bardziej inwazyjnej metody mapowania mózgu przez elektrostymulację (Crone 1998a, Crone, 1998b, Crone, 2006) oraz w konstrukcji interfejsów mózg-komputer (Pfurtscheller, 2006).&lt;br /&gt;
[[Plik:Mapowanie.png|thumb|600px|center|Mapowanie kory czuciowo-ruchowej za pomocą stymulacji: dwie falki – bezwolne reakcje ruchowe, trzy falki – kloniczny skurcz mięśni, za Crone, 1998]]&lt;br /&gt;
[[Plik:Mapki_ECoG.jpg|thumb|600px|center|Mapowanie kory czuciowo-ruchowej za pomocą ERD/ERS.Pacjent z przyczyn medycznych miał umieszczoną na korze motorycznej siatkę elektrod (6×8, odstęp 1 cm). Pacjent miał zaciskać pięść w odpowiedzi na bodziec wzrokowy przez cały czas trwania bodźca (3 s)&lt;br /&gt;
Prezentowane mapy istotnych statystycznie zmian uzyskano na podstawie 49 wolnych od artefaktów realizacji.]]&lt;br /&gt;
&lt;br /&gt;
==Estymacja zmian mocy sygnału EEG w dziedzinie czasu==&lt;br /&gt;
Przebieg czasowy zjawiska ERD i ERS jest specyficzny dla pasm częstości.&lt;br /&gt;
[[Grafika:ERDS klasycznie_1.png|right|thumb|768px|&amp;lt;figure id=&amp;quot;fig:erds_klasycznie&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt; Klasyczne obliczanie ERD/ERS. &amp;lt;br&amp;gt; a) Przykładowy zapis EEG jednej z ''N'' realizacji  &amp;lt;br&amp;gt; b) przefiltrowany sygnał EEG w wybranym paśmie (tutaj: [15 25] Hz)&amp;lt;br&amp;gt;  c) przefiltrowany sygnał podniesiony do kwadratu &amp;amp;mdash; w ten sposób uzyskujemy przebieg mocy pasmowej w czasie &amp;lt;br&amp;gt; d) uśredniony po realizacjach przebieg mocy pasmowej w czasie &amp;lt;br&amp;gt; e) wygładzony przebieg z d) za pomocą średniej biegnącej (tutaj okienko 0,25 s); czerwone pionowe linie wyznaczają okres referencyjny &amp;lt;br&amp;gt; f) ERD/ERS — względna zmiana sygnału e) w odniesieniu do okresu referencyjnego.]]&lt;br /&gt;
Klasyczny sposób estymowania  ERD i ERS (Pfurtscheller, 1979) polega na (patrz ilustracja): &lt;br /&gt;
*filtrowaniu pasmowym,&lt;br /&gt;
*wyrównaniu realizacji względem momentu wystąpienia bodźca, &lt;br /&gt;
*obliczaniu mocy chwilowej (podniesienie do kwadratu wartości każdej próbki sygnału), &lt;br /&gt;
*uśrednieniu mocy chwilowej po realizacjach, wygładzeniu przebiegu czasowego uśrednionej mocy chwilowej filtrem dolnoprzepustowym.&lt;br /&gt;
*Następnie względna zmiana mocy obliczana jest jako:&lt;br /&gt;
: &amp;lt;math&amp;gt;\mathrm{ERD/ERS}_f(t) = \frac{P_f(t) - R_f}{R_f}  &amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie:&lt;br /&gt;
''P''&amp;lt;sub&amp;gt;''f ''&amp;lt;/sub&amp;gt;(''t'') &amp;amp;mdash; średnia moc chwilowa w paśmie częstości ''f''; uśrednianie przebiega po realizacjach.&lt;br /&gt;
''R''&amp;lt;sub&amp;gt;''f''&amp;lt;/sub&amp;gt; &amp;amp;mdash; średnia moc w paśmie ''f'' w okresie referencyjnym; uśrednianie przebiega po realizacjach i po czasie trwania okresu referencyjnego.&lt;br /&gt;
Klasycznym metodom obliczania ERD/ERS poświęcona jest praca (Pfurtscheller, 1999).&lt;br /&gt;
Całościowy obraz zmian mocy sygnału EEG związanych z bodźcem można dogodnie analizować w dziedzinie czas-częstość.&lt;br /&gt;
&lt;br /&gt;
=Cwiczenia=&lt;br /&gt;
&lt;br /&gt;
==Paradygmat ==&lt;br /&gt;
&lt;br /&gt;
===wersja 1===&lt;br /&gt;
Osoba badana siedzi wygodnie i trzyma przycisk podłączony do triggera.&lt;br /&gt;
Na ekranie w odstępach 13&amp;lt;math&amp;gt;\pm&amp;lt;/math&amp;gt;1 sekund wyświetlany jest krzyżyk. Krzyżyk wyświetlany jest przez 2 sekundy. W przeciągu 2 sekund po zniknięciu krzyżyka osoba badana w wybranym przez siebie momencie wciska przycisk. Proszę zarejestrować 60 realizacji.&lt;br /&gt;
&lt;br /&gt;
Przygotuj program implementujący powyższy paradygmat.&lt;br /&gt;
&lt;br /&gt;
===wersja 2===&lt;br /&gt;
Próba rozróżnienia ruchów lewą i prawą ręką &amp;amp;mdash; jak w BCI; na podstawie artykułu [[file:ERDS.BCI.TNSRE2012.pdf]], oczywiście w uproszczonej wersji :-)&lt;br /&gt;
&lt;br /&gt;
Procedura:&lt;br /&gt;
&lt;br /&gt;
Osoba badana ma za zadanie poruszać palcami (wskazującym oraz środkowym) prawej lub lewej ręki. Na ekranie monitora pojawia się strzałka, która widoczna jest przez okres 3 sek. i wskazuje rękę, którą będzie wykonywany ruch. Osoba badana ma ruszyć wskazaną ręką w wybranym przez siebie momencie PO zniknięciu strzałki. &lt;br /&gt;
Dla każdej ręki przewidziane jest 100 powtórzeń. W celu synchronizacji sygnału EEG ze wskazówkami pojawiającymi się na ekranie monitora, w lewym dolnym rogu (gdzie pojawia się biały kwadrat) powinna zostać umieszczona fotodioda. &lt;br /&gt;
&lt;br /&gt;
Rejestracja sygnału:&lt;br /&gt;
&lt;br /&gt;
Wykorzystujemy następujące elektrody umieszczone zgodnie z systemem 10-10: FC3, FC1, FCz, FC2, FC4, C5, C3, C1, Cz, C2, C4, C6, CP5, CP3, CP1, CPz, CP2, CP4, CP6, P1, P2, A1, A2. Dodatkowo wykonujemy pomiar z mięśnia extensor digitorum. W tym celu na obu rękach umieszczamy elektrody bipolarne do EMG (patrz Fig. 1 (elektroda ED3): http://jn.physiology.org/content/100/6/3225.long). Sygnał rejestrujemy z częstością 512 Hz.&lt;br /&gt;
&lt;br /&gt;
Procedura może zostać pobrana ze stony: https://github.com/mroja/signal_utils/tree/master/erds/arrows.&lt;br /&gt;
&lt;br /&gt;
===wersja 3=== &lt;br /&gt;
Osoba ma za zadanie ruszać ręką prawą/lewą/nogą lub wyobrażać sobie ruch prawą/lewą/nogą.W bloku pierwszym powienien być ruch, w drugim wyobrażenie. Na ekranie powinna zostać wyświetlona instrukcja, w której opisany jest cel badania. Następnie rozpoczyna się blok prób, w trakcie poszczególnej próby wyświetlane jest polecenie: &amp;amp;bdquo;Rusz ręką&amp;amp;rdquo;/&amp;amp;bdquo;Wyobraź sobie ruch ręką&amp;amp;rdquo; na 1 s, następnie 5 s przerwy (pusty ekran). Każde polecenie powinno być powtórzone 80 razy. &lt;br /&gt;
&lt;br /&gt;
W trakcie procedury powinien być zbierany sygnał EEG oraz EMG palca. Wykorzystujemy następujące elektrody EEG umieszczone zgodnie z systemem 10-10: FC3, FC1, FCz, FC2, FC4, C5, C3, C1, Cz, C2, C4, C6, CP5, CP3, CP1, CPz, CP2, CP4, CP6, P1, P2, A1, A2. częstość próbkowania: min. 256 Hz. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--Analiza:&lt;br /&gt;
# ERD/S w pasmach&lt;br /&gt;
# uśrednione mapy czas-częstość osobno dla ruchu lewą i prawą ręką&lt;br /&gt;
# analiza możliwości rozróżnienia ruchu na podstawie EEG&lt;br /&gt;
&lt;br /&gt;
Uśrednianie spektrogramów wykonujemy samodzielnie w Pythonie, a na deser liczymy estymatę średnich rozkładów czas-częstość z MP:&lt;br /&gt;
&lt;br /&gt;
# eksportujemy tagi znalezione na podstawie EMG https://brain.fuw.edu.pl/edu/EEG:Pracownia_EEG/SSVEP_1#.C4.86wiczenie_dla_ch.C4.99tnych i oglądamy w Svarogu wyniki na tle sygnału&lt;br /&gt;
# ściągamy najnowszą wersję Svaroga z http://braintech.pl/svarog, umożliwiającą uśrednianie map&lt;br /&gt;
# Otwieramy w Svarogu plik sygnału wraz z tagami.&lt;br /&gt;
# Ustalamy odpowiedni montaż i filtrowanie sygnału.&lt;br /&gt;
# Uruchamiamy dekompozycję MP (Tools → MP decomposition) wybierając w ustawieniach (zakładka „Signal selection” → zakładka „Marked”)&lt;br /&gt;
## rodzaj taga oznaczającego kolejne powtórzenia&lt;br /&gt;
## początek i długość trwania analizowanego interwału czasu (w sekundach, względem wystąpienia taga)&lt;br /&gt;
&lt;br /&gt;
Po zakończeniu obliczeń otwieramy rezultat w nowym oknie („Get result”). Obliczona w ten sposób „książka” składa się z dekompozycji MP kolejnych powtórzeń eksperymentu, przedstawionych w postaci map czas-częstość. Otrzymane mapy możemy następnie uśrednić (Tools → Average books) i zapisać do pliku graficznego o ustalonej rozdzielczości.--&amp;gt;&lt;br /&gt;
&amp;lt;!--==Rejestracja sygnału==&lt;br /&gt;
[[Plik:10_20zAFz.png|thumb| 600px|right]]&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 5 k&amp;lt;math&amp;gt;\Omega&amp;lt;/math&amp;gt; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%.&lt;br /&gt;
# Elektrody referencyjne A1 i A2.&lt;br /&gt;
# Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz).&lt;br /&gt;
# Sygnał rejestrujemy z częstością 256 Hz.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Analiza==&lt;br /&gt;
Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
&lt;br /&gt;
===Wyznaczenie pasma &amp;amp;mu; i &amp;amp;beta;===&lt;br /&gt;
# Z sygnału wycinamy fragmenty od &amp;amp;minus;3 do &amp;amp;minus;1 sek. dla elektrod C3, C4 i Cz (elektrody położone nad korą ruchową dłoni/nogi). &lt;br /&gt;
# Dla każdej realizacji obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane widma uśredniamy po realizacjach.&lt;br /&gt;
# Z sygnału wycinamy fragmenty od +0,5 do +2,5 sek. dla elektrod C3, C4 i Cz (elektrody położone nad korą ruchową dłoni/nogi). &lt;br /&gt;
# Dla każdej realizacji obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane widma uśredniamy po realizacjach.&lt;br /&gt;
# Wykreśl widma z okresu poprzedzającego ruch i z okresu po ruchu nałożone na siebie, a także względną zmianę widma. Zaobserwuj w jakich zakresach częstości &amp;amp;mu; (pasmo około 10 Hz) i &amp;amp;beta; (około 23 Hz) występują największe zmiany.&lt;br /&gt;
#Dla wersji 3 &amp;amp;mdash; te same operacje wykonaj dla warunku wyobrażonego ruchu &amp;amp;mdash; w pierwszym kroku należy ocenić na podstawie sygnału EMG, czy został wykonany ruch &amp;amp;mdash; jeśli tak &amp;amp;mdash; próbę taką należy usunąć z analiz. Jako punkt 0 będziemy brać początek polecenia na podstawie tagów.&lt;br /&gt;
&lt;br /&gt;
===Wyznaczenie przebiegu czasowego ERD i ERS ===&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Chebyszewa 2 rodzaju) zgodne z wyznaczonymi pasmami. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;3 do +3 sekund (wszystkie kanały). Przefiltruj każdą realizację. &lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat amplitudy chwilowej).&lt;br /&gt;
# Uśrednij moc chwilową po realizacjach.&lt;br /&gt;
# Oblicz względną zmianę mocy chwilowej względem czasu &amp;amp;minus;3 do &amp;amp;minus;1. W ten sposób otrzymasz przebieg ERD i ERS w czasie.&lt;br /&gt;
# Wykreśl ERD i ERS w układzie topograficznym. (Rozmieść subploty tak, aby z w przybliżeniu odpowiadały pozycjom elektrod).&lt;br /&gt;
&lt;br /&gt;
===Wyznaczenie przebiegu czasowego ERD i ERS wersja w roku 2024===&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Chebyszewa 2 rodzaju) zgodne z wyznaczonymi pasmami. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Przefiltruj wszystkie kanały danych: osobno w pasmie alfa i osobno w pasmie beta.&lt;br /&gt;
# Powycinaj realizacje zgodnie położeniem tagów (czas 0 s) od &amp;amp;minus;2 do +4,5 sekund (wszystkie kanały).&lt;br /&gt;
# Kolejne etapy analizy wykonujemy osobno dla pasm alfa i beta.&lt;br /&gt;
# Oblicz amplitudę chwilową w każdej realizacji za pomocą transformaty Hilberta.&lt;br /&gt;
# Oblicz moc chwilową podnosząc amplitudy chwilowe do kwadratu.&lt;br /&gt;
# Uśrednij moc chwilową po realizacjach.&lt;br /&gt;
# Oblicz moc referencyjną na odcinku &amp;amp;minus;1,5 s do &amp;amp;minus;0,5 s w każdym kanale (można sprawdzić też odcinek &amp;amp;minus;2 s do &amp;amp;minus;0,5 s).&lt;br /&gt;
# Oblicz względną zmianę mocy chwilowej — przebieg ERD i ERS w czasie.&lt;br /&gt;
# Wykreśl ERD i ERS w układzie topograficznym. (Rozmieść subploty tak, aby z w przybliżeniu odpowiadały pozycjom elektrod).&lt;br /&gt;
&lt;br /&gt;
===Transformacja Hjortha===&lt;br /&gt;
Transformacja Hjortha jest przybliżeniem numerycznym transformacji Laplace'a, czyli drugiej pochodnej przestrzennej.&lt;br /&gt;
Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
&lt;br /&gt;
Proszę przeliczyć potencjały C3, Cz i C4 na montaż Hjortha oraz powtórzyć analizę ERD/ERS opisaną powyżej.&lt;br /&gt;
Przykładowo dla elektrody C3 montaż Hjortha &amp;lt;math&amp;gt;\mathrm{C3_H}&amp;lt;/math&amp;gt; otrzymuje się w następujący sposób:&lt;br /&gt;
&amp;lt;math&amp;gt;\mathrm{C3_H = C3 - \frac{1}{4}(T3+F3+Cz+P3)}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Literatura=&lt;br /&gt;
* Beck, A., 1891. Oznaczenie lokalizacyi w mózgu i rdzeniu za pomoca zjawisk elektrycznych. Ph.D. thesis, Polska Akademia Umiejętności, Kraków, seria II.&lt;br /&gt;
* Crone, N. E., Miglioretti, D. L., Gordon, B., Lesser, R. P., 1998a. Functional mapping of human sensorimotor cortex with electrocorticigraphic spectral analysis II. Event-related synchronization in the gamma band. Brain 121, 2301–15.&lt;br /&gt;
* Crone, N. E., Miglioretti, D. L., Gordon, B., Sieracki, J. M., Wilson, M. T., Uematsu, S., 1998b. Functional mapping of human sensorimotor cortex with electrocorticographic spectral analysis I. Alpha and beta event-related desynchronization. Brain 121, 2271–99.&lt;br /&gt;
* Crone, N. E., Korzeniewska, A., Franaszczuk, P. J., 2010. Cortical gamma responses: Searching high and low. International Journal of Psychophysiology.&lt;br /&gt;
*Crone, N. E., Sinai, A., Korzeniewska, A., 2006. High-frequency gamma oscilla- tions and human brain mapping with electrocorticography. Progress in Brain Research 159, 275–295.&lt;br /&gt;
* Kaiser, J., Lutzenberger, W., 2003. Induced gamma-band activity and human brain function. Neuroscientist 9, 475–84.&lt;br /&gt;
* Nunez, P. L., 1981. Electric Fields of the Brain. The Neurophysics of EEG. Oxford University Press, New York.&lt;br /&gt;
* Pfurtscheller, G., Aranibar, A., 1979. Evaluation of event-related desyn- chronization (ERD) preceding and following voluntary self-paced movement. Electroencephalography and Clinical Neurophysiology 46, 138–146.&lt;br /&gt;
* Pfurtscheller, G., Flotzinger, D., Neuper, C., 1994. Differentiation between finger, toe and tongue movement in man based on 40 Hz EEG. Electroencephalography and Clinical Neurophysiology 90, 456–60.&lt;br /&gt;
* Pfurtscheller, G., Lopes da Silva, F. H., 1999. Event-related EEG/MEG synchronization and desynchronization: basic principles. Clinical Neurophysiology 110, 1842–57.&lt;br /&gt;
* Pfurtscheller, G., 1999. Quantification of ERD and ERS in the time domain. In: W Pfurtscheller, G., Lopes da Silva, F. H. (Eds.), Event-related desynchroni- zation. Vol. 6. Elsevier, p. 89–105.&lt;br /&gt;
* Pfurtscheller, G., Neuper, C., 2006. Future prospects of ERD/ERS in the context of brain-computer interface (BCI) developments. Progress in Brain Research 159, 433–437.&lt;br /&gt;
* Pfurtscheller, G., Stancak Jr, A., C., N., 1996a. Post-movement beta synchronization. A correlate of an idling motor area? Electroencephalography and Clinical Neurophysiology 98, 281–93.&lt;br /&gt;
* Pfurtscheller, G., Stancak Jr, A., Neuper, C., 1996b. Event-related synchronization (ERS) in the alpha band—an electrophysiological correlate of cortical idling: a review. International Journal of Psychophysiology 24, 39–46.&lt;br /&gt;
*Tallon-Baudry, C., Bertrand, O., 1999. Oscillatory gamma activity in humans and its role in object representation. Trends Cogn. Sci. 3, 151–62.&lt;br /&gt;
* Tallon-Baudry, C., Bertrand, O., Delpuech, C., Pernier, J., 1996. Stimulus specificity of phase-locked and non-phase-locked 40 Hz visual responses in human. The Journal of Neuroscience 16, 4240–4249.&lt;/div&gt;</summary>
		<author><name>Maciek</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG_2/ERDS&amp;diff=11518</id>
		<title>Pracownia EEG 2/ERDS</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG_2/ERDS&amp;diff=11518"/>
		<updated>2025-12-09T09:54:51Z</updated>

		<summary type="html">&lt;p&gt;Maciek: /* Wyznaczenie pasma &amp;amp;mu; i &amp;amp;beta; */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Pracownia EEG 2|Pracownia EEG 2]] / ERD/S&lt;br /&gt;
&lt;br /&gt;
=Wstęp=&lt;br /&gt;
Wśród badań wykonywanych z wykorzystaniem rejestracji EEG czy MEG można wyróżnić badania spoczynkowe, gdzie rejestrowana jest spontaniczna aktywność mózgu oraz badania zmian aktywności pod wpływem różnych bodźców, przy czym bodźce te mogą być pochodzenia egzo- lub endogennego. Reakcja na bodziec może wykazywać stały związek fazowy z momentem wystąpienia bodźca &amp;amp;mdash; w takiej sytuacji mówimy o potencjałach lub polach wywołanych (ang. ''event related potential'', ''ERP'' i ''event related field'', ''ERF'') &amp;amp;mdash; lub też może nie być fazowo związana z bodźcem.&lt;br /&gt;
&lt;br /&gt;
Niniejsza część pracowni poświęcona jest metodologii badania reakcji mózgu na bodźce, które są czasowo ale niekoniecznie fazowo związane z bodźcem.&lt;br /&gt;
&lt;br /&gt;
=Zmiany pasmowej mocy sygnału EEG=&lt;br /&gt;
Pierwsze rezultaty opisujące zmiany w mocy pasmowej sygnału EEG (spadek mocy rytmu alfa) związane z reakcją na bodziec zostały opisane w pracy doktorskiej Adolf Becka zatytułowanej &amp;amp;bdquo;Oznaczenie lokalizacyi w mózgu i rdzeniu za pomocą zjawisk elektrycznych&amp;amp;rdquo; (Beck,  1891). &lt;br /&gt;
Ilościowe badania zjawisk modulacji mocy sygnału EEG w reakcji na bodźce rozpoczęto stosunkowo niedawno. Począwszy od pracy (Pfurtscheller, 1979) zjawiska te zaczęto nazywać ''Event Related Desynchronization'' (ERD) &amp;amp;mdash; czyli desynchronizacja związana z bodźcem. Termin ERD dotyczy spadku mocy. Przez analogię w późniejszych pracach terminem ''Event Related Synchronization'' (ERS) opisywane są efekty polegające na wzroście mocy. W większości paradygmatów eksperymentalnych zjawiska ERD i ERS są małe w porównaniu ze zmiennością mocy sygnału EEG związanej ze spontaniczną aktywnością mózgu. W celu ich ilościowego badania wymagane jest zarejestrowanie wielu realizacji reakcji na bodziec i poddanie ich analizie statystycznej. &lt;br /&gt;
&lt;br /&gt;
[[Plik:Paradygmat erds.gif|thumb|800px|center]]&lt;br /&gt;
==Interpretacja fizjologiczna==&lt;br /&gt;
[[Plik:EEG_synchronicznosc.png|600px|thumb|right|Synchronicznie pobudzana grupa neuronów piramidalnych kory tworzy warstwę dipolową.]]&lt;br /&gt;
[[Plik:Mapka_tf_erds.png|600px|thumb|right|Przykładowa mapa zjawiska synchronizacji i desynchronizacji sygnału EEG w przestrzeni czas-częstość dla sygnału zearejestrowanego przez elektrodę C3. Osoba badana wykonywała szybki ruch palcem w momencie oznaczonym 0. Kolory odpowiadają procentowej zmianie mocy względem poprzedzającego okresu 2 s, zgodnie ze skalą barw umieszczoną po prawej stronie.  Na poziomej osi — czas w s, na pionowej częstość w Hz.]]&lt;br /&gt;
Terminy ERD i ERS mają swoje źródło w fizjologicznej interpretacji zmian mocy sygnału w określonych pasmach częstości.  Źródłem mierzalnego na powierzchni głowy sygnału elektrycznego lub magnetycznego jest synchroniczna aktywność wielu neuronów (głównie piramidalnych kory). Szacuje się, że wpływ na wielkość sygnału EEG lub MEG ma głównie stopień synchronizacji neuronów wytwarzających ten sygnał, a w drugiej kolejności ich ilość (Nunez, 1981). Tak więc wzrost mocy w pewnym paśmie (np. alfa ERS) interpretowany jest jako wzrost synchronizacji aktywności neuronów generujących aktywność EEG w tym paśmie, zaś spadek mocy (np. alfa ERD) interpretowany jest jako spadek synchronizacji neuronów generujących aktywność EEG w tym paśmie częstości. Przy takiej interpretacji należy pamiętać o skali w jakiej dokonywany jest pomiar. Zarówno elektrody EEG jak i cewki MEG mierzą sygnały średnie pochodzące od olbrzymich ilości neuronów. Zatem zmiana mocy w tym sygnale odpowiada desynchronizacji lub synchronizacji w skali makroskopowej (rzędu 10&amp;lt;sup&amp;gt;6&amp;lt;/sup&amp;gt;-10&amp;lt;sup&amp;gt;8&amp;lt;/sup&amp;gt; neuronów). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zjawiska ERD i ERS badane były zarówno w eksperymentach motorycznych (Pfurtscheller, 1994, Pfurtscheller, 1996a, Pfurtscheller, 1996b , Pfurtscheller, 1999) jak i kognitywistycznych  (Tallon Baudry, 1996, Tallon, 1999, Kaiser, 2003).&lt;br /&gt;
Wnioski płynące z tych prac są takie, że znaczenie zjawisk ERD i ERS zależy od pasma częstości, w którym one występują. Aktywność w paśmie alfa wiązana jest ze stanem spoczynkowym, ERD w paśmie alfa i beta wiązane jest z pobudzeniem danego rejonu kory mózgowej, w którym zjawisko to zachodzi. ERS w paśmie alfa i beta następujący po ERD w tym samym paśmie częstości interpretowany jest najczęściej jako przejaw inhibicji lub kasowania poprzedniego stanu. Z kolei zwiększona aktywność w paśmie gamma jest interpretowana jako przejaw funkcjonalnej aktywacji danego fragmentu kory. Nowe wyniki pojawiają się na bieżąco i stawiane są nowe pytania co do możliwych interpretacji poszczególnych zjawisk  np. (Crone, 2010).&lt;br /&gt;
&lt;br /&gt;
Oprócz motywacji czysto poznawczych, badania zjawisk ERD i ERS stymulowane są przez praktyczne możliwości ich wykorzystania w diagnostyce epilepsji, gdzie są nadzieje na zastosowanie tej techniki w miejsce bardziej inwazyjnej metody mapowania mózgu przez elektrostymulację (Crone 1998a, Crone, 1998b, Crone, 2006) oraz w konstrukcji interfejsów mózg-komputer (Pfurtscheller, 2006).&lt;br /&gt;
[[Plik:Mapowanie.png|thumb|600px|center|Mapowanie kory czuciowo-ruchowej za pomocą stymulacji: dwie falki – bezwolne reakcje ruchowe, trzy falki – kloniczny skurcz mięśni, za Crone, 1998]]&lt;br /&gt;
[[Plik:Mapki_ECoG.jpg|thumb|600px|center|Mapowanie kory czuciowo-ruchowej za pomocą ERD/ERS.Pacjent z przyczyn medycznych miał umieszczoną na korze motorycznej siatkę elektrod (6×8, odstęp 1 cm). Pacjent miał zaciskać pięść w odpowiedzi na bodziec wzrokowy przez cały czas trwania bodźca (3 s)&lt;br /&gt;
Prezentowane mapy istotnych statystycznie zmian uzyskano na podstawie 49 wolnych od artefaktów realizacji.]]&lt;br /&gt;
&lt;br /&gt;
==Estymacja zmian mocy sygnału EEG w dziedzinie czasu==&lt;br /&gt;
Przebieg czasowy zjawiska ERD i ERS jest specyficzny dla pasm częstości.&lt;br /&gt;
[[Grafika:ERDS klasycznie_1.png|right|thumb|768px|&amp;lt;figure id=&amp;quot;fig:erds_klasycznie&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt; Klasyczne obliczanie ERD/ERS. &amp;lt;br&amp;gt; a) Przykładowy zapis EEG jednej z ''N'' realizacji  &amp;lt;br&amp;gt; b) przefiltrowany sygnał EEG w wybranym paśmie (tutaj: [15 25] Hz)&amp;lt;br&amp;gt;  c) przefiltrowany sygnał podniesiony do kwadratu &amp;amp;mdash; w ten sposób uzyskujemy przebieg mocy pasmowej w czasie &amp;lt;br&amp;gt; d) uśredniony po realizacjach przebieg mocy pasmowej w czasie &amp;lt;br&amp;gt; e) wygładzony przebieg z d) za pomocą średniej biegnącej (tutaj okienko 0,25 s); czerwone pionowe linie wyznaczają okres referencyjny &amp;lt;br&amp;gt; f) ERD/ERS — względna zmiana sygnału e) w odniesieniu do okresu referencyjnego.]]&lt;br /&gt;
Klasyczny sposób estymowania  ERD i ERS (Pfurtscheller, 1979) polega na (patrz ilustracja): &lt;br /&gt;
*filtrowaniu pasmowym,&lt;br /&gt;
*wyrównaniu realizacji względem momentu wystąpienia bodźca, &lt;br /&gt;
*obliczaniu mocy chwilowej (podniesienie do kwadratu wartości każdej próbki sygnału), &lt;br /&gt;
*uśrednieniu mocy chwilowej po realizacjach, wygładzeniu przebiegu czasowego uśrednionej mocy chwilowej filtrem dolnoprzepustowym.&lt;br /&gt;
*Następnie względna zmiana mocy obliczana jest jako:&lt;br /&gt;
: &amp;lt;math&amp;gt;\mathrm{ERD/ERS}_f(t) = \frac{P_f(t) - R_f}{R_f}  &amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie:&lt;br /&gt;
''P''&amp;lt;sub&amp;gt;''f ''&amp;lt;/sub&amp;gt;(''t'') &amp;amp;mdash; średnia moc chwilowa w paśmie częstości ''f''; uśrednianie przebiega po realizacjach.&lt;br /&gt;
''R''&amp;lt;sub&amp;gt;''f''&amp;lt;/sub&amp;gt; &amp;amp;mdash; średnia moc w paśmie ''f'' w okresie referencyjnym; uśrednianie przebiega po realizacjach i po czasie trwania okresu referencyjnego.&lt;br /&gt;
Klasycznym metodom obliczania ERD/ERS poświęcona jest praca (Pfurtscheller, 1999).&lt;br /&gt;
Całościowy obraz zmian mocy sygnału EEG związanych z bodźcem można dogodnie analizować w dziedzinie czas-częstość.&lt;br /&gt;
&lt;br /&gt;
=Cwiczenia=&lt;br /&gt;
&lt;br /&gt;
==Paradygmat ==&lt;br /&gt;
&lt;br /&gt;
===wersja 1===&lt;br /&gt;
Osoba badana siedzi wygodnie i trzyma przycisk podłączony do triggera.&lt;br /&gt;
Na ekranie w odstępach 13&amp;lt;math&amp;gt;\pm&amp;lt;/math&amp;gt;1 sekund wyświetlany jest krzyżyk. Krzyżyk wyświetlany jest przez 2 sekundy. W przeciągu 2 sekund po zniknięciu krzyżyka osoba badana w wybranym przez siebie momencie wciska przycisk. Proszę zarejestrować 60 realizacji.&lt;br /&gt;
&lt;br /&gt;
Przygotuj program implementujący powyższy paradygmat.&lt;br /&gt;
&lt;br /&gt;
===wersja 2===&lt;br /&gt;
Próba rozróżnienia ruchów lewą i prawą ręką &amp;amp;mdash; jak w BCI; na podstawie artykułu [[file:ERDS.BCI.TNSRE2012.pdf]], oczywiście w uproszczonej wersji :-)&lt;br /&gt;
&lt;br /&gt;
Procedura:&lt;br /&gt;
&lt;br /&gt;
Osoba badana ma za zadanie poruszać palcami (wskazującym oraz środkowym) prawej lub lewej ręki. Na ekranie monitora pojawia się strzałka, która widoczna jest przez okres 3 sek. i wskazuje rękę, którą będzie wykonywany ruch. Osoba badana ma ruszyć wskazaną ręką w wybranym przez siebie momencie PO zniknięciu strzałki. &lt;br /&gt;
Dla każdej ręki przewidziane jest 100 powtórzeń. W celu synchronizacji sygnału EEG ze wskazówkami pojawiającymi się na ekranie monitora, w lewym dolnym rogu (gdzie pojawia się biały kwadrat) powinna zostać umieszczona fotodioda. &lt;br /&gt;
&lt;br /&gt;
Rejestracja sygnału:&lt;br /&gt;
&lt;br /&gt;
Wykorzystujemy następujące elektrody umieszczone zgodnie z systemem 10--10: FC3, FC1, FCz, FC2, FC4, C5, C3, C1, Cz, C2, C4, C6, CP5, CP3, CP1, CPz, CP2, CP4, CP6, P1, P2, A1, A2. Dodatkowo wykonujemy pomiar z mięśnia extensor digitorum. W tym celu na obu rękach umieszczamy elektrody bipolarne do EMG (patrz Fig. 1 (elektroda ED3): http://jn.physiology.org/content/100/6/3225.long). Sygnał rejestrujemy z częstością 512 Hz.&lt;br /&gt;
&lt;br /&gt;
Procedura może zostać pobrana ze stony: https://github.com/mroja/signal_utils/tree/master/erds/arrows.&lt;br /&gt;
&lt;br /&gt;
===wersja 3=== &lt;br /&gt;
Osoba ma za zadanie ruszać ręką prawą/lewą/nogą lub wyobrażać sobie ruch prawą/lewą/nogą.W bloku pierwszym powienien być ruch, w drugim wyobrażenie. Na ekranie powinna zostać wyświetlona instrukcja, w której opisany jest cel badania. Następnie rozpoczyna się blok prób, w trakcie poszczególnej próby wyświetlane jest polecenie: &amp;amp;bdquo;Rusz ręką&amp;amp;rdquo;/&amp;amp;bdquo;Wyobraź sobie ruch ręką&amp;amp;rdquo; na 1 s, następnie 5 s przerwy (pusty ekran). Każde polecenie powinno być powtórzone 80 razy. &lt;br /&gt;
&lt;br /&gt;
W trakcie procedury powinien być zbierany sygnał EEG oraz EMG palca. Wykorzystujemy następujące elektrody EEG umieszczone zgodnie z systemem 10-10: FC3, FC1, FCz, FC2, FC4, C5, C3, C1, Cz, C2, C4, C6, CP5, CP3, CP1, CPz, CP2, CP4, CP6, P1, P2, A1, A2. częstość próbkowania: min. 256 Hz. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--Analiza:&lt;br /&gt;
# ERD/S w pasmach&lt;br /&gt;
# uśrednione mapy czas-częstość osobno dla ruchu lewą i prawą ręką&lt;br /&gt;
# analiza możliwości rozróżnienia ruchu na podstawie EEG&lt;br /&gt;
&lt;br /&gt;
Uśrednianie spektrogramów wykonujemy samodzielnie w Pythonie, a na deser liczymy estymatę średnich rozkładów czas-częstość z MP:&lt;br /&gt;
&lt;br /&gt;
# eksportujemy tagi znalezione na podstawie EMG https://brain.fuw.edu.pl/edu/EEG:Pracownia_EEG/SSVEP_1#.C4.86wiczenie_dla_ch.C4.99tnych i oglądamy w Svarogu wyniki na tle sygnału&lt;br /&gt;
# ściągamy najnowszą wersję Svaroga z http://braintech.pl/svarog, umożliwiającą uśrednianie map&lt;br /&gt;
# Otwieramy w Svarogu plik sygnału wraz z tagami.&lt;br /&gt;
# Ustalamy odpowiedni montaż i filtrowanie sygnału.&lt;br /&gt;
# Uruchamiamy dekompozycję MP (Tools → MP decomposition) wybierając w ustawieniach (zakładka „Signal selection” → zakładka „Marked”)&lt;br /&gt;
## rodzaj taga oznaczającego kolejne powtórzenia&lt;br /&gt;
## początek i długość trwania analizowanego interwału czasu (w sekundach, względem wystąpienia taga)&lt;br /&gt;
&lt;br /&gt;
Po zakończeniu obliczeń otwieramy rezultat w nowym oknie („Get result”). Obliczona w ten sposób „książka” składa się z dekompozycji MP kolejnych powtórzeń eksperymentu, przedstawionych w postaci map czas-częstość. Otrzymane mapy możemy następnie uśrednić (Tools → Average books) i zapisać do pliku graficznego o ustalonej rozdzielczości.--&amp;gt;&lt;br /&gt;
&amp;lt;!--==Rejestracja sygnału==&lt;br /&gt;
[[Plik:10_20zAFz.png|thumb| 600px|right]]&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 5 k&amp;lt;math&amp;gt;\Omega&amp;lt;/math&amp;gt; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%.&lt;br /&gt;
# Elektrody referencyjne A1 i A2.&lt;br /&gt;
# Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz).&lt;br /&gt;
# Sygnał rejestrujemy z częstością 256 Hz.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Analiza==&lt;br /&gt;
Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
&lt;br /&gt;
===Wyznaczenie pasma &amp;amp;mu; i &amp;amp;beta;===&lt;br /&gt;
# Z sygnału wycinamy fragmenty od &amp;amp;minus;3 do &amp;amp;minus;1 sek. dla elektrod C3, C4 i Cz (elektrody położone nad korą ruchową dłoni/nogi). &lt;br /&gt;
# Dla każdej realizacji obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane widma uśredniamy po realizacjach.&lt;br /&gt;
# Z sygnału wycinamy fragmenty od +0,5 do +2,5 sek. dla elektrod C3, C4 i Cz (elektrody położone nad korą ruchową dłoni/nogi). &lt;br /&gt;
# Dla każdej realizacji obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane widma uśredniamy po realizacjach.&lt;br /&gt;
# Wykreśl widma z okresu poprzedzającego ruch i z okresu po ruchu nałożone na siebie, a także względną zmianę widma. Zaobserwuj w jakich zakresach częstości &amp;amp;mu; (pasmo około 10 Hz) i &amp;amp;beta; (około 23 Hz) występują największe zmiany.&lt;br /&gt;
#Dla wersji 3 &amp;amp;mdash; te same operacje wykonaj dla warunku wyobrażonego ruchu &amp;amp;mdash; w pierwszym kroku należy ocenić na podstawie sygnału EMG, czy został wykonany ruch &amp;amp;mdash; jeśli tak &amp;amp;mdash; próbę taką należy usunąć z analiz. Jako punkt 0 będziemy brać początek polecenia na podstawie tagów.&lt;br /&gt;
&lt;br /&gt;
===Wyznaczenie przebiegu czasowego ERD i ERS ===&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Chebyszewa 2 rodzaju) zgodne z wyznaczonymi pasmami. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;3 do +3 sekund (wszystkie kanały). Przefiltruj każdą realizację. &lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat amplitudy chwilowej).&lt;br /&gt;
# Uśrednij moc chwilową po realizacjach.&lt;br /&gt;
# Oblicz względną zmianę mocy chwilowej względem czasu &amp;amp;minus;3 do &amp;amp;minus;1. W ten sposób otrzymasz przebieg ERD i ERS w czasie.&lt;br /&gt;
# Wykreśl ERD i ERS w układzie topograficznym. (Rozmieść subploty tak, aby z w przybliżeniu odpowiadały pozycjom elektrod).&lt;br /&gt;
&lt;br /&gt;
===Wyznaczenie przebiegu czasowego ERD i ERS wersja w roku 2024===&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Chebyszewa 2 rodzaju) zgodne z wyznaczonymi pasmami. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Przefiltruj wszystkie kanały danych: osobno w pasmie alfa i osobno w pasmie beta.&lt;br /&gt;
# Powycinaj realizacje zgodnie położeniem tagów (czas 0 s) od &amp;amp;minus;2 do +4,5 sekund (wszystkie kanały).&lt;br /&gt;
# Kolejne etapy analizy wykonujemy osobno dla pasm alfa i beta.&lt;br /&gt;
# Oblicz amplitudę chwilową w każdej realizacji za pomocą transformaty Hilberta.&lt;br /&gt;
# Oblicz moc chwilową podnosząc amplitudy chwilowe do kwadratu.&lt;br /&gt;
# Uśrednij moc chwilową po realizacjach.&lt;br /&gt;
# Oblicz moc referencyjną na odcinku &amp;amp;minus;1,5 s do &amp;amp;minus;0,5 s w każdym kanale (można sprawdzić też odcinek &amp;amp;minus;2 s do &amp;amp;minus;0,5 s).&lt;br /&gt;
# Oblicz względną zmianę mocy chwilowej — przebieg ERD i ERS w czasie.&lt;br /&gt;
# Wykreśl ERD i ERS w układzie topograficznym. (Rozmieść subploty tak, aby z w przybliżeniu odpowiadały pozycjom elektrod).&lt;br /&gt;
&lt;br /&gt;
===Transformacja Hjortha===&lt;br /&gt;
Transformacja Hjortha jest przybliżeniem numerycznym transformacji Laplace'a, czyli drugiej pochodnej przestrzennej.&lt;br /&gt;
Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
&lt;br /&gt;
Proszę przeliczyć potencjały C3, Cz i C4 na montaż Hjortha oraz powtórzyć analizę ERD/ERS opisaną powyżej.&lt;br /&gt;
Przykładowo dla elektrody C3 montaż Hjortha &amp;lt;math&amp;gt;\mathrm{C3_H}&amp;lt;/math&amp;gt; otrzymuje się w następujący sposób:&lt;br /&gt;
&amp;lt;math&amp;gt;\mathrm{C3_H = C3 - \frac{1}{4}(T3+F3+Cz+P3)}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Literatura=&lt;br /&gt;
* Beck, A., 1891. Oznaczenie lokalizacyi w mózgu i rdzeniu za pomoca zjawisk elektrycznych. Ph.D. thesis, Polska Akademia Umiejętności, Kraków, seria II.&lt;br /&gt;
* Crone, N. E., Miglioretti, D. L., Gordon, B., Lesser, R. P., 1998a. Functional mapping of human sensorimotor cortex with electrocorticigraphic spectral analysis II. Event-related synchronization in the gamma band. Brain 121, 2301–15.&lt;br /&gt;
* Crone, N. E., Miglioretti, D. L., Gordon, B., Sieracki, J. M., Wilson, M. T., Uematsu, S., 1998b. Functional mapping of human sensorimotor cortex with electrocorticographic spectral analysis I. Alpha and beta event-related desynchronization. Brain 121, 2271–99.&lt;br /&gt;
* Crone, N. E., Korzeniewska, A., Franaszczuk, P. J., 2010. Cortical gamma responses: Searching high and low. International Journal of Psychophysiology.&lt;br /&gt;
*Crone, N. E., Sinai, A., Korzeniewska, A., 2006. High-frequency gamma oscilla- tions and human brain mapping with electrocorticography. Progress in Brain Research 159, 275–295.&lt;br /&gt;
* Kaiser, J., Lutzenberger, W., 2003. Induced gamma-band activity and human brain function. Neuroscientist 9, 475–84.&lt;br /&gt;
* Nunez, P. L., 1981. Electric Fields of the Brain. The Neurophysics of EEG. Oxford University Press, New York.&lt;br /&gt;
* Pfurtscheller, G., Aranibar, A., 1979. Evaluation of event-related desyn- chronization (ERD) preceding and following voluntary self-paced movement. Electroencephalography and Clinical Neurophysiology 46, 138–146.&lt;br /&gt;
* Pfurtscheller, G., Flotzinger, D., Neuper, C., 1994. Differentiation between finger, toe and tongue movement in man based on 40 Hz EEG. Electroencephalography and Clinical Neurophysiology 90, 456–60.&lt;br /&gt;
* Pfurtscheller, G., Lopes da Silva, F. H., 1999. Event-related EEG/MEG synchronization and desynchronization: basic principles. Clinical Neurophysiology 110, 1842–57.&lt;br /&gt;
* Pfurtscheller, G., 1999. Quantification of ERD and ERS in the time domain. In: W Pfurtscheller, G., Lopes da Silva, F. H. (Eds.), Event-related desynchroni- zation. Vol. 6. Elsevier, p. 89–105.&lt;br /&gt;
* Pfurtscheller, G., Neuper, C., 2006. Future prospects of ERD/ERS in the context of brain-computer interface (BCI) developments. Progress in Brain Research 159, 433–437.&lt;br /&gt;
* Pfurtscheller, G., Stancak Jr, A., C., N., 1996a. Post-movement beta synchronization. A correlate of an idling motor area? Electroencephalography and Clinical Neurophysiology 98, 281–93.&lt;br /&gt;
* Pfurtscheller, G., Stancak Jr, A., Neuper, C., 1996b. Event-related synchronization (ERS) in the alpha band—an electrophysiological correlate of cortical idling: a review. International Journal of Psychophysiology 24, 39–46.&lt;br /&gt;
*Tallon-Baudry, C., Bertrand, O., 1999. Oscillatory gamma activity in humans and its role in object representation. Trends Cogn. Sci. 3, 151–62.&lt;br /&gt;
* Tallon-Baudry, C., Bertrand, O., Delpuech, C., Pernier, J., 1996. Stimulus specificity of phase-locked and non-phase-locked 40 Hz visual responses in human. The Journal of Neuroscience 16, 4240–4249.&lt;/div&gt;</summary>
		<author><name>Maciek</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG_2/ERDS&amp;diff=11517</id>
		<title>Pracownia EEG 2/ERDS</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG_2/ERDS&amp;diff=11517"/>
		<updated>2025-12-09T09:52:11Z</updated>

		<summary type="html">&lt;p&gt;Maciek: /* Analiza */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Pracownia EEG 2|Pracownia EEG 2]] / ERD/S&lt;br /&gt;
&lt;br /&gt;
=Wstęp=&lt;br /&gt;
Wśród badań wykonywanych z wykorzystaniem rejestracji EEG czy MEG można wyróżnić badania spoczynkowe, gdzie rejestrowana jest spontaniczna aktywność mózgu oraz badania zmian aktywności pod wpływem różnych bodźców, przy czym bodźce te mogą być pochodzenia egzo- lub endogennego. Reakcja na bodziec może wykazywać stały związek fazowy z momentem wystąpienia bodźca &amp;amp;mdash; w takiej sytuacji mówimy o potencjałach lub polach wywołanych (ang. ''event related potential'', ''ERP'' i ''event related field'', ''ERF'') &amp;amp;mdash; lub też może nie być fazowo związana z bodźcem.&lt;br /&gt;
&lt;br /&gt;
Niniejsza część pracowni poświęcona jest metodologii badania reakcji mózgu na bodźce, które są czasowo ale niekoniecznie fazowo związane z bodźcem.&lt;br /&gt;
&lt;br /&gt;
=Zmiany pasmowej mocy sygnału EEG=&lt;br /&gt;
Pierwsze rezultaty opisujące zmiany w mocy pasmowej sygnału EEG (spadek mocy rytmu alfa) związane z reakcją na bodziec zostały opisane w pracy doktorskiej Adolf Becka zatytułowanej &amp;amp;bdquo;Oznaczenie lokalizacyi w mózgu i rdzeniu za pomocą zjawisk elektrycznych&amp;amp;rdquo; (Beck,  1891). &lt;br /&gt;
Ilościowe badania zjawisk modulacji mocy sygnału EEG w reakcji na bodźce rozpoczęto stosunkowo niedawno. Począwszy od pracy (Pfurtscheller, 1979) zjawiska te zaczęto nazywać ''Event Related Desynchronization'' (ERD) &amp;amp;mdash; czyli desynchronizacja związana z bodźcem. Termin ERD dotyczy spadku mocy. Przez analogię w późniejszych pracach terminem ''Event Related Synchronization'' (ERS) opisywane są efekty polegające na wzroście mocy. W większości paradygmatów eksperymentalnych zjawiska ERD i ERS są małe w porównaniu ze zmiennością mocy sygnału EEG związanej ze spontaniczną aktywnością mózgu. W celu ich ilościowego badania wymagane jest zarejestrowanie wielu realizacji reakcji na bodziec i poddanie ich analizie statystycznej. &lt;br /&gt;
&lt;br /&gt;
[[Plik:Paradygmat erds.gif|thumb|800px|center]]&lt;br /&gt;
==Interpretacja fizjologiczna==&lt;br /&gt;
[[Plik:EEG_synchronicznosc.png|600px|thumb|right|Synchronicznie pobudzana grupa neuronów piramidalnych kory tworzy warstwę dipolową.]]&lt;br /&gt;
[[Plik:Mapka_tf_erds.png|600px|thumb|right|Przykładowa mapa zjawiska synchronizacji i desynchronizacji sygnału EEG w przestrzeni czas-częstość dla sygnału zearejestrowanego przez elektrodę C3. Osoba badana wykonywała szybki ruch palcem w momencie oznaczonym 0. Kolory odpowiadają procentowej zmianie mocy względem poprzedzającego okresu 2 s, zgodnie ze skalą barw umieszczoną po prawej stronie.  Na poziomej osi — czas w s, na pionowej częstość w Hz.]]&lt;br /&gt;
Terminy ERD i ERS mają swoje źródło w fizjologicznej interpretacji zmian mocy sygnału w określonych pasmach częstości.  Źródłem mierzalnego na powierzchni głowy sygnału elektrycznego lub magnetycznego jest synchroniczna aktywność wielu neuronów (głównie piramidalnych kory). Szacuje się, że wpływ na wielkość sygnału EEG lub MEG ma głównie stopień synchronizacji neuronów wytwarzających ten sygnał, a w drugiej kolejności ich ilość (Nunez, 1981). Tak więc wzrost mocy w pewnym paśmie (np. alfa ERS) interpretowany jest jako wzrost synchronizacji aktywności neuronów generujących aktywność EEG w tym paśmie, zaś spadek mocy (np. alfa ERD) interpretowany jest jako spadek synchronizacji neuronów generujących aktywność EEG w tym paśmie częstości. Przy takiej interpretacji należy pamiętać o skali w jakiej dokonywany jest pomiar. Zarówno elektrody EEG jak i cewki MEG mierzą sygnały średnie pochodzące od olbrzymich ilości neuronów. Zatem zmiana mocy w tym sygnale odpowiada desynchronizacji lub synchronizacji w skali makroskopowej (rzędu 10&amp;lt;sup&amp;gt;6&amp;lt;/sup&amp;gt;-10&amp;lt;sup&amp;gt;8&amp;lt;/sup&amp;gt; neuronów). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zjawiska ERD i ERS badane były zarówno w eksperymentach motorycznych (Pfurtscheller, 1994, Pfurtscheller, 1996a, Pfurtscheller, 1996b , Pfurtscheller, 1999) jak i kognitywistycznych  (Tallon Baudry, 1996, Tallon, 1999, Kaiser, 2003).&lt;br /&gt;
Wnioski płynące z tych prac są takie, że znaczenie zjawisk ERD i ERS zależy od pasma częstości, w którym one występują. Aktywność w paśmie alfa wiązana jest ze stanem spoczynkowym, ERD w paśmie alfa i beta wiązane jest z pobudzeniem danego rejonu kory mózgowej, w którym zjawisko to zachodzi. ERS w paśmie alfa i beta następujący po ERD w tym samym paśmie częstości interpretowany jest najczęściej jako przejaw inhibicji lub kasowania poprzedniego stanu. Z kolei zwiększona aktywność w paśmie gamma jest interpretowana jako przejaw funkcjonalnej aktywacji danego fragmentu kory. Nowe wyniki pojawiają się na bieżąco i stawiane są nowe pytania co do możliwych interpretacji poszczególnych zjawisk  np. (Crone, 2010).&lt;br /&gt;
&lt;br /&gt;
Oprócz motywacji czysto poznawczych, badania zjawisk ERD i ERS stymulowane są przez praktyczne możliwości ich wykorzystania w diagnostyce epilepsji, gdzie są nadzieje na zastosowanie tej techniki w miejsce bardziej inwazyjnej metody mapowania mózgu przez elektrostymulację (Crone 1998a, Crone, 1998b, Crone, 2006) oraz w konstrukcji interfejsów mózg-komputer (Pfurtscheller, 2006).&lt;br /&gt;
[[Plik:Mapowanie.png|thumb|600px|center|Mapowanie kory czuciowo-ruchowej za pomocą stymulacji: dwie falki – bezwolne reakcje ruchowe, trzy falki – kloniczny skurcz mięśni, za Crone, 1998]]&lt;br /&gt;
[[Plik:Mapki_ECoG.jpg|thumb|600px|center|Mapowanie kory czuciowo-ruchowej za pomocą ERD/ERS.Pacjent z przyczyn medycznych miał umieszczoną na korze motorycznej siatkę elektrod (6×8, odstęp 1 cm). Pacjent miał zaciskać pięść w odpowiedzi na bodziec wzrokowy przez cały czas trwania bodźca (3 s)&lt;br /&gt;
Prezentowane mapy istotnych statystycznie zmian uzyskano na podstawie 49 wolnych od artefaktów realizacji.]]&lt;br /&gt;
&lt;br /&gt;
==Estymacja zmian mocy sygnału EEG w dziedzinie czasu==&lt;br /&gt;
Przebieg czasowy zjawiska ERD i ERS jest specyficzny dla pasm częstości.&lt;br /&gt;
[[Grafika:ERDS klasycznie_1.png|right|thumb|768px|&amp;lt;figure id=&amp;quot;fig:erds_klasycznie&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt; Klasyczne obliczanie ERD/ERS. &amp;lt;br&amp;gt; a) Przykładowy zapis EEG jednej z ''N'' realizacji  &amp;lt;br&amp;gt; b) przefiltrowany sygnał EEG w wybranym paśmie (tutaj: [15 25] Hz)&amp;lt;br&amp;gt;  c) przefiltrowany sygnał podniesiony do kwadratu &amp;amp;mdash; w ten sposób uzyskujemy przebieg mocy pasmowej w czasie &amp;lt;br&amp;gt; d) uśredniony po realizacjach przebieg mocy pasmowej w czasie &amp;lt;br&amp;gt; e) wygładzony przebieg z d) za pomocą średniej biegnącej (tutaj okienko 0,25 s); czerwone pionowe linie wyznaczają okres referencyjny &amp;lt;br&amp;gt; f) ERD/ERS — względna zmiana sygnału e) w odniesieniu do okresu referencyjnego.]]&lt;br /&gt;
Klasyczny sposób estymowania  ERD i ERS (Pfurtscheller, 1979) polega na (patrz ilustracja): &lt;br /&gt;
*filtrowaniu pasmowym,&lt;br /&gt;
*wyrównaniu realizacji względem momentu wystąpienia bodźca, &lt;br /&gt;
*obliczaniu mocy chwilowej (podniesienie do kwadratu wartości każdej próbki sygnału), &lt;br /&gt;
*uśrednieniu mocy chwilowej po realizacjach, wygładzeniu przebiegu czasowego uśrednionej mocy chwilowej filtrem dolnoprzepustowym.&lt;br /&gt;
*Następnie względna zmiana mocy obliczana jest jako:&lt;br /&gt;
: &amp;lt;math&amp;gt;\mathrm{ERD/ERS}_f(t) = \frac{P_f(t) - R_f}{R_f}  &amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie:&lt;br /&gt;
''P''&amp;lt;sub&amp;gt;''f ''&amp;lt;/sub&amp;gt;(''t'') &amp;amp;mdash; średnia moc chwilowa w paśmie częstości ''f''; uśrednianie przebiega po realizacjach.&lt;br /&gt;
''R''&amp;lt;sub&amp;gt;''f''&amp;lt;/sub&amp;gt; &amp;amp;mdash; średnia moc w paśmie ''f'' w okresie referencyjnym; uśrednianie przebiega po realizacjach i po czasie trwania okresu referencyjnego.&lt;br /&gt;
Klasycznym metodom obliczania ERD/ERS poświęcona jest praca (Pfurtscheller, 1999).&lt;br /&gt;
Całościowy obraz zmian mocy sygnału EEG związanych z bodźcem można dogodnie analizować w dziedzinie czas-częstość.&lt;br /&gt;
&lt;br /&gt;
=Cwiczenia=&lt;br /&gt;
&lt;br /&gt;
==Paradygmat ==&lt;br /&gt;
&lt;br /&gt;
===wersja 1===&lt;br /&gt;
Osoba badana siedzi wygodnie i trzyma przycisk podłączony do triggera.&lt;br /&gt;
Na ekranie w odstępach 13&amp;lt;math&amp;gt;\pm&amp;lt;/math&amp;gt;1 sekund wyświetlany jest krzyżyk. Krzyżyk wyświetlany jest przez 2 sekundy. W przeciągu 2 sekund po zniknięciu krzyżyka osoba badana w wybranym przez siebie momencie wciska przycisk. Proszę zarejestrować 60 realizacji.&lt;br /&gt;
&lt;br /&gt;
Przygotuj program implementujący powyższy paradygmat.&lt;br /&gt;
&lt;br /&gt;
===wersja 2===&lt;br /&gt;
Próba rozróżnienia ruchów lewą i prawą ręką &amp;amp;mdash; jak w BCI; na podstawie artykułu [[file:ERDS.BCI.TNSRE2012.pdf]], oczywiście w uproszczonej wersji :-)&lt;br /&gt;
&lt;br /&gt;
Procedura:&lt;br /&gt;
&lt;br /&gt;
Osoba badana ma za zadanie poruszać palcami (wskazującym oraz środkowym) prawej lub lewej ręki. Na ekranie monitora pojawia się strzałka, która widoczna jest przez okres 3 sek. i wskazuje rękę, którą będzie wykonywany ruch. Osoba badana ma ruszyć wskazaną ręką w wybranym przez siebie momencie PO zniknięciu strzałki. &lt;br /&gt;
Dla każdej ręki przewidziane jest 100 powtórzeń. W celu synchronizacji sygnału EEG ze wskazówkami pojawiającymi się na ekranie monitora, w lewym dolnym rogu (gdzie pojawia się biały kwadrat) powinna zostać umieszczona fotodioda. &lt;br /&gt;
&lt;br /&gt;
Rejestracja sygnału:&lt;br /&gt;
&lt;br /&gt;
Wykorzystujemy następujące elektrody umieszczone zgodnie z systemem 10--10: FC3, FC1, FCz, FC2, FC4, C5, C3, C1, Cz, C2, C4, C6, CP5, CP3, CP1, CPz, CP2, CP4, CP6, P1, P2, A1, A2. Dodatkowo wykonujemy pomiar z mięśnia extensor digitorum. W tym celu na obu rękach umieszczamy elektrody bipolarne do EMG (patrz Fig. 1 (elektroda ED3): http://jn.physiology.org/content/100/6/3225.long). Sygnał rejestrujemy z częstością 512 Hz.&lt;br /&gt;
&lt;br /&gt;
Procedura może zostać pobrana ze stony: https://github.com/mroja/signal_utils/tree/master/erds/arrows.&lt;br /&gt;
&lt;br /&gt;
===wersja 3=== &lt;br /&gt;
Osoba ma za zadanie ruszać ręką prawą/lewą/nogą lub wyobrażać sobie ruch prawą/lewą/nogą.W bloku pierwszym powienien być ruch, w drugim wyobrażenie. Na ekranie powinna zostać wyświetlona instrukcja, w której opisany jest cel badania. Następnie rozpoczyna się blok prób, w trakcie poszczególnej próby wyświetlane jest polecenie: &amp;amp;bdquo;Rusz ręką&amp;amp;rdquo;/&amp;amp;bdquo;Wyobraź sobie ruch ręką&amp;amp;rdquo; na 1 s, następnie 5 s przerwy (pusty ekran). Każde polecenie powinno być powtórzone 80 razy. &lt;br /&gt;
&lt;br /&gt;
W trakcie procedury powinien być zbierany sygnał EEG oraz EMG palca. Wykorzystujemy następujące elektrody EEG umieszczone zgodnie z systemem 10-10: FC3, FC1, FCz, FC2, FC4, C5, C3, C1, Cz, C2, C4, C6, CP5, CP3, CP1, CPz, CP2, CP4, CP6, P1, P2, A1, A2. częstość próbkowania: min. 256 Hz. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--Analiza:&lt;br /&gt;
# ERD/S w pasmach&lt;br /&gt;
# uśrednione mapy czas-częstość osobno dla ruchu lewą i prawą ręką&lt;br /&gt;
# analiza możliwości rozróżnienia ruchu na podstawie EEG&lt;br /&gt;
&lt;br /&gt;
Uśrednianie spektrogramów wykonujemy samodzielnie w Pythonie, a na deser liczymy estymatę średnich rozkładów czas-częstość z MP:&lt;br /&gt;
&lt;br /&gt;
# eksportujemy tagi znalezione na podstawie EMG https://brain.fuw.edu.pl/edu/EEG:Pracownia_EEG/SSVEP_1#.C4.86wiczenie_dla_ch.C4.99tnych i oglądamy w Svarogu wyniki na tle sygnału&lt;br /&gt;
# ściągamy najnowszą wersję Svaroga z http://braintech.pl/svarog, umożliwiającą uśrednianie map&lt;br /&gt;
# Otwieramy w Svarogu plik sygnału wraz z tagami.&lt;br /&gt;
# Ustalamy odpowiedni montaż i filtrowanie sygnału.&lt;br /&gt;
# Uruchamiamy dekompozycję MP (Tools → MP decomposition) wybierając w ustawieniach (zakładka „Signal selection” → zakładka „Marked”)&lt;br /&gt;
## rodzaj taga oznaczającego kolejne powtórzenia&lt;br /&gt;
## początek i długość trwania analizowanego interwału czasu (w sekundach, względem wystąpienia taga)&lt;br /&gt;
&lt;br /&gt;
Po zakończeniu obliczeń otwieramy rezultat w nowym oknie („Get result”). Obliczona w ten sposób „książka” składa się z dekompozycji MP kolejnych powtórzeń eksperymentu, przedstawionych w postaci map czas-częstość. Otrzymane mapy możemy następnie uśrednić (Tools → Average books) i zapisać do pliku graficznego o ustalonej rozdzielczości.--&amp;gt;&lt;br /&gt;
&amp;lt;!--==Rejestracja sygnału==&lt;br /&gt;
[[Plik:10_20zAFz.png|thumb| 600px|right]]&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 5 k&amp;lt;math&amp;gt;\Omega&amp;lt;/math&amp;gt; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%.&lt;br /&gt;
# Elektrody referencyjne A1 i A2.&lt;br /&gt;
# Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz).&lt;br /&gt;
# Sygnał rejestrujemy z częstością 256 Hz.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Analiza==&lt;br /&gt;
Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
&lt;br /&gt;
===Wyznaczenie pasma &amp;amp;mu; i &amp;amp;beta;===&lt;br /&gt;
# Z sygnału wycinamy fragmenty od &amp;amp;minus;3 do &amp;amp;minus;1 sek. dla elektrod C3 i C4 (elektrody położone nad korą ruchową dłoni). &lt;br /&gt;
# Dla każdej realizacji obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane widma uśredniamy po realizacjach.&lt;br /&gt;
# Z sygnału wycinamy fragmenty od +0.5 do +2.5 sek. dla elektrod C3 i C4 (elektrody położone nad korą ruchową dłoni). &lt;br /&gt;
# Dla każdej realizacji obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane widma uśredniamy po realizacjach.&lt;br /&gt;
# Wykreśl widma z okresu poprzedzającego ruch i z okresu po ruchu nałożone na siebie, a także względną zmianę widma. Zaobserwuj w jakich zakresach częstości &amp;amp;mu; (pasmo około 10 Hz) i &amp;amp;beta; (około 23 Hz) występują największe zmiany.&lt;br /&gt;
#Dla wersji 3 - te same operacje wykonaj dla warunku wyobrażonego ruchu - w pierwszym kroku należy ocenić na podstawie sygnału EMG, czy został wykonany ruch - jeśli tak - próbę taką należy usunąć z analiz. Jako punkt 0 będziemy brać początek polecenia na podstawie tagów.&lt;br /&gt;
&lt;br /&gt;
===Wyznaczenie przebiegu czasowego ERD i ERS ===&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Chebyszewa 2 rodzaju) zgodne z wyznaczonymi pasmami. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;3 do +3 sekund (wszystkie kanały). Przefiltruj każdą realizację. &lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat amplitudy chwilowej).&lt;br /&gt;
# Uśrednij moc chwilową po realizacjach.&lt;br /&gt;
# Oblicz względną zmianę mocy chwilowej względem czasu &amp;amp;minus;3 do &amp;amp;minus;1. W ten sposób otrzymasz przebieg ERD i ERS w czasie.&lt;br /&gt;
# Wykreśl ERD i ERS w układzie topograficznym. (Rozmieść subploty tak, aby z w przybliżeniu odpowiadały pozycjom elektrod).&lt;br /&gt;
&lt;br /&gt;
===Wyznaczenie przebiegu czasowego ERD i ERS wersja w roku 2024===&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Chebyszewa 2 rodzaju) zgodne z wyznaczonymi pasmami. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Przefiltruj wszystkie kanały danych: osobno w pasmie alfa i osobno w pasmie beta.&lt;br /&gt;
# Powycinaj realizacje zgodnie położeniem tagów (czas 0 s) od &amp;amp;minus;2 do +4,5 sekund (wszystkie kanały).&lt;br /&gt;
# Kolejne etapy analizy wykonujemy osobno dla pasm alfa i beta.&lt;br /&gt;
# Oblicz amplitudę chwilową w każdej realizacji za pomocą transformaty Hilberta.&lt;br /&gt;
# Oblicz moc chwilową podnosząc amplitudy chwilowe do kwadratu.&lt;br /&gt;
# Uśrednij moc chwilową po realizacjach.&lt;br /&gt;
# Oblicz moc referencyjną na odcinku &amp;amp;minus;1,5 s do &amp;amp;minus;0,5 s w każdym kanale (można sprawdzić też odcinek &amp;amp;minus;2 s do &amp;amp;minus;0,5 s).&lt;br /&gt;
# Oblicz względną zmianę mocy chwilowej — przebieg ERD i ERS w czasie.&lt;br /&gt;
# Wykreśl ERD i ERS w układzie topograficznym. (Rozmieść subploty tak, aby z w przybliżeniu odpowiadały pozycjom elektrod).&lt;br /&gt;
&lt;br /&gt;
===Transformacja Hjortha===&lt;br /&gt;
Transformacja Hjortha jest przybliżeniem numerycznym transformacji Laplace'a, czyli drugiej pochodnej przestrzennej.&lt;br /&gt;
Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
&lt;br /&gt;
Proszę przeliczyć potencjały C3, Cz i C4 na montaż Hjortha oraz powtórzyć analizę ERD/ERS opisaną powyżej.&lt;br /&gt;
Przykładowo dla elektrody C3 montaż Hjortha &amp;lt;math&amp;gt;\mathrm{C3_H}&amp;lt;/math&amp;gt; otrzymuje się w następujący sposób:&lt;br /&gt;
&amp;lt;math&amp;gt;\mathrm{C3_H = C3 - \frac{1}{4}(T3+F3+Cz+P3)}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Literatura=&lt;br /&gt;
* Beck, A., 1891. Oznaczenie lokalizacyi w mózgu i rdzeniu za pomoca zjawisk elektrycznych. Ph.D. thesis, Polska Akademia Umiejętności, Kraków, seria II.&lt;br /&gt;
* Crone, N. E., Miglioretti, D. L., Gordon, B., Lesser, R. P., 1998a. Functional mapping of human sensorimotor cortex with electrocorticigraphic spectral analysis II. Event-related synchronization in the gamma band. Brain 121, 2301–15.&lt;br /&gt;
* Crone, N. E., Miglioretti, D. L., Gordon, B., Sieracki, J. M., Wilson, M. T., Uematsu, S., 1998b. Functional mapping of human sensorimotor cortex with electrocorticographic spectral analysis I. Alpha and beta event-related desynchronization. Brain 121, 2271–99.&lt;br /&gt;
* Crone, N. E., Korzeniewska, A., Franaszczuk, P. J., 2010. Cortical gamma responses: Searching high and low. International Journal of Psychophysiology.&lt;br /&gt;
*Crone, N. E., Sinai, A., Korzeniewska, A., 2006. High-frequency gamma oscilla- tions and human brain mapping with electrocorticography. Progress in Brain Research 159, 275–295.&lt;br /&gt;
* Kaiser, J., Lutzenberger, W., 2003. Induced gamma-band activity and human brain function. Neuroscientist 9, 475–84.&lt;br /&gt;
* Nunez, P. L., 1981. Electric Fields of the Brain. The Neurophysics of EEG. Oxford University Press, New York.&lt;br /&gt;
* Pfurtscheller, G., Aranibar, A., 1979. Evaluation of event-related desyn- chronization (ERD) preceding and following voluntary self-paced movement. Electroencephalography and Clinical Neurophysiology 46, 138–146.&lt;br /&gt;
* Pfurtscheller, G., Flotzinger, D., Neuper, C., 1994. Differentiation between finger, toe and tongue movement in man based on 40 Hz EEG. Electroencephalography and Clinical Neurophysiology 90, 456–60.&lt;br /&gt;
* Pfurtscheller, G., Lopes da Silva, F. H., 1999. Event-related EEG/MEG synchronization and desynchronization: basic principles. Clinical Neurophysiology 110, 1842–57.&lt;br /&gt;
* Pfurtscheller, G., 1999. Quantification of ERD and ERS in the time domain. In: W Pfurtscheller, G., Lopes da Silva, F. H. (Eds.), Event-related desynchroni- zation. Vol. 6. Elsevier, p. 89–105.&lt;br /&gt;
* Pfurtscheller, G., Neuper, C., 2006. Future prospects of ERD/ERS in the context of brain-computer interface (BCI) developments. Progress in Brain Research 159, 433–437.&lt;br /&gt;
* Pfurtscheller, G., Stancak Jr, A., C., N., 1996a. Post-movement beta synchronization. A correlate of an idling motor area? Electroencephalography and Clinical Neurophysiology 98, 281–93.&lt;br /&gt;
* Pfurtscheller, G., Stancak Jr, A., Neuper, C., 1996b. Event-related synchronization (ERS) in the alpha band—an electrophysiological correlate of cortical idling: a review. International Journal of Psychophysiology 24, 39–46.&lt;br /&gt;
*Tallon-Baudry, C., Bertrand, O., 1999. Oscillatory gamma activity in humans and its role in object representation. Trends Cogn. Sci. 3, 151–62.&lt;br /&gt;
* Tallon-Baudry, C., Bertrand, O., Delpuech, C., Pernier, J., 1996. Stimulus specificity of phase-locked and non-phase-locked 40 Hz visual responses in human. The Journal of Neuroscience 16, 4240–4249.&lt;/div&gt;</summary>
		<author><name>Maciek</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG_2/ERDS&amp;diff=11516</id>
		<title>Pracownia EEG 2/ERDS</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG_2/ERDS&amp;diff=11516"/>
		<updated>2025-12-09T09:50:40Z</updated>

		<summary type="html">&lt;p&gt;Maciek: /* wersja 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Pracownia EEG 2|Pracownia EEG 2]] / ERD/S&lt;br /&gt;
&lt;br /&gt;
=Wstęp=&lt;br /&gt;
Wśród badań wykonywanych z wykorzystaniem rejestracji EEG czy MEG można wyróżnić badania spoczynkowe, gdzie rejestrowana jest spontaniczna aktywność mózgu oraz badania zmian aktywności pod wpływem różnych bodźców, przy czym bodźce te mogą być pochodzenia egzo- lub endogennego. Reakcja na bodziec może wykazywać stały związek fazowy z momentem wystąpienia bodźca &amp;amp;mdash; w takiej sytuacji mówimy o potencjałach lub polach wywołanych (ang. ''event related potential'', ''ERP'' i ''event related field'', ''ERF'') &amp;amp;mdash; lub też może nie być fazowo związana z bodźcem.&lt;br /&gt;
&lt;br /&gt;
Niniejsza część pracowni poświęcona jest metodologii badania reakcji mózgu na bodźce, które są czasowo ale niekoniecznie fazowo związane z bodźcem.&lt;br /&gt;
&lt;br /&gt;
=Zmiany pasmowej mocy sygnału EEG=&lt;br /&gt;
Pierwsze rezultaty opisujące zmiany w mocy pasmowej sygnału EEG (spadek mocy rytmu alfa) związane z reakcją na bodziec zostały opisane w pracy doktorskiej Adolf Becka zatytułowanej &amp;amp;bdquo;Oznaczenie lokalizacyi w mózgu i rdzeniu za pomocą zjawisk elektrycznych&amp;amp;rdquo; (Beck,  1891). &lt;br /&gt;
Ilościowe badania zjawisk modulacji mocy sygnału EEG w reakcji na bodźce rozpoczęto stosunkowo niedawno. Począwszy od pracy (Pfurtscheller, 1979) zjawiska te zaczęto nazywać ''Event Related Desynchronization'' (ERD) &amp;amp;mdash; czyli desynchronizacja związana z bodźcem. Termin ERD dotyczy spadku mocy. Przez analogię w późniejszych pracach terminem ''Event Related Synchronization'' (ERS) opisywane są efekty polegające na wzroście mocy. W większości paradygmatów eksperymentalnych zjawiska ERD i ERS są małe w porównaniu ze zmiennością mocy sygnału EEG związanej ze spontaniczną aktywnością mózgu. W celu ich ilościowego badania wymagane jest zarejestrowanie wielu realizacji reakcji na bodziec i poddanie ich analizie statystycznej. &lt;br /&gt;
&lt;br /&gt;
[[Plik:Paradygmat erds.gif|thumb|800px|center]]&lt;br /&gt;
==Interpretacja fizjologiczna==&lt;br /&gt;
[[Plik:EEG_synchronicznosc.png|600px|thumb|right|Synchronicznie pobudzana grupa neuronów piramidalnych kory tworzy warstwę dipolową.]]&lt;br /&gt;
[[Plik:Mapka_tf_erds.png|600px|thumb|right|Przykładowa mapa zjawiska synchronizacji i desynchronizacji sygnału EEG w przestrzeni czas-częstość dla sygnału zearejestrowanego przez elektrodę C3. Osoba badana wykonywała szybki ruch palcem w momencie oznaczonym 0. Kolory odpowiadają procentowej zmianie mocy względem poprzedzającego okresu 2 s, zgodnie ze skalą barw umieszczoną po prawej stronie.  Na poziomej osi — czas w s, na pionowej częstość w Hz.]]&lt;br /&gt;
Terminy ERD i ERS mają swoje źródło w fizjologicznej interpretacji zmian mocy sygnału w określonych pasmach częstości.  Źródłem mierzalnego na powierzchni głowy sygnału elektrycznego lub magnetycznego jest synchroniczna aktywność wielu neuronów (głównie piramidalnych kory). Szacuje się, że wpływ na wielkość sygnału EEG lub MEG ma głównie stopień synchronizacji neuronów wytwarzających ten sygnał, a w drugiej kolejności ich ilość (Nunez, 1981). Tak więc wzrost mocy w pewnym paśmie (np. alfa ERS) interpretowany jest jako wzrost synchronizacji aktywności neuronów generujących aktywność EEG w tym paśmie, zaś spadek mocy (np. alfa ERD) interpretowany jest jako spadek synchronizacji neuronów generujących aktywność EEG w tym paśmie częstości. Przy takiej interpretacji należy pamiętać o skali w jakiej dokonywany jest pomiar. Zarówno elektrody EEG jak i cewki MEG mierzą sygnały średnie pochodzące od olbrzymich ilości neuronów. Zatem zmiana mocy w tym sygnale odpowiada desynchronizacji lub synchronizacji w skali makroskopowej (rzędu 10&amp;lt;sup&amp;gt;6&amp;lt;/sup&amp;gt;-10&amp;lt;sup&amp;gt;8&amp;lt;/sup&amp;gt; neuronów). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zjawiska ERD i ERS badane były zarówno w eksperymentach motorycznych (Pfurtscheller, 1994, Pfurtscheller, 1996a, Pfurtscheller, 1996b , Pfurtscheller, 1999) jak i kognitywistycznych  (Tallon Baudry, 1996, Tallon, 1999, Kaiser, 2003).&lt;br /&gt;
Wnioski płynące z tych prac są takie, że znaczenie zjawisk ERD i ERS zależy od pasma częstości, w którym one występują. Aktywność w paśmie alfa wiązana jest ze stanem spoczynkowym, ERD w paśmie alfa i beta wiązane jest z pobudzeniem danego rejonu kory mózgowej, w którym zjawisko to zachodzi. ERS w paśmie alfa i beta następujący po ERD w tym samym paśmie częstości interpretowany jest najczęściej jako przejaw inhibicji lub kasowania poprzedniego stanu. Z kolei zwiększona aktywność w paśmie gamma jest interpretowana jako przejaw funkcjonalnej aktywacji danego fragmentu kory. Nowe wyniki pojawiają się na bieżąco i stawiane są nowe pytania co do możliwych interpretacji poszczególnych zjawisk  np. (Crone, 2010).&lt;br /&gt;
&lt;br /&gt;
Oprócz motywacji czysto poznawczych, badania zjawisk ERD i ERS stymulowane są przez praktyczne możliwości ich wykorzystania w diagnostyce epilepsji, gdzie są nadzieje na zastosowanie tej techniki w miejsce bardziej inwazyjnej metody mapowania mózgu przez elektrostymulację (Crone 1998a, Crone, 1998b, Crone, 2006) oraz w konstrukcji interfejsów mózg-komputer (Pfurtscheller, 2006).&lt;br /&gt;
[[Plik:Mapowanie.png|thumb|600px|center|Mapowanie kory czuciowo-ruchowej za pomocą stymulacji: dwie falki – bezwolne reakcje ruchowe, trzy falki – kloniczny skurcz mięśni, za Crone, 1998]]&lt;br /&gt;
[[Plik:Mapki_ECoG.jpg|thumb|600px|center|Mapowanie kory czuciowo-ruchowej za pomocą ERD/ERS.Pacjent z przyczyn medycznych miał umieszczoną na korze motorycznej siatkę elektrod (6×8, odstęp 1 cm). Pacjent miał zaciskać pięść w odpowiedzi na bodziec wzrokowy przez cały czas trwania bodźca (3 s)&lt;br /&gt;
Prezentowane mapy istotnych statystycznie zmian uzyskano na podstawie 49 wolnych od artefaktów realizacji.]]&lt;br /&gt;
&lt;br /&gt;
==Estymacja zmian mocy sygnału EEG w dziedzinie czasu==&lt;br /&gt;
Przebieg czasowy zjawiska ERD i ERS jest specyficzny dla pasm częstości.&lt;br /&gt;
[[Grafika:ERDS klasycznie_1.png|right|thumb|768px|&amp;lt;figure id=&amp;quot;fig:erds_klasycznie&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt; Klasyczne obliczanie ERD/ERS. &amp;lt;br&amp;gt; a) Przykładowy zapis EEG jednej z ''N'' realizacji  &amp;lt;br&amp;gt; b) przefiltrowany sygnał EEG w wybranym paśmie (tutaj: [15 25] Hz)&amp;lt;br&amp;gt;  c) przefiltrowany sygnał podniesiony do kwadratu &amp;amp;mdash; w ten sposób uzyskujemy przebieg mocy pasmowej w czasie &amp;lt;br&amp;gt; d) uśredniony po realizacjach przebieg mocy pasmowej w czasie &amp;lt;br&amp;gt; e) wygładzony przebieg z d) za pomocą średniej biegnącej (tutaj okienko 0,25 s); czerwone pionowe linie wyznaczają okres referencyjny &amp;lt;br&amp;gt; f) ERD/ERS — względna zmiana sygnału e) w odniesieniu do okresu referencyjnego.]]&lt;br /&gt;
Klasyczny sposób estymowania  ERD i ERS (Pfurtscheller, 1979) polega na (patrz ilustracja): &lt;br /&gt;
*filtrowaniu pasmowym,&lt;br /&gt;
*wyrównaniu realizacji względem momentu wystąpienia bodźca, &lt;br /&gt;
*obliczaniu mocy chwilowej (podniesienie do kwadratu wartości każdej próbki sygnału), &lt;br /&gt;
*uśrednieniu mocy chwilowej po realizacjach, wygładzeniu przebiegu czasowego uśrednionej mocy chwilowej filtrem dolnoprzepustowym.&lt;br /&gt;
*Następnie względna zmiana mocy obliczana jest jako:&lt;br /&gt;
: &amp;lt;math&amp;gt;\mathrm{ERD/ERS}_f(t) = \frac{P_f(t) - R_f}{R_f}  &amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie:&lt;br /&gt;
''P''&amp;lt;sub&amp;gt;''f ''&amp;lt;/sub&amp;gt;(''t'') &amp;amp;mdash; średnia moc chwilowa w paśmie częstości ''f''; uśrednianie przebiega po realizacjach.&lt;br /&gt;
''R''&amp;lt;sub&amp;gt;''f''&amp;lt;/sub&amp;gt; &amp;amp;mdash; średnia moc w paśmie ''f'' w okresie referencyjnym; uśrednianie przebiega po realizacjach i po czasie trwania okresu referencyjnego.&lt;br /&gt;
Klasycznym metodom obliczania ERD/ERS poświęcona jest praca (Pfurtscheller, 1999).&lt;br /&gt;
Całościowy obraz zmian mocy sygnału EEG związanych z bodźcem można dogodnie analizować w dziedzinie czas-częstość.&lt;br /&gt;
&lt;br /&gt;
=Cwiczenia=&lt;br /&gt;
&lt;br /&gt;
==Paradygmat ==&lt;br /&gt;
&lt;br /&gt;
===wersja 1===&lt;br /&gt;
Osoba badana siedzi wygodnie i trzyma przycisk podłączony do triggera.&lt;br /&gt;
Na ekranie w odstępach 13&amp;lt;math&amp;gt;\pm&amp;lt;/math&amp;gt;1 sekund wyświetlany jest krzyżyk. Krzyżyk wyświetlany jest przez 2 sekundy. W przeciągu 2 sekund po zniknięciu krzyżyka osoba badana w wybranym przez siebie momencie wciska przycisk. Proszę zarejestrować 60 realizacji.&lt;br /&gt;
&lt;br /&gt;
Przygotuj program implementujący powyższy paradygmat.&lt;br /&gt;
&lt;br /&gt;
===wersja 2===&lt;br /&gt;
Próba rozróżnienia ruchów lewą i prawą ręką &amp;amp;mdash; jak w BCI; na podstawie artykułu [[file:ERDS.BCI.TNSRE2012.pdf]], oczywiście w uproszczonej wersji :-)&lt;br /&gt;
&lt;br /&gt;
Procedura:&lt;br /&gt;
&lt;br /&gt;
Osoba badana ma za zadanie poruszać palcami (wskazującym oraz środkowym) prawej lub lewej ręki. Na ekranie monitora pojawia się strzałka, która widoczna jest przez okres 3 sek. i wskazuje rękę, którą będzie wykonywany ruch. Osoba badana ma ruszyć wskazaną ręką w wybranym przez siebie momencie PO zniknięciu strzałki. &lt;br /&gt;
Dla każdej ręki przewidziane jest 100 powtórzeń. W celu synchronizacji sygnału EEG ze wskazówkami pojawiającymi się na ekranie monitora, w lewym dolnym rogu (gdzie pojawia się biały kwadrat) powinna zostać umieszczona fotodioda. &lt;br /&gt;
&lt;br /&gt;
Rejestracja sygnału:&lt;br /&gt;
&lt;br /&gt;
Wykorzystujemy następujące elektrody umieszczone zgodnie z systemem 10--10: FC3, FC1, FCz, FC2, FC4, C5, C3, C1, Cz, C2, C4, C6, CP5, CP3, CP1, CPz, CP2, CP4, CP6, P1, P2, A1, A2. Dodatkowo wykonujemy pomiar z mięśnia extensor digitorum. W tym celu na obu rękach umieszczamy elektrody bipolarne do EMG (patrz Fig. 1 (elektroda ED3): http://jn.physiology.org/content/100/6/3225.long). Sygnał rejestrujemy z częstością 512 Hz.&lt;br /&gt;
&lt;br /&gt;
Procedura może zostać pobrana ze stony: https://github.com/mroja/signal_utils/tree/master/erds/arrows.&lt;br /&gt;
&lt;br /&gt;
===wersja 3=== &lt;br /&gt;
Osoba ma za zadanie ruszać ręką prawą/lewą/nogą lub wyobrażać sobie ruch prawą/lewą/nogą.W bloku pierwszym powienien być ruch, w drugim wyobrażenie. Na ekranie powinna zostać wyświetlona instrukcja, w której opisany jest cel badania. Następnie rozpoczyna się blok prób, w trakcie poszczególnej próby wyświetlane jest polecenie: &amp;amp;bdquo;Rusz ręką&amp;amp;rdquo;/&amp;amp;bdquo;Wyobraź sobie ruch ręką&amp;amp;rdquo; na 1 s, następnie 5 s przerwy (pusty ekran). Każde polecenie powinno być powtórzone 80 razy. &lt;br /&gt;
&lt;br /&gt;
W trakcie procedury powinien być zbierany sygnał EEG oraz EMG palca. Wykorzystujemy następujące elektrody EEG umieszczone zgodnie z systemem 10-10: FC3, FC1, FCz, FC2, FC4, C5, C3, C1, Cz, C2, C4, C6, CP5, CP3, CP1, CPz, CP2, CP4, CP6, P1, P2, A1, A2. częstość próbkowania: min. 256 Hz. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--Analiza:&lt;br /&gt;
# ERD/S w pasmach&lt;br /&gt;
# uśrednione mapy czas-częstość osobno dla ruchu lewą i prawą ręką&lt;br /&gt;
# analiza możliwości rozróżnienia ruchu na podstawie EEG&lt;br /&gt;
&lt;br /&gt;
Uśrednianie spektrogramów wykonujemy samodzielnie w Pythonie, a na deser liczymy estymatę średnich rozkładów czas-częstość z MP:&lt;br /&gt;
&lt;br /&gt;
# eksportujemy tagi znalezione na podstawie EMG https://brain.fuw.edu.pl/edu/EEG:Pracownia_EEG/SSVEP_1#.C4.86wiczenie_dla_ch.C4.99tnych i oglądamy w Svarogu wyniki na tle sygnału&lt;br /&gt;
# ściągamy najnowszą wersję Svaroga z http://braintech.pl/svarog, umożliwiającą uśrednianie map&lt;br /&gt;
# Otwieramy w Svarogu plik sygnału wraz z tagami.&lt;br /&gt;
# Ustalamy odpowiedni montaż i filtrowanie sygnału.&lt;br /&gt;
# Uruchamiamy dekompozycję MP (Tools → MP decomposition) wybierając w ustawieniach (zakładka „Signal selection” → zakładka „Marked”)&lt;br /&gt;
## rodzaj taga oznaczającego kolejne powtórzenia&lt;br /&gt;
## początek i długość trwania analizowanego interwału czasu (w sekundach, względem wystąpienia taga)&lt;br /&gt;
&lt;br /&gt;
Po zakończeniu obliczeń otwieramy rezultat w nowym oknie („Get result”). Obliczona w ten sposób „książka” składa się z dekompozycji MP kolejnych powtórzeń eksperymentu, przedstawionych w postaci map czas-częstość. Otrzymane mapy możemy następnie uśrednić (Tools → Average books) i zapisać do pliku graficznego o ustalonej rozdzielczości.--&amp;gt;&lt;br /&gt;
&amp;lt;!--==Rejestracja sygnału==&lt;br /&gt;
[[Plik:10_20zAFz.png|thumb| 600px|right]]&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 5 k&amp;lt;math&amp;gt;\Omega&amp;lt;/math&amp;gt; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%.&lt;br /&gt;
# Elektrody referencyjne A1 i A2.&lt;br /&gt;
# Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz).&lt;br /&gt;
# Sygnał rejestrujemy z częstością 256 Hz.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Analiza==&lt;br /&gt;
Czas wciśnięcia przycisku (wersja 1 i 2)/ wzorst EMG (wersja 3) oznaczymy jako 0.&lt;br /&gt;
Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
&lt;br /&gt;
===Wyznaczenie pasma &amp;amp;mu; i &amp;amp;beta;===&lt;br /&gt;
# Z sygnału wycinamy fragmenty od &amp;amp;minus;3 do &amp;amp;minus;1 sek. dla elektrod C3 i C4 (elektrody położone nad korą ruchową dłoni). &lt;br /&gt;
# Dla każdej realizacji obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane widma uśredniamy po realizacjach.&lt;br /&gt;
# Z sygnału wycinamy fragmenty od +0.5 do +2.5 sek. dla elektrod C3 i C4 (elektrody położone nad korą ruchową dłoni). &lt;br /&gt;
# Dla każdej realizacji obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane widma uśredniamy po realizacjach.&lt;br /&gt;
# Wykreśl widma z okresu poprzedzającego ruch i z okresu po ruchu nałożone na siebie, a także względną zmianę widma. Zaobserwuj w jakich zakresach częstości &amp;amp;mu; (pasmo około 10 Hz) i &amp;amp;beta; (około 23 Hz) występują największe zmiany.&lt;br /&gt;
#Dla wersji 3 - te same operacje wykonaj dla warunku wyobrażonego ruchu - w pierwszym kroku należy ocenić na podstawie sygnału EMG, czy został wykonany ruch - jeśli tak - próbę taką należy usunąć z analiz. Jako punkt 0 będziemy brać początek polecenia na podstawie tagów.&lt;br /&gt;
&lt;br /&gt;
===Wyznaczenie przebiegu czasowego ERD i ERS ===&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Chebyszewa 2 rodzaju) zgodne z wyznaczonymi pasmami. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;3 do +3 sekund (wszystkie kanały). Przefiltruj każdą realizację. &lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat amplitudy chwilowej).&lt;br /&gt;
# Uśrednij moc chwilową po realizacjach.&lt;br /&gt;
# Oblicz względną zmianę mocy chwilowej względem czasu &amp;amp;minus;3 do &amp;amp;minus;1. W ten sposób otrzymasz przebieg ERD i ERS w czasie.&lt;br /&gt;
# Wykreśl ERD i ERS w układzie topograficznym. (Rozmieść subploty tak, aby z w przybliżeniu odpowiadały pozycjom elektrod).&lt;br /&gt;
&lt;br /&gt;
===Wyznaczenie przebiegu czasowego ERD i ERS wersja w roku 2024===&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Chebyszewa 2 rodzaju) zgodne z wyznaczonymi pasmami. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Przefiltruj wszystkie kanały danych: osobno w pasmie alfa i osobno w pasmie beta.&lt;br /&gt;
# Powycinaj realizacje zgodnie położeniem tagów (czas 0 s) od &amp;amp;minus;2 do +4,5 sekund (wszystkie kanały).&lt;br /&gt;
# Kolejne etapy analizy wykonujemy osobno dla pasm alfa i beta.&lt;br /&gt;
# Oblicz amplitudę chwilową w każdej realizacji za pomocą transformaty Hilberta.&lt;br /&gt;
# Oblicz moc chwilową podnosząc amplitudy chwilowe do kwadratu.&lt;br /&gt;
# Uśrednij moc chwilową po realizacjach.&lt;br /&gt;
# Oblicz moc referencyjną na odcinku &amp;amp;minus;1,5 s do &amp;amp;minus;0,5 s w każdym kanale (można sprawdzić też odcinek &amp;amp;minus;2 s do &amp;amp;minus;0,5 s).&lt;br /&gt;
# Oblicz względną zmianę mocy chwilowej — przebieg ERD i ERS w czasie.&lt;br /&gt;
# Wykreśl ERD i ERS w układzie topograficznym. (Rozmieść subploty tak, aby z w przybliżeniu odpowiadały pozycjom elektrod).&lt;br /&gt;
&lt;br /&gt;
===Transformacja Hjortha===&lt;br /&gt;
Transformacja Hjortha jest przybliżeniem numerycznym transformacji Laplace'a, czyli drugiej pochodnej przestrzennej.&lt;br /&gt;
Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
&lt;br /&gt;
Proszę przeliczyć potencjały C3, Cz i C4 na montaż Hjortha oraz powtórzyć analizę ERD/ERS opisaną powyżej.&lt;br /&gt;
Przykładowo dla elektrody C3 montaż Hjortha &amp;lt;math&amp;gt;\mathrm{C3_H}&amp;lt;/math&amp;gt; otrzymuje się w następujący sposób:&lt;br /&gt;
&amp;lt;math&amp;gt;\mathrm{C3_H = C3 - \frac{1}{4}(T3+F3+Cz+P3)}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Literatura=&lt;br /&gt;
* Beck, A., 1891. Oznaczenie lokalizacyi w mózgu i rdzeniu za pomoca zjawisk elektrycznych. Ph.D. thesis, Polska Akademia Umiejętności, Kraków, seria II.&lt;br /&gt;
* Crone, N. E., Miglioretti, D. L., Gordon, B., Lesser, R. P., 1998a. Functional mapping of human sensorimotor cortex with electrocorticigraphic spectral analysis II. Event-related synchronization in the gamma band. Brain 121, 2301–15.&lt;br /&gt;
* Crone, N. E., Miglioretti, D. L., Gordon, B., Sieracki, J. M., Wilson, M. T., Uematsu, S., 1998b. Functional mapping of human sensorimotor cortex with electrocorticographic spectral analysis I. Alpha and beta event-related desynchronization. Brain 121, 2271–99.&lt;br /&gt;
* Crone, N. E., Korzeniewska, A., Franaszczuk, P. J., 2010. Cortical gamma responses: Searching high and low. International Journal of Psychophysiology.&lt;br /&gt;
*Crone, N. E., Sinai, A., Korzeniewska, A., 2006. High-frequency gamma oscilla- tions and human brain mapping with electrocorticography. Progress in Brain Research 159, 275–295.&lt;br /&gt;
* Kaiser, J., Lutzenberger, W., 2003. Induced gamma-band activity and human brain function. Neuroscientist 9, 475–84.&lt;br /&gt;
* Nunez, P. L., 1981. Electric Fields of the Brain. The Neurophysics of EEG. Oxford University Press, New York.&lt;br /&gt;
* Pfurtscheller, G., Aranibar, A., 1979. Evaluation of event-related desyn- chronization (ERD) preceding and following voluntary self-paced movement. Electroencephalography and Clinical Neurophysiology 46, 138–146.&lt;br /&gt;
* Pfurtscheller, G., Flotzinger, D., Neuper, C., 1994. Differentiation between finger, toe and tongue movement in man based on 40 Hz EEG. Electroencephalography and Clinical Neurophysiology 90, 456–60.&lt;br /&gt;
* Pfurtscheller, G., Lopes da Silva, F. H., 1999. Event-related EEG/MEG synchronization and desynchronization: basic principles. Clinical Neurophysiology 110, 1842–57.&lt;br /&gt;
* Pfurtscheller, G., 1999. Quantification of ERD and ERS in the time domain. In: W Pfurtscheller, G., Lopes da Silva, F. H. (Eds.), Event-related desynchroni- zation. Vol. 6. Elsevier, p. 89–105.&lt;br /&gt;
* Pfurtscheller, G., Neuper, C., 2006. Future prospects of ERD/ERS in the context of brain-computer interface (BCI) developments. Progress in Brain Research 159, 433–437.&lt;br /&gt;
* Pfurtscheller, G., Stancak Jr, A., C., N., 1996a. Post-movement beta synchronization. A correlate of an idling motor area? Electroencephalography and Clinical Neurophysiology 98, 281–93.&lt;br /&gt;
* Pfurtscheller, G., Stancak Jr, A., Neuper, C., 1996b. Event-related synchronization (ERS) in the alpha band—an electrophysiological correlate of cortical idling: a review. International Journal of Psychophysiology 24, 39–46.&lt;br /&gt;
*Tallon-Baudry, C., Bertrand, O., 1999. Oscillatory gamma activity in humans and its role in object representation. Trends Cogn. Sci. 3, 151–62.&lt;br /&gt;
* Tallon-Baudry, C., Bertrand, O., Delpuech, C., Pernier, J., 1996. Stimulus specificity of phase-locked and non-phase-locked 40 Hz visual responses in human. The Journal of Neuroscience 16, 4240–4249.&lt;/div&gt;</summary>
		<author><name>Maciek</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG_2/ERDS&amp;diff=11515</id>
		<title>Pracownia EEG 2/ERDS</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG_2/ERDS&amp;diff=11515"/>
		<updated>2025-12-09T09:49:59Z</updated>

		<summary type="html">&lt;p&gt;Maciek: /* wersja 3 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Pracownia EEG 2|Pracownia EEG 2]] / ERD/S&lt;br /&gt;
&lt;br /&gt;
=Wstęp=&lt;br /&gt;
Wśród badań wykonywanych z wykorzystaniem rejestracji EEG czy MEG można wyróżnić badania spoczynkowe, gdzie rejestrowana jest spontaniczna aktywność mózgu oraz badania zmian aktywności pod wpływem różnych bodźców, przy czym bodźce te mogą być pochodzenia egzo- lub endogennego. Reakcja na bodziec może wykazywać stały związek fazowy z momentem wystąpienia bodźca &amp;amp;mdash; w takiej sytuacji mówimy o potencjałach lub polach wywołanych (ang. ''event related potential'', ''ERP'' i ''event related field'', ''ERF'') &amp;amp;mdash; lub też może nie być fazowo związana z bodźcem.&lt;br /&gt;
&lt;br /&gt;
Niniejsza część pracowni poświęcona jest metodologii badania reakcji mózgu na bodźce, które są czasowo ale niekoniecznie fazowo związane z bodźcem.&lt;br /&gt;
&lt;br /&gt;
=Zmiany pasmowej mocy sygnału EEG=&lt;br /&gt;
Pierwsze rezultaty opisujące zmiany w mocy pasmowej sygnału EEG (spadek mocy rytmu alfa) związane z reakcją na bodziec zostały opisane w pracy doktorskiej Adolf Becka zatytułowanej &amp;amp;bdquo;Oznaczenie lokalizacyi w mózgu i rdzeniu za pomocą zjawisk elektrycznych&amp;amp;rdquo; (Beck,  1891). &lt;br /&gt;
Ilościowe badania zjawisk modulacji mocy sygnału EEG w reakcji na bodźce rozpoczęto stosunkowo niedawno. Począwszy od pracy (Pfurtscheller, 1979) zjawiska te zaczęto nazywać ''Event Related Desynchronization'' (ERD) &amp;amp;mdash; czyli desynchronizacja związana z bodźcem. Termin ERD dotyczy spadku mocy. Przez analogię w późniejszych pracach terminem ''Event Related Synchronization'' (ERS) opisywane są efekty polegające na wzroście mocy. W większości paradygmatów eksperymentalnych zjawiska ERD i ERS są małe w porównaniu ze zmiennością mocy sygnału EEG związanej ze spontaniczną aktywnością mózgu. W celu ich ilościowego badania wymagane jest zarejestrowanie wielu realizacji reakcji na bodziec i poddanie ich analizie statystycznej. &lt;br /&gt;
&lt;br /&gt;
[[Plik:Paradygmat erds.gif|thumb|800px|center]]&lt;br /&gt;
==Interpretacja fizjologiczna==&lt;br /&gt;
[[Plik:EEG_synchronicznosc.png|600px|thumb|right|Synchronicznie pobudzana grupa neuronów piramidalnych kory tworzy warstwę dipolową.]]&lt;br /&gt;
[[Plik:Mapka_tf_erds.png|600px|thumb|right|Przykładowa mapa zjawiska synchronizacji i desynchronizacji sygnału EEG w przestrzeni czas-częstość dla sygnału zearejestrowanego przez elektrodę C3. Osoba badana wykonywała szybki ruch palcem w momencie oznaczonym 0. Kolory odpowiadają procentowej zmianie mocy względem poprzedzającego okresu 2 s, zgodnie ze skalą barw umieszczoną po prawej stronie.  Na poziomej osi — czas w s, na pionowej częstość w Hz.]]&lt;br /&gt;
Terminy ERD i ERS mają swoje źródło w fizjologicznej interpretacji zmian mocy sygnału w określonych pasmach częstości.  Źródłem mierzalnego na powierzchni głowy sygnału elektrycznego lub magnetycznego jest synchroniczna aktywność wielu neuronów (głównie piramidalnych kory). Szacuje się, że wpływ na wielkość sygnału EEG lub MEG ma głównie stopień synchronizacji neuronów wytwarzających ten sygnał, a w drugiej kolejności ich ilość (Nunez, 1981). Tak więc wzrost mocy w pewnym paśmie (np. alfa ERS) interpretowany jest jako wzrost synchronizacji aktywności neuronów generujących aktywność EEG w tym paśmie, zaś spadek mocy (np. alfa ERD) interpretowany jest jako spadek synchronizacji neuronów generujących aktywność EEG w tym paśmie częstości. Przy takiej interpretacji należy pamiętać o skali w jakiej dokonywany jest pomiar. Zarówno elektrody EEG jak i cewki MEG mierzą sygnały średnie pochodzące od olbrzymich ilości neuronów. Zatem zmiana mocy w tym sygnale odpowiada desynchronizacji lub synchronizacji w skali makroskopowej (rzędu 10&amp;lt;sup&amp;gt;6&amp;lt;/sup&amp;gt;-10&amp;lt;sup&amp;gt;8&amp;lt;/sup&amp;gt; neuronów). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zjawiska ERD i ERS badane były zarówno w eksperymentach motorycznych (Pfurtscheller, 1994, Pfurtscheller, 1996a, Pfurtscheller, 1996b , Pfurtscheller, 1999) jak i kognitywistycznych  (Tallon Baudry, 1996, Tallon, 1999, Kaiser, 2003).&lt;br /&gt;
Wnioski płynące z tych prac są takie, że znaczenie zjawisk ERD i ERS zależy od pasma częstości, w którym one występują. Aktywność w paśmie alfa wiązana jest ze stanem spoczynkowym, ERD w paśmie alfa i beta wiązane jest z pobudzeniem danego rejonu kory mózgowej, w którym zjawisko to zachodzi. ERS w paśmie alfa i beta następujący po ERD w tym samym paśmie częstości interpretowany jest najczęściej jako przejaw inhibicji lub kasowania poprzedniego stanu. Z kolei zwiększona aktywność w paśmie gamma jest interpretowana jako przejaw funkcjonalnej aktywacji danego fragmentu kory. Nowe wyniki pojawiają się na bieżąco i stawiane są nowe pytania co do możliwych interpretacji poszczególnych zjawisk  np. (Crone, 2010).&lt;br /&gt;
&lt;br /&gt;
Oprócz motywacji czysto poznawczych, badania zjawisk ERD i ERS stymulowane są przez praktyczne możliwości ich wykorzystania w diagnostyce epilepsji, gdzie są nadzieje na zastosowanie tej techniki w miejsce bardziej inwazyjnej metody mapowania mózgu przez elektrostymulację (Crone 1998a, Crone, 1998b, Crone, 2006) oraz w konstrukcji interfejsów mózg-komputer (Pfurtscheller, 2006).&lt;br /&gt;
[[Plik:Mapowanie.png|thumb|600px|center|Mapowanie kory czuciowo-ruchowej za pomocą stymulacji: dwie falki – bezwolne reakcje ruchowe, trzy falki – kloniczny skurcz mięśni, za Crone, 1998]]&lt;br /&gt;
[[Plik:Mapki_ECoG.jpg|thumb|600px|center|Mapowanie kory czuciowo-ruchowej za pomocą ERD/ERS.Pacjent z przyczyn medycznych miał umieszczoną na korze motorycznej siatkę elektrod (6×8, odstęp 1 cm). Pacjent miał zaciskać pięść w odpowiedzi na bodziec wzrokowy przez cały czas trwania bodźca (3 s)&lt;br /&gt;
Prezentowane mapy istotnych statystycznie zmian uzyskano na podstawie 49 wolnych od artefaktów realizacji.]]&lt;br /&gt;
&lt;br /&gt;
==Estymacja zmian mocy sygnału EEG w dziedzinie czasu==&lt;br /&gt;
Przebieg czasowy zjawiska ERD i ERS jest specyficzny dla pasm częstości.&lt;br /&gt;
[[Grafika:ERDS klasycznie_1.png|right|thumb|768px|&amp;lt;figure id=&amp;quot;fig:erds_klasycznie&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt; Klasyczne obliczanie ERD/ERS. &amp;lt;br&amp;gt; a) Przykładowy zapis EEG jednej z ''N'' realizacji  &amp;lt;br&amp;gt; b) przefiltrowany sygnał EEG w wybranym paśmie (tutaj: [15 25] Hz)&amp;lt;br&amp;gt;  c) przefiltrowany sygnał podniesiony do kwadratu &amp;amp;mdash; w ten sposób uzyskujemy przebieg mocy pasmowej w czasie &amp;lt;br&amp;gt; d) uśredniony po realizacjach przebieg mocy pasmowej w czasie &amp;lt;br&amp;gt; e) wygładzony przebieg z d) za pomocą średniej biegnącej (tutaj okienko 0,25 s); czerwone pionowe linie wyznaczają okres referencyjny &amp;lt;br&amp;gt; f) ERD/ERS — względna zmiana sygnału e) w odniesieniu do okresu referencyjnego.]]&lt;br /&gt;
Klasyczny sposób estymowania  ERD i ERS (Pfurtscheller, 1979) polega na (patrz ilustracja): &lt;br /&gt;
*filtrowaniu pasmowym,&lt;br /&gt;
*wyrównaniu realizacji względem momentu wystąpienia bodźca, &lt;br /&gt;
*obliczaniu mocy chwilowej (podniesienie do kwadratu wartości każdej próbki sygnału), &lt;br /&gt;
*uśrednieniu mocy chwilowej po realizacjach, wygładzeniu przebiegu czasowego uśrednionej mocy chwilowej filtrem dolnoprzepustowym.&lt;br /&gt;
*Następnie względna zmiana mocy obliczana jest jako:&lt;br /&gt;
: &amp;lt;math&amp;gt;\mathrm{ERD/ERS}_f(t) = \frac{P_f(t) - R_f}{R_f}  &amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie:&lt;br /&gt;
''P''&amp;lt;sub&amp;gt;''f ''&amp;lt;/sub&amp;gt;(''t'') &amp;amp;mdash; średnia moc chwilowa w paśmie częstości ''f''; uśrednianie przebiega po realizacjach.&lt;br /&gt;
''R''&amp;lt;sub&amp;gt;''f''&amp;lt;/sub&amp;gt; &amp;amp;mdash; średnia moc w paśmie ''f'' w okresie referencyjnym; uśrednianie przebiega po realizacjach i po czasie trwania okresu referencyjnego.&lt;br /&gt;
Klasycznym metodom obliczania ERD/ERS poświęcona jest praca (Pfurtscheller, 1999).&lt;br /&gt;
Całościowy obraz zmian mocy sygnału EEG związanych z bodźcem można dogodnie analizować w dziedzinie czas-częstość.&lt;br /&gt;
&lt;br /&gt;
=Cwiczenia=&lt;br /&gt;
&lt;br /&gt;
==Paradygmat ==&lt;br /&gt;
&lt;br /&gt;
===wersja 1===&lt;br /&gt;
Osoba badana siedzi wygodnie i trzyma przycisk podłączony do triggera.&lt;br /&gt;
Na ekranie w odstępach 13&amp;lt;math&amp;gt;\pm&amp;lt;/math&amp;gt;1 sekund wyświetlany jest krzyżyk. Krzyżyk wyświetlany jest przez 2 sekundy. W przeciągu 2 sekund po zniknięciu krzyżyka osoba badana w wybranym przez siebie momencie wciska przycisk. Proszę zarejestrować 60 realizacji.&lt;br /&gt;
&lt;br /&gt;
Przygotuj program implementujący powyższy paradygmat.&lt;br /&gt;
&lt;br /&gt;
===wersja 2===&lt;br /&gt;
Próba rozróżnienia ruchów lewą i prawą ręką &amp;amp;mdash; jak w BCI; na podstawie artykułu [[file:ERDS.BCI.TNSRE2012.pdf]], oczywiście w uproszczonej wersji :-)&lt;br /&gt;
&lt;br /&gt;
Procedura:&lt;br /&gt;
&lt;br /&gt;
Osoba badana ma za zadanie poruszać palcami (wskazującym oraz środkowym) prawej lub lewej ręki. Na ekranie monitora pojawia się strzałka, która widoczna jest przez okres 3 sek. i wskazuje rękę, którą będzie wykonywany ruch. Osoba badana ma ruszyć wskazaną ręką w wybranym przez siebie momencie PO zniknięciu strzałki. &lt;br /&gt;
Dla każdej ręki przewidziane jest 100 powtórzeń. W celu synchronizacji sygnału EEG ze wskazówkami pojawiającymi się na ekranie monitora, w lewym dolnym rogu (gdzie pojawia się biały kwadrat) powinna zostać umieszczona fotodioda. &lt;br /&gt;
&lt;br /&gt;
Rejestracja sygnału:&lt;br /&gt;
&lt;br /&gt;
Wykorzystujemy następujące elektrody umieszczone zgodnie z systemem 10--10: FC3, FC1, FCz, FC2, FC4, C5, C3, C1, Cz, C2, C4, C6, CP5, CP3, CP1, CPz, CP2, CP4, CP6, P1, P2, A1, A1. Dodatkowo wykonujemy pomiar z mięśnia extensor digitorum. W tym celu na obu rękach umieszczamy elektrody bipolarne do EMG (patrz Fig. 1 (elektroda ED3): http://jn.physiology.org/content/100/6/3225.long). Sygnał rejestrujemy z częstością 512 Hz.&lt;br /&gt;
&lt;br /&gt;
Procedura może zostać pobrana ze stony: https://github.com/mroja/signal_utils/tree/master/erds/arrows.&lt;br /&gt;
&lt;br /&gt;
===wersja 3=== &lt;br /&gt;
Osoba ma za zadanie ruszać ręką prawą/lewą/nogą lub wyobrażać sobie ruch prawą/lewą/nogą.W bloku pierwszym powienien być ruch, w drugim wyobrażenie. Na ekranie powinna zostać wyświetlona instrukcja, w której opisany jest cel badania. Następnie rozpoczyna się blok prób, w trakcie poszczególnej próby wyświetlane jest polecenie: &amp;amp;bdquo;Rusz ręką&amp;amp;rdquo;/&amp;amp;bdquo;Wyobraź sobie ruch ręką&amp;amp;rdquo; na 1 s, następnie 5 s przerwy (pusty ekran). Każde polecenie powinno być powtórzone 80 razy. &lt;br /&gt;
&lt;br /&gt;
W trakcie procedury powinien być zbierany sygnał EEG oraz EMG palca. Wykorzystujemy następujące elektrody EEG umieszczone zgodnie z systemem 10-10: FC3, FC1, FCz, FC2, FC4, C5, C3, C1, Cz, C2, C4, C6, CP5, CP3, CP1, CPz, CP2, CP4, CP6, P1, P2, A1, A2. częstość próbkowania: min. 256 Hz. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--Analiza:&lt;br /&gt;
# ERD/S w pasmach&lt;br /&gt;
# uśrednione mapy czas-częstość osobno dla ruchu lewą i prawą ręką&lt;br /&gt;
# analiza możliwości rozróżnienia ruchu na podstawie EEG&lt;br /&gt;
&lt;br /&gt;
Uśrednianie spektrogramów wykonujemy samodzielnie w Pythonie, a na deser liczymy estymatę średnich rozkładów czas-częstość z MP:&lt;br /&gt;
&lt;br /&gt;
# eksportujemy tagi znalezione na podstawie EMG https://brain.fuw.edu.pl/edu/EEG:Pracownia_EEG/SSVEP_1#.C4.86wiczenie_dla_ch.C4.99tnych i oglądamy w Svarogu wyniki na tle sygnału&lt;br /&gt;
# ściągamy najnowszą wersję Svaroga z http://braintech.pl/svarog, umożliwiającą uśrednianie map&lt;br /&gt;
# Otwieramy w Svarogu plik sygnału wraz z tagami.&lt;br /&gt;
# Ustalamy odpowiedni montaż i filtrowanie sygnału.&lt;br /&gt;
# Uruchamiamy dekompozycję MP (Tools → MP decomposition) wybierając w ustawieniach (zakładka „Signal selection” → zakładka „Marked”)&lt;br /&gt;
## rodzaj taga oznaczającego kolejne powtórzenia&lt;br /&gt;
## początek i długość trwania analizowanego interwału czasu (w sekundach, względem wystąpienia taga)&lt;br /&gt;
&lt;br /&gt;
Po zakończeniu obliczeń otwieramy rezultat w nowym oknie („Get result”). Obliczona w ten sposób „książka” składa się z dekompozycji MP kolejnych powtórzeń eksperymentu, przedstawionych w postaci map czas-częstość. Otrzymane mapy możemy następnie uśrednić (Tools → Average books) i zapisać do pliku graficznego o ustalonej rozdzielczości.--&amp;gt;&lt;br /&gt;
&amp;lt;!--==Rejestracja sygnału==&lt;br /&gt;
[[Plik:10_20zAFz.png|thumb| 600px|right]]&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 5 k&amp;lt;math&amp;gt;\Omega&amp;lt;/math&amp;gt; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%.&lt;br /&gt;
# Elektrody referencyjne A1 i A2.&lt;br /&gt;
# Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz).&lt;br /&gt;
# Sygnał rejestrujemy z częstością 256 Hz.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Analiza==&lt;br /&gt;
Czas wciśnięcia przycisku (wersja 1 i 2)/ wzorst EMG (wersja 3) oznaczymy jako 0.&lt;br /&gt;
Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
&lt;br /&gt;
===Wyznaczenie pasma &amp;amp;mu; i &amp;amp;beta;===&lt;br /&gt;
# Z sygnału wycinamy fragmenty od &amp;amp;minus;3 do &amp;amp;minus;1 sek. dla elektrod C3 i C4 (elektrody położone nad korą ruchową dłoni). &lt;br /&gt;
# Dla każdej realizacji obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane widma uśredniamy po realizacjach.&lt;br /&gt;
# Z sygnału wycinamy fragmenty od +0.5 do +2.5 sek. dla elektrod C3 i C4 (elektrody położone nad korą ruchową dłoni). &lt;br /&gt;
# Dla każdej realizacji obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane widma uśredniamy po realizacjach.&lt;br /&gt;
# Wykreśl widma z okresu poprzedzającego ruch i z okresu po ruchu nałożone na siebie, a także względną zmianę widma. Zaobserwuj w jakich zakresach częstości &amp;amp;mu; (pasmo około 10 Hz) i &amp;amp;beta; (około 23 Hz) występują największe zmiany.&lt;br /&gt;
#Dla wersji 3 - te same operacje wykonaj dla warunku wyobrażonego ruchu - w pierwszym kroku należy ocenić na podstawie sygnału EMG, czy został wykonany ruch - jeśli tak - próbę taką należy usunąć z analiz. Jako punkt 0 będziemy brać początek polecenia na podstawie tagów.&lt;br /&gt;
&lt;br /&gt;
===Wyznaczenie przebiegu czasowego ERD i ERS ===&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Chebyszewa 2 rodzaju) zgodne z wyznaczonymi pasmami. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;3 do +3 sekund (wszystkie kanały). Przefiltruj każdą realizację. &lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat amplitudy chwilowej).&lt;br /&gt;
# Uśrednij moc chwilową po realizacjach.&lt;br /&gt;
# Oblicz względną zmianę mocy chwilowej względem czasu &amp;amp;minus;3 do &amp;amp;minus;1. W ten sposób otrzymasz przebieg ERD i ERS w czasie.&lt;br /&gt;
# Wykreśl ERD i ERS w układzie topograficznym. (Rozmieść subploty tak, aby z w przybliżeniu odpowiadały pozycjom elektrod).&lt;br /&gt;
&lt;br /&gt;
===Wyznaczenie przebiegu czasowego ERD i ERS wersja w roku 2024===&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Chebyszewa 2 rodzaju) zgodne z wyznaczonymi pasmami. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Przefiltruj wszystkie kanały danych: osobno w pasmie alfa i osobno w pasmie beta.&lt;br /&gt;
# Powycinaj realizacje zgodnie położeniem tagów (czas 0 s) od &amp;amp;minus;2 do +4,5 sekund (wszystkie kanały).&lt;br /&gt;
# Kolejne etapy analizy wykonujemy osobno dla pasm alfa i beta.&lt;br /&gt;
# Oblicz amplitudę chwilową w każdej realizacji za pomocą transformaty Hilberta.&lt;br /&gt;
# Oblicz moc chwilową podnosząc amplitudy chwilowe do kwadratu.&lt;br /&gt;
# Uśrednij moc chwilową po realizacjach.&lt;br /&gt;
# Oblicz moc referencyjną na odcinku &amp;amp;minus;1,5 s do &amp;amp;minus;0,5 s w każdym kanale (można sprawdzić też odcinek &amp;amp;minus;2 s do &amp;amp;minus;0,5 s).&lt;br /&gt;
# Oblicz względną zmianę mocy chwilowej — przebieg ERD i ERS w czasie.&lt;br /&gt;
# Wykreśl ERD i ERS w układzie topograficznym. (Rozmieść subploty tak, aby z w przybliżeniu odpowiadały pozycjom elektrod).&lt;br /&gt;
&lt;br /&gt;
===Transformacja Hjortha===&lt;br /&gt;
Transformacja Hjortha jest przybliżeniem numerycznym transformacji Laplace'a, czyli drugiej pochodnej przestrzennej.&lt;br /&gt;
Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
&lt;br /&gt;
Proszę przeliczyć potencjały C3, Cz i C4 na montaż Hjortha oraz powtórzyć analizę ERD/ERS opisaną powyżej.&lt;br /&gt;
Przykładowo dla elektrody C3 montaż Hjortha &amp;lt;math&amp;gt;\mathrm{C3_H}&amp;lt;/math&amp;gt; otrzymuje się w następujący sposób:&lt;br /&gt;
&amp;lt;math&amp;gt;\mathrm{C3_H = C3 - \frac{1}{4}(T3+F3+Cz+P3)}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Literatura=&lt;br /&gt;
* Beck, A., 1891. Oznaczenie lokalizacyi w mózgu i rdzeniu za pomoca zjawisk elektrycznych. Ph.D. thesis, Polska Akademia Umiejętności, Kraków, seria II.&lt;br /&gt;
* Crone, N. E., Miglioretti, D. L., Gordon, B., Lesser, R. P., 1998a. Functional mapping of human sensorimotor cortex with electrocorticigraphic spectral analysis II. Event-related synchronization in the gamma band. Brain 121, 2301–15.&lt;br /&gt;
* Crone, N. E., Miglioretti, D. L., Gordon, B., Sieracki, J. M., Wilson, M. T., Uematsu, S., 1998b. Functional mapping of human sensorimotor cortex with electrocorticographic spectral analysis I. Alpha and beta event-related desynchronization. Brain 121, 2271–99.&lt;br /&gt;
* Crone, N. E., Korzeniewska, A., Franaszczuk, P. J., 2010. Cortical gamma responses: Searching high and low. International Journal of Psychophysiology.&lt;br /&gt;
*Crone, N. E., Sinai, A., Korzeniewska, A., 2006. High-frequency gamma oscilla- tions and human brain mapping with electrocorticography. Progress in Brain Research 159, 275–295.&lt;br /&gt;
* Kaiser, J., Lutzenberger, W., 2003. Induced gamma-band activity and human brain function. Neuroscientist 9, 475–84.&lt;br /&gt;
* Nunez, P. L., 1981. Electric Fields of the Brain. The Neurophysics of EEG. Oxford University Press, New York.&lt;br /&gt;
* Pfurtscheller, G., Aranibar, A., 1979. Evaluation of event-related desyn- chronization (ERD) preceding and following voluntary self-paced movement. Electroencephalography and Clinical Neurophysiology 46, 138–146.&lt;br /&gt;
* Pfurtscheller, G., Flotzinger, D., Neuper, C., 1994. Differentiation between finger, toe and tongue movement in man based on 40 Hz EEG. Electroencephalography and Clinical Neurophysiology 90, 456–60.&lt;br /&gt;
* Pfurtscheller, G., Lopes da Silva, F. H., 1999. Event-related EEG/MEG synchronization and desynchronization: basic principles. Clinical Neurophysiology 110, 1842–57.&lt;br /&gt;
* Pfurtscheller, G., 1999. Quantification of ERD and ERS in the time domain. In: W Pfurtscheller, G., Lopes da Silva, F. H. (Eds.), Event-related desynchroni- zation. Vol. 6. Elsevier, p. 89–105.&lt;br /&gt;
* Pfurtscheller, G., Neuper, C., 2006. Future prospects of ERD/ERS in the context of brain-computer interface (BCI) developments. Progress in Brain Research 159, 433–437.&lt;br /&gt;
* Pfurtscheller, G., Stancak Jr, A., C., N., 1996a. Post-movement beta synchronization. A correlate of an idling motor area? Electroencephalography and Clinical Neurophysiology 98, 281–93.&lt;br /&gt;
* Pfurtscheller, G., Stancak Jr, A., Neuper, C., 1996b. Event-related synchronization (ERS) in the alpha band—an electrophysiological correlate of cortical idling: a review. International Journal of Psychophysiology 24, 39–46.&lt;br /&gt;
*Tallon-Baudry, C., Bertrand, O., 1999. Oscillatory gamma activity in humans and its role in object representation. Trends Cogn. Sci. 3, 151–62.&lt;br /&gt;
* Tallon-Baudry, C., Bertrand, O., Delpuech, C., Pernier, J., 1996. Stimulus specificity of phase-locked and non-phase-locked 40 Hz visual responses in human. The Journal of Neuroscience 16, 4240–4249.&lt;/div&gt;</summary>
		<author><name>Maciek</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Strona_g%C5%82%C3%B3wna&amp;diff=11433</id>
		<title>Strona główna</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Strona_g%C5%82%C3%B3wna&amp;diff=11433"/>
		<updated>2025-10-07T08:43:02Z</updated>

		<summary type="html">&lt;p&gt;Maciek: /* Pracownie specjalistyczne: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Materiały dydaktycznie dla studentów kierunku [http://fizykaxxi.fuw.edu.pl/zastosowania-fizyki-w-biologii-i-medycynie/ Zastosowania Fizyki w Biologii i Medycynie]=&lt;br /&gt;
&lt;br /&gt;
==Informatyka:==&lt;br /&gt;
 [[Plik:Pętla_while.svg|175px|right]]&lt;br /&gt;
* Technologia Informacyjna:&lt;br /&gt;
** Wykład    [[Technologie informacyjne i komunikacyjne]] &lt;br /&gt;
** Wykład [[Technologie informacyjne i komunikacyjne_(1F11)]]&lt;br /&gt;
** Ćwiczenia [[&amp;quot;Programowanie z Pythonem3&amp;quot;]] (dla studentów Wydziału Fizyki) '''od 2020/21'''&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
** Ćwiczenia [[dla studentów Wydziału Biologii|&amp;quot;Technologia informacyjna&amp;quot;]] (dla studentów Wydziału Biologii)&lt;br /&gt;
** Wykład [[Slajdy z wykładów dla optyki okularowej z roku 2015|&amp;quot;Technologie cyfrowe&amp;quot;]] (dla specjalności Optyka Okularowa)&lt;br /&gt;
** Ćwiczenia [[&amp;quot;Programowanie z Pythonem&amp;quot;]] (dla studentów Wydziału Fizyki) '''STARE'''&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
* Ćwiczenia [[&amp;quot;Programowanie dla Neuroinformatyków&amp;quot;]]&lt;br /&gt;
* Ćwiczenia [[&amp;quot;Programowanie dla Fizyków Medycznych&amp;quot;]]&lt;br /&gt;
* Bazy danych:&lt;br /&gt;
** Wykład    [[TI:WTBD|&amp;quot;Wstęp do technologii baz danych&amp;quot;]]&lt;br /&gt;
** Ćwiczenia [[TI:WTBD|&amp;quot;Wstęp do technologii baz danych&amp;quot;]]&lt;br /&gt;
* [[TI/Pracownia wykorzystania zasobów internetowych|Pracownia wykorzystania zasobów internetowych]]&lt;br /&gt;
&lt;br /&gt;
==Matematyka:==&lt;br /&gt;
* Wykład    [[Matematyka I - FMiN lecture|Matematyka I]] (dla specjalności Fizyka Medyczna i Neuroinformatyka)&lt;br /&gt;
** Ćwiczenia [[Matematyka I - FMiN exercises|Matematyka I]] (dla specjalności Fizyka Medyczna i Neuroinformatyka)&lt;br /&gt;
** Ćwiczenia [[Matematyka I - OO exercises|Matematyka I]] (dla specjalności Optyka Okularowa)&lt;br /&gt;
 [[Plik:main_math.png|175px|right]]&lt;br /&gt;
* Wykład    [[Matematyka II - FMiN lecture|Matematyka II]] (dla specjalności Fizyka Medyczna i Neuroinformatyka)&lt;br /&gt;
** Ćwiczenia [[Matematyka II - FMiN exercises|Matematyka II]] (dla specjalności Fizyka Medyczna i Neuroinformatyka)&lt;br /&gt;
&lt;br /&gt;
==Fizyka:==&lt;br /&gt;
* Fizyka I:&lt;br /&gt;
** Wykład [[Fizyka I - FMiN lecture|Fizyka I]] - Mechanika (dla specjalności Fizyka Medyczna i Neuroinformatyka)&lt;br /&gt;
** Wykład [[Fizyka I - OO lecture|Fizyka I]] - Mechanika (dla specjalności Optyka Okularowa)&lt;br /&gt;
** Ćwiczenia [[Fizyka I - FMiN exercises|Fizyka I]] - Mechanika (dla specjalności Fizyka Medyczna i Neuroinformatyka)&lt;br /&gt;
* Fizyka II: [[Plik:main_phys.png|220px|right]]&lt;br /&gt;
** Wykład [[Fizyka II - OO lecture|Fizyka II]] - Elektrostatyka (dla specjalności Optyka Okularowa)&lt;br /&gt;
** Wykład [[Fizyka II - NI lecture|Fizyka II]] - Elektrostatyka (dla specjalności Fizyka Medyczna i Neuroinformatyka)&lt;br /&gt;
** Ćwiczenia [[Fizyka II - FMiN exercises|Fizyka II]] - Elektrostatyka (dla specjalności Fizyka Medyczna i Neuroinformatyka)&lt;br /&gt;
** Ćwiczenia [[Fizyka II - OO exercises|Fizyka II]] - Elektrostatyka (dla specjalności Optyka Okularowa)&lt;br /&gt;
* Fizyka III:&lt;br /&gt;
** Wykład [[Fizyka III - FMiN lecture|Fizyka III]] - Drgania i Fale (dla specjalności Fizyka Medyczna i Neuroinformatyka)&lt;br /&gt;
** Ćwiczenia [[Fizyka III - FMiN exercises|Fizyka III]] - Drgania i Fale (dla specjalności Fizyka Medyczna i Neuroinformatyka)&lt;br /&gt;
* Elektrodynamika:&lt;br /&gt;
** Ćwiczenia [[Ćwiczenia z elektrodynamiki dla neuroinformatyków|Elektrodynamika]] (dla specjalności Neuroinformatyka)&lt;br /&gt;
* Ćwiczenia [[Fizyka Promieniowania Jądrowego]]&lt;br /&gt;
* Ćwiczenia [[Fizyka atomów oraz cząstek i makrocząstek biologicznych]]&lt;br /&gt;
&lt;br /&gt;
==Chemia:==&lt;br /&gt;
* Wykład [[Podstawy chemii z elementami biochemii]]&lt;br /&gt;
* Wykład [[Chemia ogólna - lecture|Chemia ogólna]] &lt;br /&gt;
* Pracownia [[Chemia ogólna - workshop|Chemia ogólna]]&lt;br /&gt;
* Wykład [[Chemia organiczna]]&lt;br /&gt;
&lt;br /&gt;
==Biologia:==&lt;br /&gt;
 [[Plik:main_biol.jpg|220px|right]]&lt;br /&gt;
* Wykład [[Biologia komórki]] &lt;br /&gt;
* Wykład [[Histologia]]&lt;br /&gt;
* Pracownia [[Biologia molekularna]]&lt;br /&gt;
&lt;br /&gt;
==Biofizyka molekularna:==&lt;br /&gt;
* Wykład [[Metody Biofizyki Molekularnej - lecture|Metody Biofizyki Molekularnej]]&lt;br /&gt;
** Ćwiczenia [[Metody Biofizyki Molekularnej - exercises|Metody Biofizyki Molekularnej]]&lt;br /&gt;
*[[Pracownia podstaw biofizyki]] (dla specjalności Biofizyka molekularna)&lt;br /&gt;
* Pracownia [[Podstawy Biofizyki]]&lt;br /&gt;
* Pracownia [[Pracownia Biofizyki dla Zaawansowanych]]&lt;br /&gt;
*[[Pracownia biofizyki dla zaawansowanych]] (dla specjalności Biofizyka Molekularna)&lt;br /&gt;
&lt;br /&gt;
== Przedmioty specjalizacyjne: ==&lt;br /&gt;
* Wykład [[Obrazowanie Medyczne]]&lt;br /&gt;
&amp;lt;!--* Wykład [[Metody fizyczne w biologii i medycynie]]--&amp;gt;&lt;br /&gt;
* Wykład [[Ochrona radiologiczna]]&lt;br /&gt;
* Wykład [[Ochrona radilogiczna 2]]&lt;br /&gt;
&amp;lt;!--* Wykład [[Sygnały Bioelektryczne]]--&amp;gt;&lt;br /&gt;
* Wykład [[Elektroencefalografia]]&lt;br /&gt;
* Wykład [[Wnioskowanie Statystyczne - lecture|Wnioskowanie Statystyczne]] [[Plik:main_eeg2.png|125px|right]]&lt;br /&gt;
** Ćwiczenia [[Wnioskowanie Statystyczne - exercises|Wnioskowanie Statystyczne]]&lt;br /&gt;
* Wykład [[Analiza sygnałów - lecture|Analiza sygnałów]] [[Plik:Logo_pelne_KNI.png|220px|right|link=https://pl-pl.facebook.com/KNNeuroinformatyki/]]&lt;br /&gt;
** Ćwiczenia [[Analiza sygnałów - exercises|Analiza sygnałów]]&lt;br /&gt;
* [[Uczenie maszynowe i sztuczne sieci neuronowe]]&lt;br /&gt;
&amp;lt;!-- ** Ćwiczenia [[Uczenie maszynowe i sztuczne sieci neuronowe_cw|Uczenie maszynowe i sztuczne sieci neuronowe]]--&amp;gt;&lt;br /&gt;
* Warsztaty [[Metody diagnostyczne]]&lt;br /&gt;
* Warsztaty [[Warsztaty_z_Metod_Terapeutycznych|z Metod Terapeutycznych]] (dla specjalności Fizyka Medyczna)&lt;br /&gt;
* Warsztaty [[Modelowanie molekularne 2]]&lt;br /&gt;
&lt;br /&gt;
== Pracownie specjalistyczne: ==&lt;br /&gt;
 [[Plik:main_eeg1.jpg|220px|right]]&lt;br /&gt;
*[[INFORMACJE O OPROGRAMOWANIU DO PRACOWNI EEG i SYGNAŁÓW BIOELEKTRYCZNYCH]]&lt;br /&gt;
*[[Pracownia Sygnałów Bioelektrycznych]] (dla specjalności Neuroinformatyka)&lt;br /&gt;
 &amp;lt;!-- *[[Pracownia EEG|Pracownia EEG]] (dla specjalności Neuroinformatyka)  &lt;br /&gt;
*[[Pracownia EEG|Pracownia EEG]] (dla specjalności Neuroinformatyka) --&amp;gt;&lt;br /&gt;
*[[Pracownia EEG 2|Pracownia EEG]] (dla specjalności Neuroinformatyka)&lt;br /&gt;
*[[Laboratorium EEG|Laboratorium EEG]] (dla specjalności Neuroinformatyka)&lt;br /&gt;
*[[Nowe technologie w fizyce biomedycznej]] (dla specjalności Fizyka Medyczna i Neuroinformatyka)&lt;br /&gt;
*[[USG|Warsztaty z metod obrazowania ultradźwiękowego]]&lt;br /&gt;
&lt;br /&gt;
== Inne: == &lt;br /&gt;
[[Plik:Bookstack.svg|130px|right]]&lt;br /&gt;
&amp;lt;!--* Wykład [[&amp;quot;Własność intelektualna i ochrona danych osobowych&amp;quot;]]--&amp;gt;&lt;br /&gt;
* Pracownia [[&amp;quot;Wykorzystanie zasobów internetowych&amp;quot;]]&lt;br /&gt;
* Proseminarium [[Proseminarium licencjackie|licencjackie]]&lt;br /&gt;
&lt;br /&gt;
==Strony dodatkowe==&lt;br /&gt;
* [[Podręcznik użytkownika systemu do badań dostępnego w laboratorium EEG Wydziału Fizyki Uniwersytetu Warszawskiego]]: http://laboratorium-eeg.braintech.pl/ w tym:&lt;br /&gt;
** dokumentacja SVAROG: http://laboratorium-eeg.braintech.pl/svarog/index.html&lt;br /&gt;
** dokumentacja PSYCHOPY: http://laboratorium-eeg.braintech.pl/psychopy/index.html&lt;br /&gt;
** dokumentacja techniczna BCI framework: http://laboratorium-eeg.braintech.pl/openbci/&lt;br /&gt;
** dokumentacja i tutorial biblioteki ReadManager (Python, Matlab): http://moduly-analizy-danych.braintech.pl/&lt;br /&gt;
&lt;br /&gt;
* [[Instalacja i konfiguracja Kinect, Wiimote i Eyetrackera]]&lt;br /&gt;
* Strona [http://www.fuw.edu.pl/biblioteki.html Biblioteki Wydziału Fizyki]&lt;br /&gt;
* Podręcznik dotyczący stosowania Jupyter notebook do prowadzenia zajęć dydaktycznych: https://jupyter4edu.github.io/jupyter-edu-book/notebooks-in-teaching-and-learning.html&lt;br /&gt;
&lt;br /&gt;
* Podręcznik [https://wuw.pl/data/include/cms/Neurocybernetyka_teoretyczna_Tadeusiewicz_Ryszard_red_nauk_2009.pdf Neurocybernetyka Teoretyczna]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* Pracownia [[Pracownia Pokazów Wykładowych|Pokazów Wykładowych]]&lt;br /&gt;
* [[Tematy prac licencjackich]]&lt;br /&gt;
* AI, czyli [http://shanghailectures.org/lectures Sztuczna Inteligencja]&lt;br /&gt;
*[[dokumentacja SVAROG]]&lt;br /&gt;
*[[dokumentacja OBCI]]&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Maciek</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG_2&amp;diff=11432</id>
		<title>Pracownia EEG 2</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG_2&amp;diff=11432"/>
		<updated>2025-10-07T08:38:24Z</updated>

		<summary type="html">&lt;p&gt;Maciek: /* Terminy */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Pracownia EEG 2=&lt;br /&gt;
&lt;br /&gt;
==Terminy==&lt;br /&gt;
Zajęcia odbywają się w sali 4.59 w budynku Pasteura 5. &lt;br /&gt;
&lt;br /&gt;
* we wtorki w godz. 10.00 - 14:00&lt;br /&gt;
* w środy w godz. 13:45 - 16:00&lt;br /&gt;
&lt;br /&gt;
==Cele przedmiotu== &lt;br /&gt;
&lt;br /&gt;
W trakcie naszych wartszatów chcielibyśmy Panstwu przybliżyć następujące kwestie:  &lt;br /&gt;
&lt;br /&gt;
# charakterystykę sygnału EEG - czym charakteryzuje się prawidłowo zarejestrowany sygnał EEG, jakie ma właściwości&lt;br /&gt;
# jak zebrać prawidłowo EEG - po naszym kursie nabędą Państwo umiejętność rejestracji EEG&lt;br /&gt;
# charakterystyki podstawowych metod analizy sygnału EEG, ze zrozumieniem ich wad i zalet, wymagań, oraz zmienności wyników między osobami. &lt;br /&gt;
# jakie narzędzia informatyczne mogą Panstwo spotkac w labie EEG (Psychopy, SVAROG)&lt;br /&gt;
# podstawowych zjawisk z psychofizjologii w kontekście procesów poznawczych oraz ich interpretacji fizjologicznych&lt;br /&gt;
&lt;br /&gt;
CZEGO NIE UCZYMY: obsługi przeglądarek sygnału, obsługi toolboxów - nasz kurs ma na celu zrozumienie metod i charakterystyki badanych zjawisk a nie obsługi konkretnego środowiska. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Materiały==&lt;br /&gt;
#[[Pracownia_EEG 2/Wprowadzenie do Psychopy|Wprowadzenie do Psychopy]] &lt;br /&gt;
#[[Pracownia_EEG 2/Krótkie przypomnienie z anatomii i funkcji mózgu|Krótkie przypomnienie z anatomii i funkcji mózgu]]&lt;br /&gt;
#[[Pracownia_EEG 2/EEG_spoczynkowe|EEG spoczynkowe, artefakty ]]&lt;br /&gt;
#[[Pracownia_EEG 2/Potencjały_wywołane|Potencjały wywołane]]&lt;br /&gt;
#[[Pracownia_EEG 2/SSVEP_1|SSVEP]]&lt;br /&gt;
#[[Pracownia_EEG 2/EEG_wlasności_EEG_spoczynkowego|Własności EEG spoczynkowego: funkcja autokorelacji i widmo]] &lt;br /&gt;
#[[Pracownia_EEG 2/AR_1|Widmowa analiza parametryczna]]&lt;br /&gt;
#[[Pracownia_EEG 2/ERDS_2|Wprowadzenie do metod czas-częstość]]&lt;br /&gt;
#[[Pracownia_EEG 2/ERDS|Synchronizacja i desynchronizacja sygnału EEG związana z bodźcem]]&lt;br /&gt;
#[[Pracownia_EEG 2/Projekt|Projekt]]&lt;br /&gt;
&lt;br /&gt;
Autorzy: dr hab. Maciej Kamiński,&lt;br /&gt;
dr Rafał Kuś,&lt;br /&gt;
dr hab. Jarosław Żygierewicz,&lt;br /&gt;
dr Anna Duszyk-Bogorodzka&lt;br /&gt;
&lt;br /&gt;
==Zasady zaliczenia pracowni==&lt;br /&gt;
Materiał zajęć jest podzielony na bloki tematyczne. W każdym bloku studenci mają do wykonania zestaw ćwiczeń. &lt;br /&gt;
Zaliczenie bloku ma dwa elementy:&lt;br /&gt;
&lt;br /&gt;
* uzupełnienie krótkich raportów po wskazanych blokach. &lt;br /&gt;
* wykonanie projektu i zaprezentowanie wyników&lt;br /&gt;
* obecność obowiązkowa, możliwe dwie nieobeności nieusprawideliwione. &lt;br /&gt;
&lt;br /&gt;
===Wskazówki dotyczące przygotowania prezentacji===&lt;br /&gt;
# Wyniki ćwiczeń przedstawiamy w postaci prezentacji komputerowej (OpenOffice, PowerPoint, LibreOffice, Acrobat, itp.); czas trwania &amp;amp;mdash; maksymalnie 15 minut.&lt;br /&gt;
# Należy uwzględnić wyniki uzyskane w ćwiczeniach wskazanych przez prowadzących.&lt;br /&gt;
# Należy zadbać o prawidłową postać wykresów, w tym w szczególności:&lt;br /&gt;
#* obecność opisów osi (w miarę możliwości);&lt;br /&gt;
#* spójne zakresy osi i skalowanie wykresów;&lt;br /&gt;
#* właściwy dobór skali (tak, aby uwidocznić najważniejsze rzeczy);&lt;br /&gt;
#* obecność tytułów i innych podpisów ułatwiających zrozumienie prezentowanych treści;&lt;br /&gt;
#* odpowiedni rozmiar podpisów, aby były widoczne z daleka.&lt;br /&gt;
# Prezentacja wyników powinna uwzględniać:&lt;br /&gt;
#* krótko &amp;amp;mdash; przypomnienie co było liczone&lt;br /&gt;
#* podstawowe parametry rejestracji danych;&lt;br /&gt;
#* krótko &amp;amp;mdash; jak było liczone (jeśli trzeba);&lt;br /&gt;
#* na co należy zwrócić uwagę w prezentowanych wynikach;&lt;br /&gt;
#* interpretację wykresów.&amp;lt;br&amp;gt;Część z tych informacji można dołożyć do rysunków w postaci krótkich wyjaśnień.&lt;br /&gt;
# Ocenie podlegają:&lt;br /&gt;
#* kompletność prezentacji;&lt;br /&gt;
#* czytelność prezentowanych wielkości i zjawisk;&lt;br /&gt;
#* merytoryczna poprawność wypowiedzi.&lt;br /&gt;
# Każdy z powyższych elementów prezentacji będzie oceniany w 10-punktowej skali. Punkty zebrane w ciągu semestru będą przekładać się na ocenę końcową.&lt;br /&gt;
# Wyniki dodatkowe, ponadprogramowe, są mile widziane i mogą skutkować lepszą oceną.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Maciek</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=WnioskowanieStatystyczne/_Regresja_liniowa_i_test_chi2&amp;diff=11353</id>
		<title>WnioskowanieStatystyczne/ Regresja liniowa i test chi2</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=WnioskowanieStatystyczne/_Regresja_liniowa_i_test_chi2&amp;diff=11353"/>
		<updated>2025-06-08T19:40:40Z</updated>

		<summary type="html">&lt;p&gt;Maciek: /* Regresja liniowa */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Wstęp ==&lt;br /&gt;
Załóżmy, że mamy dwie zmienne losowe ciągłe &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Chcielibyśmy wykorzystać wiedzę o wartościach zmiennej &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; do przewidywania wartości zmiennej &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Mówimy, że zmienna &amp;lt;math&amp;gt;X &amp;lt;/math&amp;gt; jest niezależna, a zmienna &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; zależna. W fizyce taką wiedzę opisujemy przy pomocy równań. Równania fizyczne często wyrażają związki przyczynowo-skutkowe. W takim wypadku, która zmienna jest zależna, a która niezależna ma głębszy sens. Jednak nie zawsze tak musi być. Wartości dwóch zmiennych mogą zależeć od trzeciej nieobserwowanej zmiennej. W tej sytuacji wiedza o wartości jednej z tych zmiennych może być wykorzystana do przewidywania wartości drugiej, ale nie ma między nimi związku przyczynowo-skutkowego.&lt;br /&gt;
&lt;br /&gt;
== Regresja ==&lt;br /&gt;
W ogólności, dla każdej wartości zmiennej &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; mamy rozkład wartości zmiennej &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. &lt;br /&gt;
{{Solution | title = Przykład: rozkłady ''Y''  dla każdego punktu ''X'' |text = &lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
# symuowana zależność ma następującą postać y = b0 + b1*x &lt;br /&gt;
# wartości parametrów &lt;br /&gt;
b0 = 1 &lt;br /&gt;
b1 = 3&lt;br /&gt;
&lt;br /&gt;
X = np.arange(0, 10,0.5)&lt;br /&gt;
# będę symulował zbieranie n wartości Y dlakażdego X[i], zakładam to samo odchylenie standardowe &lt;br /&gt;
odch_std = 1&lt;br /&gt;
n = 30&lt;br /&gt;
Y = np.zeros((n,len(X)))&lt;br /&gt;
for i in range(len(X)):&lt;br /&gt;
	Y[:,i] =  b0 + b1*X[i] + st.norm.rvs(size = n, loc=0, scale = odch_std)&lt;br /&gt;
&lt;br /&gt;
# narysujmy ten zbiór punktów &lt;br /&gt;
for j in range(len(X)):&lt;br /&gt;
	py.plot(X, Y[j,:],'b,')&lt;br /&gt;
# wyróżnimy średnie&lt;br /&gt;
py.plot(X,np.mean(Y,0),'ro')&lt;br /&gt;
#  i odchykenia standardowe:&lt;br /&gt;
py.errorbar(X,np.mean(Y,0),odch_std,ecolor = 'k',elinewidth = 8)&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
===Regresja liniowa ===&lt;br /&gt;
Dalej będziemy rozważać regresję liniową, tzn. założymy, że punkty &amp;lt;math&amp;gt;(X,Y)&amp;lt;/math&amp;gt; są generowane przez model  liniowy o następującym równaniu:&lt;br /&gt;
: &amp;lt;math&amp;gt; y = b_0 + b_1x + \epsilon &amp;lt;/math&amp;gt;&lt;br /&gt;
współczynniki &amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;b_1&amp;lt;/math&amp;gt; można wyestymować stosując &lt;br /&gt;
[https://brain.fuw.edu.pl/edu/index.php/WnioskowanieStatystyczne/MLF metodę największej wiarygodności]:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;{\hat{\,b}}_1=\frac{\underset{i=1}{\overset{N}{\sum }}(x_{i}-\bar{x})(y_{i}-&lt;br /&gt;
\bar{y})}{\underset{i=1}{\overset{N}{\sum }}(x_{i}-\bar{x})^{2}},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
 \hat{\ b}_0=\bar{y}-\hat{\,b}_1\bar{x}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Z tymi współczynnikami otrzymujemy równanie opisujące prostą regresji:&lt;br /&gt;
&amp;lt;math&amp;gt;\hat{\ y} = \hat{\,b}_0 + \hat{\ b}_1 x&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zakłądając, że &amp;lt;math&amp;gt;\epsilon &amp;lt;/math&amp;gt; pochodzi z rozkładu normalnego o wariancji &amp;lt;math&amp;gt;\sigma^2&amp;lt;/math&amp;gt; estymowane współczynniki są zmiennymi losowymi pochodzącymi z rozkładów normalnego o średniej takiej jak wyestymowany współczynnik i  wariancji odpowiednio:&lt;br /&gt;
:&amp;lt;math&amp;gt; v_{b_1} = \frac{\sigma^2}{\sum_i (x_i - \bar x)^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt; v_{b_0} = \frac{\sigma^2}{n} + \frac{\bar x ^2}{\sum_i (x_i - \bar x)^2} \sigma^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wariancję &amp;lt;math&amp;gt;\sigma^2 = E[S^2]&amp;lt;/math&amp;gt;  można estymować przez:&lt;br /&gt;
:&amp;lt;math&amp;gt;S^2 = \frac{1}{n-2}\sum_{i=1}^n(y_i - \hat{\ y}_i)^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Warto tu zwrócić uwagę na prosty fakt, że niepewność oszacowania współczynników można zmniejszyć zwiększając zakres zmiennej &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Funkcję estymującą parametry i ich standardowe odchylenia można zaimplementować w pythonie następująco:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
def regresja_liniowa(X,Y):&lt;br /&gt;
	'''równanie dopasowywanej prostej to y = b0 + b1*x&lt;br /&gt;
	argumenty:&lt;br /&gt;
	  X - zmienna niezależna&lt;br /&gt;
	  Y - zmienna zależna&lt;br /&gt;
	funkcja zwraca:&lt;br /&gt;
	  b0, b1, - estymaty parametrów&lt;br /&gt;
	  s_b0, s_b1, - estymaty standardowego odchylenia parametrów &lt;br /&gt;
	  residua - różnice między punktami pomiarowymi a punktami na dopasowanej prostej&lt;br /&gt;
	'''&lt;br /&gt;
	N = len(X)&lt;br /&gt;
	x_sr = np.mean(X)&lt;br /&gt;
	y_sr = np.mean(Y)&lt;br /&gt;
	# estymatory parametrów &lt;br /&gt;
	# korzystamy z tego że numpy wykonuje odejmowania i potęgowania dla każdego elementu tablicy X i Y&lt;br /&gt;
	b1 = np.sum((X-x_sr)*(Y-y_sr))/np.sum((X-x_sr)**2)&lt;br /&gt;
	b0 = y_sr - b1*x_sr&lt;br /&gt;
	&lt;br /&gt;
	# teraz liczymy kilka rzeczy przydatnych do oceny jakości modelu&lt;br /&gt;
	Y_reg = b0 + b1*X # wartości Y przewidywane przez model&lt;br /&gt;
	residua = Y - Y_reg # residua, czyli zmienność Y nie wynikająca z modelu&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	sse = np.sum(residua**2)&lt;br /&gt;
	# estymator wariancji residuów, bywa nazywany średnim błędem kwadratowym regresji :&lt;br /&gt;
	v_e = sse/(N-2)&lt;br /&gt;
	# estymatory standardowych błędów parametrów&lt;br /&gt;
	s_b0 = np.sqrt(v_e) * np.sqrt(1.0/N + x_sr**2/np.sum( (X-x_sr)**2))&lt;br /&gt;
	s_b1 = np.sqrt(v_e) * np.sqrt( 1.0/np.sum( (X -x_sr)**2 ))&lt;br /&gt;
	return (b0, b1, s_b0, s_b1, residua )&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Przykład: Dopasowanie prostej do punktów (zakładamy jednakową wariancję ''Y'' dla każdego ''X'')====&lt;br /&gt;
Wytwórzmy dane zgodnie z modelem:&lt;br /&gt;
: &amp;lt;math&amp;gt;y = -13 + 3 x + \epsilon&amp;lt;/math&amp;gt; &lt;br /&gt;
: i &amp;lt;math&amp;gt;\sigma_\epsilon =19&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# symulowana zależność ma następującą postać y = b0 + b1*x &lt;br /&gt;
# wartości parametrów &lt;br /&gt;
b0 = -13.0&lt;br /&gt;
b1 = 3.0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
X = np.arange(30, 70, 0.5)&lt;br /&gt;
sigma = 19.0&lt;br /&gt;
n = 1&lt;br /&gt;
Y = np.zeros(len(X))&lt;br /&gt;
for i in range(len(X)):&lt;br /&gt;
	Y[i] =  b0 + b1*X[i] + st.norm.rvs(size = n, loc=0, scale = sigma)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Korzystając ze zdefiniowanej powyżej funkcji &amp;lt;tt&amp;gt;regresja_liniowa&amp;lt;/tt&amp;gt; estymujemy parametry i ich odchylenia standardowe:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
(b0, b1, s_b0, s_b1, residua ) = regresja_liniowa(X,Y)&lt;br /&gt;
&lt;br /&gt;
print('Równanie prostej: y = b0 + b1*x')&lt;br /&gt;
print('dopasowane współczynniki: b0 = %.3f, b1 = %.3f' %(b0, b1))&lt;br /&gt;
print('s_b0 = %.4f, s_b1= %.4f '%(s_b0, s_b1))&lt;br /&gt;
	&lt;br /&gt;
py.errorbar(X,Y,sigma)&lt;br /&gt;
Y_reg = b0 + b1*X &lt;br /&gt;
py.plot(X,Y_reg)&lt;br /&gt;
&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Ocena jakości dopasownia ====&lt;br /&gt;
=====Współczynnik &amp;lt;math&amp;gt;R^2&amp;lt;/math&amp;gt;=====&lt;br /&gt;
Aby wyrazić współczynnik &amp;lt;math&amp;gt;R^2&amp;lt;/math&amp;gt; potrzebujemy następujących wyrażeń - sum kwadratów (ss). Są one miarą zmienności.&lt;br /&gt;
* &amp;lt;math&amp;gt;ss_{tot}&amp;lt;/math&amp;gt; - całkowita suma kwadratów - proporcjonalna do wariancji próby,&lt;br /&gt;
* &amp;lt;math&amp;gt;ss_{reg}&amp;lt;/math&amp;gt; -  suma kwadratów regresji - zwana też wyjaśnioną sumą kwadratów,&lt;br /&gt;
* &amp;lt;math&amp;gt;ss_{err}&amp;lt;/math&amp;gt; -  suma kwadratów residuów - niewyjaśniona suma kwadratów.&lt;br /&gt;
&lt;br /&gt;
Poszczególne składniki wymienionych powyżej sum kwadratów są zilustrowane na poniższym rysunku.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Regresja1.svg|thumb|500px|center|Dla wybranego punktu &amp;lt;math&amp;gt;(x_i,y_i)&amp;lt;/math&amp;gt; zaznaczono różnice będące składnikami poszczególnych sum kwadratów]]&lt;br /&gt;
&lt;br /&gt;
Implementacja:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
y_sr = np.mean(Y)&lt;br /&gt;
ss_tot = np.sum( (Y -  y_sr)**2 ) &lt;br /&gt;
ss_reg = np.sum( (Y_reg - y_sr)**2 )&lt;br /&gt;
ss_err = np.sum( (residua)**2 ) &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
mając te sumy &amp;lt;math&amp;gt;R^2&amp;lt;/math&amp;gt; definiujemy jako:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^2 = 1 - \frac{ss_{err}}{ss_{tot}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
R2 = 1 - ss_err/ss_tot &lt;br /&gt;
print('R2 = %.2f' %(R2))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W przypadku regresji liniowej &amp;lt;math&amp;gt;ss_{reg} + ss_{err} = ss_{tot}&amp;lt;/math&amp;gt;. Możemy to sprawdzić [http://brain.fuw.edu.pl/edu/STAT:Regresja_liniowa#Interpretacja_wsp.C3.B3.C5.82czynnika_korelacji analitycznie] i numerycznie:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
print('ss_tot = %.3f' %(ss_tot))&lt;br /&gt;
print('ss_reg + ss_err =%.3f'%(ss_reg+ss_err))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
czyli &lt;br /&gt;
: &amp;lt;math&amp;gt;R^2 = \frac{ss_{reg}}{ss_{tot}} &amp;lt;/math&amp;gt;, &lt;br /&gt;
można więc interpretować &amp;lt;math&amp;gt;R^2&amp;lt;/math&amp;gt;  jako frakcję zmienności ''Y'' tłumaczoną przez model.&lt;br /&gt;
W przypadku regresji liniowej współczynnik &amp;lt;math&amp;gt;R^2&amp;lt;/math&amp;gt; równy jest kwadratowi  współczynnika korelacji &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt; &lt;br /&gt;
: &amp;lt;math&amp;gt;R^2 = \rho^2&amp;lt;/math&amp;gt;&lt;br /&gt;
[http://brain.fuw.edu.pl/edu/STAT:Regresja_liniowa#Interpretacja_wsp.C3.B3.C5.82czynnika_korelacji (dowód)]&lt;br /&gt;
&lt;br /&gt;
===== Test F dla hipotezy o braku korelacji =====&lt;br /&gt;
Często interesujące jest zweryfikowanie hipotezy o istotności zależności między ''Y'' a ''X'' (proszę nie mylić tego z istnieniem związku przyczynowo-skutkowego). Matematycznie równoważne jest to postawieniu hipotezy:&lt;br /&gt;
: &amp;lt;math&amp;gt;H_0: b_1 = 0 &amp;lt;/math&amp;gt;&lt;br /&gt;
:  &amp;lt;math&amp;gt;H_1: b_1 \ne 0 &amp;lt;/math&amp;gt;&lt;br /&gt;
albo:&lt;br /&gt;
: &amp;lt;math&amp;gt;H_0: \rho = 0 &amp;lt;/math&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;H_1: \rho \ne 0 &amp;lt;/math&amp;gt;&lt;br /&gt;
Wykorzystamy do tego test równości wariancji oparty o [http://brain.fuw.edu.pl/edu/STAT:Analiza_wariancji rozkład F]. &lt;br /&gt;
Jeśli zgodnie z &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;b_1 = 0&amp;lt;/math&amp;gt; to prosta regresji jest pozioma i wariancja wyjaśniona przez regresję (proporcjonalna do &amp;lt;math&amp;gt;ss_{reg}&amp;lt;/math&amp;gt;) jest równa wariancji niewyjaśnionej (proporcjonalna do &amp;lt;math&amp;gt;ss_{err}&amp;lt;/math&amp;gt;). Wariancje te można estymować dzieląc odpowiednie sumy kwadratów zdefiniowane w poprzednim paragrafie przez odpowiadającą im liczbę stopni swobody. Jeśli mamy ''N'' punktów danych, to:&lt;br /&gt;
* liczba stopni swobody dla  &amp;lt;math&amp;gt;ss_{tot}&amp;lt;/math&amp;gt; jest &amp;lt;math&amp;gt;N-1&amp;lt;/math&amp;gt;, poniważ jeden stopień swobody jest tracony na obliczenie średniej, &lt;br /&gt;
* liczba stopni swobody dla &amp;lt;math&amp;gt;ss_{err}&amp;lt;/math&amp;gt; jest &amp;lt;math&amp;gt;N-2&amp;lt;/math&amp;gt;, ponieważ do policzenia tej sumy kwadratów musimy wyznaczyć dwa parametry prostej,&lt;br /&gt;
* liczba stopni swobody odpowiadająca &amp;lt;math&amp;gt;ss_{reg}&amp;lt;/math&amp;gt; jest 1, bo jest &amp;lt;math&amp;gt;ss_{reg}&amp;lt;/math&amp;gt;  związana jest z poprzednimi sumami kwadratów równaniem, czyli swobody jest tyle ile wynosi różnica w stopniach swobody tamtych sum. &lt;br /&gt;
Zatem:&lt;br /&gt;
* estymator wariancji wyjaśnionej:&lt;br /&gt;
: &amp;lt;math&amp;gt;s_{reg} = \frac{ss_{reg}}{1}&amp;lt;/math&amp;gt;&lt;br /&gt;
* estymator wariancji niewyjaśnionej:&lt;br /&gt;
: &amp;lt;math&amp;gt;s_{err} = \frac{ss_{err}}{N-2}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wielkość&lt;br /&gt;
:&amp;lt;math&amp;gt; F = \frac{ss_{reg}(N-2)}{ss_{err}} &amp;lt;/math&amp;gt; podlega rozkładowi ''F'' o &amp;lt;math&amp;gt;(1,N-2)&amp;lt;/math&amp;gt; stopniach swobody.&lt;br /&gt;
W naszym przykładzie:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# test F&lt;br /&gt;
N = len(X)&lt;br /&gt;
F = (ss_reg *(N-2))/ss_err&lt;br /&gt;
p_F = 1-st.f.cdf(F,1,N-2)&lt;br /&gt;
print('F = %.2f, p_F = %.2f'%(F, p_F))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
''Wnioskowanie:'' Jeśli &amp;lt;tt&amp;gt;p_F&amp;lt;/tt&amp;gt; jest duże to nie mamy powodu aby odrzucić hipotezę zerową. Jeśli zaś jest ono mniejsze niż ustalony poziom istotności to odrzucamy hipotezę zerową i przyjmujemy alternatywną.&lt;br /&gt;
&lt;br /&gt;
===== Przedziały ufności dla parametrów =====&lt;br /&gt;
Przedziały ufności dla parametrów &amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;b_1&amp;lt;/math&amp;gt; pokazują zakres, w jakim z zadanym prawdopodobieństwem znajdują się ich &amp;quot;prawdziwe&amp;quot; wartości.&lt;br /&gt;
&lt;br /&gt;
Jeśli residua mają rozkład normalny, to estymatory parametrów &amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;b_1&amp;lt;/math&amp;gt; również będą miały rozkład normalny. &lt;br /&gt;
Zmienne:&lt;br /&gt;
: &amp;lt;math&amp;gt;t = \frac{\hat b_0 - b_0}{s_{\hat b_0}}\ \sim\ t_{N-2},&amp;lt;/math&amp;gt; &lt;br /&gt;
: &amp;lt;math&amp;gt;t = \frac{\hat b_1 - b_1}{s_{\hat b_1}}\ \sim\ t_{N-2},&amp;lt;/math&amp;gt; &lt;br /&gt;
podlegają rozkładowi ''t'' z  (''N''−2) stopniami swobody.&lt;br /&gt;
&lt;br /&gt;
Używając powyższych statystyk ''t'' można skonstruować przedziały ufności w standardowy sposób [http://brain.fuw.edu.pl/edu/STATLAB:Przedzia%C5%82y_ufno%C5%9Bci#Przyk.C5.82ad_2 (porównaj z przykładem)]. Jeśli przedział ma mieć poziom ufności &amp;lt;math&amp;gt;1 - \alpha&amp;lt;/math&amp;gt; to potrzebna nam będzie wartość krytyczna z rozkładu &amp;lt;math&amp;gt;t^*_{N-2}&amp;lt;/math&amp;gt; taka, że prawdopodobieństwo zaobserwowania wartości ''t'' nie większej od niej jest &amp;lt;math&amp;gt;\alpha/2&amp;lt;/math&amp;gt;. Wówczas:&lt;br /&gt;
: &amp;lt;math&amp;gt; b_1\in \Big[\ \hat b_1 - s_{\hat b_1} t^*_{N-2},\ \hat b_1 + s_{\hat b_1} t^*_{N-2}\ \Big] &amp;lt;/math&amp;gt; &lt;br /&gt;
oraz&lt;br /&gt;
: &amp;lt;math&amp;gt; b_0 \in \Big[\ \hat b_0 - s_{\hat b_0} t^*_{N-2},\ \hat b_0 + s_{\hat b_0} t^*_{N-2}\ \Big] &amp;lt;/math&amp;gt;&lt;br /&gt;
Implementacja:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# przedziały ufności:&lt;br /&gt;
alpha = 0.05  # zakładam 95% przedział ufności&lt;br /&gt;
# wartość krytyczna w rozkładzie t&lt;br /&gt;
t_kryt = st.t.ppf(alpha/2, N-2)&lt;br /&gt;
b0_l = b0 + s_b0*t_kryt&lt;br /&gt;
b0_h = b0 - s_b0*t_kryt&lt;br /&gt;
b1_l = b1 + s_b1*t_kryt&lt;br /&gt;
b1_h = b1 - s_b1*t_kryt&lt;br /&gt;
print('%.1f procentowe przedziały ufności parametrów:'%((1-alpha)*100))&lt;br /&gt;
print('b0: [%.2f %.2f ] '%(b0_l, b0_h))&lt;br /&gt;
print('b1: [%.2f %.2f ] '%(b1_l, b1_h))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Przedziały ufności dla modelu =====&lt;br /&gt;
Widzieliśmy, że parametry dopasowanej prostej nie są wyznaczone dokładnie. Tzn. jeśli dostalibyśmy inne realizacje danych (''X,Y'') to ta sama procedura regresji zwraca nieco inne parametry modelu. Jak widzieliśmy powyżej można wyznaczyć przedziały ufności wewnątrz których parametry te znajdują się z określonym prawdopodobieństwem. Różnym parametrom odpowiadają różne proste. Proste te wyznaczają na płaszczyźnie (''x,y'') pewien obszar. Obszar ten to przedział ufności dla modelu. Jego granice można wyznaczyć obliczając dla każdej wartości ''x'' błąd standardowy regresji ze wzoru:&lt;br /&gt;
: &amp;lt;math&amp;gt;s_{reg}(x_i) = \sqrt{\frac{ss_{err}}{N-2}} \cdot \sqrt{\frac{1}{N} + \frac{(x_i - \bar X)^2}{\sum_{j=1}^N(x_j - \bar X)^2}} &amp;lt;/math&amp;gt;&lt;br /&gt;
odległość krzywej wyznaczającej obszar ufności od prostej regresji znajdujemy mnożąc ten błąd standardowy przez odpowiednią wartość krytyczną z rozkładu &amp;lt;math&amp;gt;t_{N-2}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;d_i = t^*_{N-2}s_{reg}(x_i) &amp;lt;/math&amp;gt;&lt;br /&gt;
Implementacja:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# Przedział ufności modelu:&lt;br /&gt;
alpha = 0.05  # zakładam 95% przedział ufności&lt;br /&gt;
# wartość krytyczna w rozkładzie t&lt;br /&gt;
t_kryt = st.t.ppf(alpha/2, N-2)&lt;br /&gt;
sse = np.sum(residua**2)&lt;br /&gt;
# estymator wariancji residuów, bywa nazywany średnim błędem kwadratowym regresji :&lt;br /&gt;
v_e = sse/(N-2)&lt;br /&gt;
x_sr = np.mean(X)&lt;br /&gt;
# Odległość brzegów przedziału ufności od prostej regresji&lt;br /&gt;
d = t_kryt*np.sqrt(v_e)*np.sqrt(1.0/N + (X- x_sr)**2/np.sum((X-x_sr)**2))&lt;br /&gt;
# Ilustracja: dla każdego X cieniujemy obszar pomiędzy Y_reg-d,Y_reg+d i nadajemy mu przezroczystość 0.5&lt;br /&gt;
py.fill_between(X,Y_reg-d,Y_reg+d,alpha=0.5)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Przedziały ufności dla obserwacji =====&lt;br /&gt;
Przedział zmienności dla modelu nie mówi nam wiele o tym jak daleko od wyznaczonej prostej mogą pojawiać się nowe obserwacje (''x,y''). Aby zobrazować obszar, w którym z określonym prawdopodobieństwem mogą wystąpić nowe obserwacje potrzebujemy przedziału ufności dla obserwacji.&lt;br /&gt;
Jego granice można wyznaczyć obliczając dla każdej wartości ''x'' błąd standardowy ze wzoru:&lt;br /&gt;
: &amp;lt;math&amp;gt;s_{reg}(x_i) = \sqrt{\frac{ss_{err}}{N-2}} \cdot \sqrt{1+\frac{1}{N} + \frac{(x_i - \bar X)^2}{\sum_{j=1}^N(x_j - \bar X)^2}} &amp;lt;/math&amp;gt;&lt;br /&gt;
odległość krzywej wyznaczającej obszar ufności od prostej regresji znajdujemy mnożąc ten błąd standardowy przez odpowiednią wartość krytyczną z rozkładu &amp;lt;math&amp;gt;t_{N-2}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;d_i = t^*_{N-2}s_{reg}(x_i) &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# przedział ufności na obserwacje&lt;br /&gt;
d = t_kryt*np.sqrt(v_e)*np.sqrt(1+1.0/N + (X- x_sr)**2/np.sum((X-x_sr)**2))&lt;br /&gt;
py.fill_between(X,Y_reg-d,Y_reg+d, facecolor='gray',alpha=0.5)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Test &amp;lt;math&amp;gt;\chi^2&amp;lt;/math&amp;gt;=====&lt;br /&gt;
Jeśli znamy wariancję błędu pomiarowego można zastosować test &amp;lt;math&amp;gt;\chi^2&amp;lt;/math&amp;gt; do oceny jakości dopasowania.&lt;br /&gt;
Po pierwsze powinniśmy przetestować czy residua mają rozkład normalny&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
W, p =st.shapiro(residua)&lt;br /&gt;
print('Test normalności residuów: p = %.3f'%(p))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Jeśli tak to zmienna:&lt;br /&gt;
: &amp;lt;math&amp;gt;\chi_{fit}^2 = \sum_{i=1}^N {\left( \frac{y_i-y_{reg}}{\sigma} \right)^2 }&amp;lt;/math&amp;gt;&lt;br /&gt;
podlega rozkładowi &amp;lt;math&amp;gt;\chi^2&amp;lt;/math&amp;gt; o &amp;lt;math&amp;gt;N - n&amp;lt;/math&amp;gt;  ilości stopni swobody (''n'' - ilość estymowanych parametrów), czyli u nas ''N-2''.	&lt;br /&gt;
Możemy zbadać jakie jest prawdopodobieństwo zaobserwowania takiej (&amp;lt;math&amp;gt;\chi_{fit}^2&amp;lt;/math&amp;gt;), bądź bardziej ekstremalnej wartości &amp;lt;math&amp;gt;\chi^2&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
chi2 = np.sum(residua**2)/sigma**2&lt;br /&gt;
N = len(X)&lt;br /&gt;
if chi2 &amp;lt; N-2:&lt;br /&gt;
	p_chi2 = st.chi2.cdf(chi2, N-2)&lt;br /&gt;
else:&lt;br /&gt;
	p_chi2 = 1 - st.chi2.cdf(chi2, N-2)&lt;br /&gt;
print('chi2 = %.2f, p_chi2 = %.3f' %(chi2, p_chi2))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Czasem używamy zredukowanego, czyli podzielonego przez liczbę stopni swobody &amp;lt;math&amp;gt;\chi^2&amp;lt;/math&amp;gt;:&lt;br /&gt;
*  Jeśli jest on znacząco większy niż 1 to model nie pasuje do danych, lub nie doszacowaliśmy standardowego odchylenia &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;. &lt;br /&gt;
*  Jeśli jest sporo mniejszy niż 1 to prawdopodobnie oszacowane przez nas &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; jest większe niż rzeczywiste.&lt;br /&gt;
To jakościowe porównanie można uściślić szacując prawdopodobieństwo zaobserwowania wartości &amp;lt;math&amp;gt;\chi^2_{zred}&amp;lt;/math&amp;gt; bardziej ekstremalnych niż otrzymane w dopasowaniu. Zmienna &amp;lt;math&amp;gt;\chi^2_{zred}&amp;lt;/math&amp;gt; podlega innemu rozkładowi prawdopodobieństwa niż &amp;lt;math&amp;gt;\chi^2&amp;lt;/math&amp;gt;, możemy go jednak łatwo wyznaczyć w drodze symulacji:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
chi2_zred = chi2/(N-2)&lt;br /&gt;
# potrzebny jest nam rozkład chi2_zred:&lt;br /&gt;
N_dist = 100000&lt;br /&gt;
dist_chi2_zred = np.sum(st.norm.rvs(size=(N-2,N_dist))**2  ,0)/(N-2)&lt;br /&gt;
if chi2_zred&amp;gt;1:&lt;br /&gt;
	p_chi2_zred = np.sum(dist_chi2_zred&amp;gt;=chi2_zred)/float(N_dist)&lt;br /&gt;
else:&lt;br /&gt;
	p_chi2_zred = np.sum(dist_chi2_zred&amp;lt;=chi2_zred)/float(N_dist)&lt;br /&gt;
print('chi2_zred = %.2f, p_chi2_zred = %.3f' %(chi2_zred, p_chi2_zred))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dopasowanie krzywej do danych gdy wariancje dla poszczególnych punktów pomiarowych są różne ===&lt;br /&gt;
Często w fizyce potrzebujemy dopasować jakąś bardziej skomplikowaną zależność niż prosta.  Często też potrafimy oszacować błędy pomiarowe dla różnych wartości zmiennej niezależnej, przy czym może się zdarzyć, że błędy te nie są jednakowe dla różnych wartości zmiennej niezależnej. Do dopasowania współczynników używamy zasady [[WnioskowanieStatystyczne/MLF|największej wiarygodności]], która prowadzi do procedur minimalizacji ważonego średniego błędu kwadratowego. Możemy wówczas użyć standardowych procedur minimalizacji gradientowej. Należy jednak pamiętać, że metody gradientowe znajdują najbliższe ''minimum lokalne'' analizowanej funkcji. W przypadku funkcji nieliniowych skutkiem tego  jest zależność wyniku od punktu startu minimalizacji.&lt;br /&gt;
&lt;br /&gt;
====Dopasowanie dowolnej funkcji====&lt;br /&gt;
Poniżej rozważymy przykład dopasowania zależności wykładniczej. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import scipy.optimize as opt&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
 &lt;br /&gt;
# funkcja używana do symulowania danych&lt;br /&gt;
def zanik(x, amp, wykladnik, blad_wzgledny):&lt;br /&gt;
	'''Definicja funkcji zaniku wykładniczego. Użyjemy jej do wytworzenia danych'''&lt;br /&gt;
	y = amp * (x**wykladnik)       # idealne dane&lt;br /&gt;
	sigma = blad_wzgledny * y      # zakładamy, że stały jest błąd względny pomiaru&lt;br /&gt;
				       # przeliczamy go na standardowe odchylenie symulowanego  błędu &lt;br /&gt;
	# symulujemy szum z obliczonym odchyleniem standardowym i dodajemy go do danych idealnych										&lt;br /&gt;
	y += st.norm.rvs(size=num_points) * sigma       &lt;br /&gt;
	return (y, sigma)&lt;br /&gt;
 &lt;br /&gt;
# Funkcja, którą chcemy dopasować do danych:&lt;br /&gt;
def funkcja_do_fitowania(x,a,b):&lt;br /&gt;
	y = a*x**b&lt;br /&gt;
	return y&lt;br /&gt;
 &lt;br /&gt;
def funkcja_bledu(x, y, funkcja, params, err):&lt;br /&gt;
	'''Suma kwadratów tej funkcji jest minimalizowana w procesie optymalizacji parametrów.&lt;br /&gt;
	Nam przyda się do obliczenia residuów.'''&lt;br /&gt;
	y_fit = funkcja(x, *params) # aktualne wartości y z dopasowania&lt;br /&gt;
	residuum = y-y_fit # residua wchodzą do sumy kwadratów z wagą odwrotnie proporcjonalną do standardowego odchylenia&lt;br /&gt;
	residuum_wazone = residuum/ err &lt;br /&gt;
	return residuum_wazone&lt;br /&gt;
&lt;br /&gt;
# Generujemy punkty z szumem&lt;br /&gt;
num_points = 20&lt;br /&gt;
X = np.linspace(1.1, 10.1, num_points)&lt;br /&gt;
Y, sigma = zanik(X, 10.0, -2.0, 0.1)     # symulowane dane &lt;br /&gt;
 &lt;br /&gt;
# Dopasowujemy parametry &lt;br /&gt;
# nie musimy podawać wartości startowych (params_init) dla procedury minimalizacji (wtedy funkcja zakłada wartości startowe równe 1)&lt;br /&gt;
# jednak zazwyczaj dobrze jest podpowiedzieć algorytmowi, gdzie powinien zacząć&lt;br /&gt;
# nie musimy również podawać wartości sigma, ale jeśli są one różne dla różnych punktów, to podanie ich sprawi, że algorytm będzie się bardziej troszczył&lt;br /&gt;
# o dopasowanie do punktów pomiarowych zmierzonych z dobrą dokładnością, a bardziej swobodnie podejdzie do tych o dużych niepewnościach&lt;br /&gt;
params_init = [2.0, -1.0]&lt;br /&gt;
params_final, covar = opt.curve_fit(funkcja_do_fitowania,X,Y,params_init,sigma)&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Dopasowane parametry&amp;quot;,params_final)&lt;br /&gt;
print(&amp;quot;Macierz kowariancji\n&amp;quot;,covar)&lt;br /&gt;
&lt;br /&gt;
# dopasowane parametry&lt;br /&gt;
amp=params_final[0]&lt;br /&gt;
wykladnik=params_final[1]&lt;br /&gt;
&lt;br /&gt;
# standardowe błędy dopasowania&lt;br /&gt;
amp_err = np.sqrt(covar[0][0])&lt;br /&gt;
wykladnik_err = np.sqrt(covar[1][1])&lt;br /&gt;
 &lt;br /&gt;
# test chi2 dobroci dopasowania. &lt;br /&gt;
# Jeśli znamy wariancję błędu pomiarowego można zastosować test chi2 do oceny jakości dopasowania.&lt;br /&gt;
# 	Po pierwsze powinniśmy przetestować czy residua mają rozkład normalny&lt;br /&gt;
 &lt;br /&gt;
residua = funkcja_bledu(X, Y, funkcja_do_fitowania, params_final, sigma)# tym razem residua już są podzielone przez standardowe odchylenie, każde przez swoje&lt;br /&gt;
W, p =st.shapiro(residua)&lt;br /&gt;
print('Test normalności residuów: p = %.3f'%(p))&lt;br /&gt;
# jeśli tak to zmienna:&lt;br /&gt;
chi2 = np.sum(residua**2)&lt;br /&gt;
# podlega rozkładowi chi-kwadrat o N - n  ilości stopni swobody (n - ilość fitowanych parametrów), czyli u nas N-2	&lt;br /&gt;
# możemy zbadać jakie jest prawdopodobieństwo zaobserwowania takiej, bądź bardziej ekstremalnej wartości chi2:&lt;br /&gt;
&lt;br /&gt;
N = len (X)&lt;br /&gt;
liczba_stopni_swobody = N-len(params_final) # liczba punktów - liczba parametrów&lt;br /&gt;
if chi2 &amp;lt; liczba_stopni_swobody:&lt;br /&gt;
	p_chi2 = st.chi2.cdf(chi2, liczba_stopni_swobody)&lt;br /&gt;
else:&lt;br /&gt;
	p_chi2 = st.chi2.sf(chi2, liczba_stopni_swobody) # równoważne 1-st.chi2.cdf(chi2, N-2), ale sf ma lepszą dokładność dla małych wartości&lt;br /&gt;
print('chi2 = %.2f, p_chi2 = %.3f' %(chi2, p_chi2))&lt;br /&gt;
# czasem używamy zredukowanego chi2, czyli podzielonego przez ilość stopni swobody&lt;br /&gt;
chi2_zred = chi2/liczba_stopni_swobody&lt;br /&gt;
# jeśli jest on znacząco większy niż 1 to model nie pasuje do danych, lub nie doszacowaliśmy sigmy, &lt;br /&gt;
# jeśli jest sporo mniejszy niż 1 to prawdopodobnie oszacowane przez nas sigma jest większe niż rzeczywiste&lt;br /&gt;
# potrzebny jest nam rozkład chi2_zred:&lt;br /&gt;
N_dist = 100000&lt;br /&gt;
dist_chi2_zred = np.sum(st.norm.rvs(size=(liczba_stopni_swobody,N_dist))**2  ,0)/liczba_stopni_swobody&lt;br /&gt;
p_chi2_zred = np.sum(dist_chi2_zred&amp;gt;=chi2_zred)/float(N_dist)&lt;br /&gt;
print('chi2_zred = %.2f, p_chi2_zred = %.3f' %(chi2_zred, p_chi2_zred))&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
##########&lt;br /&gt;
# wykres&lt;br /&gt;
##########&lt;br /&gt;
py.subplot(2,1,1)&lt;br /&gt;
py.plot(X, funkcja_do_fitowania(X,amp,wykladnik))     # Fit&lt;br /&gt;
py.errorbar(X, Y, yerr=sigma, fmt='k.')  # Dane i błędy&lt;br /&gt;
py.text(5, 6.5, 'amplituda = %5.2f +/- %5.2f' % (amp, amp_err))&lt;br /&gt;
py.text(5, 5.5, u'wykładnik = %5.2f +/- %5.2f' % (wykladnik, wykladnik_err))&lt;br /&gt;
py.title(u'Dopasowanie metodą najmniejszych kwadratów')&lt;br /&gt;
py.xlabel('X')&lt;br /&gt;
py.ylabel('Y')&lt;br /&gt;
py.xlim(1, 11)&lt;br /&gt;
py.subplot(2,1,2)&lt;br /&gt;
py.plot(X, residua) # residua&lt;br /&gt;
py.xlabel('X')&lt;br /&gt;
py.ylabel('dY')&lt;br /&gt;
py.title(u'Wykres residuów')&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Dopasowanie wielomianu====&lt;br /&gt;
Poniżej rozważymy przykład dopasowania zależności wielomianowej.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
 &lt;br /&gt;
# funkcja używana do symulowania danych&lt;br /&gt;
def wielomian_z_szumem(x, wspolczynniki,blad_wzgledny):&lt;br /&gt;
	'''Definicja funkcji wielomianowej. Użyjemy jej do wytworzenia danych'''&lt;br /&gt;
	W = np.poly1d(wspolczynniki) # funkcja zwracająca obiekt wielomianu o zadanych wspolczynnikach&lt;br /&gt;
								 #można go używać tak, jak zwykłej funkcji, ale obsługuje też działania na wielomianach&lt;br /&gt;
	y = W(X)# idealne dane&lt;br /&gt;
	sigma = blad_wzgledny * y	# zakładamy, że stały jest błąd względny pomiaru&lt;br /&gt;
								# przeliczamy go na standardowe odchylenie symulowanego  błędu &lt;br /&gt;
	# symulujemy szum z obliczonym odchyleniem standardowym i dodajemy go do danych idealnych										&lt;br /&gt;
	y += st.norm.rvs(size=num_points) * sigma       &lt;br /&gt;
	return (y, sigma)&lt;br /&gt;
&lt;br /&gt;
def funkcja_bledu_dla_wielomianow(x, y, wspolczynniki, err):&lt;br /&gt;
	'''Suma kwadratów tej funkcji jest minimalizowana w procesie optymalizacji parametrów.&lt;br /&gt;
	Nam przyda się do obliczenia residuów.'''&lt;br /&gt;
	W = np.poly1d(wspolczynniki)&lt;br /&gt;
	y_fit = W(x) # aktualne wartości y z dopasowania&lt;br /&gt;
	residuum = y-y_fit # residua wchodzą do sumy kwadratów z wagą odwrotnie proporcjonalną do standardowego odchylenia&lt;br /&gt;
	residuum_wazone = residuum/ err &lt;br /&gt;
	return residuum_wazone&lt;br /&gt;
&lt;br /&gt;
# Generujemy punkty z szumem&lt;br /&gt;
num_points = 20&lt;br /&gt;
X = np.linspace(-4, 6, num_points)&lt;br /&gt;
wspolczynniki_wielomianu= (0.3,1,-2,4)&lt;br /&gt;
stopien_wielomianu=len(wspolczynniki_wielomianu)-1&lt;br /&gt;
blad_wzgledny_pomiaru=0.1&lt;br /&gt;
Y, sigma = wielomian_z_szumem(X, wspolczynniki_wielomianu, blad_wzgledny_pomiaru)     # symulowane dane &lt;br /&gt;
 &lt;br /&gt;
# Dopasowujemy parametry&lt;br /&gt;
# tym razem skorzystamy z funkcji np.polyfit, która nie potrzebuje parametrów początkowych, ani zdefiniowanej funkcji, którą ma dopasować&lt;br /&gt;
# podajemy jej tylko nasze dane oraz stopień wielomianu, który ma dopasować oraz opcjonalne wagi&lt;br /&gt;
# UWAGA! Tym razem wagi muszą być odwrotnością odchyleń standardowych (1/sigma, a nie sigma, jak w curve_fit)&lt;br /&gt;
# funkcja ta domyślnie zwraca tylko dopasowane parametry (wspolczynniki wielomianu), a nie zwraca macierzy kowariancji,&lt;br /&gt;
# jeśli jest nam ona potrzebna, to musimy jej zarządać poprzez dodanie opcji cov=True (full=False, ale to jest domyślnie)&lt;br /&gt;
params_final, covar=np.polyfit(X, Y, deg=stopien_wielomianu, w=1/sigma, cov=True)&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Dopasowane wspolczynniki wielomianu&amp;quot;,params_final)&lt;br /&gt;
print(&amp;quot;Macierz kowariancji\n&amp;quot;,covar)&lt;br /&gt;
&lt;br /&gt;
# standardowe błędy dopasowania&lt;br /&gt;
niepewnosci=[]&lt;br /&gt;
for i in range(len(params_final)):&lt;br /&gt;
	niepewnosci.append(np.sqrt(covar[i][i]))&lt;br /&gt;
print(niepewnosci)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# test chi2 dobroci dopasowania. &lt;br /&gt;
# Jeśli znamy wariancję błędu pomiarowego można zastosować test chi2 do oceny jakości dopasowania.&lt;br /&gt;
# 	Po pierwsze powinniśmy przetestować czy residua mają rozkład normalny&lt;br /&gt;
 &lt;br /&gt;
residua = funkcja_bledu_dla_wielomianow(X, Y, params_final, sigma)# tym razem residua już są podzielone przez standardowe odchylenie, każde przez swoje&lt;br /&gt;
W, p =st.shapiro(residua)&lt;br /&gt;
print('Test normalności residuów: p = %.3f'%(p))&lt;br /&gt;
# jeśli tak to zmienna:&lt;br /&gt;
chi2 = np.sum(residua**2)&lt;br /&gt;
# podlega rozkładowi chi-kwadrat o N - n  ilości stopni swobody (n - ilość fitowanych parametrów), czyli u nas N-2	&lt;br /&gt;
# możemy zbadać jakie jest prawdopodobieństwo zaobserwowania takiej, bądź bardziej ekstremalnej wartości chi2:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
N = len (X)&lt;br /&gt;
liczba_stopni_swobody = N-len(params_final) # liczba punktów - liczba parametrów&lt;br /&gt;
if chi2 &amp;lt; liczba_stopni_swobody:&lt;br /&gt;
	p_chi2 = st.chi2.cdf(chi2, liczba_stopni_swobody)&lt;br /&gt;
else:&lt;br /&gt;
	p_chi2 = st.chi2.sf(chi2, liczba_stopni_swobody) # równoważne 1-st.chi2.cdf(chi2, N-2), ale sf ma lepszą dokładność dla małych wartości&lt;br /&gt;
print('chi2 = %.2f, p_chi2 = %.3f' %(chi2, p_chi2))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# czasem używamy zredukowanego chi2, czyli podzielonego przez ilość stopni swobody&lt;br /&gt;
chi2_zred = chi2/liczba_stopni_swobody&lt;br /&gt;
# jeśli jest on znacząco większy niż 1 to model nie pasuje do danych, lub nie doszacowaliśmy sigmy, &lt;br /&gt;
# jeśli jest sporo mniejszy niż 1 to prawdopodobnie oszacowane przez nas sigma jest większe niż rzeczywiste&lt;br /&gt;
# potrzebny jest nam rozkład chi2_zred:&lt;br /&gt;
N_dist = 100000&lt;br /&gt;
dist_chi2_zred = np.sum(st.norm.rvs(size=(liczba_stopni_swobody,N_dist))**2  ,0)/liczba_stopni_swobody&lt;br /&gt;
p_chi2_zred = np.sum(dist_chi2_zred&amp;gt;=chi2_zred)/float(N_dist)&lt;br /&gt;
print('chi2_zred = %.2f, p_chi2_zred = %.3f' %(chi2_zred, p_chi2_zred))&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
##########&lt;br /&gt;
# wykres&lt;br /&gt;
##########&lt;br /&gt;
py.subplot(2,1,1)&lt;br /&gt;
W=np.poly1d(params_final)&lt;br /&gt;
py.plot(X, W(X))     # Fit&lt;br /&gt;
py.errorbar(X, Y, yerr=sigma, fmt='k.')  # Dane i błędy&lt;br /&gt;
py.title(u'Dopasowanie metodą najmniejszych kwadratów')&lt;br /&gt;
py.text(-4.6, 92, u'dopasowane współczynniki = '+str(np.round(params_final,3)))&lt;br /&gt;
py.text(-4.6, 86, u'niepewności współczynników = '+str(np.round(niepewnosci,3)))&lt;br /&gt;
py.text(-4.6, 80, u'prawdziwe współczynniki = '+str(np.round(wspolczynniki_wielomianu,3)))&lt;br /&gt;
py.xlabel('X')&lt;br /&gt;
py.ylabel('Y')&lt;br /&gt;
py.xlim(X.min()-1, X.max()+1)&lt;br /&gt;
py.subplot(2,1,2)&lt;br /&gt;
py.plot(X, residua) # residua&lt;br /&gt;
py.xlabel('X')&lt;br /&gt;
py.ylabel('dY')&lt;br /&gt;
py.title(u'Wykres residuów')&lt;br /&gt;
py.show()&lt;br /&gt;
py.show()&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Maciek</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=WnioskowanieStatystyczne/_Regresja_liniowa_i_test_chi2&amp;diff=11351</id>
		<title>WnioskowanieStatystyczne/ Regresja liniowa i test chi2</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=WnioskowanieStatystyczne/_Regresja_liniowa_i_test_chi2&amp;diff=11351"/>
		<updated>2025-06-04T12:20:25Z</updated>

		<summary type="html">&lt;p&gt;Maciek: /* Regresja liniowa */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Wstęp ==&lt;br /&gt;
Załóżmy, że mamy dwie zmienne losowe ciągłe &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Chcielibyśmy wykorzystać wiedzę o wartościach zmiennej &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; do przewidywania wartości zmiennej &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Mówimy, że zmienna &amp;lt;math&amp;gt;X &amp;lt;/math&amp;gt; jest niezależna, a zmienna &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; zależna. W fizyce taką wiedzę opisujemy przy pomocy równań. Równania fizyczne często wyrażają związki przyczynowo-skutkowe. W takim wypadku, która zmienna jest zależna, a która niezależna ma głębszy sens. Jednak nie zawsze tak musi być. Wartości dwóch zmiennych mogą zależeć od trzeciej nieobserwowanej zmiennej. W tej sytuacji wiedza o wartości jednej z tych zmiennych może być wykorzystana do przewidywania wartości drugiej, ale nie ma między nimi związku przyczynowo-skutkowego.&lt;br /&gt;
&lt;br /&gt;
== Regresja ==&lt;br /&gt;
W ogólności, dla każdej wartości zmiennej &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; mamy rozkład wartości zmiennej &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. &lt;br /&gt;
{{Solution | title = Przykład: rozkłady ''Y''  dla każdego punktu ''X'' |text = &lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
# symuowana zależność ma następującą postać y = b0 + b1*x &lt;br /&gt;
# wartości parametrów &lt;br /&gt;
b0 = 1 &lt;br /&gt;
b1 = 3&lt;br /&gt;
&lt;br /&gt;
X = np.arange(0, 10,0.5)&lt;br /&gt;
# będę symulował zbieranie n wartości Y dlakażdego X[i], zakładam to samo odchylenie standardowe &lt;br /&gt;
odch_std = 1&lt;br /&gt;
n = 30&lt;br /&gt;
Y = np.zeros((n,len(X)))&lt;br /&gt;
for i in range(len(X)):&lt;br /&gt;
	Y[:,i] =  b0 + b1*X[i] + st.norm.rvs(size = n, loc=0, scale = odch_std)&lt;br /&gt;
&lt;br /&gt;
# narysujmy ten zbiór punktów &lt;br /&gt;
for j in range(len(X)):&lt;br /&gt;
	py.plot(X, Y[j,:],'b,')&lt;br /&gt;
# wyróżnimy średnie&lt;br /&gt;
py.plot(X,np.mean(Y,0),'ro')&lt;br /&gt;
#  i odchykenia standardowe:&lt;br /&gt;
py.errorbar(X,np.mean(Y,0),odch_std,ecolor = 'k',elinewidth = 8)&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
===Regresja liniowa ===&lt;br /&gt;
Dalej będziemy rozważać regresję liniową, tzn. założymy, że punkty &amp;lt;math&amp;gt;(X,Y)&amp;lt;/math&amp;gt; są generowane przez model  liniowy o następującym równaniu:&lt;br /&gt;
: &amp;lt;math&amp;gt; y = b_0 + b_1x + \epsilon &amp;lt;/math&amp;gt;&lt;br /&gt;
współczynniki &amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;b_1&amp;lt;/math&amp;gt; można wyestymować stosując &lt;br /&gt;
[https://brain.fuw.edu.pl/edu/index.php/WnioskowanieStatystyczne/MLF metodę największej wiarygodności]:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat b_1=\frac{\underset{i=1}{\overset{N}{\sum }}(x_{i}-\overline{x})(y_{i}-&lt;br /&gt;
\overline{y})}{\underset{i=1}{\overset{N}{\sum }}(x_{i}-\overline{x})^{2}},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
 \hat b_0=\overline{y}-\hat b_1\overline{x}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Z tymi współczynnikami otrzymujemy równanie opisujące prostą regresji:&lt;br /&gt;
&amp;lt;math&amp;gt;\hat y = \hat b_0 + \hat b_1 x&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zakłądając, że &amp;lt;math&amp;gt;\epsilon &amp;lt;/math&amp;gt; pochodzi z rozkładu normalnego o wariancji &amp;lt;math&amp;gt;\sigma^2&amp;lt;/math&amp;gt; estymowane współczynniki są zmiennymi losowymi pochodzącymi z rozkładów normalnego o średniej takiej jak wyestymowany współczynnik i  wariancji odpowiednio:&lt;br /&gt;
:&amp;lt;math&amp;gt; v_{b_1} = \frac{\sigma^2}{\sum_i (x_i - \bar x)^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt; v_{b_0} = \frac{\sigma^2}{n} + \frac{\bar x ^2}{\sum_i (x_i - \bar x)^2} \sigma^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wariancję &amp;lt;math&amp;gt;\sigma^2 = E[S^2]&amp;lt;/math&amp;gt;  można estymować przez:&lt;br /&gt;
:&amp;lt;math&amp;gt;S^2 = \frac{1}{n-2}\sum_{i=1}^n(y_i - \hat y_i)^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Warto tu zwrócić uwagę na prosty fakt, że niepewność oszacowania współczynników można zmniejszyć zwiększając zakres zmiennej &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Funkcję estymującą parametry i ich standardowe odchylenia można zaimplementować w pythonie następująco:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
def regresja_liniowa(X,Y):&lt;br /&gt;
	'''równanie dopasowywanej prostej to y = b0 + b1*x&lt;br /&gt;
	argumenty:&lt;br /&gt;
	  X - zmienna niezależna&lt;br /&gt;
	  Y - zmienna zależna&lt;br /&gt;
	funkcja zwraca:&lt;br /&gt;
	  b0, b1, - estymaty parametrów&lt;br /&gt;
	  s_b0, s_b1, - estymaty standardowego odchylenia parametrów &lt;br /&gt;
	  residua - różnice między punktami pomiarowymi a punktami na dopasowanej prostej&lt;br /&gt;
	'''&lt;br /&gt;
	N = len(X)&lt;br /&gt;
	x_sr = np.mean(X)&lt;br /&gt;
	y_sr = np.mean(Y)&lt;br /&gt;
	# estymatory parametrów &lt;br /&gt;
	# korzystamy z tego że numpy wykonuje odejmowania i potęgowania dla każdego elementu tablicy X i Y&lt;br /&gt;
	b1 = np.sum((X-x_sr)*(Y-y_sr))/np.sum((X-x_sr)**2)&lt;br /&gt;
	b0 = y_sr - b1*x_sr&lt;br /&gt;
	&lt;br /&gt;
	# teraz liczymy kilka rzeczy przydatnych do oceny jakości modelu&lt;br /&gt;
	Y_reg = b0 + b1*X # wartości Y przewidywane przez model&lt;br /&gt;
	residua = Y - Y_reg # residua, czyli zmienność Y nie wynikająca z modelu&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	sse = np.sum(residua**2)&lt;br /&gt;
	# estymator wariancji residuów, bywa nazywany średnim błędem kwadratowym regresji :&lt;br /&gt;
	v_e = sse/(N-2)&lt;br /&gt;
	# estymatory standardowych błędów parametrów&lt;br /&gt;
	s_b0 = np.sqrt(v_e) * np.sqrt(1.0/N + x_sr**2/np.sum( (X-x_sr)**2))&lt;br /&gt;
	s_b1 = np.sqrt(v_e) * np.sqrt( 1.0/np.sum( (X -x_sr)**2 ))&lt;br /&gt;
	return (b0, b1, s_b0, s_b1, residua )&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Przykład: Dopasowanie prostej do punktów (zakładamy jednakową wariancję ''Y'' dla każdego ''X'')====&lt;br /&gt;
Wytwórzmy dane zgodnie z modelem:&lt;br /&gt;
: &amp;lt;math&amp;gt;y = -13 + 3 x + \epsilon&amp;lt;/math&amp;gt; &lt;br /&gt;
: i &amp;lt;math&amp;gt;\sigma_\epsilon =19&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# symulowana zależność ma następującą postać y = b0 + b1*x &lt;br /&gt;
# wartości parametrów &lt;br /&gt;
b0 = -13.0&lt;br /&gt;
b1 = 3.0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
X = np.arange(30, 70, 0.5)&lt;br /&gt;
sigma = 19.0&lt;br /&gt;
n = 1&lt;br /&gt;
Y = np.zeros(len(X))&lt;br /&gt;
for i in range(len(X)):&lt;br /&gt;
	Y[i] =  b0 + b1*X[i] + st.norm.rvs(size = n, loc=0, scale = sigma)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Korzystając ze zdefiniowanej powyżej funkcji &amp;lt;tt&amp;gt;regresja_liniowa&amp;lt;/tt&amp;gt; estymujemy parametry i ich odchylenia standardowe:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
(b0, b1, s_b0, s_b1, residua ) = regresja_liniowa(X,Y)&lt;br /&gt;
&lt;br /&gt;
print('Równanie prostej: y = b0 + b1*x')&lt;br /&gt;
print('dopasowane współczynniki: b0 = %.3f, b1 = %.3f' %(b0, b1))&lt;br /&gt;
print('s_b0 = %.4f, s_b1= %.4f '%(s_b0, s_b1))&lt;br /&gt;
	&lt;br /&gt;
py.errorbar(X,Y,sigma)&lt;br /&gt;
Y_reg = b0 + b1*X &lt;br /&gt;
py.plot(X,Y_reg)&lt;br /&gt;
&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Ocena jakości dopasownia ====&lt;br /&gt;
=====Współczynnik &amp;lt;math&amp;gt;R^2&amp;lt;/math&amp;gt;=====&lt;br /&gt;
Aby wyrazić współczynnik &amp;lt;math&amp;gt;R^2&amp;lt;/math&amp;gt; potrzebujemy następujących wyrażeń - sum kwadratów (ss). Są one miarą zmienności.&lt;br /&gt;
* &amp;lt;math&amp;gt;ss_{tot}&amp;lt;/math&amp;gt; - całkowita suma kwadratów - proporcjonalna do wariancji próby,&lt;br /&gt;
* &amp;lt;math&amp;gt;ss_{reg}&amp;lt;/math&amp;gt; -  suma kwadratów regresji - zwana też wyjaśnioną sumą kwadratów,&lt;br /&gt;
* &amp;lt;math&amp;gt;ss_{err}&amp;lt;/math&amp;gt; -  suma kwadratów residuów - niewyjaśniona suma kwadratów.&lt;br /&gt;
&lt;br /&gt;
Poszczególne składniki wymienionych powyżej sum kwadratów są zilustrowane na poniższym rysunku.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Regresja1.svg|thumb|500px|center|Dla wybranego punktu &amp;lt;math&amp;gt;(x_i,y_i)&amp;lt;/math&amp;gt; zaznaczono różnice będące składnikami poszczególnych sum kwadratów]]&lt;br /&gt;
&lt;br /&gt;
Implementacja:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
y_sr = np.mean(Y)&lt;br /&gt;
ss_tot = np.sum( (Y -  y_sr)**2 ) &lt;br /&gt;
ss_reg = np.sum( (Y_reg - y_sr)**2 )&lt;br /&gt;
ss_err = np.sum( (residua)**2 ) &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
mając te sumy &amp;lt;math&amp;gt;R^2&amp;lt;/math&amp;gt; definiujemy jako:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^2 = 1 - \frac{ss_{err}}{ss_{tot}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
R2 = 1 - ss_err/ss_tot &lt;br /&gt;
print('R2 = %.2f' %(R2))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W przypadku regresji liniowej &amp;lt;math&amp;gt;ss_{reg} + ss_{err} = ss_{tot}&amp;lt;/math&amp;gt;. Możemy to sprawdzić [http://brain.fuw.edu.pl/edu/STAT:Regresja_liniowa#Interpretacja_wsp.C3.B3.C5.82czynnika_korelacji analitycznie] i numerycznie:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
print('ss_tot = %.3f' %(ss_tot))&lt;br /&gt;
print('ss_reg + ss_err =%.3f'%(ss_reg+ss_err))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
czyli &lt;br /&gt;
: &amp;lt;math&amp;gt;R^2 = \frac{ss_{reg}}{ss_{tot}} &amp;lt;/math&amp;gt;, &lt;br /&gt;
można więc interpretować &amp;lt;math&amp;gt;R^2&amp;lt;/math&amp;gt;  jako frakcję zmienności ''Y'' tłumaczoną przez model.&lt;br /&gt;
W przypadku regresji liniowej współczynnik &amp;lt;math&amp;gt;R^2&amp;lt;/math&amp;gt; równy jest kwadratowi  współczynnika korelacji &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt; &lt;br /&gt;
: &amp;lt;math&amp;gt;R^2 = \rho^2&amp;lt;/math&amp;gt;&lt;br /&gt;
[http://brain.fuw.edu.pl/edu/STAT:Regresja_liniowa#Interpretacja_wsp.C3.B3.C5.82czynnika_korelacji (dowód)]&lt;br /&gt;
&lt;br /&gt;
===== Test F dla hipotezy o braku korelacji =====&lt;br /&gt;
Często interesujące jest zweryfikowanie hipotezy o istotności zależności między ''Y'' a ''X'' (proszę nie mylić tego z istnieniem związku przyczynowo-skutkowego). Matematycznie równoważne jest to postawieniu hipotezy:&lt;br /&gt;
: &amp;lt;math&amp;gt;H_0: b_1 = 0 &amp;lt;/math&amp;gt;&lt;br /&gt;
:  &amp;lt;math&amp;gt;H_1: b_1 \ne 0 &amp;lt;/math&amp;gt;&lt;br /&gt;
albo:&lt;br /&gt;
: &amp;lt;math&amp;gt;H_0: \rho = 0 &amp;lt;/math&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;H_1: \rho \ne 0 &amp;lt;/math&amp;gt;&lt;br /&gt;
Wykorzystamy do tego test równości wariancji oparty o [http://brain.fuw.edu.pl/edu/STAT:Analiza_wariancji rozkład F]. &lt;br /&gt;
Jeśli zgodnie z &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;b_1 = 0&amp;lt;/math&amp;gt; to prosta regresji jest pozioma i wariancja wyjaśniona przez regresję (proporcjonalna do &amp;lt;math&amp;gt;ss_{reg}&amp;lt;/math&amp;gt;) jest równa wariancji niewyjaśnionej (proporcjonalna do &amp;lt;math&amp;gt;ss_{err}&amp;lt;/math&amp;gt;). Wariancje te można estymować dzieląc odpowiednie sumy kwadratów zdefiniowane w poprzednim paragrafie przez odpowiadającą im liczbę stopni swobody. Jeśli mamy ''N'' punktów danych, to:&lt;br /&gt;
* liczba stopni swobody dla  &amp;lt;math&amp;gt;ss_{tot}&amp;lt;/math&amp;gt; jest &amp;lt;math&amp;gt;N-1&amp;lt;/math&amp;gt;, poniważ jeden stopień swobody jest tracony na obliczenie średniej, &lt;br /&gt;
* liczba stopni swobody dla &amp;lt;math&amp;gt;ss_{err}&amp;lt;/math&amp;gt; jest &amp;lt;math&amp;gt;N-2&amp;lt;/math&amp;gt;, ponieważ do policzenia tej sumy kwadratów musimy wyznaczyć dwa parametry prostej,&lt;br /&gt;
* liczba stopni swobody odpowiadająca &amp;lt;math&amp;gt;ss_{reg}&amp;lt;/math&amp;gt; jest 1, bo jest &amp;lt;math&amp;gt;ss_{reg}&amp;lt;/math&amp;gt;  związana jest z poprzednimi sumami kwadratów równaniem, czyli swobody jest tyle ile wynosi różnica w stopniach swobody tamtych sum. &lt;br /&gt;
Zatem:&lt;br /&gt;
* estymator wariancji wyjaśnionej:&lt;br /&gt;
: &amp;lt;math&amp;gt;s_{reg} = \frac{ss_{reg}}{1}&amp;lt;/math&amp;gt;&lt;br /&gt;
* estymator wariancji niewyjaśnionej:&lt;br /&gt;
: &amp;lt;math&amp;gt;s_{err} = \frac{ss_{err}}{N-2}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wielkość&lt;br /&gt;
:&amp;lt;math&amp;gt; F = \frac{ss_{reg}(N-2)}{ss_{err}} &amp;lt;/math&amp;gt; podlega rozkładowi ''F'' o &amp;lt;math&amp;gt;(1,N-2)&amp;lt;/math&amp;gt; stopniach swobody.&lt;br /&gt;
W naszym przykładzie:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# test F&lt;br /&gt;
N = len(X)&lt;br /&gt;
F = (ss_reg *(N-2))/ss_err&lt;br /&gt;
p_F = 1-st.f.cdf(F,1,N-2)&lt;br /&gt;
print('F = %.2f, p_F = %.2f'%(F, p_F))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
''Wnioskowanie:'' Jeśli &amp;lt;tt&amp;gt;p_F&amp;lt;/tt&amp;gt; jest duże to nie mamy powodu aby odrzucić hipotezę zerową. Jeśli zaś jest ono mniejsze niż ustalony poziom istotności to odrzucamy hipotezę zerową i przyjmujemy alternatywną.&lt;br /&gt;
&lt;br /&gt;
===== Przedziały ufności dla parametrów =====&lt;br /&gt;
Przedziały ufności dla parametrów &amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;b_1&amp;lt;/math&amp;gt; pokazują zakres, w jakim z zadanym prawdopodobieństwem znajdują się ich &amp;quot;prawdziwe&amp;quot; wartości.&lt;br /&gt;
&lt;br /&gt;
Jeśli residua mają rozkład normalny, to estymatory parametrów &amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;b_1&amp;lt;/math&amp;gt; również będą miały rozkład normalny. &lt;br /&gt;
Zmienne:&lt;br /&gt;
: &amp;lt;math&amp;gt;t = \frac{\hat b_0 - b_0}{s_{\hat b_0}}\ \sim\ t_{N-2},&amp;lt;/math&amp;gt; &lt;br /&gt;
: &amp;lt;math&amp;gt;t = \frac{\hat b_1 - b_1}{s_{\hat b_1}}\ \sim\ t_{N-2},&amp;lt;/math&amp;gt; &lt;br /&gt;
podlegają rozkładowi ''t'' z  (''N''−2) stopniami swobody.&lt;br /&gt;
&lt;br /&gt;
Używając powyższych statystyk ''t'' można skonstruować przedziały ufności w standardowy sposób [http://brain.fuw.edu.pl/edu/STATLAB:Przedzia%C5%82y_ufno%C5%9Bci#Przyk.C5.82ad_2 (porównaj z przykładem)]. Jeśli przedział ma mieć poziom ufności &amp;lt;math&amp;gt;1 - \alpha&amp;lt;/math&amp;gt; to potrzebna nam będzie wartość krytyczna z rozkładu &amp;lt;math&amp;gt;t^*_{N-2}&amp;lt;/math&amp;gt; taka, że prawdopodobieństwo zaobserwowania wartości ''t'' nie większej od niej jest &amp;lt;math&amp;gt;\alpha/2&amp;lt;/math&amp;gt;. Wówczas:&lt;br /&gt;
: &amp;lt;math&amp;gt; b_1\in \Big[\ \hat b_1 - s_{\hat b_1} t^*_{N-2},\ \hat b_1 + s_{\hat b_1} t^*_{N-2}\ \Big] &amp;lt;/math&amp;gt; &lt;br /&gt;
oraz&lt;br /&gt;
: &amp;lt;math&amp;gt; b_0 \in \Big[\ \hat b_0 - s_{\hat b_0} t^*_{N-2},\ \hat b_0 + s_{\hat b_0} t^*_{N-2}\ \Big] &amp;lt;/math&amp;gt;&lt;br /&gt;
Implementacja:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# przedziały ufności:&lt;br /&gt;
alpha = 0.05  # zakładam 95% przedział ufności&lt;br /&gt;
# wartość krytyczna w rozkładzie t&lt;br /&gt;
t_kryt = st.t.ppf(alpha/2, N-2)&lt;br /&gt;
b0_l = b0 + s_b0*t_kryt&lt;br /&gt;
b0_h = b0 - s_b0*t_kryt&lt;br /&gt;
b1_l = b1 + s_b1*t_kryt&lt;br /&gt;
b1_h = b1 - s_b1*t_kryt&lt;br /&gt;
print('%.1f procentowe przedziały ufności parametrów:'%((1-alpha)*100))&lt;br /&gt;
print('b0: [%.2f %.2f ] '%(b0_l, b0_h))&lt;br /&gt;
print('b1: [%.2f %.2f ] '%(b1_l, b1_h))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Przedziały ufności dla modelu =====&lt;br /&gt;
Widzieliśmy, że parametry dopasowanej prostej nie są wyznaczone dokładnie. Tzn. jeśli dostalibyśmy inne realizacje danych (''X,Y'') to ta sama procedura regresji zwraca nieco inne parametry modelu. Jak widzieliśmy powyżej można wyznaczyć przedziały ufności wewnątrz których parametry te znajdują się z określonym prawdopodobieństwem. Różnym parametrom odpowiadają różne proste. Proste te wyznaczają na płaszczyźnie (''x,y'') pewien obszar. Obszar ten to przedział ufności dla modelu. Jego granice można wyznaczyć obliczając dla każdej wartości ''x'' błąd standardowy regresji ze wzoru:&lt;br /&gt;
: &amp;lt;math&amp;gt;s_{reg}(x_i) = \sqrt{\frac{ss_{err}}{N-2}} \cdot \sqrt{\frac{1}{N} + \frac{(x_i - \bar X)^2}{\sum_{j=1}^N(x_j - \bar X)^2}} &amp;lt;/math&amp;gt;&lt;br /&gt;
odległość krzywej wyznaczającej obszar ufności od prostej regresji znajdujemy mnożąc ten błąd standardowy przez odpowiednią wartość krytyczną z rozkładu &amp;lt;math&amp;gt;t_{N-2}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;d_i = t^*_{N-2}s_{reg}(x_i) &amp;lt;/math&amp;gt;&lt;br /&gt;
Implementacja:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# Przedział ufności modelu:&lt;br /&gt;
alpha = 0.05  # zakładam 95% przedział ufności&lt;br /&gt;
# wartość krytyczna w rozkładzie t&lt;br /&gt;
t_kryt = st.t.ppf(alpha/2, N-2)&lt;br /&gt;
sse = np.sum(residua**2)&lt;br /&gt;
# estymator wariancji residuów, bywa nazywany średnim błędem kwadratowym regresji :&lt;br /&gt;
v_e = sse/(N-2)&lt;br /&gt;
x_sr = np.mean(X)&lt;br /&gt;
# Odległość brzegów przedziału ufności od prostej regresji&lt;br /&gt;
d = t_kryt*np.sqrt(v_e)*np.sqrt(1.0/N + (X- x_sr)**2/np.sum((X-x_sr)**2))&lt;br /&gt;
# Ilustracja: dla każdego X cieniujemy obszar pomiędzy Y_reg-d,Y_reg+d i nadajemy mu przezroczystość 0.5&lt;br /&gt;
py.fill_between(X,Y_reg-d,Y_reg+d,alpha=0.5)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Przedziały ufności dla obserwacji =====&lt;br /&gt;
Przedział zmienności dla modelu nie mówi nam wiele o tym jak daleko od wyznaczonej prostej mogą pojawiać się nowe obserwacje (''x,y''). Aby zobrazować obszar, w którym z określonym prawdopodobieństwem mogą wystąpić nowe obserwacje potrzebujemy przedziału ufności dla obserwacji.&lt;br /&gt;
Jego granice można wyznaczyć obliczając dla każdej wartości ''x'' błąd standardowy ze wzoru:&lt;br /&gt;
: &amp;lt;math&amp;gt;s_{reg}(x_i) = \sqrt{\frac{ss_{err}}{N-2}} \cdot \sqrt{1+\frac{1}{N} + \frac{(x_i - \bar X)^2}{\sum_{j=1}^N(x_j - \bar X)^2}} &amp;lt;/math&amp;gt;&lt;br /&gt;
odległość krzywej wyznaczającej obszar ufności od prostej regresji znajdujemy mnożąc ten błąd standardowy przez odpowiednią wartość krytyczną z rozkładu &amp;lt;math&amp;gt;t_{N-2}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;d_i = t^*_{N-2}s_{reg}(x_i) &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# przedział ufności na obserwacje&lt;br /&gt;
d = t_kryt*np.sqrt(v_e)*np.sqrt(1+1.0/N + (X- x_sr)**2/np.sum((X-x_sr)**2))&lt;br /&gt;
py.fill_between(X,Y_reg-d,Y_reg+d, facecolor='gray',alpha=0.5)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Test &amp;lt;math&amp;gt;\chi^2&amp;lt;/math&amp;gt;=====&lt;br /&gt;
Jeśli znamy wariancję błędu pomiarowego można zastosować test &amp;lt;math&amp;gt;\chi^2&amp;lt;/math&amp;gt; do oceny jakości dopasowania.&lt;br /&gt;
Po pierwsze powinniśmy przetestować czy residua mają rozkład normalny&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
W, p =st.shapiro(residua)&lt;br /&gt;
print('Test normalności residuów: p = %.3f'%(p))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Jeśli tak to zmienna:&lt;br /&gt;
: &amp;lt;math&amp;gt;\chi_{fit}^2 = \sum_{i=1}^N {\left( \frac{y_i-y_{reg}}{\sigma} \right)^2 }&amp;lt;/math&amp;gt;&lt;br /&gt;
podlega rozkładowi &amp;lt;math&amp;gt;\chi^2&amp;lt;/math&amp;gt; o &amp;lt;math&amp;gt;N - n&amp;lt;/math&amp;gt;  ilości stopni swobody (''n'' - ilość estymowanych parametrów), czyli u nas ''N-2''.	&lt;br /&gt;
Możemy zbadać jakie jest prawdopodobieństwo zaobserwowania takiej (&amp;lt;math&amp;gt;\chi_{fit}^2&amp;lt;/math&amp;gt;), bądź bardziej ekstremalnej wartości &amp;lt;math&amp;gt;\chi^2&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
chi2 = np.sum(residua**2)/sigma**2&lt;br /&gt;
N = len(X)&lt;br /&gt;
if chi2 &amp;lt; N-2:&lt;br /&gt;
	p_chi2 = st.chi2.cdf(chi2, N-2)&lt;br /&gt;
else:&lt;br /&gt;
	p_chi2 = 1 - st.chi2.cdf(chi2, N-2)&lt;br /&gt;
print('chi2 = %.2f, p_chi2 = %.3f' %(chi2, p_chi2))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Czasem używamy zredukowanego, czyli podzielonego przez liczbę stopni swobody &amp;lt;math&amp;gt;\chi^2&amp;lt;/math&amp;gt;:&lt;br /&gt;
*  Jeśli jest on znacząco większy niż 1 to model nie pasuje do danych, lub nie doszacowaliśmy standardowego odchylenia &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;. &lt;br /&gt;
*  Jeśli jest sporo mniejszy niż 1 to prawdopodobnie oszacowane przez nas &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; jest większe niż rzeczywiste.&lt;br /&gt;
To jakościowe porównanie można uściślić szacując prawdopodobieństwo zaobserwowania wartości &amp;lt;math&amp;gt;\chi^2_{zred}&amp;lt;/math&amp;gt; bardziej ekstremalnych niż otrzymane w dopasowaniu. Zmienna &amp;lt;math&amp;gt;\chi^2_{zred}&amp;lt;/math&amp;gt; podlega innemu rozkładowi prawdopodobieństwa niż &amp;lt;math&amp;gt;\chi^2&amp;lt;/math&amp;gt;, możemy go jednak łatwo wyznaczyć w drodze symulacji:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
chi2_zred = chi2/(N-2)&lt;br /&gt;
# potrzebny jest nam rozkład chi2_zred:&lt;br /&gt;
N_dist = 100000&lt;br /&gt;
dist_chi2_zred = np.sum(st.norm.rvs(size=(N-2,N_dist))**2  ,0)/(N-2)&lt;br /&gt;
if chi2_zred&amp;gt;1:&lt;br /&gt;
	p_chi2_zred = np.sum(dist_chi2_zred&amp;gt;=chi2_zred)/float(N_dist)&lt;br /&gt;
else:&lt;br /&gt;
	p_chi2_zred = np.sum(dist_chi2_zred&amp;lt;=chi2_zred)/float(N_dist)&lt;br /&gt;
print('chi2_zred = %.2f, p_chi2_zred = %.3f' %(chi2_zred, p_chi2_zred))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dopasowanie krzywej do danych gdy wariancje dla poszczególnych punktów pomiarowych są różne ===&lt;br /&gt;
Często w fizyce potrzebujemy dopasować jakąś bardziej skomplikowaną zależność niż prosta.  Często też potrafimy oszacować błędy pomiarowe dla różnych wartości zmiennej niezależnej, przy czym może się zdarzyć, że błędy te nie są jednakowe dla różnych wartości zmiennej niezależnej. Do dopasowania współczynników używamy zasady [[WnioskowanieStatystyczne/MLF|największej wiarygodności]], która prowadzi do procedur minimalizacji ważonego średniego błędu kwadratowego. Możemy wówczas użyć standardowych procedur minimalizacji gradientowej. Należy jednak pamiętać, że metody gradientowe znajdują najbliższe ''minimum lokalne'' analizowanej funkcji. W przypadku funkcji nieliniowych skutkiem tego  jest zależność wyniku od punktu startu minimalizacji.&lt;br /&gt;
&lt;br /&gt;
====Dopasowanie dowolnej funkcji====&lt;br /&gt;
Poniżej rozważymy przykład dopasowania zależności wykładniczej. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import scipy.optimize as opt&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
 &lt;br /&gt;
# funkcja używana do symulowania danych&lt;br /&gt;
def zanik(x, amp, wykladnik, blad_wzgledny):&lt;br /&gt;
	'''Definicja funkcji zaniku wykładniczego. Użyjemy jej do wytworzenia danych'''&lt;br /&gt;
	y = amp * (x**wykladnik)       # idealne dane&lt;br /&gt;
	sigma = blad_wzgledny * y      # zakładamy, że stały jest błąd względny pomiaru&lt;br /&gt;
				       # przeliczamy go na standardowe odchylenie symulowanego  błędu &lt;br /&gt;
	# symulujemy szum z obliczonym odchyleniem standardowym i dodajemy go do danych idealnych										&lt;br /&gt;
	y += st.norm.rvs(size=num_points) * sigma       &lt;br /&gt;
	return (y, sigma)&lt;br /&gt;
 &lt;br /&gt;
# Funkcja, którą chcemy dopasować do danych:&lt;br /&gt;
def funkcja_do_fitowania(x,a,b):&lt;br /&gt;
	y = a*x**b&lt;br /&gt;
	return y&lt;br /&gt;
 &lt;br /&gt;
def funkcja_bledu(x, y, funkcja, params, err):&lt;br /&gt;
	'''Suma kwadratów tej funkcji jest minimalizowana w procesie optymalizacji parametrów.&lt;br /&gt;
	Nam przyda się do obliczenia residuów.'''&lt;br /&gt;
	y_fit = funkcja(x, *params) # aktualne wartości y z dopasowania&lt;br /&gt;
	residuum = y-y_fit # residua wchodzą do sumy kwadratów z wagą odwrotnie proporcjonalną do standardowego odchylenia&lt;br /&gt;
	residuum_wazone = residuum/ err &lt;br /&gt;
	return residuum_wazone&lt;br /&gt;
&lt;br /&gt;
# Generujemy punkty z szumem&lt;br /&gt;
num_points = 20&lt;br /&gt;
X = np.linspace(1.1, 10.1, num_points)&lt;br /&gt;
Y, sigma = zanik(X, 10.0, -2.0, 0.1)     # symulowane dane &lt;br /&gt;
 &lt;br /&gt;
# Dopasowujemy parametry &lt;br /&gt;
# nie musimy podawać wartości startowych (params_init) dla procedury minimalizacji (wtedy funkcja zakłada wartości startowe równe 1)&lt;br /&gt;
# jednak zazwyczaj dobrze jest podpowiedzieć algorytmowi, gdzie powinien zacząć&lt;br /&gt;
# nie musimy również podawać wartości sigma, ale jeśli są one różne dla różnych punktów, to podanie ich sprawi, że algorytm będzie się bardziej troszczył&lt;br /&gt;
# o dopasowanie do punktów pomiarowych zmierzonych z dobrą dokładnością, a bardziej swobodnie podejdzie do tych o dużych niepewnościach&lt;br /&gt;
params_init = [2.0, -1.0]&lt;br /&gt;
params_final, covar = opt.curve_fit(funkcja_do_fitowania,X,Y,params_init,sigma)&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Dopasowane parametry&amp;quot;,params_final)&lt;br /&gt;
print(&amp;quot;Macierz kowariancji\n&amp;quot;,covar)&lt;br /&gt;
&lt;br /&gt;
# dopasowane parametry&lt;br /&gt;
amp=params_final[0]&lt;br /&gt;
wykladnik=params_final[1]&lt;br /&gt;
&lt;br /&gt;
# standardowe błędy dopasowania&lt;br /&gt;
amp_err = np.sqrt(covar[0][0])&lt;br /&gt;
wykladnik_err = np.sqrt(covar[1][1])&lt;br /&gt;
 &lt;br /&gt;
# test chi2 dobroci dopasowania. &lt;br /&gt;
# Jeśli znamy wariancję błędu pomiarowego można zastosować test chi2 do oceny jakości dopasowania.&lt;br /&gt;
# 	Po pierwsze powinniśmy przetestować czy residua mają rozkład normalny&lt;br /&gt;
 &lt;br /&gt;
residua = funkcja_bledu(X, Y, funkcja_do_fitowania, params_final, sigma)# tym razem residua już są podzielone przez standardowe odchylenie, każde przez swoje&lt;br /&gt;
W, p =st.shapiro(residua)&lt;br /&gt;
print('Test normalności residuów: p = %.3f'%(p))&lt;br /&gt;
# jeśli tak to zmienna:&lt;br /&gt;
chi2 = np.sum(residua**2)&lt;br /&gt;
# podlega rozkładowi chi-kwadrat o N - n  ilości stopni swobody (n - ilość fitowanych parametrów), czyli u nas N-2	&lt;br /&gt;
# możemy zbadać jakie jest prawdopodobieństwo zaobserwowania takiej, bądź bardziej ekstremalnej wartości chi2:&lt;br /&gt;
&lt;br /&gt;
N = len (X)&lt;br /&gt;
liczba_stopni_swobody = N-len(params_final) # liczba punktów - liczba parametrów&lt;br /&gt;
if chi2 &amp;lt; liczba_stopni_swobody:&lt;br /&gt;
	p_chi2 = st.chi2.cdf(chi2, liczba_stopni_swobody)&lt;br /&gt;
else:&lt;br /&gt;
	p_chi2 = st.chi2.sf(chi2, liczba_stopni_swobody) # równoważne 1-st.chi2.cdf(chi2, N-2), ale sf ma lepszą dokładność dla małych wartości&lt;br /&gt;
print('chi2 = %.2f, p_chi2 = %.3f' %(chi2, p_chi2))&lt;br /&gt;
# czasem używamy zredukowanego chi2, czyli podzielonego przez ilość stopni swobody&lt;br /&gt;
chi2_zred = chi2/liczba_stopni_swobody&lt;br /&gt;
# jeśli jest on znacząco większy niż 1 to model nie pasuje do danych, lub nie doszacowaliśmy sigmy, &lt;br /&gt;
# jeśli jest sporo mniejszy niż 1 to prawdopodobnie oszacowane przez nas sigma jest większe niż rzeczywiste&lt;br /&gt;
# potrzebny jest nam rozkład chi2_zred:&lt;br /&gt;
N_dist = 100000&lt;br /&gt;
dist_chi2_zred = np.sum(st.norm.rvs(size=(liczba_stopni_swobody,N_dist))**2  ,0)/liczba_stopni_swobody&lt;br /&gt;
p_chi2_zred = np.sum(dist_chi2_zred&amp;gt;=chi2_zred)/float(N_dist)&lt;br /&gt;
print('chi2_zred = %.2f, p_chi2_zred = %.3f' %(chi2_zred, p_chi2_zred))&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
##########&lt;br /&gt;
# wykres&lt;br /&gt;
##########&lt;br /&gt;
py.subplot(2,1,1)&lt;br /&gt;
py.plot(X, funkcja_do_fitowania(X,amp,wykladnik))     # Fit&lt;br /&gt;
py.errorbar(X, Y, yerr=sigma, fmt='k.')  # Dane i błędy&lt;br /&gt;
py.text(5, 6.5, 'amplituda = %5.2f +/- %5.2f' % (amp, amp_err))&lt;br /&gt;
py.text(5, 5.5, u'wykładnik = %5.2f +/- %5.2f' % (wykladnik, wykladnik_err))&lt;br /&gt;
py.title(u'Dopasowanie metodą najmniejszych kwadratów')&lt;br /&gt;
py.xlabel('X')&lt;br /&gt;
py.ylabel('Y')&lt;br /&gt;
py.xlim(1, 11)&lt;br /&gt;
py.subplot(2,1,2)&lt;br /&gt;
py.plot(X, residua) # residua&lt;br /&gt;
py.xlabel('X')&lt;br /&gt;
py.ylabel('dY')&lt;br /&gt;
py.title(u'Wykres residuów')&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Dopasowanie wielomianu====&lt;br /&gt;
Poniżej rozważymy przykład dopasowania zależności wielomianowej.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
 &lt;br /&gt;
# funkcja używana do symulowania danych&lt;br /&gt;
def wielomian_z_szumem(x, wspolczynniki,blad_wzgledny):&lt;br /&gt;
	'''Definicja funkcji wielomianowej. Użyjemy jej do wytworzenia danych'''&lt;br /&gt;
	W = np.poly1d(wspolczynniki) # funkcja zwracająca obiekt wielomianu o zadanych wspolczynnikach&lt;br /&gt;
								 #można go używać tak, jak zwykłej funkcji, ale obsługuje też działania na wielomianach&lt;br /&gt;
	y = W(X)# idealne dane&lt;br /&gt;
	sigma = blad_wzgledny * y	# zakładamy, że stały jest błąd względny pomiaru&lt;br /&gt;
								# przeliczamy go na standardowe odchylenie symulowanego  błędu &lt;br /&gt;
	# symulujemy szum z obliczonym odchyleniem standardowym i dodajemy go do danych idealnych										&lt;br /&gt;
	y += st.norm.rvs(size=num_points) * sigma       &lt;br /&gt;
	return (y, sigma)&lt;br /&gt;
&lt;br /&gt;
def funkcja_bledu_dla_wielomianow(x, y, wspolczynniki, err):&lt;br /&gt;
	'''Suma kwadratów tej funkcji jest minimalizowana w procesie optymalizacji parametrów.&lt;br /&gt;
	Nam przyda się do obliczenia residuów.'''&lt;br /&gt;
	W = np.poly1d(wspolczynniki)&lt;br /&gt;
	y_fit = W(x) # aktualne wartości y z dopasowania&lt;br /&gt;
	residuum = y-y_fit # residua wchodzą do sumy kwadratów z wagą odwrotnie proporcjonalną do standardowego odchylenia&lt;br /&gt;
	residuum_wazone = residuum/ err &lt;br /&gt;
	return residuum_wazone&lt;br /&gt;
&lt;br /&gt;
# Generujemy punkty z szumem&lt;br /&gt;
num_points = 20&lt;br /&gt;
X = np.linspace(-4, 6, num_points)&lt;br /&gt;
wspolczynniki_wielomianu= (0.3,1,-2,4)&lt;br /&gt;
stopien_wielomianu=len(wspolczynniki_wielomianu)-1&lt;br /&gt;
blad_wzgledny_pomiaru=0.1&lt;br /&gt;
Y, sigma = wielomian_z_szumem(X, wspolczynniki_wielomianu, blad_wzgledny_pomiaru)     # symulowane dane &lt;br /&gt;
 &lt;br /&gt;
# Dopasowujemy parametry&lt;br /&gt;
# tym razem skorzystamy z funkcji np.polyfit, która nie potrzebuje parametrów początkowych, ani zdefiniowanej funkcji, którą ma dopasować&lt;br /&gt;
# podajemy jej tylko nasze dane oraz stopień wielomianu, który ma dopasować oraz opcjonalne wagi&lt;br /&gt;
# UWAGA! Tym razem wagi muszą być odwrotnością odchyleń standardowych (1/sigma, a nie sigma, jak w curve_fit)&lt;br /&gt;
# funkcja ta domyślnie zwraca tylko dopasowane parametry (wspolczynniki wielomianu), a nie zwraca macierzy kowariancji,&lt;br /&gt;
# jeśli jest nam ona potrzebna, to musimy jej zarządać poprzez dodanie opcji cov=True (full=False, ale to jest domyślnie)&lt;br /&gt;
params_final, covar=np.polyfit(X, Y, deg=stopien_wielomianu, w=1/sigma, cov=True)&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Dopasowane wspolczynniki wielomianu&amp;quot;,params_final)&lt;br /&gt;
print(&amp;quot;Macierz kowariancji\n&amp;quot;,covar)&lt;br /&gt;
&lt;br /&gt;
# standardowe błędy dopasowania&lt;br /&gt;
niepewnosci=[]&lt;br /&gt;
for i in range(len(params_final)):&lt;br /&gt;
	niepewnosci.append(np.sqrt(covar[i][i]))&lt;br /&gt;
print(niepewnosci)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# test chi2 dobroci dopasowania. &lt;br /&gt;
# Jeśli znamy wariancję błędu pomiarowego można zastosować test chi2 do oceny jakości dopasowania.&lt;br /&gt;
# 	Po pierwsze powinniśmy przetestować czy residua mają rozkład normalny&lt;br /&gt;
 &lt;br /&gt;
residua = funkcja_bledu_dla_wielomianow(X, Y, params_final, sigma)# tym razem residua już są podzielone przez standardowe odchylenie, każde przez swoje&lt;br /&gt;
W, p =st.shapiro(residua)&lt;br /&gt;
print('Test normalności residuów: p = %.3f'%(p))&lt;br /&gt;
# jeśli tak to zmienna:&lt;br /&gt;
chi2 = np.sum(residua**2)&lt;br /&gt;
# podlega rozkładowi chi-kwadrat o N - n  ilości stopni swobody (n - ilość fitowanych parametrów), czyli u nas N-2	&lt;br /&gt;
# możemy zbadać jakie jest prawdopodobieństwo zaobserwowania takiej, bądź bardziej ekstremalnej wartości chi2:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
N = len (X)&lt;br /&gt;
liczba_stopni_swobody = N-len(params_final) # liczba punktów - liczba parametrów&lt;br /&gt;
if chi2 &amp;lt; liczba_stopni_swobody:&lt;br /&gt;
	p_chi2 = st.chi2.cdf(chi2, liczba_stopni_swobody)&lt;br /&gt;
else:&lt;br /&gt;
	p_chi2 = st.chi2.sf(chi2, liczba_stopni_swobody) # równoważne 1-st.chi2.cdf(chi2, N-2), ale sf ma lepszą dokładność dla małych wartości&lt;br /&gt;
print('chi2 = %.2f, p_chi2 = %.3f' %(chi2, p_chi2))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# czasem używamy zredukowanego chi2, czyli podzielonego przez ilość stopni swobody&lt;br /&gt;
chi2_zred = chi2/liczba_stopni_swobody&lt;br /&gt;
# jeśli jest on znacząco większy niż 1 to model nie pasuje do danych, lub nie doszacowaliśmy sigmy, &lt;br /&gt;
# jeśli jest sporo mniejszy niż 1 to prawdopodobnie oszacowane przez nas sigma jest większe niż rzeczywiste&lt;br /&gt;
# potrzebny jest nam rozkład chi2_zred:&lt;br /&gt;
N_dist = 100000&lt;br /&gt;
dist_chi2_zred = np.sum(st.norm.rvs(size=(liczba_stopni_swobody,N_dist))**2  ,0)/liczba_stopni_swobody&lt;br /&gt;
p_chi2_zred = np.sum(dist_chi2_zred&amp;gt;=chi2_zred)/float(N_dist)&lt;br /&gt;
print('chi2_zred = %.2f, p_chi2_zred = %.3f' %(chi2_zred, p_chi2_zred))&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
##########&lt;br /&gt;
# wykres&lt;br /&gt;
##########&lt;br /&gt;
py.subplot(2,1,1)&lt;br /&gt;
W=np.poly1d(params_final)&lt;br /&gt;
py.plot(X, W(X))     # Fit&lt;br /&gt;
py.errorbar(X, Y, yerr=sigma, fmt='k.')  # Dane i błędy&lt;br /&gt;
py.title(u'Dopasowanie metodą najmniejszych kwadratów')&lt;br /&gt;
py.text(-4.6, 92, u'dopasowane współczynniki = '+str(np.round(params_final,3)))&lt;br /&gt;
py.text(-4.6, 86, u'niepewności współczynników = '+str(np.round(niepewnosci,3)))&lt;br /&gt;
py.text(-4.6, 80, u'prawdziwe współczynniki = '+str(np.round(wspolczynniki_wielomianu,3)))&lt;br /&gt;
py.xlabel('X')&lt;br /&gt;
py.ylabel('Y')&lt;br /&gt;
py.xlim(X.min()-1, X.max()+1)&lt;br /&gt;
py.subplot(2,1,2)&lt;br /&gt;
py.plot(X, residua) # residua&lt;br /&gt;
py.xlabel('X')&lt;br /&gt;
py.ylabel('dY')&lt;br /&gt;
py.title(u'Wykres residuów')&lt;br /&gt;
py.show()&lt;br /&gt;
py.show()&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Maciek</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=WnioskowanieStatystyczne/_Regresja_liniowa_i_test_chi2&amp;diff=11350</id>
		<title>WnioskowanieStatystyczne/ Regresja liniowa i test chi2</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=WnioskowanieStatystyczne/_Regresja_liniowa_i_test_chi2&amp;diff=11350"/>
		<updated>2025-06-04T12:18:38Z</updated>

		<summary type="html">&lt;p&gt;Maciek: /* Regresja liniowa */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Wstęp ==&lt;br /&gt;
Załóżmy, że mamy dwie zmienne losowe ciągłe &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Chcielibyśmy wykorzystać wiedzę o wartościach zmiennej &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; do przewidywania wartości zmiennej &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. Mówimy, że zmienna &amp;lt;math&amp;gt;X &amp;lt;/math&amp;gt; jest niezależna, a zmienna &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; zależna. W fizyce taką wiedzę opisujemy przy pomocy równań. Równania fizyczne często wyrażają związki przyczynowo-skutkowe. W takim wypadku, która zmienna jest zależna, a która niezależna ma głębszy sens. Jednak nie zawsze tak musi być. Wartości dwóch zmiennych mogą zależeć od trzeciej nieobserwowanej zmiennej. W tej sytuacji wiedza o wartości jednej z tych zmiennych może być wykorzystana do przewidywania wartości drugiej, ale nie ma między nimi związku przyczynowo-skutkowego.&lt;br /&gt;
&lt;br /&gt;
== Regresja ==&lt;br /&gt;
W ogólności, dla każdej wartości zmiennej &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; mamy rozkład wartości zmiennej &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;. &lt;br /&gt;
{{Solution | title = Przykład: rozkłady ''Y''  dla każdego punktu ''X'' |text = &lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
# symuowana zależność ma następującą postać y = b0 + b1*x &lt;br /&gt;
# wartości parametrów &lt;br /&gt;
b0 = 1 &lt;br /&gt;
b1 = 3&lt;br /&gt;
&lt;br /&gt;
X = np.arange(0, 10,0.5)&lt;br /&gt;
# będę symulował zbieranie n wartości Y dlakażdego X[i], zakładam to samo odchylenie standardowe &lt;br /&gt;
odch_std = 1&lt;br /&gt;
n = 30&lt;br /&gt;
Y = np.zeros((n,len(X)))&lt;br /&gt;
for i in range(len(X)):&lt;br /&gt;
	Y[:,i] =  b0 + b1*X[i] + st.norm.rvs(size = n, loc=0, scale = odch_std)&lt;br /&gt;
&lt;br /&gt;
# narysujmy ten zbiór punktów &lt;br /&gt;
for j in range(len(X)):&lt;br /&gt;
	py.plot(X, Y[j,:],'b,')&lt;br /&gt;
# wyróżnimy średnie&lt;br /&gt;
py.plot(X,np.mean(Y,0),'ro')&lt;br /&gt;
#  i odchykenia standardowe:&lt;br /&gt;
py.errorbar(X,np.mean(Y,0),odch_std,ecolor = 'k',elinewidth = 8)&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
===Regresja liniowa ===&lt;br /&gt;
Dalej będziemy rozważać regresję liniową, tzn. założymy, że punkty &amp;lt;math&amp;gt;(X,Y)&amp;lt;/math&amp;gt; są generowane przez model  liniowy o następującym równaniu:&lt;br /&gt;
: &amp;lt;math&amp;gt; y = b_0 + b_1x + \epsilon &amp;lt;/math&amp;gt;&lt;br /&gt;
współczynniki &amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;b_1&amp;lt;/math&amp;gt; można wyestymować stosując &lt;br /&gt;
[https://brain.fuw.edu.pl/edu/index.php/Wnioskowanie_Statystyczne_-_wykład  metodę największej wiarygodności]:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;\hat b_1=\frac{\underset{i=1}{\overset{N}{\sum }}(x_{i}-\overline{x})(y_{i}-&lt;br /&gt;
\overline{y})}{\underset{i=1}{\overset{N}{\sum }}(x_{i}-\overline{x})^{2}},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
 \hat b_0=\overline{y}-\hat b_1\overline{x}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Z tymi współczynnikami otrzymujemy równanie opisujące prostą regresji:&lt;br /&gt;
&amp;lt;math&amp;gt;\hat y = \hat b_0 + \hat b_1 x&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zakłądając, że &amp;lt;math&amp;gt;\epsilon &amp;lt;/math&amp;gt; pochodzi z rozkładu normalnego o wariancji &amp;lt;math&amp;gt;\sigma^2&amp;lt;/math&amp;gt; estymowane współczynniki są zmiennymi losowymi pochodzącymi z rozkładów normalnego o średniej takiej jak wyestymowany współczynnik i  wariancji odpowiednio:&lt;br /&gt;
:&amp;lt;math&amp;gt; v_{b_1} = \frac{\sigma^2}{\sum_i (x_i - \bar x)^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt; v_{b_0} = \frac{\sigma^2}{n} + \frac{\bar x ^2}{\sum_i (x_i - \bar x)^2} \sigma^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wariancję &amp;lt;math&amp;gt;\sigma^2 = E[S^2]&amp;lt;/math&amp;gt;  można estymować przez:&lt;br /&gt;
:&amp;lt;math&amp;gt;S^2 = \frac{1}{n-2}\sum_{i=1}^n(y_i - \hat y_i)^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Warto tu zwrócić uwagę na prosty fakt, że niepewność oszacowania współczynników można zmniejszyć zwiększając zakres zmiennej &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Funkcję estymującą parametry i ich standardowe odchylenia można zaimplementować w pythonie następująco:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
def regresja_liniowa(X,Y):&lt;br /&gt;
	'''równanie dopasowywanej prostej to y = b0 + b1*x&lt;br /&gt;
	argumenty:&lt;br /&gt;
	  X - zmienna niezależna&lt;br /&gt;
	  Y - zmienna zależna&lt;br /&gt;
	funkcja zwraca:&lt;br /&gt;
	  b0, b1, - estymaty parametrów&lt;br /&gt;
	  s_b0, s_b1, - estymaty standardowego odchylenia parametrów &lt;br /&gt;
	  residua - różnice między punktami pomiarowymi a punktami na dopasowanej prostej&lt;br /&gt;
	'''&lt;br /&gt;
	N = len(X)&lt;br /&gt;
	x_sr = np.mean(X)&lt;br /&gt;
	y_sr = np.mean(Y)&lt;br /&gt;
	# estymatory parametrów &lt;br /&gt;
	# korzystamy z tego że numpy wykonuje odejmowania i potęgowania dla każdego elementu tablicy X i Y&lt;br /&gt;
	b1 = np.sum((X-x_sr)*(Y-y_sr))/np.sum((X-x_sr)**2)&lt;br /&gt;
	b0 = y_sr - b1*x_sr&lt;br /&gt;
	&lt;br /&gt;
	# teraz liczymy kilka rzeczy przydatnych do oceny jakości modelu&lt;br /&gt;
	Y_reg = b0 + b1*X # wartości Y przewidywane przez model&lt;br /&gt;
	residua = Y - Y_reg # residua, czyli zmienność Y nie wynikająca z modelu&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	sse = np.sum(residua**2)&lt;br /&gt;
	# estymator wariancji residuów, bywa nazywany średnim błędem kwadratowym regresji :&lt;br /&gt;
	v_e = sse/(N-2)&lt;br /&gt;
	# estymatory standardowych błędów parametrów&lt;br /&gt;
	s_b0 = np.sqrt(v_e) * np.sqrt(1.0/N + x_sr**2/np.sum( (X-x_sr)**2))&lt;br /&gt;
	s_b1 = np.sqrt(v_e) * np.sqrt( 1.0/np.sum( (X -x_sr)**2 ))&lt;br /&gt;
	return (b0, b1, s_b0, s_b1, residua )&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Przykład: Dopasowanie prostej do punktów (zakładamy jednakową wariancję ''Y'' dla każdego ''X'')====&lt;br /&gt;
Wytwórzmy dane zgodnie z modelem:&lt;br /&gt;
: &amp;lt;math&amp;gt;y = -13 + 3 x + \epsilon&amp;lt;/math&amp;gt; &lt;br /&gt;
: i &amp;lt;math&amp;gt;\sigma_\epsilon =19&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# symulowana zależność ma następującą postać y = b0 + b1*x &lt;br /&gt;
# wartości parametrów &lt;br /&gt;
b0 = -13.0&lt;br /&gt;
b1 = 3.0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
X = np.arange(30, 70, 0.5)&lt;br /&gt;
sigma = 19.0&lt;br /&gt;
n = 1&lt;br /&gt;
Y = np.zeros(len(X))&lt;br /&gt;
for i in range(len(X)):&lt;br /&gt;
	Y[i] =  b0 + b1*X[i] + st.norm.rvs(size = n, loc=0, scale = sigma)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Korzystając ze zdefiniowanej powyżej funkcji &amp;lt;tt&amp;gt;regresja_liniowa&amp;lt;/tt&amp;gt; estymujemy parametry i ich odchylenia standardowe:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
(b0, b1, s_b0, s_b1, residua ) = regresja_liniowa(X,Y)&lt;br /&gt;
&lt;br /&gt;
print('Równanie prostej: y = b0 + b1*x')&lt;br /&gt;
print('dopasowane współczynniki: b0 = %.3f, b1 = %.3f' %(b0, b1))&lt;br /&gt;
print('s_b0 = %.4f, s_b1= %.4f '%(s_b0, s_b1))&lt;br /&gt;
	&lt;br /&gt;
py.errorbar(X,Y,sigma)&lt;br /&gt;
Y_reg = b0 + b1*X &lt;br /&gt;
py.plot(X,Y_reg)&lt;br /&gt;
&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Ocena jakości dopasownia ====&lt;br /&gt;
=====Współczynnik &amp;lt;math&amp;gt;R^2&amp;lt;/math&amp;gt;=====&lt;br /&gt;
Aby wyrazić współczynnik &amp;lt;math&amp;gt;R^2&amp;lt;/math&amp;gt; potrzebujemy następujących wyrażeń - sum kwadratów (ss). Są one miarą zmienności.&lt;br /&gt;
* &amp;lt;math&amp;gt;ss_{tot}&amp;lt;/math&amp;gt; - całkowita suma kwadratów - proporcjonalna do wariancji próby,&lt;br /&gt;
* &amp;lt;math&amp;gt;ss_{reg}&amp;lt;/math&amp;gt; -  suma kwadratów regresji - zwana też wyjaśnioną sumą kwadratów,&lt;br /&gt;
* &amp;lt;math&amp;gt;ss_{err}&amp;lt;/math&amp;gt; -  suma kwadratów residuów - niewyjaśniona suma kwadratów.&lt;br /&gt;
&lt;br /&gt;
Poszczególne składniki wymienionych powyżej sum kwadratów są zilustrowane na poniższym rysunku.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Regresja1.svg|thumb|500px|center|Dla wybranego punktu &amp;lt;math&amp;gt;(x_i,y_i)&amp;lt;/math&amp;gt; zaznaczono różnice będące składnikami poszczególnych sum kwadratów]]&lt;br /&gt;
&lt;br /&gt;
Implementacja:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
y_sr = np.mean(Y)&lt;br /&gt;
ss_tot = np.sum( (Y -  y_sr)**2 ) &lt;br /&gt;
ss_reg = np.sum( (Y_reg - y_sr)**2 )&lt;br /&gt;
ss_err = np.sum( (residua)**2 ) &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
mając te sumy &amp;lt;math&amp;gt;R^2&amp;lt;/math&amp;gt; definiujemy jako:&lt;br /&gt;
:&amp;lt;math&amp;gt;R^2 = 1 - \frac{ss_{err}}{ss_{tot}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
R2 = 1 - ss_err/ss_tot &lt;br /&gt;
print('R2 = %.2f' %(R2))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W przypadku regresji liniowej &amp;lt;math&amp;gt;ss_{reg} + ss_{err} = ss_{tot}&amp;lt;/math&amp;gt;. Możemy to sprawdzić [http://brain.fuw.edu.pl/edu/STAT:Regresja_liniowa#Interpretacja_wsp.C3.B3.C5.82czynnika_korelacji analitycznie] i numerycznie:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
print('ss_tot = %.3f' %(ss_tot))&lt;br /&gt;
print('ss_reg + ss_err =%.3f'%(ss_reg+ss_err))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
czyli &lt;br /&gt;
: &amp;lt;math&amp;gt;R^2 = \frac{ss_{reg}}{ss_{tot}} &amp;lt;/math&amp;gt;, &lt;br /&gt;
można więc interpretować &amp;lt;math&amp;gt;R^2&amp;lt;/math&amp;gt;  jako frakcję zmienności ''Y'' tłumaczoną przez model.&lt;br /&gt;
W przypadku regresji liniowej współczynnik &amp;lt;math&amp;gt;R^2&amp;lt;/math&amp;gt; równy jest kwadratowi  współczynnika korelacji &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt; &lt;br /&gt;
: &amp;lt;math&amp;gt;R^2 = \rho^2&amp;lt;/math&amp;gt;&lt;br /&gt;
[http://brain.fuw.edu.pl/edu/STAT:Regresja_liniowa#Interpretacja_wsp.C3.B3.C5.82czynnika_korelacji (dowód)]&lt;br /&gt;
&lt;br /&gt;
===== Test F dla hipotezy o braku korelacji =====&lt;br /&gt;
Często interesujące jest zweryfikowanie hipotezy o istotności zależności między ''Y'' a ''X'' (proszę nie mylić tego z istnieniem związku przyczynowo-skutkowego). Matematycznie równoważne jest to postawieniu hipotezy:&lt;br /&gt;
: &amp;lt;math&amp;gt;H_0: b_1 = 0 &amp;lt;/math&amp;gt;&lt;br /&gt;
:  &amp;lt;math&amp;gt;H_1: b_1 \ne 0 &amp;lt;/math&amp;gt;&lt;br /&gt;
albo:&lt;br /&gt;
: &amp;lt;math&amp;gt;H_0: \rho = 0 &amp;lt;/math&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;H_1: \rho \ne 0 &amp;lt;/math&amp;gt;&lt;br /&gt;
Wykorzystamy do tego test równości wariancji oparty o [http://brain.fuw.edu.pl/edu/STAT:Analiza_wariancji rozkład F]. &lt;br /&gt;
Jeśli zgodnie z &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;b_1 = 0&amp;lt;/math&amp;gt; to prosta regresji jest pozioma i wariancja wyjaśniona przez regresję (proporcjonalna do &amp;lt;math&amp;gt;ss_{reg}&amp;lt;/math&amp;gt;) jest równa wariancji niewyjaśnionej (proporcjonalna do &amp;lt;math&amp;gt;ss_{err}&amp;lt;/math&amp;gt;). Wariancje te można estymować dzieląc odpowiednie sumy kwadratów zdefiniowane w poprzednim paragrafie przez odpowiadającą im liczbę stopni swobody. Jeśli mamy ''N'' punktów danych, to:&lt;br /&gt;
* liczba stopni swobody dla  &amp;lt;math&amp;gt;ss_{tot}&amp;lt;/math&amp;gt; jest &amp;lt;math&amp;gt;N-1&amp;lt;/math&amp;gt;, poniważ jeden stopień swobody jest tracony na obliczenie średniej, &lt;br /&gt;
* liczba stopni swobody dla &amp;lt;math&amp;gt;ss_{err}&amp;lt;/math&amp;gt; jest &amp;lt;math&amp;gt;N-2&amp;lt;/math&amp;gt;, ponieważ do policzenia tej sumy kwadratów musimy wyznaczyć dwa parametry prostej,&lt;br /&gt;
* liczba stopni swobody odpowiadająca &amp;lt;math&amp;gt;ss_{reg}&amp;lt;/math&amp;gt; jest 1, bo jest &amp;lt;math&amp;gt;ss_{reg}&amp;lt;/math&amp;gt;  związana jest z poprzednimi sumami kwadratów równaniem, czyli swobody jest tyle ile wynosi różnica w stopniach swobody tamtych sum. &lt;br /&gt;
Zatem:&lt;br /&gt;
* estymator wariancji wyjaśnionej:&lt;br /&gt;
: &amp;lt;math&amp;gt;s_{reg} = \frac{ss_{reg}}{1}&amp;lt;/math&amp;gt;&lt;br /&gt;
* estymator wariancji niewyjaśnionej:&lt;br /&gt;
: &amp;lt;math&amp;gt;s_{err} = \frac{ss_{err}}{N-2}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wielkość&lt;br /&gt;
:&amp;lt;math&amp;gt; F = \frac{ss_{reg}(N-2)}{ss_{err}} &amp;lt;/math&amp;gt; podlega rozkładowi ''F'' o &amp;lt;math&amp;gt;(1,N-2)&amp;lt;/math&amp;gt; stopniach swobody.&lt;br /&gt;
W naszym przykładzie:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# test F&lt;br /&gt;
N = len(X)&lt;br /&gt;
F = (ss_reg *(N-2))/ss_err&lt;br /&gt;
p_F = 1-st.f.cdf(F,1,N-2)&lt;br /&gt;
print('F = %.2f, p_F = %.2f'%(F, p_F))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
''Wnioskowanie:'' Jeśli &amp;lt;tt&amp;gt;p_F&amp;lt;/tt&amp;gt; jest duże to nie mamy powodu aby odrzucić hipotezę zerową. Jeśli zaś jest ono mniejsze niż ustalony poziom istotności to odrzucamy hipotezę zerową i przyjmujemy alternatywną.&lt;br /&gt;
&lt;br /&gt;
===== Przedziały ufności dla parametrów =====&lt;br /&gt;
Przedziały ufności dla parametrów &amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;b_1&amp;lt;/math&amp;gt; pokazują zakres, w jakim z zadanym prawdopodobieństwem znajdują się ich &amp;quot;prawdziwe&amp;quot; wartości.&lt;br /&gt;
&lt;br /&gt;
Jeśli residua mają rozkład normalny, to estymatory parametrów &amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;b_1&amp;lt;/math&amp;gt; również będą miały rozkład normalny. &lt;br /&gt;
Zmienne:&lt;br /&gt;
: &amp;lt;math&amp;gt;t = \frac{\hat b_0 - b_0}{s_{\hat b_0}}\ \sim\ t_{N-2},&amp;lt;/math&amp;gt; &lt;br /&gt;
: &amp;lt;math&amp;gt;t = \frac{\hat b_1 - b_1}{s_{\hat b_1}}\ \sim\ t_{N-2},&amp;lt;/math&amp;gt; &lt;br /&gt;
podlegają rozkładowi ''t'' z  (''N''−2) stopniami swobody.&lt;br /&gt;
&lt;br /&gt;
Używając powyższych statystyk ''t'' można skonstruować przedziały ufności w standardowy sposób [http://brain.fuw.edu.pl/edu/STATLAB:Przedzia%C5%82y_ufno%C5%9Bci#Przyk.C5.82ad_2 (porównaj z przykładem)]. Jeśli przedział ma mieć poziom ufności &amp;lt;math&amp;gt;1 - \alpha&amp;lt;/math&amp;gt; to potrzebna nam będzie wartość krytyczna z rozkładu &amp;lt;math&amp;gt;t^*_{N-2}&amp;lt;/math&amp;gt; taka, że prawdopodobieństwo zaobserwowania wartości ''t'' nie większej od niej jest &amp;lt;math&amp;gt;\alpha/2&amp;lt;/math&amp;gt;. Wówczas:&lt;br /&gt;
: &amp;lt;math&amp;gt; b_1\in \Big[\ \hat b_1 - s_{\hat b_1} t^*_{N-2},\ \hat b_1 + s_{\hat b_1} t^*_{N-2}\ \Big] &amp;lt;/math&amp;gt; &lt;br /&gt;
oraz&lt;br /&gt;
: &amp;lt;math&amp;gt; b_0 \in \Big[\ \hat b_0 - s_{\hat b_0} t^*_{N-2},\ \hat b_0 + s_{\hat b_0} t^*_{N-2}\ \Big] &amp;lt;/math&amp;gt;&lt;br /&gt;
Implementacja:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# przedziały ufności:&lt;br /&gt;
alpha = 0.05  # zakładam 95% przedział ufności&lt;br /&gt;
# wartość krytyczna w rozkładzie t&lt;br /&gt;
t_kryt = st.t.ppf(alpha/2, N-2)&lt;br /&gt;
b0_l = b0 + s_b0*t_kryt&lt;br /&gt;
b0_h = b0 - s_b0*t_kryt&lt;br /&gt;
b1_l = b1 + s_b1*t_kryt&lt;br /&gt;
b1_h = b1 - s_b1*t_kryt&lt;br /&gt;
print('%.1f procentowe przedziały ufności parametrów:'%((1-alpha)*100))&lt;br /&gt;
print('b0: [%.2f %.2f ] '%(b0_l, b0_h))&lt;br /&gt;
print('b1: [%.2f %.2f ] '%(b1_l, b1_h))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Przedziały ufności dla modelu =====&lt;br /&gt;
Widzieliśmy, że parametry dopasowanej prostej nie są wyznaczone dokładnie. Tzn. jeśli dostalibyśmy inne realizacje danych (''X,Y'') to ta sama procedura regresji zwraca nieco inne parametry modelu. Jak widzieliśmy powyżej można wyznaczyć przedziały ufności wewnątrz których parametry te znajdują się z określonym prawdopodobieństwem. Różnym parametrom odpowiadają różne proste. Proste te wyznaczają na płaszczyźnie (''x,y'') pewien obszar. Obszar ten to przedział ufności dla modelu. Jego granice można wyznaczyć obliczając dla każdej wartości ''x'' błąd standardowy regresji ze wzoru:&lt;br /&gt;
: &amp;lt;math&amp;gt;s_{reg}(x_i) = \sqrt{\frac{ss_{err}}{N-2}} \cdot \sqrt{\frac{1}{N} + \frac{(x_i - \bar X)^2}{\sum_{j=1}^N(x_j - \bar X)^2}} &amp;lt;/math&amp;gt;&lt;br /&gt;
odległość krzywej wyznaczającej obszar ufności od prostej regresji znajdujemy mnożąc ten błąd standardowy przez odpowiednią wartość krytyczną z rozkładu &amp;lt;math&amp;gt;t_{N-2}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;d_i = t^*_{N-2}s_{reg}(x_i) &amp;lt;/math&amp;gt;&lt;br /&gt;
Implementacja:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# Przedział ufności modelu:&lt;br /&gt;
alpha = 0.05  # zakładam 95% przedział ufności&lt;br /&gt;
# wartość krytyczna w rozkładzie t&lt;br /&gt;
t_kryt = st.t.ppf(alpha/2, N-2)&lt;br /&gt;
sse = np.sum(residua**2)&lt;br /&gt;
# estymator wariancji residuów, bywa nazywany średnim błędem kwadratowym regresji :&lt;br /&gt;
v_e = sse/(N-2)&lt;br /&gt;
x_sr = np.mean(X)&lt;br /&gt;
# Odległość brzegów przedziału ufności od prostej regresji&lt;br /&gt;
d = t_kryt*np.sqrt(v_e)*np.sqrt(1.0/N + (X- x_sr)**2/np.sum((X-x_sr)**2))&lt;br /&gt;
# Ilustracja: dla każdego X cieniujemy obszar pomiędzy Y_reg-d,Y_reg+d i nadajemy mu przezroczystość 0.5&lt;br /&gt;
py.fill_between(X,Y_reg-d,Y_reg+d,alpha=0.5)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Przedziały ufności dla obserwacji =====&lt;br /&gt;
Przedział zmienności dla modelu nie mówi nam wiele o tym jak daleko od wyznaczonej prostej mogą pojawiać się nowe obserwacje (''x,y''). Aby zobrazować obszar, w którym z określonym prawdopodobieństwem mogą wystąpić nowe obserwacje potrzebujemy przedziału ufności dla obserwacji.&lt;br /&gt;
Jego granice można wyznaczyć obliczając dla każdej wartości ''x'' błąd standardowy ze wzoru:&lt;br /&gt;
: &amp;lt;math&amp;gt;s_{reg}(x_i) = \sqrt{\frac{ss_{err}}{N-2}} \cdot \sqrt{1+\frac{1}{N} + \frac{(x_i - \bar X)^2}{\sum_{j=1}^N(x_j - \bar X)^2}} &amp;lt;/math&amp;gt;&lt;br /&gt;
odległość krzywej wyznaczającej obszar ufności od prostej regresji znajdujemy mnożąc ten błąd standardowy przez odpowiednią wartość krytyczną z rozkładu &amp;lt;math&amp;gt;t_{N-2}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;d_i = t^*_{N-2}s_{reg}(x_i) &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# przedział ufności na obserwacje&lt;br /&gt;
d = t_kryt*np.sqrt(v_e)*np.sqrt(1+1.0/N + (X- x_sr)**2/np.sum((X-x_sr)**2))&lt;br /&gt;
py.fill_between(X,Y_reg-d,Y_reg+d, facecolor='gray',alpha=0.5)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Test &amp;lt;math&amp;gt;\chi^2&amp;lt;/math&amp;gt;=====&lt;br /&gt;
Jeśli znamy wariancję błędu pomiarowego można zastosować test &amp;lt;math&amp;gt;\chi^2&amp;lt;/math&amp;gt; do oceny jakości dopasowania.&lt;br /&gt;
Po pierwsze powinniśmy przetestować czy residua mają rozkład normalny&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
W, p =st.shapiro(residua)&lt;br /&gt;
print('Test normalności residuów: p = %.3f'%(p))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Jeśli tak to zmienna:&lt;br /&gt;
: &amp;lt;math&amp;gt;\chi_{fit}^2 = \sum_{i=1}^N {\left( \frac{y_i-y_{reg}}{\sigma} \right)^2 }&amp;lt;/math&amp;gt;&lt;br /&gt;
podlega rozkładowi &amp;lt;math&amp;gt;\chi^2&amp;lt;/math&amp;gt; o &amp;lt;math&amp;gt;N - n&amp;lt;/math&amp;gt;  ilości stopni swobody (''n'' - ilość estymowanych parametrów), czyli u nas ''N-2''.	&lt;br /&gt;
Możemy zbadać jakie jest prawdopodobieństwo zaobserwowania takiej (&amp;lt;math&amp;gt;\chi_{fit}^2&amp;lt;/math&amp;gt;), bądź bardziej ekstremalnej wartości &amp;lt;math&amp;gt;\chi^2&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
chi2 = np.sum(residua**2)/sigma**2&lt;br /&gt;
N = len(X)&lt;br /&gt;
if chi2 &amp;lt; N-2:&lt;br /&gt;
	p_chi2 = st.chi2.cdf(chi2, N-2)&lt;br /&gt;
else:&lt;br /&gt;
	p_chi2 = 1 - st.chi2.cdf(chi2, N-2)&lt;br /&gt;
print('chi2 = %.2f, p_chi2 = %.3f' %(chi2, p_chi2))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Czasem używamy zredukowanego, czyli podzielonego przez liczbę stopni swobody &amp;lt;math&amp;gt;\chi^2&amp;lt;/math&amp;gt;:&lt;br /&gt;
*  Jeśli jest on znacząco większy niż 1 to model nie pasuje do danych, lub nie doszacowaliśmy standardowego odchylenia &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;. &lt;br /&gt;
*  Jeśli jest sporo mniejszy niż 1 to prawdopodobnie oszacowane przez nas &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; jest większe niż rzeczywiste.&lt;br /&gt;
To jakościowe porównanie można uściślić szacując prawdopodobieństwo zaobserwowania wartości &amp;lt;math&amp;gt;\chi^2_{zred}&amp;lt;/math&amp;gt; bardziej ekstremalnych niż otrzymane w dopasowaniu. Zmienna &amp;lt;math&amp;gt;\chi^2_{zred}&amp;lt;/math&amp;gt; podlega innemu rozkładowi prawdopodobieństwa niż &amp;lt;math&amp;gt;\chi^2&amp;lt;/math&amp;gt;, możemy go jednak łatwo wyznaczyć w drodze symulacji:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
chi2_zred = chi2/(N-2)&lt;br /&gt;
# potrzebny jest nam rozkład chi2_zred:&lt;br /&gt;
N_dist = 100000&lt;br /&gt;
dist_chi2_zred = np.sum(st.norm.rvs(size=(N-2,N_dist))**2  ,0)/(N-2)&lt;br /&gt;
if chi2_zred&amp;gt;1:&lt;br /&gt;
	p_chi2_zred = np.sum(dist_chi2_zred&amp;gt;=chi2_zred)/float(N_dist)&lt;br /&gt;
else:&lt;br /&gt;
	p_chi2_zred = np.sum(dist_chi2_zred&amp;lt;=chi2_zred)/float(N_dist)&lt;br /&gt;
print('chi2_zred = %.2f, p_chi2_zred = %.3f' %(chi2_zred, p_chi2_zred))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dopasowanie krzywej do danych gdy wariancje dla poszczególnych punktów pomiarowych są różne ===&lt;br /&gt;
Często w fizyce potrzebujemy dopasować jakąś bardziej skomplikowaną zależność niż prosta.  Często też potrafimy oszacować błędy pomiarowe dla różnych wartości zmiennej niezależnej, przy czym może się zdarzyć, że błędy te nie są jednakowe dla różnych wartości zmiennej niezależnej. Do dopasowania współczynników używamy zasady [[WnioskowanieStatystyczne/MLF|największej wiarygodności]], która prowadzi do procedur minimalizacji ważonego średniego błędu kwadratowego. Możemy wówczas użyć standardowych procedur minimalizacji gradientowej. Należy jednak pamiętać, że metody gradientowe znajdują najbliższe ''minimum lokalne'' analizowanej funkcji. W przypadku funkcji nieliniowych skutkiem tego  jest zależność wyniku od punktu startu minimalizacji.&lt;br /&gt;
&lt;br /&gt;
====Dopasowanie dowolnej funkcji====&lt;br /&gt;
Poniżej rozważymy przykład dopasowania zależności wykładniczej. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import scipy.optimize as opt&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
 &lt;br /&gt;
# funkcja używana do symulowania danych&lt;br /&gt;
def zanik(x, amp, wykladnik, blad_wzgledny):&lt;br /&gt;
	'''Definicja funkcji zaniku wykładniczego. Użyjemy jej do wytworzenia danych'''&lt;br /&gt;
	y = amp * (x**wykladnik)       # idealne dane&lt;br /&gt;
	sigma = blad_wzgledny * y      # zakładamy, że stały jest błąd względny pomiaru&lt;br /&gt;
				       # przeliczamy go na standardowe odchylenie symulowanego  błędu &lt;br /&gt;
	# symulujemy szum z obliczonym odchyleniem standardowym i dodajemy go do danych idealnych										&lt;br /&gt;
	y += st.norm.rvs(size=num_points) * sigma       &lt;br /&gt;
	return (y, sigma)&lt;br /&gt;
 &lt;br /&gt;
# Funkcja, którą chcemy dopasować do danych:&lt;br /&gt;
def funkcja_do_fitowania(x,a,b):&lt;br /&gt;
	y = a*x**b&lt;br /&gt;
	return y&lt;br /&gt;
 &lt;br /&gt;
def funkcja_bledu(x, y, funkcja, params, err):&lt;br /&gt;
	'''Suma kwadratów tej funkcji jest minimalizowana w procesie optymalizacji parametrów.&lt;br /&gt;
	Nam przyda się do obliczenia residuów.'''&lt;br /&gt;
	y_fit = funkcja(x, *params) # aktualne wartości y z dopasowania&lt;br /&gt;
	residuum = y-y_fit # residua wchodzą do sumy kwadratów z wagą odwrotnie proporcjonalną do standardowego odchylenia&lt;br /&gt;
	residuum_wazone = residuum/ err &lt;br /&gt;
	return residuum_wazone&lt;br /&gt;
&lt;br /&gt;
# Generujemy punkty z szumem&lt;br /&gt;
num_points = 20&lt;br /&gt;
X = np.linspace(1.1, 10.1, num_points)&lt;br /&gt;
Y, sigma = zanik(X, 10.0, -2.0, 0.1)     # symulowane dane &lt;br /&gt;
 &lt;br /&gt;
# Dopasowujemy parametry &lt;br /&gt;
# nie musimy podawać wartości startowych (params_init) dla procedury minimalizacji (wtedy funkcja zakłada wartości startowe równe 1)&lt;br /&gt;
# jednak zazwyczaj dobrze jest podpowiedzieć algorytmowi, gdzie powinien zacząć&lt;br /&gt;
# nie musimy również podawać wartości sigma, ale jeśli są one różne dla różnych punktów, to podanie ich sprawi, że algorytm będzie się bardziej troszczył&lt;br /&gt;
# o dopasowanie do punktów pomiarowych zmierzonych z dobrą dokładnością, a bardziej swobodnie podejdzie do tych o dużych niepewnościach&lt;br /&gt;
params_init = [2.0, -1.0]&lt;br /&gt;
params_final, covar = opt.curve_fit(funkcja_do_fitowania,X,Y,params_init,sigma)&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Dopasowane parametry&amp;quot;,params_final)&lt;br /&gt;
print(&amp;quot;Macierz kowariancji\n&amp;quot;,covar)&lt;br /&gt;
&lt;br /&gt;
# dopasowane parametry&lt;br /&gt;
amp=params_final[0]&lt;br /&gt;
wykladnik=params_final[1]&lt;br /&gt;
&lt;br /&gt;
# standardowe błędy dopasowania&lt;br /&gt;
amp_err = np.sqrt(covar[0][0])&lt;br /&gt;
wykladnik_err = np.sqrt(covar[1][1])&lt;br /&gt;
 &lt;br /&gt;
# test chi2 dobroci dopasowania. &lt;br /&gt;
# Jeśli znamy wariancję błędu pomiarowego można zastosować test chi2 do oceny jakości dopasowania.&lt;br /&gt;
# 	Po pierwsze powinniśmy przetestować czy residua mają rozkład normalny&lt;br /&gt;
 &lt;br /&gt;
residua = funkcja_bledu(X, Y, funkcja_do_fitowania, params_final, sigma)# tym razem residua już są podzielone przez standardowe odchylenie, każde przez swoje&lt;br /&gt;
W, p =st.shapiro(residua)&lt;br /&gt;
print('Test normalności residuów: p = %.3f'%(p))&lt;br /&gt;
# jeśli tak to zmienna:&lt;br /&gt;
chi2 = np.sum(residua**2)&lt;br /&gt;
# podlega rozkładowi chi-kwadrat o N - n  ilości stopni swobody (n - ilość fitowanych parametrów), czyli u nas N-2	&lt;br /&gt;
# możemy zbadać jakie jest prawdopodobieństwo zaobserwowania takiej, bądź bardziej ekstremalnej wartości chi2:&lt;br /&gt;
&lt;br /&gt;
N = len (X)&lt;br /&gt;
liczba_stopni_swobody = N-len(params_final) # liczba punktów - liczba parametrów&lt;br /&gt;
if chi2 &amp;lt; liczba_stopni_swobody:&lt;br /&gt;
	p_chi2 = st.chi2.cdf(chi2, liczba_stopni_swobody)&lt;br /&gt;
else:&lt;br /&gt;
	p_chi2 = st.chi2.sf(chi2, liczba_stopni_swobody) # równoważne 1-st.chi2.cdf(chi2, N-2), ale sf ma lepszą dokładność dla małych wartości&lt;br /&gt;
print('chi2 = %.2f, p_chi2 = %.3f' %(chi2, p_chi2))&lt;br /&gt;
# czasem używamy zredukowanego chi2, czyli podzielonego przez ilość stopni swobody&lt;br /&gt;
chi2_zred = chi2/liczba_stopni_swobody&lt;br /&gt;
# jeśli jest on znacząco większy niż 1 to model nie pasuje do danych, lub nie doszacowaliśmy sigmy, &lt;br /&gt;
# jeśli jest sporo mniejszy niż 1 to prawdopodobnie oszacowane przez nas sigma jest większe niż rzeczywiste&lt;br /&gt;
# potrzebny jest nam rozkład chi2_zred:&lt;br /&gt;
N_dist = 100000&lt;br /&gt;
dist_chi2_zred = np.sum(st.norm.rvs(size=(liczba_stopni_swobody,N_dist))**2  ,0)/liczba_stopni_swobody&lt;br /&gt;
p_chi2_zred = np.sum(dist_chi2_zred&amp;gt;=chi2_zred)/float(N_dist)&lt;br /&gt;
print('chi2_zred = %.2f, p_chi2_zred = %.3f' %(chi2_zred, p_chi2_zred))&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
##########&lt;br /&gt;
# wykres&lt;br /&gt;
##########&lt;br /&gt;
py.subplot(2,1,1)&lt;br /&gt;
py.plot(X, funkcja_do_fitowania(X,amp,wykladnik))     # Fit&lt;br /&gt;
py.errorbar(X, Y, yerr=sigma, fmt='k.')  # Dane i błędy&lt;br /&gt;
py.text(5, 6.5, 'amplituda = %5.2f +/- %5.2f' % (amp, amp_err))&lt;br /&gt;
py.text(5, 5.5, u'wykładnik = %5.2f +/- %5.2f' % (wykladnik, wykladnik_err))&lt;br /&gt;
py.title(u'Dopasowanie metodą najmniejszych kwadratów')&lt;br /&gt;
py.xlabel('X')&lt;br /&gt;
py.ylabel('Y')&lt;br /&gt;
py.xlim(1, 11)&lt;br /&gt;
py.subplot(2,1,2)&lt;br /&gt;
py.plot(X, residua) # residua&lt;br /&gt;
py.xlabel('X')&lt;br /&gt;
py.ylabel('dY')&lt;br /&gt;
py.title(u'Wykres residuów')&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Dopasowanie wielomianu====&lt;br /&gt;
Poniżej rozważymy przykład dopasowania zależności wielomianowej.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
 &lt;br /&gt;
# funkcja używana do symulowania danych&lt;br /&gt;
def wielomian_z_szumem(x, wspolczynniki,blad_wzgledny):&lt;br /&gt;
	'''Definicja funkcji wielomianowej. Użyjemy jej do wytworzenia danych'''&lt;br /&gt;
	W = np.poly1d(wspolczynniki) # funkcja zwracająca obiekt wielomianu o zadanych wspolczynnikach&lt;br /&gt;
								 #można go używać tak, jak zwykłej funkcji, ale obsługuje też działania na wielomianach&lt;br /&gt;
	y = W(X)# idealne dane&lt;br /&gt;
	sigma = blad_wzgledny * y	# zakładamy, że stały jest błąd względny pomiaru&lt;br /&gt;
								# przeliczamy go na standardowe odchylenie symulowanego  błędu &lt;br /&gt;
	# symulujemy szum z obliczonym odchyleniem standardowym i dodajemy go do danych idealnych										&lt;br /&gt;
	y += st.norm.rvs(size=num_points) * sigma       &lt;br /&gt;
	return (y, sigma)&lt;br /&gt;
&lt;br /&gt;
def funkcja_bledu_dla_wielomianow(x, y, wspolczynniki, err):&lt;br /&gt;
	'''Suma kwadratów tej funkcji jest minimalizowana w procesie optymalizacji parametrów.&lt;br /&gt;
	Nam przyda się do obliczenia residuów.'''&lt;br /&gt;
	W = np.poly1d(wspolczynniki)&lt;br /&gt;
	y_fit = W(x) # aktualne wartości y z dopasowania&lt;br /&gt;
	residuum = y-y_fit # residua wchodzą do sumy kwadratów z wagą odwrotnie proporcjonalną do standardowego odchylenia&lt;br /&gt;
	residuum_wazone = residuum/ err &lt;br /&gt;
	return residuum_wazone&lt;br /&gt;
&lt;br /&gt;
# Generujemy punkty z szumem&lt;br /&gt;
num_points = 20&lt;br /&gt;
X = np.linspace(-4, 6, num_points)&lt;br /&gt;
wspolczynniki_wielomianu= (0.3,1,-2,4)&lt;br /&gt;
stopien_wielomianu=len(wspolczynniki_wielomianu)-1&lt;br /&gt;
blad_wzgledny_pomiaru=0.1&lt;br /&gt;
Y, sigma = wielomian_z_szumem(X, wspolczynniki_wielomianu, blad_wzgledny_pomiaru)     # symulowane dane &lt;br /&gt;
 &lt;br /&gt;
# Dopasowujemy parametry&lt;br /&gt;
# tym razem skorzystamy z funkcji np.polyfit, która nie potrzebuje parametrów początkowych, ani zdefiniowanej funkcji, którą ma dopasować&lt;br /&gt;
# podajemy jej tylko nasze dane oraz stopień wielomianu, który ma dopasować oraz opcjonalne wagi&lt;br /&gt;
# UWAGA! Tym razem wagi muszą być odwrotnością odchyleń standardowych (1/sigma, a nie sigma, jak w curve_fit)&lt;br /&gt;
# funkcja ta domyślnie zwraca tylko dopasowane parametry (wspolczynniki wielomianu), a nie zwraca macierzy kowariancji,&lt;br /&gt;
# jeśli jest nam ona potrzebna, to musimy jej zarządać poprzez dodanie opcji cov=True (full=False, ale to jest domyślnie)&lt;br /&gt;
params_final, covar=np.polyfit(X, Y, deg=stopien_wielomianu, w=1/sigma, cov=True)&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Dopasowane wspolczynniki wielomianu&amp;quot;,params_final)&lt;br /&gt;
print(&amp;quot;Macierz kowariancji\n&amp;quot;,covar)&lt;br /&gt;
&lt;br /&gt;
# standardowe błędy dopasowania&lt;br /&gt;
niepewnosci=[]&lt;br /&gt;
for i in range(len(params_final)):&lt;br /&gt;
	niepewnosci.append(np.sqrt(covar[i][i]))&lt;br /&gt;
print(niepewnosci)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# test chi2 dobroci dopasowania. &lt;br /&gt;
# Jeśli znamy wariancję błędu pomiarowego można zastosować test chi2 do oceny jakości dopasowania.&lt;br /&gt;
# 	Po pierwsze powinniśmy przetestować czy residua mają rozkład normalny&lt;br /&gt;
 &lt;br /&gt;
residua = funkcja_bledu_dla_wielomianow(X, Y, params_final, sigma)# tym razem residua już są podzielone przez standardowe odchylenie, każde przez swoje&lt;br /&gt;
W, p =st.shapiro(residua)&lt;br /&gt;
print('Test normalności residuów: p = %.3f'%(p))&lt;br /&gt;
# jeśli tak to zmienna:&lt;br /&gt;
chi2 = np.sum(residua**2)&lt;br /&gt;
# podlega rozkładowi chi-kwadrat o N - n  ilości stopni swobody (n - ilość fitowanych parametrów), czyli u nas N-2	&lt;br /&gt;
# możemy zbadać jakie jest prawdopodobieństwo zaobserwowania takiej, bądź bardziej ekstremalnej wartości chi2:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
N = len (X)&lt;br /&gt;
liczba_stopni_swobody = N-len(params_final) # liczba punktów - liczba parametrów&lt;br /&gt;
if chi2 &amp;lt; liczba_stopni_swobody:&lt;br /&gt;
	p_chi2 = st.chi2.cdf(chi2, liczba_stopni_swobody)&lt;br /&gt;
else:&lt;br /&gt;
	p_chi2 = st.chi2.sf(chi2, liczba_stopni_swobody) # równoważne 1-st.chi2.cdf(chi2, N-2), ale sf ma lepszą dokładność dla małych wartości&lt;br /&gt;
print('chi2 = %.2f, p_chi2 = %.3f' %(chi2, p_chi2))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# czasem używamy zredukowanego chi2, czyli podzielonego przez ilość stopni swobody&lt;br /&gt;
chi2_zred = chi2/liczba_stopni_swobody&lt;br /&gt;
# jeśli jest on znacząco większy niż 1 to model nie pasuje do danych, lub nie doszacowaliśmy sigmy, &lt;br /&gt;
# jeśli jest sporo mniejszy niż 1 to prawdopodobnie oszacowane przez nas sigma jest większe niż rzeczywiste&lt;br /&gt;
# potrzebny jest nam rozkład chi2_zred:&lt;br /&gt;
N_dist = 100000&lt;br /&gt;
dist_chi2_zred = np.sum(st.norm.rvs(size=(liczba_stopni_swobody,N_dist))**2  ,0)/liczba_stopni_swobody&lt;br /&gt;
p_chi2_zred = np.sum(dist_chi2_zred&amp;gt;=chi2_zred)/float(N_dist)&lt;br /&gt;
print('chi2_zred = %.2f, p_chi2_zred = %.3f' %(chi2_zred, p_chi2_zred))&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
##########&lt;br /&gt;
# wykres&lt;br /&gt;
##########&lt;br /&gt;
py.subplot(2,1,1)&lt;br /&gt;
W=np.poly1d(params_final)&lt;br /&gt;
py.plot(X, W(X))     # Fit&lt;br /&gt;
py.errorbar(X, Y, yerr=sigma, fmt='k.')  # Dane i błędy&lt;br /&gt;
py.title(u'Dopasowanie metodą najmniejszych kwadratów')&lt;br /&gt;
py.text(-4.6, 92, u'dopasowane współczynniki = '+str(np.round(params_final,3)))&lt;br /&gt;
py.text(-4.6, 86, u'niepewności współczynników = '+str(np.round(niepewnosci,3)))&lt;br /&gt;
py.text(-4.6, 80, u'prawdziwe współczynniki = '+str(np.round(wspolczynniki_wielomianu,3)))&lt;br /&gt;
py.xlabel('X')&lt;br /&gt;
py.ylabel('Y')&lt;br /&gt;
py.xlim(X.min()-1, X.max()+1)&lt;br /&gt;
py.subplot(2,1,2)&lt;br /&gt;
py.plot(X, residua) # residua&lt;br /&gt;
py.xlabel('X')&lt;br /&gt;
py.ylabel('dY')&lt;br /&gt;
py.title(u'Wykres residuów')&lt;br /&gt;
py.show()&lt;br /&gt;
py.show()&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Maciek</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=WnioskowanieStatystyczne/_Testowanie_hipotez&amp;diff=11337</id>
		<title>WnioskowanieStatystyczne/ Testowanie hipotez</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=WnioskowanieStatystyczne/_Testowanie_hipotez&amp;diff=11337"/>
		<updated>2025-05-12T11:31:26Z</updated>

		<summary type="html">&lt;p&gt;Maciek: /* Zadanie: Pomiar masy cząstki elementarnej */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Testowanie hipotez dotyczących jednej lub dwóch populacji ==&lt;br /&gt;
===Wstęp===&lt;br /&gt;
Schemat weryfikowania hipotez omówiony jest w wykładzie [[WnioskowanieStatystyczne/Weryfikacja hipotez |Weryfikacja hipotez statystycznych]]. Tu przypomnimy tylko krótko podstawowe pojęcia i decyzje, które trzeba pojąć w procedurze weryfikacji.&lt;br /&gt;
====Hipoteza zerowa i alternatywna====&lt;br /&gt;
Podstawą sukcesu w statystycznym testowaniu hipotez jest prawidłowe ich sformułowanie. &lt;br /&gt;
Hipotezy muszą być rozłączne. Najczęściej jako hipotezę zerową przyjmujemy zdanie, które chcemy odrzucić, &lt;br /&gt;
gdyż błąd takiej decyzji można kontrolować. Logika testowania jest następująca: tworzymy &lt;br /&gt;
funkcję od zmiennych losowych, dla której przy spełnieniu przez owe zmienne hipotezy zerowej potrafimy &lt;br /&gt;
podać prawdopodobieństwa z jakimi przyjmuje ona różne wartości. Ta funkcja nazywana jest ''statystyką''. &lt;br /&gt;
Następnie obliczamy wartość tej funkcji dla badanej próby. Jeśli prawdopodobieństwo osiągnięcia otrzymanej &lt;br /&gt;
bądź jeszcze bardziej ekstremalnej wartości statystyki jest niskie to wątpimy, że nasze dane są zgodne&lt;br /&gt;
z hipotezą zerową i jesteśmy skłonni przyjąć hipotezę alternatywną.&lt;br /&gt;
&lt;br /&gt;
====Wybór statystyki====&lt;br /&gt;
Wybierając statystykę można posłużyć się następującym schematem:&lt;br /&gt;
* Jeżeli znamy rozkład prawdopodobieństwa, z którego pochodzą nasze dane, lub umiemy je przetransformować do znanego rozkładu, to wybierzemy klasyczny test parametryczny np. test ''t'' ([http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.mstats.ttest_rel.html ttest_rel], [http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.ttest_ind.html ttest_ind]), &amp;lt;math&amp;gt;\chi^2&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; itp.&lt;br /&gt;
* Jeżeli nie znamy rozkładu prawdopodobieństwa naszych danych albo nie chcemy nic o nim zakładać to mamy dwie możliwości: &lt;br /&gt;
** korzystamy z klasycznego [[WnioskowanieStatystyczne/Test_Wilcoxona|testu nieparametrycznego]] np.:&lt;br /&gt;
&amp;lt;!--http://mail.scipy.org/pipermail/scipy-user/2009-July/021679.html--&amp;gt;&lt;br /&gt;
**; test Wilcoxona dla obserwacji sparowanych: testuje hipotezę zerową, że dwie próby &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, które ze sobą porównujemy pochodzą z tej samej populacji ciągłej (przekłada się to na równość dystrybuant). Próby &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; '''są''' sparowane. W pythonie mamy ten test zaimplementowany jako: [http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.wilcoxon.html &amp;lt;tt&amp;gt;scipy.stats.wilcoxon(x, y=None)&amp;lt;/tt&amp;gt;]. Ta implementacja stosuje przybliżenie dużych prób i zalecana jest dla &amp;lt;math&amp;gt;n&amp;gt;20&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;!--    Calculate the Wilcoxon signed-rank test&lt;br /&gt;
&lt;br /&gt;
    The Wilcoxon signed-rank test tests the null hypothesis that two related samples come from the same distribution. It is a a non-parametric version of the paired T-test.&lt;br /&gt;
    Parameters:	&lt;br /&gt;
    x : array_like&lt;br /&gt;
        The first set of measurements&lt;br /&gt;
    y : array_like, optional, default None&lt;br /&gt;
        The second set of measurements. If y is not given, then the x array is considered to be the differences between the two sets of measurements.&lt;br /&gt;
    Returns:	&lt;br /&gt;
    z-statistic : float&lt;br /&gt;
        The test statistic under the large-sample approximation that the signed-rank statistic is normally distributed.&lt;br /&gt;
    p-value : float&lt;br /&gt;
        The two-sided p-value for the test&lt;br /&gt;
    Notes&lt;br /&gt;
    Because the normal approximation is used for the calculations, the samples used should be large. A typical rule is to require that n &amp;gt; 20.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
scipy.stats.ranksums(x, y)&lt;br /&gt;
&lt;br /&gt;
    Compute the Wilcoxon rank-sum statistic for two samples.&lt;br /&gt;
&lt;br /&gt;
    The Wilcoxon rank-sum test tests the null hypothesis that two sets of measurements are drawn from the same distribution. The alternative hypothesis is that values in one sample are more likely to be larger than the values in the other sample.&lt;br /&gt;
&lt;br /&gt;
    This test should be used to compare two samples from continuous distributions. It does not handle ties between measurements in x and y. For tie-handling and an optional continuity correction see `stats.mannwhitneyu`_&lt;br /&gt;
    Parameters:	&lt;br /&gt;
&lt;br /&gt;
    x,y : array_like&lt;br /&gt;
&lt;br /&gt;
        The data from the two samples&lt;br /&gt;
&lt;br /&gt;
    Returns:	&lt;br /&gt;
&lt;br /&gt;
    z-statistic : float&lt;br /&gt;
&lt;br /&gt;
        The test statistic under the large-sample approximation that the rank sum statistic is normally distributed&lt;br /&gt;
&lt;br /&gt;
    p-value : float&lt;br /&gt;
&lt;br /&gt;
        The two-sided p-value of the test&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
**; test Manna-Whitney'a : testuje hipotezę zerową, że dwie próby &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, które ze sobą porównujemy pochodzą z tej samej populacji ciągłej. Próby &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; i&amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; '''nie są''' sparowane. Implementacja w pyhtonie: [http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.mannwhitneyu.html &amp;lt;tt&amp;gt;scipy.stats.mannwhitneyu(x, y, use_continuity=True)&amp;lt;/tt&amp;gt;] stosuje przybliżenia i zalecana jest dla &amp;lt;math&amp;gt;n&amp;gt;20&amp;lt;/math&amp;gt; w każdej z prób. Funkcja zwraca wartość ''p'' dla hipotezy jednostronnej. Jeśli testujemy hipotezę dwustronną trzeba otrzymane ''p'' pomnożyć przez 2.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
scipy.stats.mannwhitneyu(x, y, use_continuity=True)¶&lt;br /&gt;
&lt;br /&gt;
    Computes the Mann-Whitney rank test on samples x and y.&lt;br /&gt;
    Parameters:	&lt;br /&gt;
    x, y : array_like&lt;br /&gt;
        Array of samples, should be one-dimensional.&lt;br /&gt;
    use_continuity : bool, optional&lt;br /&gt;
        Whether a continuity correction (1/2.) should be taken into account. Default is True.&lt;br /&gt;
    Returns:	&lt;br /&gt;
    u : float&lt;br /&gt;
        The Mann-Whitney statistics.&lt;br /&gt;
    prob : float&lt;br /&gt;
        One-sided p-value assuming a asymptotic normal distribution.&lt;br /&gt;
    Notes&lt;br /&gt;
    Use only when the number of observation in each sample is &amp;gt; 20 and you have 2 independent samples of ranks. Mann-Whitney U is significant if the u-obtained is LESS THAN or equal to the critical value of U.&lt;br /&gt;
&lt;br /&gt;
    This test corrects for ties and by default uses a continuity correction. The reported p-value is for a one-sided hypothesis, to get the two-sided p-value multiply the returned p-value by 2.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
** wytwarzamy rozkład statystyki na podstawie naszych danych przez repróbkowanie ([[WnioskowanieStatystyczne/Bootstrap|bootstrap]] lub [[WnioskowanieStatystyczne/Testy_permutacyjne| permutacje]]). W podejściu repróbkowania tworzymy statystyczny model badanego procesu '''zgodny z hipotezą zerową''' i następnie badamy w drodze symulacji prawdopodobieństwa generowania przez ten model interesujących nas sytuacji. Największą uwagę musimy tu poświęcić na prawidłowe sformułowanie modelu, a następnie precyzyjne określenie prawdopodobieństwo jakiego zdarzenia nas naprawdę interesuje.&lt;br /&gt;
&lt;br /&gt;
===Poziom istotności &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; i wartość &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;===&lt;br /&gt;
; Błąd pierwszego rodzaju : błąd polegający na odrzuceniu hipotezy zerowej, która w rzeczywistości jest prawdziwa. Oszacowanie prawdopodobieństwa popełnienia błędu pierwszego rodzaju oznaczamy symbolem &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; i nazywamy poziomem istotności testu.&lt;br /&gt;
; Błąd drugiego rodzaju : polegaja na nieodrzuceniu hipotezy zerowej, która jest w rzeczywistości fałszywa. Oszacowanie prawdopodobieństwo popełnienia błędu drugiego rodzaju oznaczamy symbolem &amp;lt;math&amp;gt; \beta&amp;lt;/math&amp;gt;, a jego dopełnienie do jedności nazywane jest '''mocą testu'''.&lt;br /&gt;
&lt;br /&gt;
Wartość &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; jest to wartość prawdopodobieństwa, że wobec posiadanych danych  hipoteza zerowa jest prawdziwa. Jest ono obliczane jako prawdopodobieństwo zaobserwowania wartości ''statystyki'' takiej jak dla badanej próby, lub bardziej ekstremalnej, przy prawdziwej hipotezie zerowej.&lt;br /&gt;
Najczęściej porównujemy ''p'' z wcześniej ustalonym poziomem istotności &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;. Poziom istotności &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; to wartość krytyczna prawdopodobieństwa, taka że jeżeli &amp;lt;math&amp;gt; p&amp;lt; \alpha&amp;lt;/math&amp;gt; to odrzucamy hipotezę zerową.&lt;br /&gt;
&lt;br /&gt;
==Formułowanie hipotez==&lt;br /&gt;
===Przykład: mutacje muszek owocowych===&lt;br /&gt;
Załóżmy, że badamy muszki owocowe. W standardowej populacji proporcja samic do samców jest 1:1. Opracowaliśmy metodę powodującą taką mutację muszek owocowych, że potomstwo ich nie będzie miało jednakowej szansy na bycie samcem lub samiczką. W pierwszych 20 zbadanych przypadkach uzyskujemy 14 samców i 6 samiczek.&lt;br /&gt;
; Pytanie naukowe: Czy wyniki eksperymentu potwierdzają, że nasza metoda zaburza proporcję płci?&lt;br /&gt;
Najpierw musimy przetłumaczyć pytanie naukowe na pytanie statystyczne. &lt;br /&gt;
; Pytanie statystyczne: Jakie jest prawdopodobieństwo uzyskania zaobserwowanej proporcji (14:6), lub bardziej ekstremalnej w próbie 20 osobników,  jeśli rzeczywista proporcja płci jest 1:1?&lt;br /&gt;
&lt;br /&gt;
Z tego pytania wynikają dwie możliwe hipotezy:&lt;br /&gt;
* Hipoteza zerowa: Nowa metoda nie zaburza proporcji płci 1:1. Zaobserwowana próbka pochodzi z populacji, w której proporcja płci ''jest'' 1:1&lt;br /&gt;
* Hipoteza alternatywna: Zaobserwowana próbka pochodzi z populacji, w której proporcja płci ''nie jest'' 1:1.&lt;br /&gt;
; Prawdopodobieństwo, które musimy oszacować: Jakie jest prawdopodobieństwo uzyskania 14 lub więcej jedynek w serii 20 prób, jeśli prawdopodobieństwo jedynki jest &amp;lt;math&amp;gt;1/2&amp;lt;/math&amp;gt;?  &lt;br /&gt;
# Oznaczmy 1: samiec 0: samiczka.&lt;br /&gt;
# Zróbmy wektor 20-elementowy zawierający 10 zer i 10 jedynek.&lt;br /&gt;
# Wylosujmy ze zwracaniem nowy wektor 20-elementowy. (Jest to nasz model uzyskiwania 20 elementowej próbki z populacji o proporcji 1:1.) Zapamiętajmy liczbę jedynek.&lt;br /&gt;
# Powtórzmy poprzedni krok 1000 razy&lt;br /&gt;
# Zróbmy histogram ilości jedynek.&lt;br /&gt;
# Policzmy ile razy zdarzyło sie 14 lub więcej jedynek (to odpowiada 14 lub więcej samców) i dodajmy do tego ilość przypadków gdy mieliśmy 6 lub mniej jedynek (to odpowiada 14 lub więcej samiczek). Wynik podzielmy przez ilość losowań (1000).&lt;br /&gt;
&lt;br /&gt;
Powyższa procedura opisuje test dwustronny. Testu dwustronnego musimy użyć jeśli nie mamy ''istotnych'' powodów, żeby wierzyć, że nowa metoda działa ''jedynie na zwiększenie'' szansy pojawienia się samca.&lt;br /&gt;
&lt;br /&gt;
Jak powyższy problem rozwiązać w sposób parametryczny? &lt;br /&gt;
Próby podlegają rozkładowi dwumianowemu, można więc obliczyć szukane prawdopodobieństwo korzystając z jego dystrybuanty.&lt;br /&gt;
&lt;br /&gt;
==Testowanie hipotez na temat średniej==&lt;br /&gt;
Firma rozwożąca przesyłki po mieście deklaruje średni czas dostarczenia 28 minut. Przeprowadźmy test tej hipotezy na poziomie istotności 5%.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_0: \mu = 28&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;H_1: \mu \ne 28&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wybieramy losową próbę 100 przesyłek, mierzymy czas dostarczenia, liczymy średnią z próby &amp;lt;math&amp;gt;\bar x = 31,5&amp;lt;/math&amp;gt; minut i odchylenie standardowe próby &amp;lt;math&amp;gt;s = 5&amp;lt;/math&amp;gt; minut. &lt;br /&gt;
&lt;br /&gt;
Test ten można przeprowadzić z użyciem przedziałów ufności:&lt;br /&gt;
* Konstruujemy przedziały ufności 95% dla średniej &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.Formalnie, ponieważ wyliczyliśmy odchylenie standardowe z próby powinniśmy zastosować wartości krytyczne z rozkładu t. Rozmiar próby wynosi 100 więc rozkład t ma 99 stopni swobody. Wartość krytyczna w tym rozkladzie to &amp;lt;math&amp;gt;t_{97.5} =  1.984 &amp;lt;/math&amp;gt;. Mamy zatem:&lt;br /&gt;
&amp;lt;math&amp;gt;\bar x \pm 1,984 \frac{s}{\sqrt{n}} = 31,5 \pm 1,984*\frac{5}{\sqrt{100}} = 31,5 \pm 0,992 = [30,51 \quad 32,49]&amp;lt;/math&amp;gt;&lt;br /&gt;
* Wnioskowanie: Możemy więc być na 95% pewni, że nieznana średnia leży pomiędzy 30,51 a 32,49 a więc na 95% nie leży poza tym przedziałem. &lt;br /&gt;
Skoro &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; podaje &amp;lt;math&amp;gt;\mu = 28&amp;lt;/math&amp;gt; (poza przedziałem), możemy odrzucić tę hipotezę.  Jeśli &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; jest prawdziwe, istnieje prawdopodobieństwo 0,05, że skonstruowany przedział nie będzie zawierał &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. Istnieje zatem prawdopodobieństwo 0,05 popełnienia błądu I-go rodzaju. Mówimy, że przeprowadziliśmy test na poziomie istotności 0,05.&lt;br /&gt;
&lt;br /&gt;
Test można też przeprowadzić następująco:&lt;br /&gt;
* Jako statystykę wybieramy &amp;lt;math&amp;gt;t = \frac{\bar x - \mu}{s/\sqrt{n}} &amp;lt;/math&amp;gt;&lt;br /&gt;
* Obliczmy jej wartość dla danych z próby: &amp;lt;math&amp;gt;t = \frac{\bar x - \mu}{s/\sqrt{n}}  = (31,5 -28)/(5/\sqrt{100}) = 7 &amp;lt;/math&amp;gt;&lt;br /&gt;
* Porównujemy otrzymaną wartość z wartością krytyczna dla przyjętego poziomu istotności &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;. Konstuowany przez nas test ma być testem dwustronnym więc musimy wziąć do porównania wartość krytyczna dla &amp;lt;math&amp;gt;\alpha/2&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt; t_{\alpha/2} = t_{0,025}= -1,984&amp;lt;/math&amp;gt;&lt;br /&gt;
* Wnioskowanie: Dla naszej próby otrzymaliśmy wartość statystyki równą 6.96. Dla przyjętego poziomu istotności wartość statystyki wynosi 1,984. Prawdopodobieństwo zaobserwowania statystyki o wartości 7 lub bardziej ekstremalnej (tu: większej) jest mniejsze niż założony poziom istotności więc odrzucamy &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; na poziomie &amp;lt;math&amp;gt;\alpha = 0,05&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Testowanie hipotez na temat wariancji==&lt;br /&gt;
&lt;br /&gt;
Do testowania hipotez na temat wariancji używamy statystyki chi-kwadrat o &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; stopniach swobody:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\chi^2 = \frac{(n-1)s^2}{\sigma_0^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\sigma_0^2&amp;lt;/math&amp;gt; jest wartością wariancji podaną w &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
===Przykład===&lt;br /&gt;
Do produkcji baterii używane są metalowe płytki o średniej średnicy 5 mm. Jeśli wariancja średnicy płytki jest nie większa niż 1 mm&amp;lt;math&amp;gt;^2&amp;lt;/math&amp;gt;, produkcja jest kontynuowana. Jeśli wariancja przekracza 1 mm&amp;lt;math&amp;gt;^2&amp;lt;/math&amp;gt; proces produkcji trzeba przerwać. Kontroler przeprowadza test na poziomie istotności &amp;lt;math&amp;gt;\alpha = 5&amp;lt;/math&amp;gt;%: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_0:&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\sigma^2 \le 1&amp;lt;/math&amp;gt; i &lt;br /&gt;
&amp;lt;math&amp;gt;H_1:&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\sigma^2 &amp;gt; 1&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Wybiera losową próbę 31 płytek i znajduje wariancję próby &amp;lt;math&amp;gt;s^2 = 1,62&amp;lt;/math&amp;gt;. Czy daje to podstawy do przerwania produkcji?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\chi^2 = \frac{(31-1) \cdot 1,62}{1} = 48,6&amp;lt;/math&amp;gt;. Znajdujemy poziom &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; dla tej wartości &amp;lt;math&amp;gt;\chi^2&amp;lt;/math&amp;gt; z 30 stopniami swobody. &lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
p = 1-st.chi2.cdf(48.6,30)&lt;br /&gt;
print(p)&lt;br /&gt;
&lt;br /&gt;
#ilustracja&lt;br /&gt;
x = py.arange(0,60,1)  &lt;br /&gt;
py.plot(x, st.chi2.pdf(x,30)) #rysujemy funkcję gęstości prawdopodobieństwa chi2 o 30 st. swobody&lt;br /&gt;
x2 = py.arange(48.8,60,1)&lt;br /&gt;
py.fill_between(x2,st.chi2.pdf(x2,30)) #cieniujemy obszar pod funkcją geęstości prawdopodobieństwa odpowiadający obliczonemu p&lt;br /&gt;
&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Otrzymaliśmy &amp;lt;math&amp;gt; p = 0,017 &amp;lt;/math&amp;gt;.&lt;br /&gt;
Wniosek:  Odrzucamy &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Błąd drugiego rodzaju. Moc testu.==&lt;br /&gt;
Błąd II-go rodzaju popełniamy wtedy gdy przyjmujemy &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; a prawdziwe jest &amp;lt;math&amp;gt;H_1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Przykład===&lt;br /&gt;
Załóżmy następujący test:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_0: \mu = 60&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_1: \mu = 65&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Niech rozmiar próby wynosi &amp;lt;math&amp;gt;n = 100&amp;lt;/math&amp;gt; a odchylenie standardowe w populacji &amp;lt;math&amp;gt;\sigma = 20&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Powinniśmy tu zastosować test jednostronny (mamy tylko dwie możliwości: &amp;lt;math&amp;gt;\mu = 60&amp;lt;/math&amp;gt; lub &amp;lt;math&amp;gt;65&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
Znajdźmy punkt krytyczny &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; dla poziomu istotności &amp;lt;math&amp;gt;\alpha =  0,05&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;C = \mu_0 + 1,645\frac{\sigma}{\sqrt{n}} = 60 + 1,645(20/10) = 63,29&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Błąd pierwszego rodzaju popełnimy gdy &amp;lt;math&amp;gt;\bar x &amp;gt; C&amp;lt;/math&amp;gt; i prawdziwe będzie &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt;. Prawdopodobieństwo błędu pierwszego rodzaju ustaliliśmy z góry na poziomie &amp;lt;math&amp;gt;\alpha = 0,05&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\alpha = P(\bar x &amp;gt; C| \mu = \mu_0)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Błąd drugiego rodzaju popełnimy gdy &amp;lt;math&amp;gt;\bar x &amp;lt; C&amp;lt;/math&amp;gt; a prawdziwe będzie &amp;lt;math&amp;gt;H_1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Prawdopodobieństwo popełnienia tego błędu wynosi:&lt;br /&gt;
&amp;lt;math&amp;gt;\beta = P(\bar x &amp;lt; C| \mu = \mu_1) = P\left( \frac{\bar x - \mu_1}{\sigma/\sqrt{n}}  &amp;lt; \frac{C - \mu_1}{\sigma/\sqrt{n}}\right)= &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;= P\left( Z &amp;lt; \frac{63,29 - 65}{20/10}\right)  = P(Z &amp;lt; -0,855) = 0,1963&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Moc testu jest dopełnieniem błędu II rodzaju.&lt;br /&gt;
A moc testu czyli prawdopodobieństwo odrzucenia hipotezy zerowej podczas gdy jest ona fałszywa wynosi:&lt;br /&gt;
&amp;lt;math&amp;gt;1 - \beta = 0,8037&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Porównanie dwóch populacji==&lt;br /&gt;
[[WnioskowanieStatystyczne/Test_t#Test_t_.28Studenta.29_r.C3.B3.C5.BCnicy_.C5.9Brednich|Dla przypomnienia]]:&lt;br /&gt;
Jeśli mamy dwie próbki danych:&lt;br /&gt;
:&amp;lt;math&amp;gt;x_1&amp;lt;/math&amp;gt; o liczebności &amp;lt;math&amp;gt;n_1&amp;lt;/math&amp;gt; i estymowanej wariancji &amp;lt;math&amp;gt;s_1^2&amp;lt;/math&amp;gt; i &lt;br /&gt;
:&amp;lt;math&amp;gt;x_2&amp;lt;/math&amp;gt; o liczebności &amp;lt;math&amp;gt;n_2&amp;lt;/math&amp;gt; i estymowanej wariancji &amp;lt;math&amp;gt;s_2^2&amp;lt;/math&amp;gt;  &lt;br /&gt;
:gdzie &amp;lt;math&amp;gt;s_{i}^2= \frac{1}{(n_i-1)}\sum\limits_{j=1}^{n_i} (x_{j}-\overline{x}_{i})^{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
pochodzących z rozkładu normalnego o takiej samej wariancji &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; to:&lt;br /&gt;
*wspólna wariancja może być estymowana jako: &amp;lt;math&amp;gt;s^2=\frac{(n_1-1)s_1^2+(n_2-1)s_2^2}{n_1+n_2-2} &amp;lt;/math&amp;gt;&lt;br /&gt;
*wariancja różnicy średnich może być estymowana jako: &amp;lt;math&amp;gt;s_{\Delta}^2=s_{\bar{x}_1}^2+s_{\bar{x}_2}^2=\frac{1}{n_1}s_1^2+\frac{1}{n_2}s_2^2 = \frac{n_1+n_2}{n_1n_2}s^2&amp;lt;/math&amp;gt;&lt;br /&gt;
Jeśli postawimy hipotezę zerową: &amp;lt;math&amp;gt;H_0:\; \mu_1 = \mu_2&amp;lt;/math&amp;gt; to&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
t= \frac{\bar{x}_1-\bar{x}_2}{s_{\Delta}}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
pochodzi z rozkładu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; o &amp;lt;math&amp;gt;n_1+n_2-2&amp;lt;/math&amp;gt; stopniach swobody.&lt;br /&gt;
&lt;br /&gt;
===Przykład: promocja===&lt;br /&gt;
Producent odtwarzaczy CD chce sprawdzić czy małe obniżenie ceny produktu wpłynie korzystnie na sprzedaż. Losowa próba 15 tygodni sprzedaży przed obniżką dała średni dochód 6598 zł i standardowe odchylenie 844 zł. Losowa próba 12 tygodni sprzedaży w trakcie promocji dała średnią 6870 i odchylenie standardowe 669 zł. Czy dane te wykazują poprawę sprzedaży w trakcie promocji (przyjąć poziom istotności 5%) ?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\bar{x}_1 = 6598&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\bar{x}_2 = 6870&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Treść zadania odpowiada testowi jednostronnemu z poniższymi hipotezami:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_0: \mu_1 = \mu_2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_1: \mu_1 &amp;lt; \mu_2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Różnica średnich wynosi:&lt;br /&gt;
&amp;lt;math&amp;gt;\bar{x}_1-\bar{x}_2 = 6598 - 6870 = -272 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Estymowana wariancja różnicy średnich:&lt;br /&gt;
&amp;lt;math&amp;gt;s_{\Delta}^2 =  \frac{1}{n_1}s_1^2+\frac{1}{n_2}s_2^2 = \frac{844^2}{15} + \frac{669^2}{12} = 84785,82&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
zatem:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;s_{\Delta} = 291,18&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; t = -272/ 291,18 = - 0,934&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ilość stopni swobody: &amp;lt;math&amp;gt;n_1+n_2-2 = 25&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;P(t_{25} \le -0,934) = 0.18 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wniosek: Nie możemy odrzucić &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt;. Nie mamy podstaw by uznać że mała obniżka cen poprawiła sprzedaż.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Do testowania równości wariancji w dwóch populacjach stosuje się test &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;F_{(n1 -1, n2 - 1)} = \frac{s_1^2}{s_2^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
W przykładzie powyżej założyliśmy równość wariancji. Korzystając z testu &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; sprawdzić czy założenie było uzasadnione.&lt;br /&gt;
&lt;br /&gt;
==Badanie założenia o normalności rozkładu==&lt;br /&gt;
We wszystkich wspomnianych powyżej klasycznych testach statystycznych &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\chi^2&amp;lt;/math&amp;gt; istotnym założeniem jest to, że dane wejściowe w próbie mają rozkład normalny. W powyższych zadaniach po prostu to zakładaliśmy, ale w praktyce, kiedy dostajemy próbę do analizy, musimy sami sprawdzić,  czy możemy uznać ją za pochodzącą z rozkładu normalnego. Do weryfikacji takiej hipotezy służą narzędzia graficzne:&lt;br /&gt;
&lt;br /&gt;
=== Histfit: histogram z naniesionym fitem rozkładu normalnego ===&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
def histfit(x,N_bins):  &lt;br /&gt;
''' &lt;br /&gt;
x - dane&lt;br /&gt;
N_bins -ilość binów w histogramie&lt;br /&gt;
&lt;br /&gt;
Funkcja rysuje histogram i na jego tle dorysowuje wykres &lt;br /&gt;
funkcji gęstości prawdopodobieństwa rozkładu normalnego &lt;br /&gt;
o średniej i wariancji estymowanych z x.&lt;br /&gt;
&lt;br /&gt;
Funkcja wymaga zaimportowania modułów pylab as py i scipy.stats as st''' &lt;br /&gt;
 &lt;br /&gt;
	n, bins, patches = py.hist(x, N_bins, density=True, facecolor='green', alpha=0.75)&lt;br /&gt;
	# Rysujemy histogram i w jawny sposób odbieramy zwracane przez p.hist obiekty&lt;br /&gt;
	#   - normujemy histogram do jedności&lt;br /&gt;
	#   - ustalamy kolor prostokątów na zielony&lt;br /&gt;
	#   - ustawiamy przezroczystość prostokątów na 0.75&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	bincenters = 0.5*(bins[1:]+bins[:-1])&lt;br /&gt;
	# wytwarzamy tablicę z centrami binów korzystając z granic binów&lt;br /&gt;
	# zwróconych przez py.hist w macierzy bins&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	y = st.norm.pdf( bincenters, loc = np.mean(x), scale = np.std(x))&lt;br /&gt;
	# obliczamy momenty rozkładu x: średnią i wariancję (tak naprawdę to jej pierwiastek czyli standardowe odchylenie)&lt;br /&gt;
	# obliczamy wartości w normalnym rozkładzie gęstości prawdopodobieństwa&lt;br /&gt;
	# o średniej np.mean(x) i standardowym odchyleniu np.std(x) dla wartości bincenters&lt;br /&gt;
 &lt;br /&gt;
	l = py.plot(bincenters, y, 'r--', linewidth=1)&lt;br /&gt;
	# do histogramu dorysowujemy linię &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Normplot ===&lt;br /&gt;
Jest to wykres wartości w próbie, wzg. prawdopodobieństwa uzyskania takiej wartości w rozkładzie normalnym. Wykres ten jest szczególnym przypadkiem kwantylowego wykresu prawdopodobieństwa [http://en.wikipedia.org/wiki/Q-Q_plot]. Konstruuje się go następująco: &lt;br /&gt;
*Na osi pionowej odkładamy uporządkowane zaobserwowane wartości &amp;lt;math&amp;gt;x_1 \le x_2 \le \dots \le x_n &amp;lt;/math&amp;gt;. Estymują one położenie kwantyli w populacji.&lt;br /&gt;
*Na osi poziomej odkładamy położenia kwantyli w rozkładzie normalnym. Obliczamy je: &amp;lt;math&amp;gt;F^{-1}\left(\frac{i-r_{pop}}{n+n_{pop}} \right)&amp;lt;/math&amp;gt; gdzie &amp;lt;math&amp;gt;F^{-1}&amp;lt;/math&amp;gt; jest funkcją odwrotną do dystrybuanty rozkładu teoretycznego (w tym szczególnym przypadku normalnego) &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; jest numerem obserwacji a &amp;lt;math&amp;gt;r_{pop}, n_{pop}&amp;lt;/math&amp;gt; są czynnikami (&amp;lt;math&amp;gt;\le 0.5 &amp;lt;/math&amp;gt;) zapewniającymi, że argument funkcji odwrotnej do dystrybuanty nie przyjmuje wartości 0 ani 1. &lt;br /&gt;
Jeśli dane ''x'' podlegają rozkładowi normalnemu to ich położenia kwantyli powinny być zgodne z położeniami kwantyli w rozkładzie normalnym, zatem wykres powinien przedstawiać linię prostą. Odstępstwa od prostej świadczą o odstępstwie od rozkładu normalnego.&lt;br /&gt;
W pythonie możemy ten typ wykresu zaimplementować np. tak (współczynniki zaczerpnięte z [http://www.itl.nist.gov/div898/handbook/eda/section3/normprpl.htm]):&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
def normplot(x):&lt;br /&gt;
	'''normplot: x dane do testowania'''&lt;br /&gt;
	x_ord = sorted(x)&lt;br /&gt;
	N = len(x)&lt;br /&gt;
	y = np.zeros(N)&lt;br /&gt;
	y[0]=st.norm.ppf(1- 0.5**(1.0/N) )&lt;br /&gt;
	y[N-1] = st.norm.ppf(0.5**(1.0/N) )&lt;br /&gt;
	for i in range(1,N-1):&lt;br /&gt;
		arg = float(i-0.3175)/(N+0.365)&lt;br /&gt;
		y[i] = st.norm.ppf(arg)&lt;br /&gt;
	py.plot(y,x_ord,'.')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Test Shapiro-Wilka ===&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;W,p = st.shapiro(x)&amp;lt;/source&amp;gt;&lt;br /&gt;
Funkcja ta zwraca wartość statystyki ''W'' i prawdopodobieństwo ''p''  zaobserwowania takiej lub bardziej ekstremalnej wartości statystyki ''W'' dla danych podlegających rozkładowi normalnemu. Jeśli ''p'' ma wysoką wartość (większą niż przyjęta &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;) to nie możemy odrzucić hipotezy, że dane podlegają  rozkładowi normalnemu. Test Shapiro-Wilka nie jest wrażliwy na parametry rozkładu, z którego pochodzą dane (dane mogą pochodzić z rozkładu o dowolnej średniej i dowolnym odchyleniu standardowym).&lt;br /&gt;
&lt;br /&gt;
=== Test Kołmogorowa-Smirnowa ===&lt;br /&gt;
Jest on oparty  na badaniu maksymalnej różnicy pomiędzy dystrybuantą empiryczną (z próby) a teoretyczną dystrybuantą rozkładu. Dla testowania normalności próby powinniśmy wywołać &lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
D , p = st.kstest(x, 'norm', args=(np.mean(x),np.std(x,ddof=1)) #sposób zalecany&lt;br /&gt;
#lub &lt;br /&gt;
D , p = st.kstest((x-np.mean(x))/np.std(x,ddof=1), 'norm') #sposób niezalecany, ale również prawidłowy&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Funkcja zwraca wartość statystyki ''D'' i prawdopodobieństwo zaobserwowania takiej bądź bardziej ekstremalnej wartości statystyki jeśli testowane dane pochodzą z tego samego rozkładu. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;'''UWAGA!''' Test Kołmogorowa-Smirnowa '''jest wrażliwy na parametry rozkładu''', z którego pochodzą dane. Wywołanie poniższego kodu jest błędem:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
D , p = st.kstest(x, 'norm') #BŁĘDNE użycie testu Kołmogorowa-Smirnowa&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Test dla innych postaci rozkładu====&lt;br /&gt;
Za pomocą testu Kołmogorowa-Smirnowa możemy zbadać również założenie o pochodzeniu danych z populacji podlegającej dowolnemu innemu rozkładowi ciągłemu. W tym celu należy podać zamiast 'norm' odpowiednią nazwę rozkładu z modułu scipy.stats oraz parametry tegoż rozkładu w odpowiedniej kolejności (należy w tym celu zajrzeć do dokumentacji). Przykład jak to należy zrobić dla rozkładu wykładniczego:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
D , p = st.kstest(x, 'expon', args=(0, 1/np.mean(x)) #test, czy dane podlegają rozkładowi wykładniczemu&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Przykład===&lt;br /&gt;
Proszę wygenerować 1000 liczb z rozkładu normalnego. Liczby te obejrzyjmy na wykresach &amp;lt;tt&amp;gt;histfit&amp;lt;/tt&amp;gt; oraz &amp;lt;tt&amp;gt;normplot&amp;lt;/tt&amp;gt; i zbadamy ich normalność testem  Shapiro-Wilka i Kołmogorova-Smirnova. &lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
 &lt;br /&gt;
def normplot(x):&lt;br /&gt;
	'''normplot: x dane do testowania'''&lt;br /&gt;
	x_ord = sorted(x)&lt;br /&gt;
	N = len(x)&lt;br /&gt;
	y = np.zeros(N)&lt;br /&gt;
	y[0]=st.norm.ppf(1- 0.5**(1.0/N) )&lt;br /&gt;
	y[N-1] = st.norm.ppf(0.5**(1.0/N) )&lt;br /&gt;
	for i in range(1,N-1):&lt;br /&gt;
		arg = float(i-0.3175)/(N+0.365)&lt;br /&gt;
		y[i] = st.norm.ppf(arg)&lt;br /&gt;
	py.plot(y,x_ord,'.')&lt;br /&gt;
 &lt;br /&gt;
def histfit(x,N_bins):  &lt;br /&gt;
	''' funkcja rysuje histogram i na jego tle dorysowuje wykres &lt;br /&gt;
	funkcji gęstości prawdopodobieństwa rozkładu normalnego &lt;br /&gt;
	o średniej i wariancji estymowanych z x &lt;br /&gt;
	Funkcja wymaga zaimportowania modułów pylab as py i scipy.stats as st'''  &lt;br /&gt;
	n, bins, patches = py.hist(x, N_bins, normed=True, facecolor='green', alpha=0.75)&lt;br /&gt;
	bincenters = 0.5*(bins[1:]+bins[:-1]) &lt;br /&gt;
	y = st.norm.pdf( bincenters, loc = np.mean(x), scale = np.std(x,ddof=1)) &lt;br /&gt;
	l = py.plot(bincenters, y, 'r--', linewidth=1)&lt;br /&gt;
def porownania(x):&lt;br /&gt;
	py.subplot(2,2,1)&lt;br /&gt;
	normplot(x)&lt;br /&gt;
	py.subplot(2,2,2)&lt;br /&gt;
	histfit(x,15)&lt;br /&gt;
	W,p_sw = st.shapiro(x)&lt;br /&gt;
	D,p_ks = st.kstest(x, 'norm', args=(np.mean(x),np.std(x,ddof=1)))&lt;br /&gt;
	title = 'SW: %(sw).2f KS: %(ks).2f'%{'sw':p_sw, 'ks':p_ks}&lt;br /&gt;
	&lt;br /&gt;
	py.title(title)&lt;br /&gt;
	# wybieramy pierwsze dziesięć punktów  &lt;br /&gt;
	y=x[0:10]&lt;br /&gt;
	py.subplot(2,2,3)&lt;br /&gt;
	normplot(y)&lt;br /&gt;
	py.subplot(2,2,4)&lt;br /&gt;
	histfit(y,15)&lt;br /&gt;
	W,p_sw = st.shapiro(y)&lt;br /&gt;
	D,p_ks = st.kstest(y, 'norm', args=(np.mean(x),np.std(x,ddof=1)))&lt;br /&gt;
	title = 'SW: %(sw).2f KS: %(ks).2f'%{'sw':p_sw, 'ks':p_ks}&lt;br /&gt;
	py.title(title)&lt;br /&gt;
 &lt;br /&gt;
x = st.norm.rvs(size=1000, loc=0, scale=10)&lt;br /&gt;
py.figure(1)&lt;br /&gt;
porownania(x)&lt;br /&gt;
# A teraz zbadajmy dane z rozkładów innych niż normalny:&lt;br /&gt;
 &lt;br /&gt;
x = st.t.rvs(df = 2, size=1000, loc=0, scale=1)&lt;br /&gt;
py.figure(2)&lt;br /&gt;
porownania(x)&lt;br /&gt;
 &lt;br /&gt;
x = st.expon.rvs(size=1000,loc=0,scale=1)&lt;br /&gt;
py.figure(3)&lt;br /&gt;
porownania(x)&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Proszę zapuścić skrypt kilka razy i zwrócić uwagę na to, jak trudno jest ocenić normalność danych przy małych próbach.&lt;br /&gt;
&lt;br /&gt;
===Przykład: transformacja Boxa-Coxa===&lt;br /&gt;
Często normalność danych można poprawić przez zastosowanie odpowiedniej transformacji. Ogólną rodzinę transformacji, które często prowadzą do normalizacji danych można zapisać tak (trasformacja Box-Cox'a [http://www.jstor.org/stable/2984418]):&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y^{(\lambda)}=\left\{\begin{matrix} \frac{y^\lambda-1} {\lambda} &amp;amp; \mbox{dla }\lambda \ne 0 \\ \ln(y) &amp;amp; \mbox{dla }\lambda = 0\end{matrix}\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W module scipy.stats mamy tę transformację zaimplementowaną jako &amp;lt;tt&amp;gt;boxcox()&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Zobaczmy jej działanie na następującym przykładzie:&lt;br /&gt;
&lt;br /&gt;
Proszę pobrać i zapisać w pliku tekstowym następujące &lt;br /&gt;
[[Media:Samochody.txt| dane]]. Zawierają one 8 kolumn charakterystyk samochodów:&lt;br /&gt;
*zużycie paliwa&lt;br /&gt;
*cylindry&lt;br /&gt;
*pojemność skokowa&lt;br /&gt;
*moc w koniach mechanicznych&lt;br /&gt;
*masa&lt;br /&gt;
*przyspieszenie&lt;br /&gt;
*rocznik&lt;br /&gt;
*pochodzenie&lt;br /&gt;
&lt;br /&gt;
Proszę narysować histfit i normplot  oraz policzyć testy Shapiro-Wilka i Kolmogorowa-Smirnowa dla masy pojazdów, a następnie zastosować do niej transformację Boxa-Coxa i zbadać normalność przetransformowanych danych.&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
def normplot(x):&lt;br /&gt;
	'''normplot: x dane do testowania'''&lt;br /&gt;
	x_ord = sorted(list(x))&lt;br /&gt;
	N = len(x)&lt;br /&gt;
	y = np.zeros(N)&lt;br /&gt;
	y[0]=st.norm.ppf(1- 0.5**(1.0/N) )&lt;br /&gt;
	y[N-1] = st.norm.ppf(0.5**(1.0/N) )&lt;br /&gt;
	for i in range(1,N-1):&lt;br /&gt;
		arg = float(i-0.3175)/(N+0.365)&lt;br /&gt;
		y[i] = st.norm.ppf(arg)&lt;br /&gt;
	py.plot(y,x_ord,'.')&lt;br /&gt;
	&lt;br /&gt;
def histfit(x,N_bins):  &lt;br /&gt;
	''' funkcja rysuje histogram i na jego tle dorysowuje wykres &lt;br /&gt;
	funkcji gęstości prawdopodobieństwa rozkładu normalnego &lt;br /&gt;
	o średniej i wariancji estymowanych z x &lt;br /&gt;
	Funkcja wymaga zaimportowania modułów pylab as py i scipy.stats as st'''  &lt;br /&gt;
	n, bins, patches = py.hist(x, N_bins, normed=True, facecolor='green', alpha=0.75)&lt;br /&gt;
	bincenters = 0.5*(bins[1:]+bins[:-1]) &lt;br /&gt;
	y = st.norm.pdf( bincenters, loc = np.mean(x), scale = np.std(x)) &lt;br /&gt;
	l = py.plot(bincenters, y, 'r--', linewidth=1)&lt;br /&gt;
def porownania(x):&lt;br /&gt;
	py.subplot(2,1,1)&lt;br /&gt;
	normplot(x);&lt;br /&gt;
	py.subplot(2,1,2)&lt;br /&gt;
	histfit(x,15)&lt;br /&gt;
	W,p_sw = st.shapiro(x);&lt;br /&gt;
	D,p_ks = st.kstest(x,'norm',args=(np.mean(x),np.std(x) ))&lt;br /&gt;
	title = 'SW: %(sw).2f KS: %(ks).2f'%{'sw':p_sw, 'ks':p_ks}&lt;br /&gt;
	py.title(title)&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
dane = np.loadtxt('Samochody.txt')&lt;br /&gt;
# Badamy przyspieszenia&lt;br /&gt;
w = dane[:,5]&lt;br /&gt;
py.figure(1)&lt;br /&gt;
porownania(w)&lt;br /&gt;
# A teraz stosujemy transformację Box-Coxa&lt;br /&gt;
wt,lam = st.boxcox(w)&lt;br /&gt;
py.figure(2)&lt;br /&gt;
porownania(wt)&lt;br /&gt;
&lt;br /&gt;
# badamy masy&lt;br /&gt;
w = dane[:,4]&lt;br /&gt;
py.figure(3)&lt;br /&gt;
porownania(w)&lt;br /&gt;
# A teraz stosujemy transformację Box-Coxa&lt;br /&gt;
wt,lam = st.boxcox(w)&lt;br /&gt;
py.figure(4)&lt;br /&gt;
porownania(wt)&lt;br /&gt;
&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W pierwszym przypadku - asymetrię rozkładu przyspieszeń udało się transformacją B-C poprawić, ale w drugim przypadku, masa, asymetrię dało się skorygować (widać to na histfit) ale nie da się poprawić ''ciężkich ogonów'' - widać to zarówno na normplocie jak i na wynikach testów.&lt;br /&gt;
Ogólnie: zanim zaczniemy analizować dane dobrze jest je pooglądać na różnych wykresach i chwilę ''pomyśleć''.&lt;br /&gt;
&lt;br /&gt;
==Przykład (zastosowanie różnych testów do tych samych danych): karma==&lt;br /&gt;
Badamy dwie nowe karmy A i B. Mamy dwie grupy po 12 zwierząt. Uzyskane przyrosty masy są następujące:&lt;br /&gt;
&lt;br /&gt;
A: 31 34 29 26 32 35 38 34 31 29 32 31&lt;br /&gt;
&lt;br /&gt;
B: 26 24 28 29 30 29 31 29 32 26 28 32&lt;br /&gt;
&lt;br /&gt;
Pytanie:&lt;br /&gt;
Czy któraś z karm daje istotnie większe przyrosty masy?&lt;br /&gt;
&lt;br /&gt;
Poniżej rozwiążemy to zadanie stopniowo różnymi metodami. Kolejne kawałki kodu można dopisywać do tego samego pliku.&lt;br /&gt;
&lt;br /&gt;
ROZWIĄZANIE:&lt;br /&gt;
Przyjmujemy poziom istotności, na którym przeprowadzamy testy &amp;lt;math&amp;gt;\alpha = 0.05&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Badamy rozkłady danych:===&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
A=[ 31, 34, 29, 26, 32, 35, 38, 34, 31, 29, 32, 31];&lt;br /&gt;
B=[ 26, 24, 28, 29, 30, 29, 31, 29, 32, 26, 28, 32];&lt;br /&gt;
W, p_A = st.shapiro(A)&lt;br /&gt;
print('Dla grupy A:', p_A)&lt;br /&gt;
W, p_B = st.shapiro(B)&lt;br /&gt;
print('Dla grupy B:', p_B)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dla obu grup test Shapiro-Wilka nie daje nam podstaw do odrzucenia założenia o normalności rozkładów.&lt;br /&gt;
&lt;br /&gt;
===Test parametryczny===&lt;br /&gt;
Nie odrzuciliśmy hipotezy o normalnym rozkładzie danych zatem możemy zastosować  [[WnioskowanieStatystyczne/Test_t | test ''t'' ]] dla różnicy średnich.&lt;br /&gt;
&lt;br /&gt;
Formułujemy hipotezy:&lt;br /&gt;
* &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt;: średni przyrost masy w grupie A &amp;lt;math&amp;gt;=&amp;lt;/math&amp;gt; średni przyrost masy w grupie B&lt;br /&gt;
* &amp;lt;math&amp;gt;H_1&amp;lt;/math&amp;gt;: średni przyrost masy w grupie A &amp;lt;math&amp;gt;\ne&amp;lt;/math&amp;gt; średni przyrost masy w grupie B&lt;br /&gt;
Przeprowadzamy test:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
t, p = st.ttest_ind(A,B)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Otrzymujemy ''p'' = 0.01.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;p &amp;lt; \alpha &amp;lt;/math&amp;gt;,  zatem na przyjętym poziomie istotności odrzucamy hipotezę zerową i stwierdzamy, że grupa A ma inną średnią niż grupa B.&lt;br /&gt;
&lt;br /&gt;
===Test nieparametryczny ===&lt;br /&gt;
Nie zakładajac postaci  rozkładu danych mozemy zastosować test [[WnioskowanieStatystyczne/Test_Wilcoxona| ze statystykami opartymi na rangach]]. &lt;br /&gt;
Formułujemy hipotezy:&lt;br /&gt;
* &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt;: mediana przyrostu masy w grupie A &amp;lt;math&amp;gt;=&amp;lt;/math&amp;gt; mediana przyrostu masy w grupie B&lt;br /&gt;
* &amp;lt;math&amp;gt;H_1&amp;lt;/math&amp;gt;: mediana przyrostu masy w grupie A&amp;lt;math&amp;gt;\ne&amp;lt;/math&amp;gt; mediana przyrostu masy w grupie B&lt;br /&gt;
Przeprowadzamy test:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
U, p = st.mannwhitneyu(A, B)&lt;br /&gt;
p_dwustronne = 2*p&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
W pythonie zaimplementowana jest wersja jednostronna tego testu. Aby otrzymać prawdopodobieństwo ''p'' dla testu dwustronnego musimy pomnożyć je przez 2.&lt;br /&gt;
&lt;br /&gt;
===Testy bootstrapowe===&lt;br /&gt;
Teraz to samo sprawdzimy za pomocą testu repróbkowanego.&lt;br /&gt;
Przyda nam się tu funkcja do pobierania losowej próbki z powtórzeniami z danych:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
def randsample(x, N):&lt;br /&gt;
	'''zwraca wektor o dłougości N z losowo wybranymi elementami wektora x. Losowanie odbywa się z powtórzeniami''' &lt;br /&gt;
	n=len(x)&lt;br /&gt;
	ind = np.random.randint(n, size = N)&lt;br /&gt;
	y = x[ind]&lt;br /&gt;
	return y&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W testech repróbkowanych statystykę możemy wybrać dość dowolnie, ale jak pokażemy poniżej nie każda jest równie dobra.&lt;br /&gt;
Zgodnie z hipotezą zerową próbka A i  B pochodza z tej samej populacji.&lt;br /&gt;
Nasza najlepsza wiedza o owej populacji to połączone próbki A i B:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
POP=np.concatenate((A, B))&lt;br /&gt;
&lt;br /&gt;
N=len(POP)&lt;br /&gt;
NA=len(A)&lt;br /&gt;
NB=len(B)&lt;br /&gt;
# Zasymulujemy N_rep razy wyciagniecie z POP prob o rozmiarach NA i NB i&lt;br /&gt;
# zobaczymy jak czesto zdarzają się wartości statystyki  sie roznica srednich taka jak w oryginalnym&lt;br /&gt;
# pomiarze lub jeszcze wieksza. &lt;br /&gt;
N_rep=10000&lt;br /&gt;
# oryginalna roznica srednich i median:&lt;br /&gt;
mi_0 = np.abs(np.mean(A) - np.mean(B))&lt;br /&gt;
T_0  = np.abs(np.mean(A) - np.mean(B))/np.std(POP)&lt;br /&gt;
me_0 = np.abs(np.median(A) - np.median(B))&lt;br /&gt;
&lt;br /&gt;
mi = np.zeros(N_rep)&lt;br /&gt;
T  = np.zeros(N_rep)&lt;br /&gt;
me = np.zeros(N_rep)&lt;br /&gt;
&lt;br /&gt;
for i in range(N_rep):&lt;br /&gt;
	AA = randsample(POP,NA)&lt;br /&gt;
	BB = randsample(POP,NB)&lt;br /&gt;
	R_POP = np.concatenate((AA,BB))&lt;br /&gt;
	mi[i] = np.abs(np.mean(AA)-np.mean(BB)) # abs bo test dwustronny&lt;br /&gt;
	T[i]  = np.abs(np.mean(AA)-np.mean(BB))/np.std(R_POP)&lt;br /&gt;
	me[i] = np.abs(np.median(AA)-np.median(BB))&lt;br /&gt;
&lt;br /&gt;
p_mi = np.sum(mi&amp;gt;=mi_0)/N_rep&lt;br /&gt;
p_T  = np.sum( T&amp;gt;=T_0 )/N_rep&lt;br /&gt;
p_me = np.sum(me&amp;gt;=me_0)/N_rep&lt;br /&gt;
&lt;br /&gt;
print('testy repróbkowane: ')&lt;br /&gt;
print('rożnica średnich: ', p_mi)&lt;br /&gt;
print('pseudo T: ', p_T)&lt;br /&gt;
print('różnica median: ', p_me)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Widzimy, że dla testu ze statystyką różnicy średnich i  pseudo T dostajemy podobne wyniki, z tym, że pseudo T jest nieco silniejszy. Test ze statystyką różnicy średnich jest na tyle słaby, że nie pozwala na odrzucenie hipotezy zerowej.&lt;br /&gt;
&lt;br /&gt;
===Wnioskowanie w oparciu o przedziały ufności ===&lt;br /&gt;
Wnioskowanie o równości średnich dwóch grup można też przerowadzić w oparciu o przedziały ufności. W naszym przykładzie przedziały można skonstruować zarówno parametrycznie jak i nieparametrycznie.&lt;br /&gt;
==== Wersja parametryczna ====&lt;br /&gt;
Konstruujemy 95% przedział ufności wokół oryginalnej różnicy średnich.&lt;br /&gt;
Dla dwóch grup wariancję różnicy średnich znajdujemy sumując wariancje śrenich estymowane dla każdej z grup:&lt;br /&gt;
:&amp;lt;math&amp;gt; &lt;br /&gt;
\mathrm{var}_{\Delta} = \frac{1}{N_1}\mathrm{var}(x_1) + \frac{1}{N_2} \mathrm{var}(x_2)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
ilość stopni swobody:&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
 df = N_1+N_2-2&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
co prowadzi do estymatora&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
s^2_\Delta = \frac{N_1s_1^2 + N_2s_2^2}{N_1+N_2-2} \cdot \frac{N_1+N_2}{N_1N_2}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
roznica_oryginalna = np.mean(A) - np.mean(B)&lt;br /&gt;
f = NA+NB-2;&lt;br /&gt;
v_A = np.var(A)&lt;br /&gt;
v_B = np.var(B)&lt;br /&gt;
sig = np.sqrt( ((NA*v_A +NB*v_B))/f * (NA + NB)/(NA*NB) )&lt;br /&gt;
t_2_5 = st.t.ppf(0.025,f);&lt;br /&gt;
t_97_5 = st.t.ppf(0.975,f);&lt;br /&gt;
print('przedział ufności dla różnicy średnich przy założeniu normalności %(d).2f %(g).2f'%{'d':sig*t_2_5+ roznica_oryginalna,'g':sig*t_97_5+roznica_oryginalna})&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Otrzymujemy w wyniku &amp;lt;tt&amp;gt;przedział ufności dla różnicy średnich przy założeniu normalności 0.77 5.56&amp;lt;/tt&amp;gt;. Oznacza to, że w 95% analogicznych badań powinniśmy otrzymać różnicę średnich zawartą w tym przedziale. Przedził ten nie zawiera wartości 0, zatem na przyjętym poziomie istotności średnie grupy A i B są różne.&lt;br /&gt;
&lt;br /&gt;
====Wersja nieparametryczna ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# POP zawiera świat zgodny z H0&lt;br /&gt;
roznica_oryginalna = np.mean(A) - np.mean(B)&lt;br /&gt;
alfa = 0.05&lt;br /&gt;
N_rep = 10000&lt;br /&gt;
r = np.zeros(N_rep)&lt;br /&gt;
for i in range(N_rep):&lt;br /&gt;
	gA = randsample(POP, NA)&lt;br /&gt;
	gB = randsample(POP, NB)&lt;br /&gt;
	r[i] = np.mean(gA) - np.mean(gB)&lt;br /&gt;
ci_d = st.scoreatpercentile(r, per = alfa/2*100)&lt;br /&gt;
ci_g = st.scoreatpercentile(r, per = (1-alfa/2)*100)&lt;br /&gt;
# print('przedział ufności: %(d).2f %(g).2f'%{'m':np.mean(r),'d':ci_d+roznica_oryginalna, 'g':ci_g+roznica_oryginalna})&lt;br /&gt;
print('przedział ufności: %(d).2f %(g).2f'%{'m':np.mean(r),'d':ci_d, 'g':ci_g})&lt;br /&gt;
print('oryginalna różnica średnich: %(ro).2f'%{'ro':roznica_oryginalna})&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Wynik:&lt;br /&gt;
&amp;lt;tt&amp;gt;przedział ufności: -2.50 2.50&lt;br /&gt;
oryginalna różnica średnich: 3.17&amp;lt;/tt&amp;gt;.&lt;br /&gt;
Przedział ufności 95% na różnicę skonstruowany zgodnie z &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; nie zawiera oryginalnej różnicy średnich, &lt;br /&gt;
zatem różnica 3.17 w świecie zgodnym z &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; zdarza się nie częściej niż w 5% przypadków. Wniosek: średnie grup A i B są różne  na przyjętym poziomie ufności.&lt;br /&gt;
&lt;br /&gt;
== Zadanie: Przeżywalność myszy ==&lt;br /&gt;
Mamy 7 myszy, którym podano środek, który miał poprawić ich przeżywalność po operacji oraz 9 myszy kontrolnych, którym owego środka nie podano. Myszy traktowane specjalnie przeżyły &amp;lt;br&amp;gt;&lt;br /&gt;
94, 38, 23, 197, 99, 16, 141 dni&amp;lt;br&amp;gt;&lt;br /&gt;
a myszy traktowane standardowo:&amp;lt;br&amp;gt;&lt;br /&gt;
52, 10, 40, 104, 51, 27, 146, 30, 46 dni&amp;lt;br&amp;gt;&lt;br /&gt;
Średnia różnica wynosi 30,63 dni dłużej dla myszy traktowanych po nowemu.&lt;br /&gt;
Pytanie, na które chcielibyśmy znać odpowiedź to: Czy nowy środek faktycznie poprawia przeżywalność.&lt;br /&gt;
Zadanie proszę rozwiązać wszystkimi możliwymi sposobami, analogicznie do powyższego przykładu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Odp'': &lt;br /&gt;
:przedział ufności: [&amp;amp;minus;51,64 52,89]&lt;br /&gt;
:oryginalna różnica średnich: 30,63&lt;br /&gt;
:przedział ufności dla różnicy średnich przy założeniu normalności [&amp;amp;minus;27,99  89,26]&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
'''Przedział ufności dla różnicy dwóch średnich&lt;br /&gt;
&lt;br /&gt;
Mamy 7 myszy, którym podano środek, który miał poprawić ich przeżywalność &lt;br /&gt;
po operacji oraz 9 myszy kontrolnych, którym owego środka nie podano. &lt;br /&gt;
Myszy traktowane specjalnie przeżyły&lt;br /&gt;
94 38 23 197 99 16 141 dni&lt;br /&gt;
a myszy traktowane standardowo:&lt;br /&gt;
52 10 40 104 51 27 146 30 46 dni&lt;br /&gt;
Średnia różnica wynosi 30.63 dni dłużej dla myszy traktowanych po nowemu. &lt;br /&gt;
Pytanie, na które chcielibyśmy znać odpowiedź to: Czy nowy środek faktycznie &lt;br /&gt;
poprawia przeżywalność.&lt;br /&gt;
&lt;br /&gt;
Skonstruujmy przedział ufności 95% dla średniej różnicy w przeżywalności.&lt;br /&gt;
&lt;br /&gt;
Uwaga: przy tym problemie każdą z grup traktujemy jako reprezentantów bardzo &lt;br /&gt;
dużych populacji. '''&lt;br /&gt;
def randsample(x,ile):&lt;br /&gt;
	ind = st.randint.rvs(0,len(x),size = ile)&lt;br /&gt;
	y = x[ind]&lt;br /&gt;
	return y&lt;br /&gt;
&lt;br /&gt;
m_sp = np.array([94, 38, 23, 197, 99, 16, 141])&lt;br /&gt;
N_sp = len(m_sp)&lt;br /&gt;
m_st = np.array([52, 10, 40, 104, 51, 27, 146, 30, 46])&lt;br /&gt;
N_st = len(m_st)&lt;br /&gt;
alfa = 0.05&lt;br /&gt;
# zgodnie z hipotezą zerową (H0) nie ma różnicy między grupami&lt;br /&gt;
&lt;br /&gt;
# symulacja&lt;br /&gt;
# tworzymy świat zgodny z H0&lt;br /&gt;
m = np.concatenate((m_sp,m_st))&lt;br /&gt;
&lt;br /&gt;
roznica_oryginalna = np.mean(m_sp) - np.mean(m_st)&lt;br /&gt;
&lt;br /&gt;
N_rep = 10000&lt;br /&gt;
r = np.zeros(N_rep)&lt;br /&gt;
for i in range(N_rep):&lt;br /&gt;
	g1 = randsample(m, N_sp)&lt;br /&gt;
	g2 = randsample(m, N_st)&lt;br /&gt;
	r[i] = np.mean(g1) - np.mean(g2)&lt;br /&gt;
ci_d = st.scoreatpercentile(r, per = alfa/2*100)&lt;br /&gt;
ci_g = st.scoreatpercentile(r, per = (1-alfa/2)*100)&lt;br /&gt;
print('przedział ufności: %(d).2f %(g).2f'%{'m':np.mean(r),'d':ci_d, 'g':ci_g})&lt;br /&gt;
print('oryginalna różnica średnich: %(ro).2f'%{'ro':roznica_oryginalna})&lt;br /&gt;
# przedział ufności na różnicę skonstruowany zgodnie z H0 zawiera oryginalną różnicę średnich, &lt;br /&gt;
# zatem różnica taka jest na przyjętym poziomie ufności możliwa &lt;br /&gt;
# do zaobserwowania w przypadku braku różnicy między grupami&lt;br /&gt;
&lt;br /&gt;
# zakładając normalność&lt;br /&gt;
f = N_sp+N_st-2;&lt;br /&gt;
v_1 = np.var(m_sp)&lt;br /&gt;
v_2 = np.var(m_st)&lt;br /&gt;
sig = np.sqrt( ((N_sp*v_1 +N_st*v_2))/f * (N_sp + N_st)/float(N_sp*N_st) )&lt;br /&gt;
t_2_5 = st.t.ppf(0.025,f);&lt;br /&gt;
t_97_5 = st.t.ppf(0.975,f);&lt;br /&gt;
print('przedział ufności dla różnicy średnich przy założeniu normalności %(d).2f %(g).2f'%{'d':sig*t_2_5+ roznica_oryginalna,'g':sig*t_97_5+roznica_oryginalna})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
print('przedział ufności dla różnicy średnich przy założeniu normalności %(d).2f %(g).2f'%{'d':s_delta*t_2_5+ roznica_oryginalna,'g':s_delta*t_97_5+roznica_oryginalna})&lt;br /&gt;
# skonstruowany wokoł oryginalnej różnicy średnich przedział ufności zawiera 0, zatem nie możemy odrzucić możliwości,&lt;br /&gt;
# że nie ma różnicy między grupami&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zadanie: Linie lotnicze==&lt;br /&gt;
Linie lotnicze, projektując nowy samolot chcą sprawdzić czy średnia waga bagażu ręcznego zabieranego przez pasażerów nie zmieniła się od czasu poprzednich badań i wynosi wciąż 12 kg. Analiza ma być przeprowadzona na poziomie istotności &amp;lt;math&amp;gt;\alpha = 0,05&amp;lt;/math&amp;gt;. Analityk pobrał próbę bagażu ręcznego 144 pasażerów i obliczył wartość średnią z próby &amp;lt;math&amp;gt;\bar x = 14,6&amp;lt;/math&amp;gt; kg i odchylenie standardowe z próby &amp;lt;math&amp;gt;s = 7,8&amp;lt;/math&amp;gt;. Przeprowadź test hipotezy, że &amp;lt;math&amp;gt;\mu = 12&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
Standardowe importy modułów&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zmienne występujące w treści przykładu&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
mu_0=12&lt;br /&gt;
a=0.05&lt;br /&gt;
N=144&lt;br /&gt;
x=14.6&lt;br /&gt;
s=7.8&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Test dotyczy średniej wiec obliczamy odchylenie standardowe średniej:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
std_mu=s/np.sqrt(N)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wyjaśnienie |title= Obliczamy wartość statystyki:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt; &lt;br /&gt;
t=(mu_0-x)/std_mu&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Odchylenie standardowe estymowaliśmy z próby. Wartości powyższej statystyki podlegają zatem rozkładowi  t. Obliczamy wartości krytyczne odpowiadające poziomowi istotności a. Test jest dwustronny mamy wiec dwie wartości krytyczne: jedna odcina obszar pod funkcja gęstości prawdopodobieństwa na lewo,  a druga na prawo od siebie. Pole każdego z tych obszarów wynosi a/2:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt; &lt;br /&gt;
  &lt;br /&gt;
t_kryt_lewy = st.t.ppf(a/2,N-1)&lt;br /&gt;
t_kryt_prawy = st.t.ppf( 1-a/2, N-1)&lt;br /&gt;
&lt;br /&gt;
print('obliczona wartość statystyki t: ', t)&lt;br /&gt;
print('wartości krytyczne t: %(tl).2f %(tp).2f '%{'tl':t_kryt_lewy, 'tp':t_kryt_prawy})&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Możemy też obliczyć prawdopodobieństwo zaobserwowania wartości ''t'' takiej jak w naszym zadaniu lub bardziej ekstremalnej:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt; &lt;br /&gt;
p =  (st.t.cdf(-np.abs(t),N-1)) + (1-st.t.cdf(np.abs(t), N-1))  # sumujemy po obu ogonach  bo test jest dwustronny&lt;br /&gt;
print('Prawdopodobieństwo zaobserwowania bardziej ekstremalnych wartości t: %(p).4f'%{'p':p})&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wyniki te możemy zilustrować:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt; &lt;br /&gt;
os_t = np.arange(-5, 5, 0.1)&lt;br /&gt;
py.plot(os_t, st.t.pdf(os_t,N-1)) #rysujemy funkcję gęstości prawdopodobieństwa t o N-1 st. swobody&lt;br /&gt;
&lt;br /&gt;
#cieniujemy lewy obszary pod funkcją gęstości prawdopodobieństwa odpowiadający obliczonemu p&lt;br /&gt;
os_t2 = np.arange(-5, t_kryt_lewy, 0.1)&lt;br /&gt;
py.fill_between(os_t2,st.t.pdf(os_t2,N-1)) &lt;br /&gt;
#cieniujemy prawy obszary pod funkcją gęstości prawdopodobieństwa odpowiadający obliczonemu p&lt;br /&gt;
os_t2 = np.arange(t_kryt_prawy, 5,  0.1)&lt;br /&gt;
py.fill_between(os_t2,st.t.pdf(os_t2,N-1)) &lt;br /&gt;
&lt;br /&gt;
# zaznaczamy obliczoną wartość statystyki:&lt;br /&gt;
py.plot((t,), (0,), 'ro')&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Odpowiedź: Wyliczone ''t'' leży poza obszarem akceptacji hipotezy zerowej, zatem odrzucamy hipotezę zerową i akceptujemy alternatywną.&lt;br /&gt;
&lt;br /&gt;
==Zadanie: Agencja nieruchomości==&lt;br /&gt;
Agencja nieruchomości w Japonii podała, że ceny gruntu w centrum Tokio wzrosły o 49% w ciągu ostatniego roku. Inwestor chcąc przetestować te dane, znajduje próbę 18 nieruchomości w centrum Tokio, dla których zna cenę obecna i sprzed roku. Zakłada, że ceny podlegają rozkładowi normalnemu. Dla każdej nieruchomości oblicza procentowy wzrost wartości a następnie znajduje średnią i odchylenie standardowe z próby. Estymatory dla próby wynoszą &amp;lt;math&amp;gt;\bar x = 38&amp;lt;/math&amp;gt;% i &amp;lt;math&amp;gt;s = 14&amp;lt;/math&amp;gt;%. Przeprowadź test na poziomie istotności &amp;lt;math&amp;gt;\alpha = 0,01&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
mu_0=49;&lt;br /&gt;
x=38;&lt;br /&gt;
s=14;&lt;br /&gt;
N=18;&lt;br /&gt;
a=0.01;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# test dotyczy sredniej wiec jej std:&lt;br /&gt;
std_mu=s/np.sqrt(N)&lt;br /&gt;
&lt;br /&gt;
# odchylenie std obliczylismy z proby =&amp;gt; stosujemy test t&lt;br /&gt;
# obliczamy wartość statystyki &lt;br /&gt;
t=(mu_0-x)/std_mu&lt;br /&gt;
# obliczamy wartości krytyczne odpowiadające poziomowi istotności a&lt;br /&gt;
# test jest dwustronny mamy wiec dwie wartosci krytyczne &lt;br /&gt;
# jedna odcina obszar pod funkcja gęstości prawdopodobieństwa na lewo, &lt;br /&gt;
# a druga na prawo od siebie. Pole każdego z tych obszarów wynosi a/2&lt;br /&gt;
  &lt;br /&gt;
t_kryt_lewy = st.t.ppf(a/2,N-1)&lt;br /&gt;
t_kryt_prawy = st.t.ppf( 1-a/2, N-1)&lt;br /&gt;
&lt;br /&gt;
print('obliczona wartość statystyki t: ', t)&lt;br /&gt;
print('wartości krytyczne t: %(tl).2f %(tp).2f '%{'tl':t_kryt_lewy, 'tp':t_kryt_prawy})&lt;br /&gt;
&lt;br /&gt;
# Możemy też obliczyć prawdopodobieństwo zaobserwowania wrtości t takiej jak w naszym zadaniu &lt;br /&gt;
# lub bardziej ekstremalnej:&lt;br /&gt;
p = (1-st.t.cdf(t, N-1)) + (st.t.cdf(-t,N-1)) # sumujemy po obu ogonach  bo test jest dwustronny&lt;br /&gt;
		&lt;br /&gt;
print('Prawdopodobieństwo zaobserwowania bardziej ekstremalnych wrtości t: %(p).3f'%{'p':p})&lt;br /&gt;
# Wyniki te możemy zilustrować&lt;br /&gt;
os_t = np.arange(-5, 5, 0.1)&lt;br /&gt;
py.plot(os_t, st.t.pdf(os_t,N-1)) #rysujemy funkcję gęstości prawdopodobieństwa t o N-1 st. swobody&lt;br /&gt;
&lt;br /&gt;
#cieniujemy lewy obszary pod funkcją gęstości prawdopodobieństwa odpowiadający obliczonemu p&lt;br /&gt;
os_t2 = np.arange(-5, t_kryt_lewy, 0.1)&lt;br /&gt;
py.fill_between(os_t2,st.t.pdf(os_t2,N-1)) &lt;br /&gt;
#cieniujemy prawy obszary pod funkcją gęstości prawdopodobieństwa odpowiadający obliczonemu p&lt;br /&gt;
os_t2 = np.arange(t_kryt_prawy, 5,  0.1)&lt;br /&gt;
py.fill_between(os_t2,st.t.pdf(os_t2,N-1)) &lt;br /&gt;
&lt;br /&gt;
# zaznaczamy obliczoną wartość statystyki:&lt;br /&gt;
py.plot(t, 0, 'ro')&lt;br /&gt;
py.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# 'Odp: Wyliczone t lezy poza obszarem akceptacji hipotezy zerowej,&lt;br /&gt;
# zatej odrzucamy hipoteze zerowa i akceptujemy alternatywna.'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Odp. Odrzucamy &amp;lt;math&amp;gt;H_0:&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\mu_0 = 49&amp;lt;/math&amp;gt;, na poziomie istotności 0,01.&lt;br /&gt;
&lt;br /&gt;
==Zadanie: Zabiegi bio-inżynieryjne==&lt;br /&gt;
Załóżmy, że krowy są bardziej wartościowe od byków. Bio-inżynier twierdzi, że przy pomocy pewnych zabiegów jest w stanie spowodować zwiększenie szansy na urodzenie się krowy powyżej 50%. W jego eksperymencie na 10 urodzonych zwierząt 9 było krowami, a tylko 1 bykiem. Czy powinnniśmy wierzyć temu bio-inżynierowi? Jakia jest szansa na uzyskanie takiego, bądź bardziej ekstremalnego wyniku przy założeniu, że procedura stosowana przez naszego inżyniera nia ma żadnych efektów? W tym problemie dla odmiany założymy, że w normalnych warunkach 100 spośród 206 cieląt to krowy.&lt;br /&gt;
Zadanie rozwiązać metodą parametryczną i przez repróbkowanie. [[WnioskowanieStatystyczne/_Testowanie_hipotez#Przykład:_mutacje_muszek_owocowych|Wskazówka]]&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
def randsample(x, N):&lt;br /&gt;
	'''zwraca wektor z losowo wybranymi elementami wektora x. Losowanie odbywa się z powtórzeniami''' &lt;br /&gt;
	n=len(x)&lt;br /&gt;
	ind = np.random.randint(n, size = N)&lt;br /&gt;
	y = x[ind]&lt;br /&gt;
	return y&lt;br /&gt;
&lt;br /&gt;
# sposób pierwszy:&lt;br /&gt;
# zmienna urodzenie byka/krowy podlega rozkladowi dwumianowemu &lt;br /&gt;
p = 100.0/206&lt;br /&gt;
N = 10&lt;br /&gt;
k = 9&lt;br /&gt;
p_bino = 1-st.binom.cdf(k-1,N,p) #prawdopodobieństwo wylosowania 9 lub 10 krów w 10 probach &lt;br /&gt;
print('Prawdopodobieństwo wylosowania 9 lub 10 krów w 10 probach: %(p).4f'%{'p':p_bino})&lt;br /&gt;
# W jego mwetodzie chyba cos jest&lt;br /&gt;
&lt;br /&gt;
# sposob drugi: repróbkowanie&lt;br /&gt;
# model swiata z ktorego pochodza byki(0)/krowy(1):&lt;br /&gt;
w = np.concatenate((np.ones(100), np.zeros(106)))&lt;br /&gt;
&lt;br /&gt;
N_rep = 100000&lt;br /&gt;
wynik = np.zeros(N_rep)&lt;br /&gt;
for i in range(N_rep):&lt;br /&gt;
	wynik[i] = np.sum(randsample(w,10))&lt;br /&gt;
&lt;br /&gt;
p_rep = float(np.sum(wynik&amp;gt;=k))/N_rep&lt;br /&gt;
print('Prawdopodobieństwo wylosowania 9 lub 10 krów w 10 probach estymowane z symulacji: %(p).4f'%{'p':p_rep})&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''Odp'':  ''p'' = 0,008. Odrzucamy ''H''&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; o braku efektów.&lt;br /&gt;
&lt;br /&gt;
==Zadanie: Porównanie lekarstwa i placebo==&lt;br /&gt;
Badamy skuteczność leku na raka. Mamy grupę 12 chorych: 6 osobom podajemy lek &amp;amp;mdash; poprawa wystąpiła u 5 osób, pozostałym sześciu osobom podajemy placebo &amp;amp;mdash; poprawa wystąpiła u 2 osób. Czy te wyniki upoważniają do stwierdzenia, że lek istotnie zwiększa szansę poprawy? Test przeprowadzić na poziomie istotności 5%.&lt;br /&gt;
&lt;br /&gt;
Wskazówka: jako statystykę przyjąć różnicę w ilości popraw między grupą z lekiem a grupą z placebo. Interesuje nas prawdopodobieństwo zaobserwowania takiej (3) bądź większej różnicy. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
def randsample(x, N):&lt;br /&gt;
	'''zwraca wektor z losowo wybranymi elementami wektora x. Losowanie odbywa się z powtórzeniami''' &lt;br /&gt;
	n=len(x)&lt;br /&gt;
	ind = np.random.randint(n, size = N)&lt;br /&gt;
	y = x[ind]&lt;br /&gt;
	return y&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Formułujemy hipotezy &lt;br /&gt;
# H0: lek nie daje poprawy &lt;br /&gt;
# H1: lek daje poprawę&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# zgodnie z H0 obie próby pochodzą ze świata:&lt;br /&gt;
# pierwszy sposób: repróbkowanie&lt;br /&gt;
w = np.concatenate((np.ones(7), np.zeros(5))) # jedynki -&amp;gt; wystąpiła poprawa&lt;br /&gt;
&lt;br /&gt;
n_l = 5 # ilosc popraw w grupie leku&lt;br /&gt;
n_p = 2 #ilosc popraw w grupie placebo&lt;br /&gt;
# jako statystykę testową przyjmiemy różnicę w ilości popraw miedzy grupami&lt;br /&gt;
# w tym problemie istotne jest zwiększenie ilości popraw wiec stosujemy test&lt;br /&gt;
# jednostronny&lt;br /&gt;
N_rep = 100000&lt;br /&gt;
&lt;br /&gt;
st_0= n_l - n_p&lt;br /&gt;
st_rep=np.zeros(N_rep)&lt;br /&gt;
&lt;br /&gt;
for i in range(N_rep):&lt;br /&gt;
    n_l_rep   = np.sum(randsample(w,6))&lt;br /&gt;
    n_p_rep   = np.sum(randsample(w,6))&lt;br /&gt;
    st_rep[i] = n_l_rep - n_p_rep # wartość statystyki w i-tym repróbkowaniu&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
p_rep = float(np.sum(st_rep &amp;gt;= st_0))/N_rep&lt;br /&gt;
print('''Prawdopodobieństwo wylosowania takiej samej bądź większej różnicy w ilości popraw estymowane z symulacji: %(p).4f'''%{'p':p_rep})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# drugi sposób:&lt;br /&gt;
# zmienna uzyskanie poprawy podlega rozkładowi dwumianowemu &lt;br /&gt;
p = 7.0/12&lt;br /&gt;
N = 6&lt;br /&gt;
k1 = 5&lt;br /&gt;
k2 = 2&lt;br /&gt;
p_param = 0&lt;br /&gt;
for d in range(N-st_0+1):  # w tej pętli sumujemy prawdopodobieństwa zdarzeń  sprzyjających zaobserwowaniu różnicy co najmniej st_0 popraw &lt;br /&gt;
# Poprawy w jednej i drugiej grupie traktujemy jako zdarzenia niezależne&lt;br /&gt;
# Pętla &amp;quot;for d&amp;quot; przechodzi przez możliwe liczby popraw w pierwszej grupie&lt;br /&gt;
	p_bino1 = st.binom.pmf(d,N,p)   # prawdopodobieństwo uzyskania poprawy w d próbach&lt;br /&gt;
# Jeśli w pierwszej grupie było d popraw, to w drugiej może być od d+st_0 do N popraw&lt;br /&gt;
	p_bino2 = 1-st.binom.cdf( d+st_0 - 1, N, p)  # prawdopodobieństwo uzyskania poprawy w co najmniej d+st_0 próbach&lt;br /&gt;
	p_param += p_bino1 * p_bino2 # prawdopodobieństwo zaobserwowania jednocześnie obu powyższych sytuacji&lt;br /&gt;
&lt;br /&gt;
print('Prawdopodobieństwo estymowane parametrycznie: %(p).4f'%{'p':p_param})&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: Odp: Prawdopodobieństwo wylosowania takiej samej bądź większej różnicy w ilości popraw estymowane z symulacji: 0,0702&lt;br /&gt;
Prawdopodobieństwo estymowane parametrycznie: 0,0699. Wniosek: nie mamy podstaw do odrzucenia hipotezy zerowej.&lt;br /&gt;
&lt;br /&gt;
==Zadanie: Pomiar masy cząstki elementarnej==&lt;br /&gt;
W pomiarach wstępnych zbadano masę spoczynkową pewnej cząstki elementarnej. Otrzymano następujące wyniki [MeV/&amp;lt;i&amp;gt;c&amp;lt;/i&amp;gt;²]:&lt;br /&gt;
&lt;br /&gt;
139.20, 139.34, 140.22, 139.56, 139.42, 139.64, 139.22, 139.74, 139.38, 139.54,&lt;br /&gt;
139.38, 139.46, 140.09, 139.77, 139.52, 139.47, 139.89, 138.95, 139.99, 139.64,&lt;br /&gt;
139.37, 139.49, 139.15, 139.77, 140.10, 139.48, 139.84, 139.44, 140.13&lt;br /&gt;
&lt;br /&gt;
Zbadaj na poziomie istotności 1%, czy cząstką tą mógł być naładowany pion.&lt;br /&gt;
&lt;br /&gt;
Zbadaj na poziomie istotności 1%, czy cząstką tą mógł być neutralny pion.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
&lt;br /&gt;
alfa = 0.01 # poziom istotności&lt;br /&gt;
dane = np.array([139.20, 139.34, 140.22, 139.56, 139.42, 139.64, 139.22, 139.74,&lt;br /&gt;
                 139.38, 139.54, 139.38, 139.46, 140.09, 139.77, 139.52, 139.47,&lt;br /&gt;
                 139.89, 138.95, 139.99, 139.64, 139.37, 139.49, 139.15, 139.77,&lt;br /&gt;
                 140.10, 139.48, 139.84, 139.44, 140.13])&lt;br /&gt;
&lt;br /&gt;
Pi_plus_min = 139.57 # masa pionów naładowanych Pi+ i Pi-&lt;br /&gt;
Pi_neutral = 134.98  # masa pionu neutralnego Pi0&lt;br /&gt;
&lt;br /&gt;
# test t hipotezy H0, że dane pochodzą z rozkładu normalnego o wartości oczekiwanej Pi_plus_min&lt;br /&gt;
t1, p1 = st.ttest_1samp(dane,Pi_plus_min)&lt;br /&gt;
print(&amp;quot;Poziom p dla hipotezy, że był do pion naładowany&amp;quot;,p1)&lt;br /&gt;
if p1&amp;gt;=alfa: print(&amp;quot;Nie możemy odrzucić tej hipotezy na poziomie istotności {}%&amp;quot;.format(100*alfa))&lt;br /&gt;
else: print(&amp;quot;Możemy odrzucić tę hipotezę na poziomie istotności {}%&amp;quot;.format(100*alfa))&lt;br /&gt;
&lt;br /&gt;
# test t hipotezy H0, że dane pochodzą z rozkładu normalnego o średniej Pi_neutral&lt;br /&gt;
t2, p2 = st.ttest_1samp(dane,Pi_neutral)&lt;br /&gt;
print(&amp;quot;\nPoziom p dla hipotezy, że był do pion neutralny&amp;quot;,p2)&lt;br /&gt;
if p2&amp;gt;=alfa: print(&amp;quot;Nie możemy odrzucić tej hipotezy na poziomie istotności {}%&amp;quot;.format(100*alfa))&lt;br /&gt;
else: print(&amp;quot;Możemy odrzucić tę hipotezę na poziomie istotności {}%&amp;quot;.format(100*alfa))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Przykład: Średnie grup sparowanych: Lek przeciwdepresyjny==&lt;br /&gt;
Poniższa tabela prezentuje wyniki 9 pacjentów wykonujących pewien test diagnostyczny przed podaniem leku i po podaniu leku. &lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class='wikitable'&lt;br /&gt;
!przed	&lt;br /&gt;
!po&lt;br /&gt;
|-&lt;br /&gt;
|1,83	&lt;br /&gt;
|0,878&lt;br /&gt;
|-&lt;br /&gt;
|0,50	&lt;br /&gt;
|0,647&lt;br /&gt;
|-&lt;br /&gt;
|1,62	&lt;br /&gt;
|0,598&lt;br /&gt;
|-&lt;br /&gt;
|2,48	&lt;br /&gt;
|2,05&lt;br /&gt;
|-&lt;br /&gt;
|1,68	&lt;br /&gt;
|1,06&lt;br /&gt;
|-&lt;br /&gt;
|1,88	&lt;br /&gt;
|1,29&lt;br /&gt;
|-&lt;br /&gt;
|1,55	&lt;br /&gt;
|1,06&lt;br /&gt;
|-&lt;br /&gt;
|3,06	&lt;br /&gt;
|3,14&lt;br /&gt;
|-&lt;br /&gt;
|1,3	&lt;br /&gt;
|1,29&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
PRZED = [1.83, 0.5, 1.62, 2.48, 1.68, 1.88, 1.55, 3.06, 1.3]&lt;br /&gt;
PO = [0.878, 0.647, 0.598, 2.05, 1.06, 1.29, 1.06, 3.14, 1.29]&lt;br /&gt;
&lt;br /&gt;
Skonstruować test, który pozwoli stwierdzić czy lek jest skuteczny. Porównać różne wersje testu:&lt;br /&gt;
* bootstrapową (losowanie z powtórzeniami), &lt;br /&gt;
* permutacyjną, &lt;br /&gt;
* test parametryczny &lt;br /&gt;
* test nieparametryczny. &lt;br /&gt;
&lt;br /&gt;
Jakie założenia przyjmujemy przy każdej z wersji testu?&lt;br /&gt;
&lt;br /&gt;
===Rozwiązanie===&lt;br /&gt;
W tym zadaniu mamy dwie grupy ''przed'' i ''po'' ale oprócz tego istnieje ścisły porządek w parach, bez sensu jest porównywanie ''przed'' od jednego pacjenta z ''po'' drugiego pacjenta. Musimy stosować testy, które biorą ten porządek pod uwagę (testy pairwise).&lt;br /&gt;
&lt;br /&gt;
Jako miarę tego czy lek jest skuteczny przyjmiemy różnicę (''po'' - ''przed'').  Każda z zaobserwowanych różnic to zmienna losowa. Ich średnia to nasza STATYSTYKA. Będziemy wierzyli, że lek działa jeśli ta różnica jest istotnie mniejsza od zera. Mamy stąd hipotezy:&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;math&amp;gt;H_0: \bar r \geq 0&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;math&amp;gt;H_1: \bar r &amp;lt; 0 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Wersja bootstrapowa====&lt;br /&gt;
&lt;br /&gt;
Założenie, które czynimy w wersji bootstrapowej testu jest następujące:&lt;br /&gt;
Zaobserwowana grupa pacjentów jest reprezentatywna, tzn. istnieje duża populacja pacjentów spośród której moglibyśmy pobrać wiele innych grup podobnych pod względem interesujących nas parametrów do grupy zaobserwowanej w tym konkretnym eksperymencie. Konsekwencją tego założenia jest to, że jeśli w naszej grupie mamy już pacjenta z wynikami: [1.83,	0.878], to szansa na wylosowanie kolejnego pacjenta o takich wynikach się nie zmienia i nadal wynosi 1/9. Prowadzi to do implementacji zawierającej losowanie z powtórzeniami.&lt;br /&gt;
&lt;br /&gt;
Losowość występuje tu w dwóch miejscach:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; losujemy pacjentów z powtórzeniami - zakładamy, że badana grupa jest reprezentatywna dla bardzo dużej populacji.&lt;br /&gt;
&amp;lt;li&amp;gt; dla każdego z wybranych pacjentów losujemy jego wynik ''przed'' oraz wynik ''po'' z wyników, które uzyskał w rzeczywistości --- to jest zgodne z hipotezą zerową.&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Dla każdego losowania obliczamy wartość statystyki w tym losowania uśredniając  różnice indywidualne.&lt;br /&gt;
Wartości statystyki otrzymane dla wszystkich losowań tworzą jej empiryczny rozkład, przy założeniu, że hipoteza zerowa jest prawdziwa. Jako estymator prawdopodobieństwa zaobserwowania oryginalnej wartości statystyki ''mr'' (średnia różnica) przy prawdziwej hipotezie zerowej przyjmujemy frakcję rozkładu empirycznego, w której wartości statystyki były nie większe niż ''mr''. Wynik ilustrujemy histogramem rozkładu empirycznego z zaznaczoną ową frakcją.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
def randsample(x, N):&lt;br /&gt;
	'''zwraca wektor z losowo wybranymi elementami wektora x. &lt;br /&gt;
         Losowanie odbywa się z powtórzeniami''' &lt;br /&gt;
&lt;br /&gt;
	n=len(x)&lt;br /&gt;
	ind = np.random.randint(n, size = N)&lt;br /&gt;
	y = x[ind]&lt;br /&gt;
	return y&lt;br /&gt;
&lt;br /&gt;
def hist_z_markerem(x, N_bins, marker):&lt;br /&gt;
	'''Rysuje histogram wartości w tablicy x, używając N_bins binów. &lt;br /&gt;
	Na lewo od wartości wskazanej przez marker dorysowywany jest prostokąt'''&lt;br /&gt;
	&lt;br /&gt;
	r = np.max(x) - np.min(x)&lt;br /&gt;
	szer_binu = r/N_bins&lt;br /&gt;
&lt;br /&gt;
	#konstruujemy biny&lt;br /&gt;
        # robimy biny od markera co szerokość binu aż do x minimalnego&lt;br /&gt;
	biny_na_lewo = np.arange( marker, np.min(x), -szer_binu)&lt;br /&gt;
        # odwracamy kolejność tej sekwencji żeby była rosnąca&lt;br /&gt;
	biny_na_lewo = biny_na_lewo[-1::-1] &lt;br /&gt;
         # robimy biny od markera co szerokość binu aż do x maksymalnego&lt;br /&gt;
	biny_na_prawo = np.arange(marker,np.max(x), szer_binu)&lt;br /&gt;
        # sklejamy oba zakresy binów&lt;br /&gt;
	biny = np.concatenate((biny_na_lewo, biny_na_prawo))&lt;br /&gt;
	(n,xx,patch) = py.hist(x,bins = biny)&lt;br /&gt;
	py.fill([np.min(xx), np.min(xx), marker, marker] , [0, np.max(n), np.max(n), 0] ,'r' ,alpha = 0.2)&lt;br /&gt;
&lt;br /&gt;
A=np.array([[1.83,	0.878],&lt;br /&gt;
[0.50,	0.647],&lt;br /&gt;
[1.62,	0.598],&lt;br /&gt;
[2.48,	2.05],&lt;br /&gt;
[1.68,	1.06],&lt;br /&gt;
[1.88,	1.29],&lt;br /&gt;
[1.55,	1.06],&lt;br /&gt;
[3.06,	3.14],&lt;br /&gt;
[1.30,	1.29]])&lt;br /&gt;
&lt;br /&gt;
r = A[:,1] - A[:,0] # od drugiej kolumny odejmuję pierwszą&lt;br /&gt;
mr = np.mean(r)  # średnia z tych różnic to wartość statystyki zaobserwowana dla oryginalnych danych&lt;br /&gt;
print( 'średnia różnica: %(mr).2f'%{'mr':mr})&lt;br /&gt;
&lt;br /&gt;
N = len(r)&lt;br /&gt;
&lt;br /&gt;
N_rep = 100000&lt;br /&gt;
r_boot = np.zeros(N_rep)&lt;br /&gt;
przed = np.zeros(N)&lt;br /&gt;
po = np.zeros(N)&lt;br /&gt;
&lt;br /&gt;
for i in range(N_rep):&lt;br /&gt;
    ix=randsample(np.arange(0,N,1),N) # wybieramy pacjentów z powtórzeniami&lt;br /&gt;
    B=np.array(A[ix,:])&lt;br /&gt;
    for j in range(N):   # mieszamy losowo przypisując wyniki do grupy przed i po&lt;br /&gt;
                         # zakładając, że pacjent może uzyskać dwukrotnie taki sam wynik&lt;br /&gt;
        s = np.random.rand()&lt;br /&gt;
        if s &amp;gt; 0.5:&lt;br /&gt;
            przed[j]=B[j,0]&lt;br /&gt;
        else:&lt;br /&gt;
            przed[j]=B[j,1]&lt;br /&gt;
        s = np.random.rand()&lt;br /&gt;
        if s &amp;gt; 0.5:&lt;br /&gt;
            po[j]=B[j,1]&lt;br /&gt;
        else:&lt;br /&gt;
            po[j]=B[j,0]&lt;br /&gt;
    rr=po-przed&lt;br /&gt;
    r_boot[i] = np.mean(rr)&lt;br /&gt;
&lt;br /&gt;
hist_z_markerem(r_boot,30,mr)&lt;br /&gt;
p_h0 = np.sum( r_boot &amp;lt;=  mr)/N_rep&lt;br /&gt;
s_boot = u'dla repróbkowanego testu jednostronnego: %(p_h0).5f'%{'p_h0': p_h0}&lt;br /&gt;
print( s_boot)&lt;br /&gt;
py.title(s_boot)&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Wersja permutacyjna====&lt;br /&gt;
&lt;br /&gt;
W tym teście zakładamy, że grupa pacjentów jest unikalna, więc w procedurze wytwarzania empirycznego rozkładu statystyki  korzystamy z danych wszystkich pacjentów w każdej iteracji. &lt;br /&gt;
&lt;br /&gt;
Zgodnie z hipotezą zerową pomiary ''przed'' i ''po'' są równoważne można je zatem zamieniać. Wykonamy wszystkie możliwe zamiany ''przed'' i ''po''. Możliwych zamian jest &amp;lt;math&amp;gt;2^N&amp;lt;/math&amp;gt;.  Skorzystamy z faktu, że bity w reprezentacji binarnej liczb całkowitych od 0 do &amp;lt;math&amp;gt;2^{N-1}&amp;lt;/math&amp;gt; zawierają wszystkie możliwe permutacje ciągów zer i jedynek o długości ''N''. Wartości 1 zamienimy na logiczne True a wartości 0 na False. Zinterpretujemy True jako zamianę  i False jako brak zamiany. &lt;br /&gt;
&lt;br /&gt;
Dla każdej permutacji obliczamy wartość statystyki uśredniając  różnice indywidualne.&lt;br /&gt;
Wartości statystyki otrzymane dla wszystkich permutacji tworzą jej empiryczny rozkład, przy założeniu, że hipoteza zerowa jest prawdziwa. Jako estymator prawdopodobieństwa zaobserwowania oryginalnej wartości statystyki ''mr'' przy prawdziwej hipotezie zerowej przyjmujemy frakcję rozkładu empirycznego, w której wartości statystyki były nie większe niż ''mr''. Wynik ilustrujemy histogramem rozkładu empirycznego z zaznaczoną ową frakcją. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
 &lt;br /&gt;
def dec2bin(n, l):&lt;br /&gt;
    '''konwertuje dziesiętną liczbę całkowitą na tablicę &lt;br /&gt;
    przedstawiającą reprezentację binarną tej liczby&lt;br /&gt;
    n liczba do konwersji&lt;br /&gt;
    l długość reprezentacji binarnej &lt;br /&gt;
    zwracana jest binarna reprezentacja liczby &lt;br /&gt;
    skonwertowana do tablicy logicznej (0-&amp;gt;False, 1-&amp;gt; True)&lt;br /&gt;
    '''&lt;br /&gt;
    b = np.zeros(l, dtype = bool)&lt;br /&gt;
    if n &amp;lt; 0:  raise ValueError(&amp;quot;must be a positive integer&amp;quot;)&lt;br /&gt;
    i = 1&lt;br /&gt;
    while n &amp;gt; 0:&lt;br /&gt;
        b[l-i] = bool( n % 2 ) &lt;br /&gt;
        n = n &amp;gt;&amp;gt; 1&lt;br /&gt;
        i += 1&lt;br /&gt;
    return b&lt;br /&gt;
 &lt;br /&gt;
def hist_z_markerem(x, N_bins, marker):&lt;br /&gt;
	'''Rysuje histogram wartości w tablicy x, używając N_bins binów. &lt;br /&gt;
	Na lewo od wartości wskazanej przez marker dorysowywany jest prostokąt'''&lt;br /&gt;
 &lt;br /&gt;
	r = np.max(x) - np.min(x)	&lt;br /&gt;
	szer_binu = r/N_bins&lt;br /&gt;
 &lt;br /&gt;
	#konstruujemy biny&lt;br /&gt;
        # robimy biny od markera co szerokość binu aż do x minimalnego&lt;br /&gt;
	biny_na_lewo = np.arange( marker, np.min(x), -szer_binu)&lt;br /&gt;
        # odwracamy kolejność tej sekwencji żeby była rosnąca&lt;br /&gt;
	biny_na_lewo = biny_na_lewo[-1::-1] &lt;br /&gt;
         # robimy biny od markera co szerokość binu aż do x maksymalnego&lt;br /&gt;
	biny_na_prawo = np.arange(marker,np.max(x), szer_binu)&lt;br /&gt;
        # sklejamy oba zakresy binów&lt;br /&gt;
	biny = np.concatenate((biny_na_lewo, biny_na_prawo))&lt;br /&gt;
	(n,xx,patch) = py.hist(x,bins = biny )&lt;br /&gt;
	py.fill([np.min(xx), np.min(xx), marker, marker] , [0, np.max(n), np.max(n), 0] ,'r' ,alpha = 0.2)&lt;br /&gt;
 &lt;br /&gt;
A=np.array([[1.83, 0.878], [0.50, 0.647], [1.62, 0.598], [2.48, 2.05], [1.68, 1.06], [1.88, 1.29], [1.55, 1.06], [3.06, 3.14], [1.30, 1.29]])&lt;br /&gt;
 &lt;br /&gt;
r = A[:,1] - A[:,0] # od drugiej kolumny odejmuję pierwszą&lt;br /&gt;
mr = np.mean(r)  # średnia z tych różnic to wartość statystyki zaobserwowana dla oryginalnych danych&lt;br /&gt;
print( 'średnia różnica: %(mr).2f'%{'mr':mr} )&lt;br /&gt;
 &lt;br /&gt;
N = len(r)&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
N_perm = 2**N&lt;br /&gt;
r_perm = np.zeros(N_perm)&lt;br /&gt;
for i in range(2**N):&lt;br /&gt;
	B = np.array(A)   # B zawiera kopię tablicy A&lt;br /&gt;
	zamiana = dec2bin(i,N) # w których wierszach dokonać zamiany?&lt;br /&gt;
	# print( i,': ', zamiana )&lt;br /&gt;
	# wiersze tablicy B wskazane przez True w wektorze indeksów ind zamieniamy wartości  'przed' z wartościami 'po'&lt;br /&gt;
	B[zamiana, 0] = A[zamiana, 1] &lt;br /&gt;
	B[zamiana, 1] = A[zamiana, 0]&lt;br /&gt;
	rr = B[:,1] - B[:,0] # Obliczam wartości zmiennych losowych dla tej zamiany&lt;br /&gt;
	r_perm[i] = np.mean(rr) # Obliczmy wartość statystyki dla tej zamiany&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
p_h0 = np.sum( r_perm &amp;lt;=  mr)/N_perm&lt;br /&gt;
s_perm = u'dla permutacyjnego testu jednostronnego: %(p_h0).3f'%{'p_h0': p_h0}&lt;br /&gt;
print( s_perm)&lt;br /&gt;
hist_z_markerem(r_perm,30,mr)&lt;br /&gt;
py.title(s_perm)&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Wersja parametryczna====&lt;br /&gt;
&lt;br /&gt;
Jeśli badane różnice ''przed'' i ''po'' podlegają rozkładowi normalnemu to do testowania czy średnia wartość różnicy jest równa 0 można zastosować test ''t'' dla prób zależnych &amp;lt;tt&amp;gt;st.ttest_rel()&amp;lt;/tt&amp;gt;. Aby się upewnić, że możemy zastosować ten test badamy normalność różnic przy pomocy &amp;lt;tt&amp;gt;normplot()&amp;lt;/tt&amp;gt; oraz testu Shapiro-Wilka &amp;lt;tt&amp;gt;st.shapiro()&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
 &lt;br /&gt;
def normplot(x):&lt;br /&gt;
	'''normplot: x dane do testowania'''&lt;br /&gt;
 &lt;br /&gt;
	x_ord = sorted(x)&lt;br /&gt;
	N = len(x)&lt;br /&gt;
	y = np.zeros(N)&lt;br /&gt;
	y[0]=st.norm.ppf(1- 0.5**(1.0/N) )&lt;br /&gt;
	y[N-1] = st.norm.ppf(0.5**(1.0/N) )&lt;br /&gt;
	for i in range(1,N-1):&lt;br /&gt;
		arg = (i-0.3175)/(N+0.365)&lt;br /&gt;
		y[i] = st.norm.ppf(arg)&lt;br /&gt;
	py.plot(y,x_ord,'.')&lt;br /&gt;
 &lt;br /&gt;
A=np.array([[1.83, 0.878], [0.50, 0.647], [1.62, 0.598], [2.48, 2.05], [1.68, 1.06], [1.88, 1.29], [1.55, 1.06], [3.06, 3.14], [1.30, 1.29]])&lt;br /&gt;
&lt;br /&gt;
r = A[:,1] - A[:,0] # od drugiej kolumny odejmuję pierwszą&lt;br /&gt;
&lt;br /&gt;
normplot(r)&lt;br /&gt;
py.title(&amp;quot;Wyniki testów na normalność różnic\n Shapiro-Wilka:  W=%.3f, p=%.3f&amp;quot;%st.shapiro(r)&lt;br /&gt;
        +&amp;quot;\nKołmogorowa-Smirnowa: D=%.3f, p=%.3f&amp;quot;%st.kstest(r, 'norm', args=(np.mean(r),np.std(r,ddof=1))))&lt;br /&gt;
t, p = st.ttest_rel(A[:,1],A[:,0])&lt;br /&gt;
p_t = p/2 # aby test był jednostronny&lt;br /&gt;
s_t = u'dla parametrycznego testu jednostronnego: %(p_h0).3f'%{'p_h0': p_t}&lt;br /&gt;
print(s_t)&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Wersja nieparametryczna====&lt;br /&gt;
&lt;br /&gt;
W ogólności, nie zakładając normalności różnic można by przeprowadzić test Wilcoxona. W aktualnej implementacji tego testu w scipy.stats jest on dla naszych danych niedokładny, gdyż mamy małą liczebność grupy, a implementacja stosuje przybliżenia asymptotyczne.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
A=np.array([[1.83, 0.878], [0.50, 0.647], [1.62, 0.598], [2.48, 2.05], [1.68, 1.06], [1.88, 1.29], [1.55, 1.06], [3.06, 3.14], [1.30, 1.29]])&lt;br /&gt;
z, p = st.wilcoxon(A[:,1],A[:,0] )&lt;br /&gt;
p_w = p/2 # aby test był jednostronny&lt;br /&gt;
s_w = u'dla nieparametrycznego testu jednostronnego: %(p_h0).3f'%{'p_h0': p_w}&lt;br /&gt;
print( s_w)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Podsumowanie====&lt;br /&gt;
 średnia różnica: -0.43&lt;br /&gt;
 dla repróbkowanego testu jednostronnego: 0.0013&lt;br /&gt;
 dla permutacyjnego testu jednostronnego: 0.014&lt;br /&gt;
 Wynik testu Shapiro-Wilka na normalność różnic &lt;br /&gt;
 	 statystyka W: 0.921 &lt;br /&gt;
 	 prawdopodobieństwo takiej wartości statystyki dla rozkładu normalnego: 0.404&lt;br /&gt;
 dla parametrycznego testu jednostronnego: 0.008&lt;br /&gt;
 dla nieparametrycznego testu jednostronnego: 0.019&lt;br /&gt;
&lt;br /&gt;
Wszystkie testy wskazują prawdopodobieństwo zaobserwowania odpowiadających im statystyk poniżej przyjętego poziomu istotności &amp;lt;math&amp;gt;\alpha = 0.05&amp;lt;/math&amp;gt;. Zatem hipotezę zerową należy odrzucić i przyjąć hipotezę alternatywną.&lt;br /&gt;
&lt;br /&gt;
==Zadania==&lt;br /&gt;
&lt;br /&gt;
===Zanieczyszczenie środowiska===&lt;br /&gt;
Agencja ochrony środowiska ustaliła limit na koncentrację zanieczyszczeń emitowanych przez fabryki. Załóżmy, że dopuszczalny poziom zanieczyszczeń wynosi 55 cząstek na milion (cz/m) w promieniu dwóch kilometrów od fabryki. Kontrola przeprowadza 100 pomiarów o różnej porze dnia i roku w promieniu dwóch km od pewnej fabryki. Średnia z próby wyniosła 60 cz/m a odchylenie standardowe &amp;lt;math&amp;gt;s = 20&amp;lt;/math&amp;gt; cz/m. Czy dane te są wystarczające by na poziomie istotności &amp;lt;math&amp;gt;\alpha = 0,01&amp;lt;/math&amp;gt; uznać, że fabryka łamie prawo?&lt;br /&gt;
&lt;br /&gt;
Fabryka łamie prawo jeśli emituje zanieczyszczenia na poziomie wyższym niż dopuszczalny więc należy przeprowadzić test jednostronny (w tym przypadku prawostronny). Czy moglibyśmy odrzucić &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; na tym samym poziomie stosując test dwustronny?&lt;br /&gt;
Jest ważne aby w zależności od problemu wybrać odpowiedni test: jedno- lub dwustronny.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import numpy as np&lt;br /&gt;
 &lt;br /&gt;
x_c = 55 #cząstek na milion (cz/m) w promieniu dwóch kilometrów od fabryki. &lt;br /&gt;
#Kontrola przeprowadza &lt;br /&gt;
N = 100 # pomiarów o różnej porze dnia i roku w promieniu dwóch km. od pewnej fabryki. &lt;br /&gt;
#średnia z próby wyniosła &lt;br /&gt;
x_s = 60 # cz/m &lt;br /&gt;
# a odchylenie standardowe &lt;br /&gt;
s = 20 # cz/m. &lt;br /&gt;
# Czy dane te są wystarczające by uznać, że fabryka łamie prawo ?&lt;br /&gt;
alpha = 0.01&lt;br /&gt;
 &lt;br /&gt;
# H0: mu &amp;lt;=x_c&lt;br /&gt;
# H1: mu &amp;gt; x_c&lt;br /&gt;
# wystarczy sprawdzić jakie jest p dla największego dopuszczalnego stężenia &lt;br /&gt;
# mu = x_c zaobserwowania wartości średniej większej bądź równej zaobserwowanej x_s. &lt;br /&gt;
# Odchylenie std. dane jest dla populacji i trzeba je przeliczyć na odchylenie std. średniej.&lt;br /&gt;
p = 1 - st.t.cdf(x_s, df=N-1, loc = x_c, scale = s/np.sqrt(N) )&lt;br /&gt;
print(&amp;quot;poziom p&amp;quot;,p)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
############################&lt;br /&gt;
#inne (tożsame) rozwiązania:&lt;br /&gt;
&lt;br /&gt;
##wykorzystaniem &amp;quot;Survival function&amp;quot; zamiast dystrybuanty&lt;br /&gt;
p = st.t.sf(x_s, df=N-1, loc = x_c, scale = s/np.sqrt(N) )&lt;br /&gt;
print(&amp;quot;poziom p&amp;quot;,p)&lt;br /&gt;
&lt;br /&gt;
##obliczając statystykę t&lt;br /&gt;
t=(x_s-x_c)/(s/N**0.5)&lt;br /&gt;
p = 1-st.t.cdf(t,df=N-1)&lt;br /&gt;
print(&amp;quot;poziom p&amp;quot;,p)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Odp. &amp;lt;math&amp;gt;p=0,007&amp;lt;\alpha&amp;lt;/math&amp;gt;, zatem możemy odrzucić hipotezę &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; (głoszącą, że fabryka nie łamie prawa) na poziomie &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;  = 0,01.&lt;br /&gt;
&lt;br /&gt;
===Wzrost mocy turbin===&lt;br /&gt;
Turbina hydroelektryczna generuje moc średnią 25,2 kW. Po unowocześnieniu maszyny chcemy przetestować czy średnia moc generowana zmieniła się (na + lub &amp;amp;minus;). Przeprowadzono 115 pomiarów, które dały średnią 26,1 kW i odch. std. 3,2 kW. Przeprowadzić test statystyczny na poziomie istotności 1%, zinterpretować wynik. Wnioskowanie przeprowadzić także w oparciu oprzedział ufności.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
#-*- coding:utf-8 -*-&lt;br /&gt;
import numpy as np&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
N=115&lt;br /&gt;
m=25.2	#hipoteza zerowa mówi, że tyle wynosi moc&lt;br /&gt;
sr=26.1	#w pomiarach uzyskaliśmy taką średnią moc&lt;br /&gt;
s=3.2	#przy takim odchyleniu standardowym&lt;br /&gt;
&lt;br /&gt;
alfa=0.01&lt;br /&gt;
&lt;br /&gt;
#obliczenie poziomu p&lt;br /&gt;
t=(m-sr)/(s/N**0.5)&lt;br /&gt;
p = st.t.cdf(t,df=N-1) * 2 #mnozymy przez 2, bo chcemy testu dwustronnego&lt;br /&gt;
print(&amp;quot;poziom p&amp;quot;,p)&lt;br /&gt;
&lt;br /&gt;
#alternatywnie - obliczenie przedziału ufności&lt;br /&gt;
lo,hi = st.t.ppf([alfa/2, 1-alfa/2],df=N-1,loc=sr,scale=s/N**0.5)&lt;br /&gt;
print(&amp;quot;przedzial ufnosci [%.3g,%.3g]&amp;quot;%(lo,hi))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Odp.: &amp;lt;math&amp;gt;p=0,\!003&amp;lt;\alpha=0,\!01&amp;lt;/math&amp;gt;, zatem odrzucamy H0.&lt;br /&gt;
&lt;br /&gt;
Odp. (alt.): &amp;lt;math&amp;gt;\mu = 25,\!2 \not\in[25,\!3; 26,\!9]&amp;lt;/math&amp;gt;, zatem odrzucamy H0.&lt;br /&gt;
&lt;br /&gt;
===Sonda===&lt;br /&gt;
Władze miasta chciałyby wiedzieć, czy przyznać koncesję operatorowi sieci kablowej. W tym celu zleciły nam przeprowadzenie sondy wśród mieszkańców. Zapytaliśmy o zdanie 50 przypadkowo wybranych osób. 30 osób powiedziało &amp;amp;bdquo;tak&amp;amp;rdquo; a 20 &amp;amp;bdquo;nie&amp;amp;rdquo;. Na ile pewnie otrzymane wyniki wskazują, że mieszkańcy chcą tej kablówki?&lt;br /&gt;
&lt;br /&gt;
Celem naszych badań jest uniknięcie błędu polegającego na tym, że powiemy iż większość mieszkańców chce kablówki podczas gdy tak na prawdę to nie chce. &lt;br /&gt;
&lt;br /&gt;
Wskazówka: Granicznym przypadkiem popełnienia tego błędu jest proporcja 1:1 zwolenników i przeciwników kablówki. Jeśli przeciwników kablówki byłoby jeszcze więcej to uzyskanie naszych wyników byłoby jeszcze mniej prawdopodobne.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import numpy.random as rnd&lt;br /&gt;
&lt;br /&gt;
N=50&lt;br /&gt;
odp_na_tak=30&lt;br /&gt;
odp_na_nie=20&lt;br /&gt;
&lt;br /&gt;
#przypadek graniczny, który daje najwyższe prawdopodobieństwo uzyskania fałszywego wyniku na 'tak',&lt;br /&gt;
#to mieszkańcy niezdecydowani, czyli proporcja 1:1&lt;br /&gt;
#(proporcja przechylona w kierunki 'nie', da nam niższe oszacowanie,&lt;br /&gt;
#a proporcja przechylona w kierunku 'tak' nie oznaczałaby fałszywego wyniku sondy)&lt;br /&gt;
#zatem hipoteza zerowa brzmi, że nasz wynik pochodzi z populacji niezdecydowanej:&lt;br /&gt;
P=0.5 #prawdopodobieństwo, że respondent udzieli odpowiedzi na 'tak'&lt;br /&gt;
# jest to najwyższe prawdopodobieństwo jeszcze fałszywego wyniku&lt;br /&gt;
&lt;br /&gt;
#rozwiązanie parametryczne wymaga użycia rozkładu dwumianowego:&lt;br /&gt;
p = 1 - st.binom.cdf(29,50,P) #od 1 odejmujemy sumaryczne prawdopodobieństwo wszystkich przypadków udzielenia mniej niż 30 odpowiedzi na tak (czyli do 29 włącznie)&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;poziom p (parametrycznie)&amp;quot;,p)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#rozwiązanie przez symulację:&lt;br /&gt;
Nrand=100000&lt;br /&gt;
R=0 #rezultat, czyli liczba przypadków, w których przynajmniej 30 osób odpowiedziało tak&lt;br /&gt;
for i in range(Nrand):&lt;br /&gt;
	odpowiedzi = (rnd.random(N)&amp;lt;P) #losujemy odpowiedzi od N osób&lt;br /&gt;
	if odpowiedzi.sum() &amp;gt;=odp_na_tak: #jeśli zdarzyło się co najmniej 30 odpowiedzi na tak, to dodajemy jeden do liczby takich przypadków&lt;br /&gt;
		R+=1&lt;br /&gt;
	&lt;br /&gt;
print(&amp;quot;poziom p (z symulacji)&amp;quot;,R/Nrand) #na koniec dzielimy przez liczbę wszystkich sond w symulacji&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Wybory prezydenckie===&lt;br /&gt;
W ankiecie uzyskaliśmy 840 głosów popierających kandydaturę A i 660 kandydaturę B. Jaka jest szansa, że tak naprawdę kandydat B ma  poparcie 50% lub większe? Jakie jest prawdopodobieństwo pojawienia sie zaobserwowanej próbki lub próbki wskazującej na jeszcze większe poparcie dla kandydata A, jeśli w rzeczywistości poparcie kandydata A byłoby  50% lub mniej.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import numpy.random as rnd&lt;br /&gt;
&lt;br /&gt;
# rozwiązanie parametryczne&lt;br /&gt;
A = 840&lt;br /&gt;
B = 660&lt;br /&gt;
N = A+B&lt;br /&gt;
&lt;br /&gt;
#przypadek graniczny, który daje najwyższe prawdopodobieństwo uzyskania fałszywego wyniku na 'tak',&lt;br /&gt;
#to mieszkańcy niezdecydowani, czyli propocja 1:1&lt;br /&gt;
#propocja przechylona w kierunki 'nie', da nam niższe oszacowanie&lt;br /&gt;
#a propocja przechylona w kierunku 'tak' nie oznaczałaby fałszywego wyniku sondy&lt;br /&gt;
#zatem hipoteza zerowa brzmi, że nasz wynik pochodzi z populacji niezdecydowanej:&lt;br /&gt;
p_sukces = 0.5&lt;br /&gt;
&lt;br /&gt;
#rozwiązanie parametryczne&lt;br /&gt;
p = 1 - st.binom.cdf(A-1,N,p_sukces)&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;poziom p (parametrycznie)&amp;quot;,p)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#rozwiązanie przez symulację:&lt;br /&gt;
&lt;br /&gt;
#wiemy już, że musimy oszacować bardzo niskie prawdopodobieństwo, zatem symulacja musi być długa&lt;br /&gt;
#(gdybyśmy nie wiedzieli, to łatwo byśmy zauważyli, że krótka symulacja nie daje w ogóle zdarzeń sprzyjających dając wynik p=0)&lt;br /&gt;
#niestety trzeba pokusić się o optymalizację (mimo to kod będzie się wykonywał kilkadziesiąt sekund do kilku minut):&lt;br /&gt;
#chemy mieć przynajmniej 10^7 sond, ale każda sonda to 1500 odpowiedzi, zatem łącznie musimy wylosować 1.5*10^10 liczb&lt;br /&gt;
#losowanie w pętli 10^7 razy kolejnych sond po 1500 odpowiedzi zajmie bardzo bardzo dużo czasu&lt;br /&gt;
#tablica 1.5*10^10 odpowiedzi wygenerowana jednym poleceniem nie zmieści się w pamięci&lt;br /&gt;
#musimy skorzystać z rozwiązania pośredniego&lt;br /&gt;
#będziemy losować 100 razy po 1.5*10^8 odpowiedzi i dodamy wyniki&lt;br /&gt;
&lt;br /&gt;
Nrand_1=100    # 10^2&lt;br /&gt;
Nrand_2=100000 # 10^5&lt;br /&gt;
N = A+B        # 1.5*10^3&lt;br /&gt;
&lt;br /&gt;
Nrand_total = Nrand_1*Nrand_2&lt;br /&gt;
&lt;br /&gt;
R=0 #liczba sond, w których kandydat A uzyskał poparcie 840 lub większe&lt;br /&gt;
#po każdym przebiegu pętli będziemy dodawać liczbę takich przypadków (jeśli wystąpiły w danej iteracji)&lt;br /&gt;
&lt;br /&gt;
for i in range(Nrand_1):&lt;br /&gt;
	#w każdej iteracji losujemy odpowiedzi od N osób w Nrand_2 sondach&lt;br /&gt;
	#iteracji będzie w sumie Nrand_1, co da nam łącznie N osób w Nrand_total sondach&lt;br /&gt;
	#jako, że zakładamy równe prawdopodobieństwo, to może możemy wylosować tablicę zawierającą tylko 0 i 1&lt;br /&gt;
	#gdzie 1 oznacza sukces (głos na kandydata A), a 0 porażkę&lt;br /&gt;
	#korzystając z funksji randint, która zwraca (pseudo)losowe liczby całkowite z zakresu [a,b)&lt;br /&gt;
	a,b = 0,2 &lt;br /&gt;
	odpowiedzi = rnd.randint(a,b,size=(N,Nrand_2)) &lt;br /&gt;
	S = np.sum(odpowiedzi,axis=0)  #wyniki kolejnych sond (sumujemy sukcesy w wierszach)&lt;br /&gt;
&lt;br /&gt;
	R+=np.sum(S&amp;gt;=A) #dodajemy liczbę sond, w których kandydat A uzyskał poparcie 840 lub większe (w danej iteracji pętli)&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;poziom p (z symulacji)&amp;quot;,R/Nrand_total) #na koniec dzielimy przez liczbę wszystkich sond w symulacji&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Czy stosunek do marihuany się zmienił?===&lt;br /&gt;
Rozważmy dwie ankiety przeprowadzone w USA, pytano 1500 respondentów o stosunek do legalizacji marihuany. Pierwszą ankietę przeprowadzono w 1980, wówczas za legalizacją opowiadało się 52% a drugą w 1985 i za legalizacją było 46%. Czy wyniki tych dwóch ankiet są istotnie różne?&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
# rozwiązanie parametryczne&lt;br /&gt;
za1 = int(0.52*1500)&lt;br /&gt;
za2 = int(0.46*1500)&lt;br /&gt;
N = 1500&lt;br /&gt;
&lt;br /&gt;
# H0: stosunek się nie zmienił zatem p_za było w obu anlietach takie samo:&lt;br /&gt;
p_za = (0.52+0.46)/2&lt;br /&gt;
&lt;br /&gt;
# Jakie jest prawdopodobieństwo zaobserwowoania wyników ankiet o takiej bądź większej &lt;br /&gt;
# różnicy głosów za, jeśli obie są zgodne z H0 ?&lt;br /&gt;
D = za1 - za2&lt;br /&gt;
&lt;br /&gt;
#musimy zsumować wszystkie możliwości, w których wystąpiła taka różnica lub większa&lt;br /&gt;
#zrobimy to w pętli&lt;br /&gt;
p_binom = 0.0&lt;br /&gt;
for k in range(N-D+1):&lt;br /&gt;
	p1 = st.binom.pmf(k,N,p_za) # prawdopodobieństwo uzyskania dokładnie k głosów za&lt;br /&gt;
	&lt;br /&gt;
	# sumujemy prawdopodobieństwa uzyskania liczby głosów różnej przynajmniej o D&lt;br /&gt;
	przypadki_o_roznicy_przynajmniej_D = np.arange(k+D,N+1)&lt;br /&gt;
	p2 = np.sum(st.binom.pmf(przypadki_o_roznicy_przynajmniej_D,N,p_za))&lt;br /&gt;
	#co jest równoważne:&lt;br /&gt;
	#p2 = 1-st.binom.cdf(k+D-1,N,p_za)&lt;br /&gt;
	&lt;br /&gt;
	#sumujemy dla kolejnych k&lt;br /&gt;
	p_binom += p1*p2 # mnożymy prawdopodobieństwa ponieważ są wyniki obu sond są niezależne&lt;br /&gt;
	&lt;br /&gt;
p=2*p_binom #mnożymy przez 2, ponieważ robimy test dwustronny (różnica mogła wystąpić również w drugą stronę)&lt;br /&gt;
print(&amp;quot;p =&amp;quot;,p)&lt;br /&gt;
&lt;br /&gt;
# rozwiązanie symulacyjne (tym razem skorzystamy z randsample)&lt;br /&gt;
def randsample(x, N):&lt;br /&gt;
	'''zwraca wektor z losowo wybranymi elementami wektora x. Losowanie odbywa się z powtórzeniami''' &lt;br /&gt;
	n=len(x)&lt;br /&gt;
	ind = np.random.randint(n, size = N)&lt;br /&gt;
	y = x[ind]&lt;br /&gt;
	return y&lt;br /&gt;
&lt;br /&gt;
N_rep = 100000&lt;br /&gt;
# świat zgodny z H0:&lt;br /&gt;
H0 = np.concatenate((np.zeros(N*(1-p_za)), np.ones(N*p_za)))&lt;br /&gt;
&lt;br /&gt;
a = np.zeros(N_rep)&lt;br /&gt;
for i in range(N_rep):&lt;br /&gt;
	w1 = np.sum(randsample(H0,N))&lt;br /&gt;
	w2 = np.sum(randsample(H0,N))&lt;br /&gt;
	a[i] = np.abs(w1-w2)&lt;br /&gt;
p = np.sum(a&amp;gt;=D)/N_rep&lt;br /&gt;
print(p)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zawały serca i cholesterol===&lt;br /&gt;
Badano grupę 605 osób. 135 osób z tej grupy miało wysoki poziom cholesterolu a 470 niski. W grupie z wysokim poziomem cholesterolu odnotowano 10 przypadków zawału serca a w grupie z niskim poziomem 21, w czasie 16 lat obserwacji. Nasze pytanie brzmi: Czy możemy uznać, że wysoki poziom cholesterolu zwiększa ryzyko zawału serca?&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
# rozwiązanie parametryczne&lt;br /&gt;
wysoki = 135&lt;br /&gt;
niski = 470&lt;br /&gt;
N = 605&lt;br /&gt;
wysoki_zawaly = 10&lt;br /&gt;
niski_zawaly = 21&lt;br /&gt;
N_zaw = wysoki_zawaly + niski_zawaly &lt;br /&gt;
&lt;br /&gt;
# H0: proporcja zawałowców w obu grupach taka sama:&lt;br /&gt;
p_zawalu = N_zaw/N&lt;br /&gt;
# H1: proporcja jest różna, test jednostronny (wysoki cholesterol ZWIĘKSZA ryzyko)&lt;br /&gt;
&lt;br /&gt;
# Jakie jest prawdopodobieństwo zaobserwowania wyników badania o takiej bądź większej &lt;br /&gt;
# różnicy proporcji zawałów, jeśli obie są zgodne z H0 ?&lt;br /&gt;
roznica = wysoki_zawaly/wysoki - niski_zawaly/niski&lt;br /&gt;
&lt;br /&gt;
p_binom = 0.0&lt;br /&gt;
for k_wys in range(wysoki+1):&lt;br /&gt;
	p_wys = st.binom.pmf(k_wys,wysoki,p_zawalu) # prawdopodobieństwo uzyskania k_wys zawałów grupie o liczebności wysoki&lt;br /&gt;
	for k_nis in range(niski+1): &lt;br /&gt;
		if k_wys/wysoki - k_nis/niski&amp;gt;=roznica: # czy liczebności k_wys i k_nis dają większą bądź równą różnice proporcji?&lt;br /&gt;
			p_nis = st.binom.pmf(k_nis,niski,p_zawalu) # prawdopodobieństwo uzyskania k_nis zawałów w grupie o niskim cholesterolu&lt;br /&gt;
			p_binom += p_wys*p_nis # zdarzenia są niezależne&lt;br /&gt;
&lt;br /&gt;
print(p_binom)&lt;br /&gt;
&lt;br /&gt;
# rozwiązanie symulacyjne&lt;br /&gt;
def randsample(x, N):&lt;br /&gt;
	'''zwraca wektor z losowo wybranymi elementami wektora x. Losowanie odbywa się z powtórzeniami''' &lt;br /&gt;
	n=len(x)&lt;br /&gt;
	ind = np.random.randint(n, size = N)&lt;br /&gt;
	y = x[ind]&lt;br /&gt;
	return y&lt;br /&gt;
&lt;br /&gt;
N_rep = 100000&lt;br /&gt;
# świat zgodny z H0:&lt;br /&gt;
H0 = np.concatenate((np.zeros(N-N_zaw), np.ones(N_zaw)))&lt;br /&gt;
&lt;br /&gt;
wyn = np.zeros(N_rep)&lt;br /&gt;
for i in range(N_rep):&lt;br /&gt;
	wysoki_zawaly_r = np.sum(randsample(H0,wysoki))&lt;br /&gt;
	niski_zawaly_r = np.sum(randsample(H0,niski))&lt;br /&gt;
	wyn[i] = wysoki_zawaly_r/wysoki - niski_zawaly_r/niski&lt;br /&gt;
p = np.sum(wyn&amp;gt;=roznica)/N_rep&lt;br /&gt;
print(p)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Czy gęstości planet się różnią?===&lt;br /&gt;
Rozważmy pięć planet znanych w antycznym świecie. Chcemy zbadać, czy planety wewnętrzne Merkury (0,68) i Wenus (0,94) mają istotnie większe gęstości niż planety zewnętrzne Mars (0,71) Jowisz (0,24) i Saturn (0,12)?&lt;br /&gt;
&lt;br /&gt;
Wskazówki: &lt;br /&gt;
* Unikalność zestawu planet wskazuje na zastosowanie testu permutacyjnego.&lt;br /&gt;
* Moduł implementujący funkcje kombinatoryczne w pythonie to &amp;lt;tt&amp;gt;itertools &amp;lt;/tt&amp;gt;. Zawiera on funkcję &amp;lt;tt&amp;gt;permutations&amp;lt;/tt&amp;gt;. Wywołanie &amp;lt;tt&amp;gt;itertools.permutations(sekwencja[, r])&amp;lt;/tt&amp;gt; zwraca obiekt permutacji. Obiekt ten zwraca kolejne permutacje o długości r elementów w sekwencji (np. w wektorze). Przykład:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
import itertools&lt;br /&gt;
for kolejny in itertools.permutations(range(3), 2):&lt;br /&gt;
    print(kolejny)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import itertools as itt&lt;br /&gt;
PLANETY = np.array([0.68,0.94,0.71,0.24,0.12])&lt;br /&gt;
N=len(PLANETY)&lt;br /&gt;
&lt;br /&gt;
r=[] #używamy listy, bo nie chcemy obliczać ile będzie przypadków (aczkolwiek można to zrobić)&lt;br /&gt;
&lt;br /&gt;
for planety in itt.permutations(PLANETY):&lt;br /&gt;
	r.append(np.mean(planety[:2])-np.mean(planety[2:]))&lt;br /&gt;
&lt;br /&gt;
R=np.mean(PLANETY[:2])-np.mean(PLANETY[2:]) #prawdziwa różnica&lt;br /&gt;
&lt;br /&gt;
r=np.array(r) #porównanie z liczbą działa tylko dla tablic numpy, a nie dla list&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;p =&amp;quot;,np.sum(r&amp;gt;=R)/len(r))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Elektrownia jądrowa===&lt;br /&gt;
Przed wybudowaniem elektrowni jądrowej przeprowadzono pomiary intensywności promieniowania jonizującego w pobliżu planowanego budynku reaktora. Powtórzono te pomiary po uruchomieniu reaktora. Czy zebrane dane pozwalają stwierdzić, że poziom promieniowania istotnie wzrósł? Dane pomiarowe wczytaj z [[Media:pomiary_skazen.txt| pliku]].&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
&lt;br /&gt;
alfa = 0.01 # poziom istotności&lt;br /&gt;
&lt;br /&gt;
PRZED, PO = np.loadtxt('Pomiary_skazen.txt') #wczytanie danych (dwa zbiory przed uruchomieniem i po)&lt;br /&gt;
&lt;br /&gt;
t, p = st.ttest_ind(PRZED, PO) # wykorzystanie gotowej funkcji wykonującej DWUSTRONNY test t na różnicę średnich&lt;br /&gt;
                            # dla danych NIESPAROWANYCH (niezależnych)&lt;br /&gt;
                            # ttest_ind  - ind od independent &lt;br /&gt;
                            # ttest_rel  - rel od related &lt;br /&gt;
&lt;br /&gt;
p/=2 # dzielimy przez dwa ponieważ chcemy zrobić test jednostronny&lt;br /&gt;
print(&amp;quot;Poziom p&amp;quot;,p)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Odp. &amp;lt;math&amp;gt;p=0,\!39&amp;gt;\alpha=0,\!01&amp;lt;/math&amp;gt;, zatem nie mamy podstaw do odrzucenia hipotezy &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt;, że poziom promieniowania istotnie wzrósł.&lt;/div&gt;</summary>
		<author><name>Maciek</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=WnioskowanieStatystyczne/_Testowanie_hipotez&amp;diff=11336</id>
		<title>WnioskowanieStatystyczne/ Testowanie hipotez</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=WnioskowanieStatystyczne/_Testowanie_hipotez&amp;diff=11336"/>
		<updated>2025-05-12T10:00:46Z</updated>

		<summary type="html">&lt;p&gt;Maciek: /* Zadanie: Porównanie lekarstwa i placebo */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Testowanie hipotez dotyczących jednej lub dwóch populacji ==&lt;br /&gt;
===Wstęp===&lt;br /&gt;
Schemat weryfikowania hipotez omówiony jest w wykładzie [[WnioskowanieStatystyczne/Weryfikacja hipotez |Weryfikacja hipotez statystycznych]]. Tu przypomnimy tylko krótko podstawowe pojęcia i decyzje, które trzeba pojąć w procedurze weryfikacji.&lt;br /&gt;
====Hipoteza zerowa i alternatywna====&lt;br /&gt;
Podstawą sukcesu w statystycznym testowaniu hipotez jest prawidłowe ich sformułowanie. &lt;br /&gt;
Hipotezy muszą być rozłączne. Najczęściej jako hipotezę zerową przyjmujemy zdanie, które chcemy odrzucić, &lt;br /&gt;
gdyż błąd takiej decyzji można kontrolować. Logika testowania jest następująca: tworzymy &lt;br /&gt;
funkcję od zmiennych losowych, dla której przy spełnieniu przez owe zmienne hipotezy zerowej potrafimy &lt;br /&gt;
podać prawdopodobieństwa z jakimi przyjmuje ona różne wartości. Ta funkcja nazywana jest ''statystyką''. &lt;br /&gt;
Następnie obliczamy wartość tej funkcji dla badanej próby. Jeśli prawdopodobieństwo osiągnięcia otrzymanej &lt;br /&gt;
bądź jeszcze bardziej ekstremalnej wartości statystyki jest niskie to wątpimy, że nasze dane są zgodne&lt;br /&gt;
z hipotezą zerową i jesteśmy skłonni przyjąć hipotezę alternatywną.&lt;br /&gt;
&lt;br /&gt;
====Wybór statystyki====&lt;br /&gt;
Wybierając statystykę można posłużyć się następującym schematem:&lt;br /&gt;
* Jeżeli znamy rozkład prawdopodobieństwa, z którego pochodzą nasze dane, lub umiemy je przetransformować do znanego rozkładu, to wybierzemy klasyczny test parametryczny np. test ''t'' ([http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.mstats.ttest_rel.html ttest_rel], [http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.ttest_ind.html ttest_ind]), &amp;lt;math&amp;gt;\chi^2&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; itp.&lt;br /&gt;
* Jeżeli nie znamy rozkładu prawdopodobieństwa naszych danych albo nie chcemy nic o nim zakładać to mamy dwie możliwości: &lt;br /&gt;
** korzystamy z klasycznego [[WnioskowanieStatystyczne/Test_Wilcoxona|testu nieparametrycznego]] np.:&lt;br /&gt;
&amp;lt;!--http://mail.scipy.org/pipermail/scipy-user/2009-July/021679.html--&amp;gt;&lt;br /&gt;
**; test Wilcoxona dla obserwacji sparowanych: testuje hipotezę zerową, że dwie próby &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, które ze sobą porównujemy pochodzą z tej samej populacji ciągłej (przekłada się to na równość dystrybuant). Próby &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; '''są''' sparowane. W pythonie mamy ten test zaimplementowany jako: [http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.wilcoxon.html &amp;lt;tt&amp;gt;scipy.stats.wilcoxon(x, y=None)&amp;lt;/tt&amp;gt;]. Ta implementacja stosuje przybliżenie dużych prób i zalecana jest dla &amp;lt;math&amp;gt;n&amp;gt;20&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;!--    Calculate the Wilcoxon signed-rank test&lt;br /&gt;
&lt;br /&gt;
    The Wilcoxon signed-rank test tests the null hypothesis that two related samples come from the same distribution. It is a a non-parametric version of the paired T-test.&lt;br /&gt;
    Parameters:	&lt;br /&gt;
    x : array_like&lt;br /&gt;
        The first set of measurements&lt;br /&gt;
    y : array_like, optional, default None&lt;br /&gt;
        The second set of measurements. If y is not given, then the x array is considered to be the differences between the two sets of measurements.&lt;br /&gt;
    Returns:	&lt;br /&gt;
    z-statistic : float&lt;br /&gt;
        The test statistic under the large-sample approximation that the signed-rank statistic is normally distributed.&lt;br /&gt;
    p-value : float&lt;br /&gt;
        The two-sided p-value for the test&lt;br /&gt;
    Notes&lt;br /&gt;
    Because the normal approximation is used for the calculations, the samples used should be large. A typical rule is to require that n &amp;gt; 20.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
scipy.stats.ranksums(x, y)&lt;br /&gt;
&lt;br /&gt;
    Compute the Wilcoxon rank-sum statistic for two samples.&lt;br /&gt;
&lt;br /&gt;
    The Wilcoxon rank-sum test tests the null hypothesis that two sets of measurements are drawn from the same distribution. The alternative hypothesis is that values in one sample are more likely to be larger than the values in the other sample.&lt;br /&gt;
&lt;br /&gt;
    This test should be used to compare two samples from continuous distributions. It does not handle ties between measurements in x and y. For tie-handling and an optional continuity correction see `stats.mannwhitneyu`_&lt;br /&gt;
    Parameters:	&lt;br /&gt;
&lt;br /&gt;
    x,y : array_like&lt;br /&gt;
&lt;br /&gt;
        The data from the two samples&lt;br /&gt;
&lt;br /&gt;
    Returns:	&lt;br /&gt;
&lt;br /&gt;
    z-statistic : float&lt;br /&gt;
&lt;br /&gt;
        The test statistic under the large-sample approximation that the rank sum statistic is normally distributed&lt;br /&gt;
&lt;br /&gt;
    p-value : float&lt;br /&gt;
&lt;br /&gt;
        The two-sided p-value of the test&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
**; test Manna-Whitney'a : testuje hipotezę zerową, że dwie próby &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, które ze sobą porównujemy pochodzą z tej samej populacji ciągłej. Próby &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; i&amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; '''nie są''' sparowane. Implementacja w pyhtonie: [http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.mannwhitneyu.html &amp;lt;tt&amp;gt;scipy.stats.mannwhitneyu(x, y, use_continuity=True)&amp;lt;/tt&amp;gt;] stosuje przybliżenia i zalecana jest dla &amp;lt;math&amp;gt;n&amp;gt;20&amp;lt;/math&amp;gt; w każdej z prób. Funkcja zwraca wartość ''p'' dla hipotezy jednostronnej. Jeśli testujemy hipotezę dwustronną trzeba otrzymane ''p'' pomnożyć przez 2.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
scipy.stats.mannwhitneyu(x, y, use_continuity=True)¶&lt;br /&gt;
&lt;br /&gt;
    Computes the Mann-Whitney rank test on samples x and y.&lt;br /&gt;
    Parameters:	&lt;br /&gt;
    x, y : array_like&lt;br /&gt;
        Array of samples, should be one-dimensional.&lt;br /&gt;
    use_continuity : bool, optional&lt;br /&gt;
        Whether a continuity correction (1/2.) should be taken into account. Default is True.&lt;br /&gt;
    Returns:	&lt;br /&gt;
    u : float&lt;br /&gt;
        The Mann-Whitney statistics.&lt;br /&gt;
    prob : float&lt;br /&gt;
        One-sided p-value assuming a asymptotic normal distribution.&lt;br /&gt;
    Notes&lt;br /&gt;
    Use only when the number of observation in each sample is &amp;gt; 20 and you have 2 independent samples of ranks. Mann-Whitney U is significant if the u-obtained is LESS THAN or equal to the critical value of U.&lt;br /&gt;
&lt;br /&gt;
    This test corrects for ties and by default uses a continuity correction. The reported p-value is for a one-sided hypothesis, to get the two-sided p-value multiply the returned p-value by 2.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
** wytwarzamy rozkład statystyki na podstawie naszych danych przez repróbkowanie ([[WnioskowanieStatystyczne/Bootstrap|bootstrap]] lub [[WnioskowanieStatystyczne/Testy_permutacyjne| permutacje]]). W podejściu repróbkowania tworzymy statystyczny model badanego procesu '''zgodny z hipotezą zerową''' i następnie badamy w drodze symulacji prawdopodobieństwa generowania przez ten model interesujących nas sytuacji. Największą uwagę musimy tu poświęcić na prawidłowe sformułowanie modelu, a następnie precyzyjne określenie prawdopodobieństwo jakiego zdarzenia nas naprawdę interesuje.&lt;br /&gt;
&lt;br /&gt;
===Poziom istotności &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; i wartość &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;===&lt;br /&gt;
; Błąd pierwszego rodzaju : błąd polegający na odrzuceniu hipotezy zerowej, która w rzeczywistości jest prawdziwa. Oszacowanie prawdopodobieństwa popełnienia błędu pierwszego rodzaju oznaczamy symbolem &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; i nazywamy poziomem istotności testu.&lt;br /&gt;
; Błąd drugiego rodzaju : polegaja na nieodrzuceniu hipotezy zerowej, która jest w rzeczywistości fałszywa. Oszacowanie prawdopodobieństwo popełnienia błędu drugiego rodzaju oznaczamy symbolem &amp;lt;math&amp;gt; \beta&amp;lt;/math&amp;gt;, a jego dopełnienie do jedności nazywane jest '''mocą testu'''.&lt;br /&gt;
&lt;br /&gt;
Wartość &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; jest to wartość prawdopodobieństwa, że wobec posiadanych danych  hipoteza zerowa jest prawdziwa. Jest ono obliczane jako prawdopodobieństwo zaobserwowania wartości ''statystyki'' takiej jak dla badanej próby, lub bardziej ekstremalnej, przy prawdziwej hipotezie zerowej.&lt;br /&gt;
Najczęściej porównujemy ''p'' z wcześniej ustalonym poziomem istotności &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;. Poziom istotności &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; to wartość krytyczna prawdopodobieństwa, taka że jeżeli &amp;lt;math&amp;gt; p&amp;lt; \alpha&amp;lt;/math&amp;gt; to odrzucamy hipotezę zerową.&lt;br /&gt;
&lt;br /&gt;
==Formułowanie hipotez==&lt;br /&gt;
===Przykład: mutacje muszek owocowych===&lt;br /&gt;
Załóżmy, że badamy muszki owocowe. W standardowej populacji proporcja samic do samców jest 1:1. Opracowaliśmy metodę powodującą taką mutację muszek owocowych, że potomstwo ich nie będzie miało jednakowej szansy na bycie samcem lub samiczką. W pierwszych 20 zbadanych przypadkach uzyskujemy 14 samców i 6 samiczek.&lt;br /&gt;
; Pytanie naukowe: Czy wyniki eksperymentu potwierdzają, że nasza metoda zaburza proporcję płci?&lt;br /&gt;
Najpierw musimy przetłumaczyć pytanie naukowe na pytanie statystyczne. &lt;br /&gt;
; Pytanie statystyczne: Jakie jest prawdopodobieństwo uzyskania zaobserwowanej proporcji (14:6), lub bardziej ekstremalnej w próbie 20 osobników,  jeśli rzeczywista proporcja płci jest 1:1?&lt;br /&gt;
&lt;br /&gt;
Z tego pytania wynikają dwie możliwe hipotezy:&lt;br /&gt;
* Hipoteza zerowa: Nowa metoda nie zaburza proporcji płci 1:1. Zaobserwowana próbka pochodzi z populacji, w której proporcja płci ''jest'' 1:1&lt;br /&gt;
* Hipoteza alternatywna: Zaobserwowana próbka pochodzi z populacji, w której proporcja płci ''nie jest'' 1:1.&lt;br /&gt;
; Prawdopodobieństwo, które musimy oszacować: Jakie jest prawdopodobieństwo uzyskania 14 lub więcej jedynek w serii 20 prób, jeśli prawdopodobieństwo jedynki jest &amp;lt;math&amp;gt;1/2&amp;lt;/math&amp;gt;?  &lt;br /&gt;
# Oznaczmy 1: samiec 0: samiczka.&lt;br /&gt;
# Zróbmy wektor 20-elementowy zawierający 10 zer i 10 jedynek.&lt;br /&gt;
# Wylosujmy ze zwracaniem nowy wektor 20-elementowy. (Jest to nasz model uzyskiwania 20 elementowej próbki z populacji o proporcji 1:1.) Zapamiętajmy liczbę jedynek.&lt;br /&gt;
# Powtórzmy poprzedni krok 1000 razy&lt;br /&gt;
# Zróbmy histogram ilości jedynek.&lt;br /&gt;
# Policzmy ile razy zdarzyło sie 14 lub więcej jedynek (to odpowiada 14 lub więcej samców) i dodajmy do tego ilość przypadków gdy mieliśmy 6 lub mniej jedynek (to odpowiada 14 lub więcej samiczek). Wynik podzielmy przez ilość losowań (1000).&lt;br /&gt;
&lt;br /&gt;
Powyższa procedura opisuje test dwustronny. Testu dwustronnego musimy użyć jeśli nie mamy ''istotnych'' powodów, żeby wierzyć, że nowa metoda działa ''jedynie na zwiększenie'' szansy pojawienia się samca.&lt;br /&gt;
&lt;br /&gt;
Jak powyższy problem rozwiązać w sposób parametryczny? &lt;br /&gt;
Próby podlegają rozkładowi dwumianowemu, można więc obliczyć szukane prawdopodobieństwo korzystając z jego dystrybuanty.&lt;br /&gt;
&lt;br /&gt;
==Testowanie hipotez na temat średniej==&lt;br /&gt;
Firma rozwożąca przesyłki po mieście deklaruje średni czas dostarczenia 28 minut. Przeprowadźmy test tej hipotezy na poziomie istotności 5%.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_0: \mu = 28&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;H_1: \mu \ne 28&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wybieramy losową próbę 100 przesyłek, mierzymy czas dostarczenia, liczymy średnią z próby &amp;lt;math&amp;gt;\bar x = 31,5&amp;lt;/math&amp;gt; minut i odchylenie standardowe próby &amp;lt;math&amp;gt;s = 5&amp;lt;/math&amp;gt; minut. &lt;br /&gt;
&lt;br /&gt;
Test ten można przeprowadzić z użyciem przedziałów ufności:&lt;br /&gt;
* Konstruujemy przedziały ufności 95% dla średniej &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.Formalnie, ponieważ wyliczyliśmy odchylenie standardowe z próby powinniśmy zastosować wartości krytyczne z rozkładu t. Rozmiar próby wynosi 100 więc rozkład t ma 99 stopni swobody. Wartość krytyczna w tym rozkladzie to &amp;lt;math&amp;gt;t_{97.5} =  1.984 &amp;lt;/math&amp;gt;. Mamy zatem:&lt;br /&gt;
&amp;lt;math&amp;gt;\bar x \pm 1,984 \frac{s}{\sqrt{n}} = 31,5 \pm 1,984*\frac{5}{\sqrt{100}} = 31,5 \pm 0,992 = [30,51 \quad 32,49]&amp;lt;/math&amp;gt;&lt;br /&gt;
* Wnioskowanie: Możemy więc być na 95% pewni, że nieznana średnia leży pomiędzy 30,51 a 32,49 a więc na 95% nie leży poza tym przedziałem. &lt;br /&gt;
Skoro &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; podaje &amp;lt;math&amp;gt;\mu = 28&amp;lt;/math&amp;gt; (poza przedziałem), możemy odrzucić tę hipotezę.  Jeśli &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; jest prawdziwe, istnieje prawdopodobieństwo 0,05, że skonstruowany przedział nie będzie zawierał &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. Istnieje zatem prawdopodobieństwo 0,05 popełnienia błądu I-go rodzaju. Mówimy, że przeprowadziliśmy test na poziomie istotności 0,05.&lt;br /&gt;
&lt;br /&gt;
Test można też przeprowadzić następująco:&lt;br /&gt;
* Jako statystykę wybieramy &amp;lt;math&amp;gt;t = \frac{\bar x - \mu}{s/\sqrt{n}} &amp;lt;/math&amp;gt;&lt;br /&gt;
* Obliczmy jej wartość dla danych z próby: &amp;lt;math&amp;gt;t = \frac{\bar x - \mu}{s/\sqrt{n}}  = (31,5 -28)/(5/\sqrt{100}) = 7 &amp;lt;/math&amp;gt;&lt;br /&gt;
* Porównujemy otrzymaną wartość z wartością krytyczna dla przyjętego poziomu istotności &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;. Konstuowany przez nas test ma być testem dwustronnym więc musimy wziąć do porównania wartość krytyczna dla &amp;lt;math&amp;gt;\alpha/2&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt; t_{\alpha/2} = t_{0,025}= -1,984&amp;lt;/math&amp;gt;&lt;br /&gt;
* Wnioskowanie: Dla naszej próby otrzymaliśmy wartość statystyki równą 6.96. Dla przyjętego poziomu istotności wartość statystyki wynosi 1,984. Prawdopodobieństwo zaobserwowania statystyki o wartości 7 lub bardziej ekstremalnej (tu: większej) jest mniejsze niż założony poziom istotności więc odrzucamy &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; na poziomie &amp;lt;math&amp;gt;\alpha = 0,05&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Testowanie hipotez na temat wariancji==&lt;br /&gt;
&lt;br /&gt;
Do testowania hipotez na temat wariancji używamy statystyki chi-kwadrat o &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; stopniach swobody:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\chi^2 = \frac{(n-1)s^2}{\sigma_0^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\sigma_0^2&amp;lt;/math&amp;gt; jest wartością wariancji podaną w &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
===Przykład===&lt;br /&gt;
Do produkcji baterii używane są metalowe płytki o średniej średnicy 5 mm. Jeśli wariancja średnicy płytki jest nie większa niż 1 mm&amp;lt;math&amp;gt;^2&amp;lt;/math&amp;gt;, produkcja jest kontynuowana. Jeśli wariancja przekracza 1 mm&amp;lt;math&amp;gt;^2&amp;lt;/math&amp;gt; proces produkcji trzeba przerwać. Kontroler przeprowadza test na poziomie istotności &amp;lt;math&amp;gt;\alpha = 5&amp;lt;/math&amp;gt;%: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_0:&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\sigma^2 \le 1&amp;lt;/math&amp;gt; i &lt;br /&gt;
&amp;lt;math&amp;gt;H_1:&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\sigma^2 &amp;gt; 1&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Wybiera losową próbę 31 płytek i znajduje wariancję próby &amp;lt;math&amp;gt;s^2 = 1,62&amp;lt;/math&amp;gt;. Czy daje to podstawy do przerwania produkcji?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\chi^2 = \frac{(31-1) \cdot 1,62}{1} = 48,6&amp;lt;/math&amp;gt;. Znajdujemy poziom &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; dla tej wartości &amp;lt;math&amp;gt;\chi^2&amp;lt;/math&amp;gt; z 30 stopniami swobody. &lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
p = 1-st.chi2.cdf(48.6,30)&lt;br /&gt;
print(p)&lt;br /&gt;
&lt;br /&gt;
#ilustracja&lt;br /&gt;
x = py.arange(0,60,1)  &lt;br /&gt;
py.plot(x, st.chi2.pdf(x,30)) #rysujemy funkcję gęstości prawdopodobieństwa chi2 o 30 st. swobody&lt;br /&gt;
x2 = py.arange(48.8,60,1)&lt;br /&gt;
py.fill_between(x2,st.chi2.pdf(x2,30)) #cieniujemy obszar pod funkcją geęstości prawdopodobieństwa odpowiadający obliczonemu p&lt;br /&gt;
&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Otrzymaliśmy &amp;lt;math&amp;gt; p = 0,017 &amp;lt;/math&amp;gt;.&lt;br /&gt;
Wniosek:  Odrzucamy &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Błąd drugiego rodzaju. Moc testu.==&lt;br /&gt;
Błąd II-go rodzaju popełniamy wtedy gdy przyjmujemy &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; a prawdziwe jest &amp;lt;math&amp;gt;H_1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Przykład===&lt;br /&gt;
Załóżmy następujący test:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_0: \mu = 60&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_1: \mu = 65&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Niech rozmiar próby wynosi &amp;lt;math&amp;gt;n = 100&amp;lt;/math&amp;gt; a odchylenie standardowe w populacji &amp;lt;math&amp;gt;\sigma = 20&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Powinniśmy tu zastosować test jednostronny (mamy tylko dwie możliwości: &amp;lt;math&amp;gt;\mu = 60&amp;lt;/math&amp;gt; lub &amp;lt;math&amp;gt;65&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
Znajdźmy punkt krytyczny &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; dla poziomu istotności &amp;lt;math&amp;gt;\alpha =  0,05&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;C = \mu_0 + 1,645\frac{\sigma}{\sqrt{n}} = 60 + 1,645(20/10) = 63,29&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Błąd pierwszego rodzaju popełnimy gdy &amp;lt;math&amp;gt;\bar x &amp;gt; C&amp;lt;/math&amp;gt; i prawdziwe będzie &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt;. Prawdopodobieństwo błędu pierwszego rodzaju ustaliliśmy z góry na poziomie &amp;lt;math&amp;gt;\alpha = 0,05&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\alpha = P(\bar x &amp;gt; C| \mu = \mu_0)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Błąd drugiego rodzaju popełnimy gdy &amp;lt;math&amp;gt;\bar x &amp;lt; C&amp;lt;/math&amp;gt; a prawdziwe będzie &amp;lt;math&amp;gt;H_1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Prawdopodobieństwo popełnienia tego błędu wynosi:&lt;br /&gt;
&amp;lt;math&amp;gt;\beta = P(\bar x &amp;lt; C| \mu = \mu_1) = P\left( \frac{\bar x - \mu_1}{\sigma/\sqrt{n}}  &amp;lt; \frac{C - \mu_1}{\sigma/\sqrt{n}}\right)= &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;= P\left( Z &amp;lt; \frac{63,29 - 65}{20/10}\right)  = P(Z &amp;lt; -0,855) = 0,1963&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Moc testu jest dopełnieniem błędu II rodzaju.&lt;br /&gt;
A moc testu czyli prawdopodobieństwo odrzucenia hipotezy zerowej podczas gdy jest ona fałszywa wynosi:&lt;br /&gt;
&amp;lt;math&amp;gt;1 - \beta = 0,8037&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Porównanie dwóch populacji==&lt;br /&gt;
[[WnioskowanieStatystyczne/Test_t#Test_t_.28Studenta.29_r.C3.B3.C5.BCnicy_.C5.9Brednich|Dla przypomnienia]]:&lt;br /&gt;
Jeśli mamy dwie próbki danych:&lt;br /&gt;
:&amp;lt;math&amp;gt;x_1&amp;lt;/math&amp;gt; o liczebności &amp;lt;math&amp;gt;n_1&amp;lt;/math&amp;gt; i estymowanej wariancji &amp;lt;math&amp;gt;s_1^2&amp;lt;/math&amp;gt; i &lt;br /&gt;
:&amp;lt;math&amp;gt;x_2&amp;lt;/math&amp;gt; o liczebności &amp;lt;math&amp;gt;n_2&amp;lt;/math&amp;gt; i estymowanej wariancji &amp;lt;math&amp;gt;s_2^2&amp;lt;/math&amp;gt;  &lt;br /&gt;
:gdzie &amp;lt;math&amp;gt;s_{i}^2= \frac{1}{(n_i-1)}\sum\limits_{j=1}^{n_i} (x_{j}-\overline{x}_{i})^{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
pochodzących z rozkładu normalnego o takiej samej wariancji &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; to:&lt;br /&gt;
*wspólna wariancja może być estymowana jako: &amp;lt;math&amp;gt;s^2=\frac{(n_1-1)s_1^2+(n_2-1)s_2^2}{n_1+n_2-2} &amp;lt;/math&amp;gt;&lt;br /&gt;
*wariancja różnicy średnich może być estymowana jako: &amp;lt;math&amp;gt;s_{\Delta}^2=s_{\bar{x}_1}^2+s_{\bar{x}_2}^2=\frac{1}{n_1}s_1^2+\frac{1}{n_2}s_2^2 = \frac{n_1+n_2}{n_1n_2}s^2&amp;lt;/math&amp;gt;&lt;br /&gt;
Jeśli postawimy hipotezę zerową: &amp;lt;math&amp;gt;H_0:\; \mu_1 = \mu_2&amp;lt;/math&amp;gt; to&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
t= \frac{\bar{x}_1-\bar{x}_2}{s_{\Delta}}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
pochodzi z rozkładu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; o &amp;lt;math&amp;gt;n_1+n_2-2&amp;lt;/math&amp;gt; stopniach swobody.&lt;br /&gt;
&lt;br /&gt;
===Przykład: promocja===&lt;br /&gt;
Producent odtwarzaczy CD chce sprawdzić czy małe obniżenie ceny produktu wpłynie korzystnie na sprzedaż. Losowa próba 15 tygodni sprzedaży przed obniżką dała średni dochód 6598 zł i standardowe odchylenie 844 zł. Losowa próba 12 tygodni sprzedaży w trakcie promocji dała średnią 6870 i odchylenie standardowe 669 zł. Czy dane te wykazują poprawę sprzedaży w trakcie promocji (przyjąć poziom istotności 5%) ?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\bar{x}_1 = 6598&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\bar{x}_2 = 6870&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Treść zadania odpowiada testowi jednostronnemu z poniższymi hipotezami:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_0: \mu_1 = \mu_2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_1: \mu_1 &amp;lt; \mu_2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Różnica średnich wynosi:&lt;br /&gt;
&amp;lt;math&amp;gt;\bar{x}_1-\bar{x}_2 = 6598 - 6870 = -272 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Estymowana wariancja różnicy średnich:&lt;br /&gt;
&amp;lt;math&amp;gt;s_{\Delta}^2 =  \frac{1}{n_1}s_1^2+\frac{1}{n_2}s_2^2 = \frac{844^2}{15} + \frac{669^2}{12} = 84785,82&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
zatem:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;s_{\Delta} = 291,18&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; t = -272/ 291,18 = - 0,934&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ilość stopni swobody: &amp;lt;math&amp;gt;n_1+n_2-2 = 25&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;P(t_{25} \le -0,934) = 0.18 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wniosek: Nie możemy odrzucić &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt;. Nie mamy podstaw by uznać że mała obniżka cen poprawiła sprzedaż.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Do testowania równości wariancji w dwóch populacjach stosuje się test &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;F_{(n1 -1, n2 - 1)} = \frac{s_1^2}{s_2^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
W przykładzie powyżej założyliśmy równość wariancji. Korzystając z testu &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; sprawdzić czy założenie było uzasadnione.&lt;br /&gt;
&lt;br /&gt;
==Badanie założenia o normalności rozkładu==&lt;br /&gt;
We wszystkich wspomnianych powyżej klasycznych testach statystycznych &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\chi^2&amp;lt;/math&amp;gt; istotnym założeniem jest to, że dane wejściowe w próbie mają rozkład normalny. W powyższych zadaniach po prostu to zakładaliśmy, ale w praktyce, kiedy dostajemy próbę do analizy, musimy sami sprawdzić,  czy możemy uznać ją za pochodzącą z rozkładu normalnego. Do weryfikacji takiej hipotezy służą narzędzia graficzne:&lt;br /&gt;
&lt;br /&gt;
=== Histfit: histogram z naniesionym fitem rozkładu normalnego ===&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
def histfit(x,N_bins):  &lt;br /&gt;
''' &lt;br /&gt;
x - dane&lt;br /&gt;
N_bins -ilość binów w histogramie&lt;br /&gt;
&lt;br /&gt;
Funkcja rysuje histogram i na jego tle dorysowuje wykres &lt;br /&gt;
funkcji gęstości prawdopodobieństwa rozkładu normalnego &lt;br /&gt;
o średniej i wariancji estymowanych z x.&lt;br /&gt;
&lt;br /&gt;
Funkcja wymaga zaimportowania modułów pylab as py i scipy.stats as st''' &lt;br /&gt;
 &lt;br /&gt;
	n, bins, patches = py.hist(x, N_bins, density=True, facecolor='green', alpha=0.75)&lt;br /&gt;
	# Rysujemy histogram i w jawny sposób odbieramy zwracane przez p.hist obiekty&lt;br /&gt;
	#   - normujemy histogram do jedności&lt;br /&gt;
	#   - ustalamy kolor prostokątów na zielony&lt;br /&gt;
	#   - ustawiamy przezroczystość prostokątów na 0.75&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	bincenters = 0.5*(bins[1:]+bins[:-1])&lt;br /&gt;
	# wytwarzamy tablicę z centrami binów korzystając z granic binów&lt;br /&gt;
	# zwróconych przez py.hist w macierzy bins&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	y = st.norm.pdf( bincenters, loc = np.mean(x), scale = np.std(x))&lt;br /&gt;
	# obliczamy momenty rozkładu x: średnią i wariancję (tak naprawdę to jej pierwiastek czyli standardowe odchylenie)&lt;br /&gt;
	# obliczamy wartości w normalnym rozkładzie gęstości prawdopodobieństwa&lt;br /&gt;
	# o średniej np.mean(x) i standardowym odchyleniu np.std(x) dla wartości bincenters&lt;br /&gt;
 &lt;br /&gt;
	l = py.plot(bincenters, y, 'r--', linewidth=1)&lt;br /&gt;
	# do histogramu dorysowujemy linię &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Normplot ===&lt;br /&gt;
Jest to wykres wartości w próbie, wzg. prawdopodobieństwa uzyskania takiej wartości w rozkładzie normalnym. Wykres ten jest szczególnym przypadkiem kwantylowego wykresu prawdopodobieństwa [http://en.wikipedia.org/wiki/Q-Q_plot]. Konstruuje się go następująco: &lt;br /&gt;
*Na osi pionowej odkładamy uporządkowane zaobserwowane wartości &amp;lt;math&amp;gt;x_1 \le x_2 \le \dots \le x_n &amp;lt;/math&amp;gt;. Estymują one położenie kwantyli w populacji.&lt;br /&gt;
*Na osi poziomej odkładamy położenia kwantyli w rozkładzie normalnym. Obliczamy je: &amp;lt;math&amp;gt;F^{-1}\left(\frac{i-r_{pop}}{n+n_{pop}} \right)&amp;lt;/math&amp;gt; gdzie &amp;lt;math&amp;gt;F^{-1}&amp;lt;/math&amp;gt; jest funkcją odwrotną do dystrybuanty rozkładu teoretycznego (w tym szczególnym przypadku normalnego) &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; jest numerem obserwacji a &amp;lt;math&amp;gt;r_{pop}, n_{pop}&amp;lt;/math&amp;gt; są czynnikami (&amp;lt;math&amp;gt;\le 0.5 &amp;lt;/math&amp;gt;) zapewniającymi, że argument funkcji odwrotnej do dystrybuanty nie przyjmuje wartości 0 ani 1. &lt;br /&gt;
Jeśli dane ''x'' podlegają rozkładowi normalnemu to ich położenia kwantyli powinny być zgodne z położeniami kwantyli w rozkładzie normalnym, zatem wykres powinien przedstawiać linię prostą. Odstępstwa od prostej świadczą o odstępstwie od rozkładu normalnego.&lt;br /&gt;
W pythonie możemy ten typ wykresu zaimplementować np. tak (współczynniki zaczerpnięte z [http://www.itl.nist.gov/div898/handbook/eda/section3/normprpl.htm]):&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
def normplot(x):&lt;br /&gt;
	'''normplot: x dane do testowania'''&lt;br /&gt;
	x_ord = sorted(x)&lt;br /&gt;
	N = len(x)&lt;br /&gt;
	y = np.zeros(N)&lt;br /&gt;
	y[0]=st.norm.ppf(1- 0.5**(1.0/N) )&lt;br /&gt;
	y[N-1] = st.norm.ppf(0.5**(1.0/N) )&lt;br /&gt;
	for i in range(1,N-1):&lt;br /&gt;
		arg = float(i-0.3175)/(N+0.365)&lt;br /&gt;
		y[i] = st.norm.ppf(arg)&lt;br /&gt;
	py.plot(y,x_ord,'.')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Test Shapiro-Wilka ===&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;W,p = st.shapiro(x)&amp;lt;/source&amp;gt;&lt;br /&gt;
Funkcja ta zwraca wartość statystyki ''W'' i prawdopodobieństwo ''p''  zaobserwowania takiej lub bardziej ekstremalnej wartości statystyki ''W'' dla danych podlegających rozkładowi normalnemu. Jeśli ''p'' ma wysoką wartość (większą niż przyjęta &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;) to nie możemy odrzucić hipotezy, że dane podlegają  rozkładowi normalnemu. Test Shapiro-Wilka nie jest wrażliwy na parametry rozkładu, z którego pochodzą dane (dane mogą pochodzić z rozkładu o dowolnej średniej i dowolnym odchyleniu standardowym).&lt;br /&gt;
&lt;br /&gt;
=== Test Kołmogorowa-Smirnowa ===&lt;br /&gt;
Jest on oparty  na badaniu maksymalnej różnicy pomiędzy dystrybuantą empiryczną (z próby) a teoretyczną dystrybuantą rozkładu. Dla testowania normalności próby powinniśmy wywołać &lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
D , p = st.kstest(x, 'norm', args=(np.mean(x),np.std(x,ddof=1)) #sposób zalecany&lt;br /&gt;
#lub &lt;br /&gt;
D , p = st.kstest((x-np.mean(x))/np.std(x,ddof=1), 'norm') #sposób niezalecany, ale również prawidłowy&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Funkcja zwraca wartość statystyki ''D'' i prawdopodobieństwo zaobserwowania takiej bądź bardziej ekstremalnej wartości statystyki jeśli testowane dane pochodzą z tego samego rozkładu. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;'''UWAGA!''' Test Kołmogorowa-Smirnowa '''jest wrażliwy na parametry rozkładu''', z którego pochodzą dane. Wywołanie poniższego kodu jest błędem:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
D , p = st.kstest(x, 'norm') #BŁĘDNE użycie testu Kołmogorowa-Smirnowa&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Test dla innych postaci rozkładu====&lt;br /&gt;
Za pomocą testu Kołmogorowa-Smirnowa możemy zbadać również założenie o pochodzeniu danych z populacji podlegającej dowolnemu innemu rozkładowi ciągłemu. W tym celu należy podać zamiast 'norm' odpowiednią nazwę rozkładu z modułu scipy.stats oraz parametry tegoż rozkładu w odpowiedniej kolejności (należy w tym celu zajrzeć do dokumentacji). Przykład jak to należy zrobić dla rozkładu wykładniczego:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
D , p = st.kstest(x, 'expon', args=(0, 1/np.mean(x)) #test, czy dane podlegają rozkładowi wykładniczemu&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Przykład===&lt;br /&gt;
Proszę wygenerować 1000 liczb z rozkładu normalnego. Liczby te obejrzyjmy na wykresach &amp;lt;tt&amp;gt;histfit&amp;lt;/tt&amp;gt; oraz &amp;lt;tt&amp;gt;normplot&amp;lt;/tt&amp;gt; i zbadamy ich normalność testem  Shapiro-Wilka i Kołmogorova-Smirnova. &lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
 &lt;br /&gt;
def normplot(x):&lt;br /&gt;
	'''normplot: x dane do testowania'''&lt;br /&gt;
	x_ord = sorted(x)&lt;br /&gt;
	N = len(x)&lt;br /&gt;
	y = np.zeros(N)&lt;br /&gt;
	y[0]=st.norm.ppf(1- 0.5**(1.0/N) )&lt;br /&gt;
	y[N-1] = st.norm.ppf(0.5**(1.0/N) )&lt;br /&gt;
	for i in range(1,N-1):&lt;br /&gt;
		arg = float(i-0.3175)/(N+0.365)&lt;br /&gt;
		y[i] = st.norm.ppf(arg)&lt;br /&gt;
	py.plot(y,x_ord,'.')&lt;br /&gt;
 &lt;br /&gt;
def histfit(x,N_bins):  &lt;br /&gt;
	''' funkcja rysuje histogram i na jego tle dorysowuje wykres &lt;br /&gt;
	funkcji gęstości prawdopodobieństwa rozkładu normalnego &lt;br /&gt;
	o średniej i wariancji estymowanych z x &lt;br /&gt;
	Funkcja wymaga zaimportowania modułów pylab as py i scipy.stats as st'''  &lt;br /&gt;
	n, bins, patches = py.hist(x, N_bins, normed=True, facecolor='green', alpha=0.75)&lt;br /&gt;
	bincenters = 0.5*(bins[1:]+bins[:-1]) &lt;br /&gt;
	y = st.norm.pdf( bincenters, loc = np.mean(x), scale = np.std(x,ddof=1)) &lt;br /&gt;
	l = py.plot(bincenters, y, 'r--', linewidth=1)&lt;br /&gt;
def porownania(x):&lt;br /&gt;
	py.subplot(2,2,1)&lt;br /&gt;
	normplot(x)&lt;br /&gt;
	py.subplot(2,2,2)&lt;br /&gt;
	histfit(x,15)&lt;br /&gt;
	W,p_sw = st.shapiro(x)&lt;br /&gt;
	D,p_ks = st.kstest(x, 'norm', args=(np.mean(x),np.std(x,ddof=1)))&lt;br /&gt;
	title = 'SW: %(sw).2f KS: %(ks).2f'%{'sw':p_sw, 'ks':p_ks}&lt;br /&gt;
	&lt;br /&gt;
	py.title(title)&lt;br /&gt;
	# wybieramy pierwsze dziesięć punktów  &lt;br /&gt;
	y=x[0:10]&lt;br /&gt;
	py.subplot(2,2,3)&lt;br /&gt;
	normplot(y)&lt;br /&gt;
	py.subplot(2,2,4)&lt;br /&gt;
	histfit(y,15)&lt;br /&gt;
	W,p_sw = st.shapiro(y)&lt;br /&gt;
	D,p_ks = st.kstest(y, 'norm', args=(np.mean(x),np.std(x,ddof=1)))&lt;br /&gt;
	title = 'SW: %(sw).2f KS: %(ks).2f'%{'sw':p_sw, 'ks':p_ks}&lt;br /&gt;
	py.title(title)&lt;br /&gt;
 &lt;br /&gt;
x = st.norm.rvs(size=1000, loc=0, scale=10)&lt;br /&gt;
py.figure(1)&lt;br /&gt;
porownania(x)&lt;br /&gt;
# A teraz zbadajmy dane z rozkładów innych niż normalny:&lt;br /&gt;
 &lt;br /&gt;
x = st.t.rvs(df = 2, size=1000, loc=0, scale=1)&lt;br /&gt;
py.figure(2)&lt;br /&gt;
porownania(x)&lt;br /&gt;
 &lt;br /&gt;
x = st.expon.rvs(size=1000,loc=0,scale=1)&lt;br /&gt;
py.figure(3)&lt;br /&gt;
porownania(x)&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Proszę zapuścić skrypt kilka razy i zwrócić uwagę na to, jak trudno jest ocenić normalność danych przy małych próbach.&lt;br /&gt;
&lt;br /&gt;
===Przykład: transformacja Boxa-Coxa===&lt;br /&gt;
Często normalność danych można poprawić przez zastosowanie odpowiedniej transformacji. Ogólną rodzinę transformacji, które często prowadzą do normalizacji danych można zapisać tak (trasformacja Box-Cox'a [http://www.jstor.org/stable/2984418]):&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y^{(\lambda)}=\left\{\begin{matrix} \frac{y^\lambda-1} {\lambda} &amp;amp; \mbox{dla }\lambda \ne 0 \\ \ln(y) &amp;amp; \mbox{dla }\lambda = 0\end{matrix}\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W module scipy.stats mamy tę transformację zaimplementowaną jako &amp;lt;tt&amp;gt;boxcox()&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Zobaczmy jej działanie na następującym przykładzie:&lt;br /&gt;
&lt;br /&gt;
Proszę pobrać i zapisać w pliku tekstowym następujące &lt;br /&gt;
[[Media:Samochody.txt| dane]]. Zawierają one 8 kolumn charakterystyk samochodów:&lt;br /&gt;
*zużycie paliwa&lt;br /&gt;
*cylindry&lt;br /&gt;
*pojemność skokowa&lt;br /&gt;
*moc w koniach mechanicznych&lt;br /&gt;
*masa&lt;br /&gt;
*przyspieszenie&lt;br /&gt;
*rocznik&lt;br /&gt;
*pochodzenie&lt;br /&gt;
&lt;br /&gt;
Proszę narysować histfit i normplot  oraz policzyć testy Shapiro-Wilka i Kolmogorowa-Smirnowa dla masy pojazdów, a następnie zastosować do niej transformację Boxa-Coxa i zbadać normalność przetransformowanych danych.&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
def normplot(x):&lt;br /&gt;
	'''normplot: x dane do testowania'''&lt;br /&gt;
	x_ord = sorted(list(x))&lt;br /&gt;
	N = len(x)&lt;br /&gt;
	y = np.zeros(N)&lt;br /&gt;
	y[0]=st.norm.ppf(1- 0.5**(1.0/N) )&lt;br /&gt;
	y[N-1] = st.norm.ppf(0.5**(1.0/N) )&lt;br /&gt;
	for i in range(1,N-1):&lt;br /&gt;
		arg = float(i-0.3175)/(N+0.365)&lt;br /&gt;
		y[i] = st.norm.ppf(arg)&lt;br /&gt;
	py.plot(y,x_ord,'.')&lt;br /&gt;
	&lt;br /&gt;
def histfit(x,N_bins):  &lt;br /&gt;
	''' funkcja rysuje histogram i na jego tle dorysowuje wykres &lt;br /&gt;
	funkcji gęstości prawdopodobieństwa rozkładu normalnego &lt;br /&gt;
	o średniej i wariancji estymowanych z x &lt;br /&gt;
	Funkcja wymaga zaimportowania modułów pylab as py i scipy.stats as st'''  &lt;br /&gt;
	n, bins, patches = py.hist(x, N_bins, normed=True, facecolor='green', alpha=0.75)&lt;br /&gt;
	bincenters = 0.5*(bins[1:]+bins[:-1]) &lt;br /&gt;
	y = st.norm.pdf( bincenters, loc = np.mean(x), scale = np.std(x)) &lt;br /&gt;
	l = py.plot(bincenters, y, 'r--', linewidth=1)&lt;br /&gt;
def porownania(x):&lt;br /&gt;
	py.subplot(2,1,1)&lt;br /&gt;
	normplot(x);&lt;br /&gt;
	py.subplot(2,1,2)&lt;br /&gt;
	histfit(x,15)&lt;br /&gt;
	W,p_sw = st.shapiro(x);&lt;br /&gt;
	D,p_ks = st.kstest(x,'norm',args=(np.mean(x),np.std(x) ))&lt;br /&gt;
	title = 'SW: %(sw).2f KS: %(ks).2f'%{'sw':p_sw, 'ks':p_ks}&lt;br /&gt;
	py.title(title)&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
dane = np.loadtxt('Samochody.txt')&lt;br /&gt;
# Badamy przyspieszenia&lt;br /&gt;
w = dane[:,5]&lt;br /&gt;
py.figure(1)&lt;br /&gt;
porownania(w)&lt;br /&gt;
# A teraz stosujemy transformację Box-Coxa&lt;br /&gt;
wt,lam = st.boxcox(w)&lt;br /&gt;
py.figure(2)&lt;br /&gt;
porownania(wt)&lt;br /&gt;
&lt;br /&gt;
# badamy masy&lt;br /&gt;
w = dane[:,4]&lt;br /&gt;
py.figure(3)&lt;br /&gt;
porownania(w)&lt;br /&gt;
# A teraz stosujemy transformację Box-Coxa&lt;br /&gt;
wt,lam = st.boxcox(w)&lt;br /&gt;
py.figure(4)&lt;br /&gt;
porownania(wt)&lt;br /&gt;
&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W pierwszym przypadku - asymetrię rozkładu przyspieszeń udało się transformacją B-C poprawić, ale w drugim przypadku, masa, asymetrię dało się skorygować (widać to na histfit) ale nie da się poprawić ''ciężkich ogonów'' - widać to zarówno na normplocie jak i na wynikach testów.&lt;br /&gt;
Ogólnie: zanim zaczniemy analizować dane dobrze jest je pooglądać na różnych wykresach i chwilę ''pomyśleć''.&lt;br /&gt;
&lt;br /&gt;
==Przykład (zastosowanie różnych testów do tych samych danych): karma==&lt;br /&gt;
Badamy dwie nowe karmy A i B. Mamy dwie grupy po 12 zwierząt. Uzyskane przyrosty masy są następujące:&lt;br /&gt;
&lt;br /&gt;
A: 31 34 29 26 32 35 38 34 31 29 32 31&lt;br /&gt;
&lt;br /&gt;
B: 26 24 28 29 30 29 31 29 32 26 28 32&lt;br /&gt;
&lt;br /&gt;
Pytanie:&lt;br /&gt;
Czy któraś z karm daje istotnie większe przyrosty masy?&lt;br /&gt;
&lt;br /&gt;
Poniżej rozwiążemy to zadanie stopniowo różnymi metodami. Kolejne kawałki kodu można dopisywać do tego samego pliku.&lt;br /&gt;
&lt;br /&gt;
ROZWIĄZANIE:&lt;br /&gt;
Przyjmujemy poziom istotności, na którym przeprowadzamy testy &amp;lt;math&amp;gt;\alpha = 0.05&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Badamy rozkłady danych:===&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
A=[ 31, 34, 29, 26, 32, 35, 38, 34, 31, 29, 32, 31];&lt;br /&gt;
B=[ 26, 24, 28, 29, 30, 29, 31, 29, 32, 26, 28, 32];&lt;br /&gt;
W, p_A = st.shapiro(A)&lt;br /&gt;
print('Dla grupy A:', p_A)&lt;br /&gt;
W, p_B = st.shapiro(B)&lt;br /&gt;
print('Dla grupy B:', p_B)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dla obu grup test Shapiro-Wilka nie daje nam podstaw do odrzucenia założenia o normalności rozkładów.&lt;br /&gt;
&lt;br /&gt;
===Test parametryczny===&lt;br /&gt;
Nie odrzuciliśmy hipotezy o normalnym rozkładzie danych zatem możemy zastosować  [[WnioskowanieStatystyczne/Test_t | test ''t'' ]] dla różnicy średnich.&lt;br /&gt;
&lt;br /&gt;
Formułujemy hipotezy:&lt;br /&gt;
* &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt;: średni przyrost masy w grupie A &amp;lt;math&amp;gt;=&amp;lt;/math&amp;gt; średni przyrost masy w grupie B&lt;br /&gt;
* &amp;lt;math&amp;gt;H_1&amp;lt;/math&amp;gt;: średni przyrost masy w grupie A &amp;lt;math&amp;gt;\ne&amp;lt;/math&amp;gt; średni przyrost masy w grupie B&lt;br /&gt;
Przeprowadzamy test:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
t, p = st.ttest_ind(A,B)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Otrzymujemy ''p'' = 0.01.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;p &amp;lt; \alpha &amp;lt;/math&amp;gt;,  zatem na przyjętym poziomie istotności odrzucamy hipotezę zerową i stwierdzamy, że grupa A ma inną średnią niż grupa B.&lt;br /&gt;
&lt;br /&gt;
===Test nieparametryczny ===&lt;br /&gt;
Nie zakładajac postaci  rozkładu danych mozemy zastosować test [[WnioskowanieStatystyczne/Test_Wilcoxona| ze statystykami opartymi na rangach]]. &lt;br /&gt;
Formułujemy hipotezy:&lt;br /&gt;
* &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt;: mediana przyrostu masy w grupie A &amp;lt;math&amp;gt;=&amp;lt;/math&amp;gt; mediana przyrostu masy w grupie B&lt;br /&gt;
* &amp;lt;math&amp;gt;H_1&amp;lt;/math&amp;gt;: mediana przyrostu masy w grupie A&amp;lt;math&amp;gt;\ne&amp;lt;/math&amp;gt; mediana przyrostu masy w grupie B&lt;br /&gt;
Przeprowadzamy test:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
U, p = st.mannwhitneyu(A, B)&lt;br /&gt;
p_dwustronne = 2*p&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
W pythonie zaimplementowana jest wersja jednostronna tego testu. Aby otrzymać prawdopodobieństwo ''p'' dla testu dwustronnego musimy pomnożyć je przez 2.&lt;br /&gt;
&lt;br /&gt;
===Testy bootstrapowe===&lt;br /&gt;
Teraz to samo sprawdzimy za pomocą testu repróbkowanego.&lt;br /&gt;
Przyda nam się tu funkcja do pobierania losowej próbki z powtórzeniami z danych:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
def randsample(x, N):&lt;br /&gt;
	'''zwraca wektor o dłougości N z losowo wybranymi elementami wektora x. Losowanie odbywa się z powtórzeniami''' &lt;br /&gt;
	n=len(x)&lt;br /&gt;
	ind = np.random.randint(n, size = N)&lt;br /&gt;
	y = x[ind]&lt;br /&gt;
	return y&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W testech repróbkowanych statystykę możemy wybrać dość dowolnie, ale jak pokażemy poniżej nie każda jest równie dobra.&lt;br /&gt;
Zgodnie z hipotezą zerową próbka A i  B pochodza z tej samej populacji.&lt;br /&gt;
Nasza najlepsza wiedza o owej populacji to połączone próbki A i B:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
POP=np.concatenate((A, B))&lt;br /&gt;
&lt;br /&gt;
N=len(POP)&lt;br /&gt;
NA=len(A)&lt;br /&gt;
NB=len(B)&lt;br /&gt;
# Zasymulujemy N_rep razy wyciagniecie z POP prob o rozmiarach NA i NB i&lt;br /&gt;
# zobaczymy jak czesto zdarzają się wartości statystyki  sie roznica srednich taka jak w oryginalnym&lt;br /&gt;
# pomiarze lub jeszcze wieksza. &lt;br /&gt;
N_rep=10000&lt;br /&gt;
# oryginalna roznica srednich i median:&lt;br /&gt;
mi_0 = np.abs(np.mean(A) - np.mean(B))&lt;br /&gt;
T_0  = np.abs(np.mean(A) - np.mean(B))/np.std(POP)&lt;br /&gt;
me_0 = np.abs(np.median(A) - np.median(B))&lt;br /&gt;
&lt;br /&gt;
mi = np.zeros(N_rep)&lt;br /&gt;
T  = np.zeros(N_rep)&lt;br /&gt;
me = np.zeros(N_rep)&lt;br /&gt;
&lt;br /&gt;
for i in range(N_rep):&lt;br /&gt;
	AA = randsample(POP,NA)&lt;br /&gt;
	BB = randsample(POP,NB)&lt;br /&gt;
	R_POP = np.concatenate((AA,BB))&lt;br /&gt;
	mi[i] = np.abs(np.mean(AA)-np.mean(BB)) # abs bo test dwustronny&lt;br /&gt;
	T[i]  = np.abs(np.mean(AA)-np.mean(BB))/np.std(R_POP)&lt;br /&gt;
	me[i] = np.abs(np.median(AA)-np.median(BB))&lt;br /&gt;
&lt;br /&gt;
p_mi = np.sum(mi&amp;gt;=mi_0)/N_rep&lt;br /&gt;
p_T  = np.sum( T&amp;gt;=T_0 )/N_rep&lt;br /&gt;
p_me = np.sum(me&amp;gt;=me_0)/N_rep&lt;br /&gt;
&lt;br /&gt;
print('testy repróbkowane: ')&lt;br /&gt;
print('rożnica średnich: ', p_mi)&lt;br /&gt;
print('pseudo T: ', p_T)&lt;br /&gt;
print('różnica median: ', p_me)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Widzimy, że dla testu ze statystyką różnicy średnich i  pseudo T dostajemy podobne wyniki, z tym, że pseudo T jest nieco silniejszy. Test ze statystyką różnicy średnich jest na tyle słaby, że nie pozwala na odrzucenie hipotezy zerowej.&lt;br /&gt;
&lt;br /&gt;
===Wnioskowanie w oparciu o przedziały ufności ===&lt;br /&gt;
Wnioskowanie o równości średnich dwóch grup można też przerowadzić w oparciu o przedziały ufności. W naszym przykładzie przedziały można skonstruować zarówno parametrycznie jak i nieparametrycznie.&lt;br /&gt;
==== Wersja parametryczna ====&lt;br /&gt;
Konstruujemy 95% przedział ufności wokół oryginalnej różnicy średnich.&lt;br /&gt;
Dla dwóch grup wariancję różnicy średnich znajdujemy sumując wariancje śrenich estymowane dla każdej z grup:&lt;br /&gt;
:&amp;lt;math&amp;gt; &lt;br /&gt;
\mathrm{var}_{\Delta} = \frac{1}{N_1}\mathrm{var}(x_1) + \frac{1}{N_2} \mathrm{var}(x_2)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
ilość stopni swobody:&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
 df = N_1+N_2-2&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
co prowadzi do estymatora&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
s^2_\Delta = \frac{N_1s_1^2 + N_2s_2^2}{N_1+N_2-2} \cdot \frac{N_1+N_2}{N_1N_2}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
roznica_oryginalna = np.mean(A) - np.mean(B)&lt;br /&gt;
f = NA+NB-2;&lt;br /&gt;
v_A = np.var(A)&lt;br /&gt;
v_B = np.var(B)&lt;br /&gt;
sig = np.sqrt( ((NA*v_A +NB*v_B))/f * (NA + NB)/(NA*NB) )&lt;br /&gt;
t_2_5 = st.t.ppf(0.025,f);&lt;br /&gt;
t_97_5 = st.t.ppf(0.975,f);&lt;br /&gt;
print('przedział ufności dla różnicy średnich przy założeniu normalności %(d).2f %(g).2f'%{'d':sig*t_2_5+ roznica_oryginalna,'g':sig*t_97_5+roznica_oryginalna})&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Otrzymujemy w wyniku &amp;lt;tt&amp;gt;przedział ufności dla różnicy średnich przy założeniu normalności 0.77 5.56&amp;lt;/tt&amp;gt;. Oznacza to, że w 95% analogicznych badań powinniśmy otrzymać różnicę średnich zawartą w tym przedziale. Przedził ten nie zawiera wartości 0, zatem na przyjętym poziomie istotności średnie grupy A i B są różne.&lt;br /&gt;
&lt;br /&gt;
====Wersja nieparametryczna ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# POP zawiera świat zgodny z H0&lt;br /&gt;
roznica_oryginalna = np.mean(A) - np.mean(B)&lt;br /&gt;
alfa = 0.05&lt;br /&gt;
N_rep = 10000&lt;br /&gt;
r = np.zeros(N_rep)&lt;br /&gt;
for i in range(N_rep):&lt;br /&gt;
	gA = randsample(POP, NA)&lt;br /&gt;
	gB = randsample(POP, NB)&lt;br /&gt;
	r[i] = np.mean(gA) - np.mean(gB)&lt;br /&gt;
ci_d = st.scoreatpercentile(r, per = alfa/2*100)&lt;br /&gt;
ci_g = st.scoreatpercentile(r, per = (1-alfa/2)*100)&lt;br /&gt;
# print('przedział ufności: %(d).2f %(g).2f'%{'m':np.mean(r),'d':ci_d+roznica_oryginalna, 'g':ci_g+roznica_oryginalna})&lt;br /&gt;
print('przedział ufności: %(d).2f %(g).2f'%{'m':np.mean(r),'d':ci_d, 'g':ci_g})&lt;br /&gt;
print('oryginalna różnica średnich: %(ro).2f'%{'ro':roznica_oryginalna})&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Wynik:&lt;br /&gt;
&amp;lt;tt&amp;gt;przedział ufności: -2.50 2.50&lt;br /&gt;
oryginalna różnica średnich: 3.17&amp;lt;/tt&amp;gt;.&lt;br /&gt;
Przedział ufności 95% na różnicę skonstruowany zgodnie z &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; nie zawiera oryginalnej różnicy średnich, &lt;br /&gt;
zatem różnica 3.17 w świecie zgodnym z &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; zdarza się nie częściej niż w 5% przypadków. Wniosek: średnie grup A i B są różne  na przyjętym poziomie ufności.&lt;br /&gt;
&lt;br /&gt;
== Zadanie: Przeżywalność myszy ==&lt;br /&gt;
Mamy 7 myszy, którym podano środek, który miał poprawić ich przeżywalność po operacji oraz 9 myszy kontrolnych, którym owego środka nie podano. Myszy traktowane specjalnie przeżyły &amp;lt;br&amp;gt;&lt;br /&gt;
94, 38, 23, 197, 99, 16, 141 dni&amp;lt;br&amp;gt;&lt;br /&gt;
a myszy traktowane standardowo:&amp;lt;br&amp;gt;&lt;br /&gt;
52, 10, 40, 104, 51, 27, 146, 30, 46 dni&amp;lt;br&amp;gt;&lt;br /&gt;
Średnia różnica wynosi 30,63 dni dłużej dla myszy traktowanych po nowemu.&lt;br /&gt;
Pytanie, na które chcielibyśmy znać odpowiedź to: Czy nowy środek faktycznie poprawia przeżywalność.&lt;br /&gt;
Zadanie proszę rozwiązać wszystkimi możliwymi sposobami, analogicznie do powyższego przykładu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Odp'': &lt;br /&gt;
:przedział ufności: [&amp;amp;minus;51,64 52,89]&lt;br /&gt;
:oryginalna różnica średnich: 30,63&lt;br /&gt;
:przedział ufności dla różnicy średnich przy założeniu normalności [&amp;amp;minus;27,99  89,26]&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
'''Przedział ufności dla różnicy dwóch średnich&lt;br /&gt;
&lt;br /&gt;
Mamy 7 myszy, którym podano środek, który miał poprawić ich przeżywalność &lt;br /&gt;
po operacji oraz 9 myszy kontrolnych, którym owego środka nie podano. &lt;br /&gt;
Myszy traktowane specjalnie przeżyły&lt;br /&gt;
94 38 23 197 99 16 141 dni&lt;br /&gt;
a myszy traktowane standardowo:&lt;br /&gt;
52 10 40 104 51 27 146 30 46 dni&lt;br /&gt;
Średnia różnica wynosi 30.63 dni dłużej dla myszy traktowanych po nowemu. &lt;br /&gt;
Pytanie, na które chcielibyśmy znać odpowiedź to: Czy nowy środek faktycznie &lt;br /&gt;
poprawia przeżywalność.&lt;br /&gt;
&lt;br /&gt;
Skonstruujmy przedział ufności 95% dla średniej różnicy w przeżywalności.&lt;br /&gt;
&lt;br /&gt;
Uwaga: przy tym problemie każdą z grup traktujemy jako reprezentantów bardzo &lt;br /&gt;
dużych populacji. '''&lt;br /&gt;
def randsample(x,ile):&lt;br /&gt;
	ind = st.randint.rvs(0,len(x),size = ile)&lt;br /&gt;
	y = x[ind]&lt;br /&gt;
	return y&lt;br /&gt;
&lt;br /&gt;
m_sp = np.array([94, 38, 23, 197, 99, 16, 141])&lt;br /&gt;
N_sp = len(m_sp)&lt;br /&gt;
m_st = np.array([52, 10, 40, 104, 51, 27, 146, 30, 46])&lt;br /&gt;
N_st = len(m_st)&lt;br /&gt;
alfa = 0.05&lt;br /&gt;
# zgodnie z hipotezą zerową (H0) nie ma różnicy między grupami&lt;br /&gt;
&lt;br /&gt;
# symulacja&lt;br /&gt;
# tworzymy świat zgodny z H0&lt;br /&gt;
m = np.concatenate((m_sp,m_st))&lt;br /&gt;
&lt;br /&gt;
roznica_oryginalna = np.mean(m_sp) - np.mean(m_st)&lt;br /&gt;
&lt;br /&gt;
N_rep = 10000&lt;br /&gt;
r = np.zeros(N_rep)&lt;br /&gt;
for i in range(N_rep):&lt;br /&gt;
	g1 = randsample(m, N_sp)&lt;br /&gt;
	g2 = randsample(m, N_st)&lt;br /&gt;
	r[i] = np.mean(g1) - np.mean(g2)&lt;br /&gt;
ci_d = st.scoreatpercentile(r, per = alfa/2*100)&lt;br /&gt;
ci_g = st.scoreatpercentile(r, per = (1-alfa/2)*100)&lt;br /&gt;
print('przedział ufności: %(d).2f %(g).2f'%{'m':np.mean(r),'d':ci_d, 'g':ci_g})&lt;br /&gt;
print('oryginalna różnica średnich: %(ro).2f'%{'ro':roznica_oryginalna})&lt;br /&gt;
# przedział ufności na różnicę skonstruowany zgodnie z H0 zawiera oryginalną różnicę średnich, &lt;br /&gt;
# zatem różnica taka jest na przyjętym poziomie ufności możliwa &lt;br /&gt;
# do zaobserwowania w przypadku braku różnicy między grupami&lt;br /&gt;
&lt;br /&gt;
# zakładając normalność&lt;br /&gt;
f = N_sp+N_st-2;&lt;br /&gt;
v_1 = np.var(m_sp)&lt;br /&gt;
v_2 = np.var(m_st)&lt;br /&gt;
sig = np.sqrt( ((N_sp*v_1 +N_st*v_2))/f * (N_sp + N_st)/float(N_sp*N_st) )&lt;br /&gt;
t_2_5 = st.t.ppf(0.025,f);&lt;br /&gt;
t_97_5 = st.t.ppf(0.975,f);&lt;br /&gt;
print('przedział ufności dla różnicy średnich przy założeniu normalności %(d).2f %(g).2f'%{'d':sig*t_2_5+ roznica_oryginalna,'g':sig*t_97_5+roznica_oryginalna})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
print('przedział ufności dla różnicy średnich przy założeniu normalności %(d).2f %(g).2f'%{'d':s_delta*t_2_5+ roznica_oryginalna,'g':s_delta*t_97_5+roznica_oryginalna})&lt;br /&gt;
# skonstruowany wokoł oryginalnej różnicy średnich przedział ufności zawiera 0, zatem nie możemy odrzucić możliwości,&lt;br /&gt;
# że nie ma różnicy między grupami&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zadanie: Linie lotnicze==&lt;br /&gt;
Linie lotnicze, projektując nowy samolot chcą sprawdzić czy średnia waga bagażu ręcznego zabieranego przez pasażerów nie zmieniła się od czasu poprzednich badań i wynosi wciąż 12 kg. Analiza ma być przeprowadzona na poziomie istotności &amp;lt;math&amp;gt;\alpha = 0,05&amp;lt;/math&amp;gt;. Analityk pobrał próbę bagażu ręcznego 144 pasażerów i obliczył wartość średnią z próby &amp;lt;math&amp;gt;\bar x = 14,6&amp;lt;/math&amp;gt; kg i odchylenie standardowe z próby &amp;lt;math&amp;gt;s = 7,8&amp;lt;/math&amp;gt;. Przeprowadź test hipotezy, że &amp;lt;math&amp;gt;\mu = 12&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
Standardowe importy modułów&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zmienne występujące w treści przykładu&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
mu_0=12&lt;br /&gt;
a=0.05&lt;br /&gt;
N=144&lt;br /&gt;
x=14.6&lt;br /&gt;
s=7.8&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Test dotyczy średniej wiec obliczamy odchylenie standardowe średniej:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
std_mu=s/np.sqrt(N)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wyjaśnienie |title= Obliczamy wartość statystyki:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt; &lt;br /&gt;
t=(mu_0-x)/std_mu&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Odchylenie standardowe estymowaliśmy z próby. Wartości powyższej statystyki podlegają zatem rozkładowi  t. Obliczamy wartości krytyczne odpowiadające poziomowi istotności a. Test jest dwustronny mamy wiec dwie wartości krytyczne: jedna odcina obszar pod funkcja gęstości prawdopodobieństwa na lewo,  a druga na prawo od siebie. Pole każdego z tych obszarów wynosi a/2:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt; &lt;br /&gt;
  &lt;br /&gt;
t_kryt_lewy = st.t.ppf(a/2,N-1)&lt;br /&gt;
t_kryt_prawy = st.t.ppf( 1-a/2, N-1)&lt;br /&gt;
&lt;br /&gt;
print('obliczona wartość statystyki t: ', t)&lt;br /&gt;
print('wartości krytyczne t: %(tl).2f %(tp).2f '%{'tl':t_kryt_lewy, 'tp':t_kryt_prawy})&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Możemy też obliczyć prawdopodobieństwo zaobserwowania wartości ''t'' takiej jak w naszym zadaniu lub bardziej ekstremalnej:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt; &lt;br /&gt;
p =  (st.t.cdf(-np.abs(t),N-1)) + (1-st.t.cdf(np.abs(t), N-1))  # sumujemy po obu ogonach  bo test jest dwustronny&lt;br /&gt;
print('Prawdopodobieństwo zaobserwowania bardziej ekstremalnych wartości t: %(p).4f'%{'p':p})&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wyniki te możemy zilustrować:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt; &lt;br /&gt;
os_t = np.arange(-5, 5, 0.1)&lt;br /&gt;
py.plot(os_t, st.t.pdf(os_t,N-1)) #rysujemy funkcję gęstości prawdopodobieństwa t o N-1 st. swobody&lt;br /&gt;
&lt;br /&gt;
#cieniujemy lewy obszary pod funkcją gęstości prawdopodobieństwa odpowiadający obliczonemu p&lt;br /&gt;
os_t2 = np.arange(-5, t_kryt_lewy, 0.1)&lt;br /&gt;
py.fill_between(os_t2,st.t.pdf(os_t2,N-1)) &lt;br /&gt;
#cieniujemy prawy obszary pod funkcją gęstości prawdopodobieństwa odpowiadający obliczonemu p&lt;br /&gt;
os_t2 = np.arange(t_kryt_prawy, 5,  0.1)&lt;br /&gt;
py.fill_between(os_t2,st.t.pdf(os_t2,N-1)) &lt;br /&gt;
&lt;br /&gt;
# zaznaczamy obliczoną wartość statystyki:&lt;br /&gt;
py.plot((t,), (0,), 'ro')&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Odpowiedź: Wyliczone ''t'' leży poza obszarem akceptacji hipotezy zerowej, zatem odrzucamy hipotezę zerową i akceptujemy alternatywną.&lt;br /&gt;
&lt;br /&gt;
==Zadanie: Agencja nieruchomości==&lt;br /&gt;
Agencja nieruchomości w Japonii podała, że ceny gruntu w centrum Tokio wzrosły o 49% w ciągu ostatniego roku. Inwestor chcąc przetestować te dane, znajduje próbę 18 nieruchomości w centrum Tokio, dla których zna cenę obecna i sprzed roku. Zakłada, że ceny podlegają rozkładowi normalnemu. Dla każdej nieruchomości oblicza procentowy wzrost wartości a następnie znajduje średnią i odchylenie standardowe z próby. Estymatory dla próby wynoszą &amp;lt;math&amp;gt;\bar x = 38&amp;lt;/math&amp;gt;% i &amp;lt;math&amp;gt;s = 14&amp;lt;/math&amp;gt;%. Przeprowadź test na poziomie istotności &amp;lt;math&amp;gt;\alpha = 0,01&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
mu_0=49;&lt;br /&gt;
x=38;&lt;br /&gt;
s=14;&lt;br /&gt;
N=18;&lt;br /&gt;
a=0.01;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# test dotyczy sredniej wiec jej std:&lt;br /&gt;
std_mu=s/np.sqrt(N)&lt;br /&gt;
&lt;br /&gt;
# odchylenie std obliczylismy z proby =&amp;gt; stosujemy test t&lt;br /&gt;
# obliczamy wartość statystyki &lt;br /&gt;
t=(mu_0-x)/std_mu&lt;br /&gt;
# obliczamy wartości krytyczne odpowiadające poziomowi istotności a&lt;br /&gt;
# test jest dwustronny mamy wiec dwie wartosci krytyczne &lt;br /&gt;
# jedna odcina obszar pod funkcja gęstości prawdopodobieństwa na lewo, &lt;br /&gt;
# a druga na prawo od siebie. Pole każdego z tych obszarów wynosi a/2&lt;br /&gt;
  &lt;br /&gt;
t_kryt_lewy = st.t.ppf(a/2,N-1)&lt;br /&gt;
t_kryt_prawy = st.t.ppf( 1-a/2, N-1)&lt;br /&gt;
&lt;br /&gt;
print('obliczona wartość statystyki t: ', t)&lt;br /&gt;
print('wartości krytyczne t: %(tl).2f %(tp).2f '%{'tl':t_kryt_lewy, 'tp':t_kryt_prawy})&lt;br /&gt;
&lt;br /&gt;
# Możemy też obliczyć prawdopodobieństwo zaobserwowania wrtości t takiej jak w naszym zadaniu &lt;br /&gt;
# lub bardziej ekstremalnej:&lt;br /&gt;
p = (1-st.t.cdf(t, N-1)) + (st.t.cdf(-t,N-1)) # sumujemy po obu ogonach  bo test jest dwustronny&lt;br /&gt;
		&lt;br /&gt;
print('Prawdopodobieństwo zaobserwowania bardziej ekstremalnych wrtości t: %(p).3f'%{'p':p})&lt;br /&gt;
# Wyniki te możemy zilustrować&lt;br /&gt;
os_t = np.arange(-5, 5, 0.1)&lt;br /&gt;
py.plot(os_t, st.t.pdf(os_t,N-1)) #rysujemy funkcję gęstości prawdopodobieństwa t o N-1 st. swobody&lt;br /&gt;
&lt;br /&gt;
#cieniujemy lewy obszary pod funkcją gęstości prawdopodobieństwa odpowiadający obliczonemu p&lt;br /&gt;
os_t2 = np.arange(-5, t_kryt_lewy, 0.1)&lt;br /&gt;
py.fill_between(os_t2,st.t.pdf(os_t2,N-1)) &lt;br /&gt;
#cieniujemy prawy obszary pod funkcją gęstości prawdopodobieństwa odpowiadający obliczonemu p&lt;br /&gt;
os_t2 = np.arange(t_kryt_prawy, 5,  0.1)&lt;br /&gt;
py.fill_between(os_t2,st.t.pdf(os_t2,N-1)) &lt;br /&gt;
&lt;br /&gt;
# zaznaczamy obliczoną wartość statystyki:&lt;br /&gt;
py.plot(t, 0, 'ro')&lt;br /&gt;
py.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# 'Odp: Wyliczone t lezy poza obszarem akceptacji hipotezy zerowej,&lt;br /&gt;
# zatej odrzucamy hipoteze zerowa i akceptujemy alternatywna.'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Odp. Odrzucamy &amp;lt;math&amp;gt;H_0:&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\mu_0 = 49&amp;lt;/math&amp;gt;, na poziomie istotności 0,01.&lt;br /&gt;
&lt;br /&gt;
==Zadanie: Zabiegi bio-inżynieryjne==&lt;br /&gt;
Załóżmy, że krowy są bardziej wartościowe od byków. Bio-inżynier twierdzi, że przy pomocy pewnych zabiegów jest w stanie spowodować zwiększenie szansy na urodzenie się krowy powyżej 50%. W jego eksperymencie na 10 urodzonych zwierząt 9 było krowami, a tylko 1 bykiem. Czy powinnniśmy wierzyć temu bio-inżynierowi? Jakia jest szansa na uzyskanie takiego, bądź bardziej ekstremalnego wyniku przy założeniu, że procedura stosowana przez naszego inżyniera nia ma żadnych efektów? W tym problemie dla odmiany założymy, że w normalnych warunkach 100 spośród 206 cieląt to krowy.&lt;br /&gt;
Zadanie rozwiązać metodą parametryczną i przez repróbkowanie. [[WnioskowanieStatystyczne/_Testowanie_hipotez#Przykład:_mutacje_muszek_owocowych|Wskazówka]]&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
def randsample(x, N):&lt;br /&gt;
	'''zwraca wektor z losowo wybranymi elementami wektora x. Losowanie odbywa się z powtórzeniami''' &lt;br /&gt;
	n=len(x)&lt;br /&gt;
	ind = np.random.randint(n, size = N)&lt;br /&gt;
	y = x[ind]&lt;br /&gt;
	return y&lt;br /&gt;
&lt;br /&gt;
# sposób pierwszy:&lt;br /&gt;
# zmienna urodzenie byka/krowy podlega rozkladowi dwumianowemu &lt;br /&gt;
p = 100.0/206&lt;br /&gt;
N = 10&lt;br /&gt;
k = 9&lt;br /&gt;
p_bino = 1-st.binom.cdf(k-1,N,p) #prawdopodobieństwo wylosowania 9 lub 10 krów w 10 probach &lt;br /&gt;
print('Prawdopodobieństwo wylosowania 9 lub 10 krów w 10 probach: %(p).4f'%{'p':p_bino})&lt;br /&gt;
# W jego mwetodzie chyba cos jest&lt;br /&gt;
&lt;br /&gt;
# sposob drugi: repróbkowanie&lt;br /&gt;
# model swiata z ktorego pochodza byki(0)/krowy(1):&lt;br /&gt;
w = np.concatenate((np.ones(100), np.zeros(106)))&lt;br /&gt;
&lt;br /&gt;
N_rep = 100000&lt;br /&gt;
wynik = np.zeros(N_rep)&lt;br /&gt;
for i in range(N_rep):&lt;br /&gt;
	wynik[i] = np.sum(randsample(w,10))&lt;br /&gt;
&lt;br /&gt;
p_rep = float(np.sum(wynik&amp;gt;=k))/N_rep&lt;br /&gt;
print('Prawdopodobieństwo wylosowania 9 lub 10 krów w 10 probach estymowane z symulacji: %(p).4f'%{'p':p_rep})&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''Odp'':  ''p'' = 0,008. Odrzucamy ''H''&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; o braku efektów.&lt;br /&gt;
&lt;br /&gt;
==Zadanie: Porównanie lekarstwa i placebo==&lt;br /&gt;
Badamy skuteczność leku na raka. Mamy grupę 12 chorych: 6 osobom podajemy lek &amp;amp;mdash; poprawa wystąpiła u 5 osób, pozostałym sześciu osobom podajemy placebo &amp;amp;mdash; poprawa wystąpiła u 2 osób. Czy te wyniki upoważniają do stwierdzenia, że lek istotnie zwiększa szansę poprawy? Test przeprowadzić na poziomie istotności 5%.&lt;br /&gt;
&lt;br /&gt;
Wskazówka: jako statystykę przyjąć różnicę w ilości popraw między grupą z lekiem a grupą z placebo. Interesuje nas prawdopodobieństwo zaobserwowania takiej (3) bądź większej różnicy. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
def randsample(x, N):&lt;br /&gt;
	'''zwraca wektor z losowo wybranymi elementami wektora x. Losowanie odbywa się z powtórzeniami''' &lt;br /&gt;
	n=len(x)&lt;br /&gt;
	ind = np.random.randint(n, size = N)&lt;br /&gt;
	y = x[ind]&lt;br /&gt;
	return y&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Formułujemy hipotezy &lt;br /&gt;
# H0: lek nie daje poprawy &lt;br /&gt;
# H1: lek daje poprawę&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# zgodnie z H0 obie próby pochodzą ze świata:&lt;br /&gt;
# pierwszy sposób: repróbkowanie&lt;br /&gt;
w = np.concatenate((np.ones(7), np.zeros(5))) # jedynki -&amp;gt; wystąpiła poprawa&lt;br /&gt;
&lt;br /&gt;
n_l = 5 # ilosc popraw w grupie leku&lt;br /&gt;
n_p = 2 #ilosc popraw w grupie placebo&lt;br /&gt;
# jako statystykę testową przyjmiemy różnicę w ilości popraw miedzy grupami&lt;br /&gt;
# w tym problemie istotne jest zwiększenie ilości popraw wiec stosujemy test&lt;br /&gt;
# jednostronny&lt;br /&gt;
N_rep = 100000&lt;br /&gt;
&lt;br /&gt;
st_0= n_l - n_p&lt;br /&gt;
st_rep=np.zeros(N_rep)&lt;br /&gt;
&lt;br /&gt;
for i in range(N_rep):&lt;br /&gt;
    n_l_rep   = np.sum(randsample(w,6))&lt;br /&gt;
    n_p_rep   = np.sum(randsample(w,6))&lt;br /&gt;
    st_rep[i] = n_l_rep - n_p_rep # wartość statystyki w i-tym repróbkowaniu&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
p_rep = float(np.sum(st_rep &amp;gt;= st_0))/N_rep&lt;br /&gt;
print('''Prawdopodobieństwo wylosowania takiej samej bądź większej różnicy w ilości popraw estymowane z symulacji: %(p).4f'''%{'p':p_rep})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# drugi sposób:&lt;br /&gt;
# zmienna uzyskanie poprawy podlega rozkładowi dwumianowemu &lt;br /&gt;
p = 7.0/12&lt;br /&gt;
N = 6&lt;br /&gt;
k1 = 5&lt;br /&gt;
k2 = 2&lt;br /&gt;
p_param = 0&lt;br /&gt;
for d in range(N-st_0+1):  # w tej pętli sumujemy prawdopodobieństwa zdarzeń  sprzyjających zaobserwowaniu różnicy co najmniej st_0 popraw &lt;br /&gt;
# Poprawy w jednej i drugiej grupie traktujemy jako zdarzenia niezależne&lt;br /&gt;
# Pętla &amp;quot;for d&amp;quot; przechodzi przez możliwe liczby popraw w pierwszej grupie&lt;br /&gt;
	p_bino1 = st.binom.pmf(d,N,p)   # prawdopodobieństwo uzyskania poprawy w d próbach&lt;br /&gt;
# Jeśli w pierwszej grupie było d popraw, to w drugiej może być od d+st_0 do N popraw&lt;br /&gt;
	p_bino2 = 1-st.binom.cdf( d+st_0 - 1, N, p)  # prawdopodobieństwo uzyskania poprawy w co najmniej d+st_0 próbach&lt;br /&gt;
	p_param += p_bino1 * p_bino2 # prawdopodobieństwo zaobserwowania jednocześnie obu powyższych sytuacji&lt;br /&gt;
&lt;br /&gt;
print('Prawdopodobieństwo estymowane parametrycznie: %(p).4f'%{'p':p_param})&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: Odp: Prawdopodobieństwo wylosowania takiej samej bądź większej różnicy w ilości popraw estymowane z symulacji: 0,0702&lt;br /&gt;
Prawdopodobieństwo estymowane parametrycznie: 0,0699. Wniosek: nie mamy podstaw do odrzucenia hipotezy zerowej.&lt;br /&gt;
&lt;br /&gt;
==Zadanie: Pomiar masy cząstki elementarnej==&lt;br /&gt;
W pomiarach wstępnych zbadano masę spoczynkową pewnej cząstki elementarnej. Otrzymano następujące wyniki [MeV/c²]:&lt;br /&gt;
&lt;br /&gt;
139.20, 139.34, 140.22, 139.56, 139.42, 139.64, 139.22, 139.74, 139.38, 139.54,&lt;br /&gt;
139.38, 139.46, 140.09, 139.77, 139.52, 139.47, 139.89, 138.95, 139.99, 139.64,&lt;br /&gt;
139.37, 139.49, 139.15, 139.77, 140.10, 139.48, 139.84, 139.44, 140.13&lt;br /&gt;
&lt;br /&gt;
Zbadaj na poziomie istotności 1%, czy cząstką tą mógł być naładowany pion.&lt;br /&gt;
&lt;br /&gt;
Zbadaj na poziomie istotności 1%, czy cząstką tą mógł być neutralny pion.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
&lt;br /&gt;
alfa = 0.01 # poziom istotności&lt;br /&gt;
dane = np.array([139.20, 139.34, 140.22, 139.56, 139.42, 139.64, 139.22, 139.74,&lt;br /&gt;
                 139.38, 139.54, 139.38, 139.46, 140.09, 139.77, 139.52, 139.47,&lt;br /&gt;
                 139.89, 138.95, 139.99, 139.64, 139.37, 139.49, 139.15, 139.77,&lt;br /&gt;
                 140.10, 139.48, 139.84, 139.44, 140.13])&lt;br /&gt;
&lt;br /&gt;
Pi_plus_min = 139.57 # masa pionów naładowanych Pi+ i Pi-&lt;br /&gt;
Pi_neutral = 134.98  # masa pionu neutralnego Pi0&lt;br /&gt;
&lt;br /&gt;
# test t hipotezy H0, że dane pochodzą z rozkładu normalnego o wartości oczekiwanej Pi_plus_min&lt;br /&gt;
t1, p1 = st.ttest_1samp(dane,Pi_plus_min)&lt;br /&gt;
print(&amp;quot;Poziom p dla hipotezy, że był do pion naładowany&amp;quot;,p1)&lt;br /&gt;
if p1&amp;gt;=alfa: print(&amp;quot;Nie możemy odrzucić tej hipotezy na poziomie istotności {}%&amp;quot;.format(100*alfa))&lt;br /&gt;
else: print(&amp;quot;Możemy odrzucić tę hipotezę na poziomie istotności {}%&amp;quot;.format(100*alfa))&lt;br /&gt;
&lt;br /&gt;
# test t hipotezy H0, że dane pochodzą z rozkładu normalnego o średniej Pi_neutral&lt;br /&gt;
t2, p2 = st.ttest_1samp(dane,Pi_neutral)&lt;br /&gt;
print(&amp;quot;\nPoziom p dla hipotezy, że był do pion neutralny&amp;quot;,p2)&lt;br /&gt;
if p2&amp;gt;=alfa: print(&amp;quot;Nie możemy odrzucić tej hipotezy na poziomie istotności {}%&amp;quot;.format(100*alfa))&lt;br /&gt;
else: print(&amp;quot;Możemy odrzucić tę hipotezę na poziomie istotności {}%&amp;quot;.format(100*alfa))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Przykład: Średnie grup sparowanych: Lek przeciwdepresyjny==&lt;br /&gt;
Poniższa tabela prezentuje wyniki 9 pacjentów wykonujących pewien test diagnostyczny przed podaniem leku i po podaniu leku. &lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class='wikitable'&lt;br /&gt;
!przed	&lt;br /&gt;
!po&lt;br /&gt;
|-&lt;br /&gt;
|1,83	&lt;br /&gt;
|0,878&lt;br /&gt;
|-&lt;br /&gt;
|0,50	&lt;br /&gt;
|0,647&lt;br /&gt;
|-&lt;br /&gt;
|1,62	&lt;br /&gt;
|0,598&lt;br /&gt;
|-&lt;br /&gt;
|2,48	&lt;br /&gt;
|2,05&lt;br /&gt;
|-&lt;br /&gt;
|1,68	&lt;br /&gt;
|1,06&lt;br /&gt;
|-&lt;br /&gt;
|1,88	&lt;br /&gt;
|1,29&lt;br /&gt;
|-&lt;br /&gt;
|1,55	&lt;br /&gt;
|1,06&lt;br /&gt;
|-&lt;br /&gt;
|3,06	&lt;br /&gt;
|3,14&lt;br /&gt;
|-&lt;br /&gt;
|1,3	&lt;br /&gt;
|1,29&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
PRZED = [1.83, 0.5, 1.62, 2.48, 1.68, 1.88, 1.55, 3.06, 1.3]&lt;br /&gt;
PO = [0.878, 0.647, 0.598, 2.05, 1.06, 1.29, 1.06, 3.14, 1.29]&lt;br /&gt;
&lt;br /&gt;
Skonstruować test, który pozwoli stwierdzić czy lek jest skuteczny. Porównać różne wersje testu:&lt;br /&gt;
* bootstrapową (losowanie z powtórzeniami), &lt;br /&gt;
* permutacyjną, &lt;br /&gt;
* test parametryczny &lt;br /&gt;
* test nieparametryczny. &lt;br /&gt;
&lt;br /&gt;
Jakie założenia przyjmujemy przy każdej z wersji testu?&lt;br /&gt;
&lt;br /&gt;
===Rozwiązanie===&lt;br /&gt;
W tym zadaniu mamy dwie grupy ''przed'' i ''po'' ale oprócz tego istnieje ścisły porządek w parach, bez sensu jest porównywanie ''przed'' od jednego pacjenta z ''po'' drugiego pacjenta. Musimy stosować testy, które biorą ten porządek pod uwagę (testy pairwise).&lt;br /&gt;
&lt;br /&gt;
Jako miarę tego czy lek jest skuteczny przyjmiemy różnicę (''po'' - ''przed'').  Każda z zaobserwowanych różnic to zmienna losowa. Ich średnia to nasza STATYSTYKA. Będziemy wierzyli, że lek działa jeśli ta różnica jest istotnie mniejsza od zera. Mamy stąd hipotezy:&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;math&amp;gt;H_0: \bar r \geq 0&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;math&amp;gt;H_1: \bar r &amp;lt; 0 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Wersja bootstrapowa====&lt;br /&gt;
&lt;br /&gt;
Założenie, które czynimy w wersji bootstrapowej testu jest następujące:&lt;br /&gt;
Zaobserwowana grupa pacjentów jest reprezentatywna, tzn. istnieje duża populacja pacjentów spośród której moglibyśmy pobrać wiele innych grup podobnych pod względem interesujących nas parametrów do grupy zaobserwowanej w tym konkretnym eksperymencie. Konsekwencją tego założenia jest to, że jeśli w naszej grupie mamy już pacjenta z wynikami: [1.83,	0.878], to szansa na wylosowanie kolejnego pacjenta o takich wynikach się nie zmienia i nadal wynosi 1/9. Prowadzi to do implementacji zawierającej losowanie z powtórzeniami.&lt;br /&gt;
&lt;br /&gt;
Losowość występuje tu w dwóch miejscach:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; losujemy pacjentów z powtórzeniami - zakładamy, że badana grupa jest reprezentatywna dla bardzo dużej populacji.&lt;br /&gt;
&amp;lt;li&amp;gt; dla każdego z wybranych pacjentów losujemy jego wynik ''przed'' oraz wynik ''po'' z wyników, które uzyskał w rzeczywistości --- to jest zgodne z hipotezą zerową.&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Dla każdego losowania obliczamy wartość statystyki w tym losowania uśredniając  różnice indywidualne.&lt;br /&gt;
Wartości statystyki otrzymane dla wszystkich losowań tworzą jej empiryczny rozkład, przy założeniu, że hipoteza zerowa jest prawdziwa. Jako estymator prawdopodobieństwa zaobserwowania oryginalnej wartości statystyki ''mr'' (średnia różnica) przy prawdziwej hipotezie zerowej przyjmujemy frakcję rozkładu empirycznego, w której wartości statystyki były nie większe niż ''mr''. Wynik ilustrujemy histogramem rozkładu empirycznego z zaznaczoną ową frakcją.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
def randsample(x, N):&lt;br /&gt;
	'''zwraca wektor z losowo wybranymi elementami wektora x. &lt;br /&gt;
         Losowanie odbywa się z powtórzeniami''' &lt;br /&gt;
&lt;br /&gt;
	n=len(x)&lt;br /&gt;
	ind = np.random.randint(n, size = N)&lt;br /&gt;
	y = x[ind]&lt;br /&gt;
	return y&lt;br /&gt;
&lt;br /&gt;
def hist_z_markerem(x, N_bins, marker):&lt;br /&gt;
	'''Rysuje histogram wartości w tablicy x, używając N_bins binów. &lt;br /&gt;
	Na lewo od wartości wskazanej przez marker dorysowywany jest prostokąt'''&lt;br /&gt;
	&lt;br /&gt;
	r = np.max(x) - np.min(x)&lt;br /&gt;
	szer_binu = r/N_bins&lt;br /&gt;
&lt;br /&gt;
	#konstruujemy biny&lt;br /&gt;
        # robimy biny od markera co szerokość binu aż do x minimalnego&lt;br /&gt;
	biny_na_lewo = np.arange( marker, np.min(x), -szer_binu)&lt;br /&gt;
        # odwracamy kolejność tej sekwencji żeby była rosnąca&lt;br /&gt;
	biny_na_lewo = biny_na_lewo[-1::-1] &lt;br /&gt;
         # robimy biny od markera co szerokość binu aż do x maksymalnego&lt;br /&gt;
	biny_na_prawo = np.arange(marker,np.max(x), szer_binu)&lt;br /&gt;
        # sklejamy oba zakresy binów&lt;br /&gt;
	biny = np.concatenate((biny_na_lewo, biny_na_prawo))&lt;br /&gt;
	(n,xx,patch) = py.hist(x,bins = biny)&lt;br /&gt;
	py.fill([np.min(xx), np.min(xx), marker, marker] , [0, np.max(n), np.max(n), 0] ,'r' ,alpha = 0.2)&lt;br /&gt;
&lt;br /&gt;
A=np.array([[1.83,	0.878],&lt;br /&gt;
[0.50,	0.647],&lt;br /&gt;
[1.62,	0.598],&lt;br /&gt;
[2.48,	2.05],&lt;br /&gt;
[1.68,	1.06],&lt;br /&gt;
[1.88,	1.29],&lt;br /&gt;
[1.55,	1.06],&lt;br /&gt;
[3.06,	3.14],&lt;br /&gt;
[1.30,	1.29]])&lt;br /&gt;
&lt;br /&gt;
r = A[:,1] - A[:,0] # od drugiej kolumny odejmuję pierwszą&lt;br /&gt;
mr = np.mean(r)  # średnia z tych różnic to wartość statystyki zaobserwowana dla oryginalnych danych&lt;br /&gt;
print( 'średnia różnica: %(mr).2f'%{'mr':mr})&lt;br /&gt;
&lt;br /&gt;
N = len(r)&lt;br /&gt;
&lt;br /&gt;
N_rep = 100000&lt;br /&gt;
r_boot = np.zeros(N_rep)&lt;br /&gt;
przed = np.zeros(N)&lt;br /&gt;
po = np.zeros(N)&lt;br /&gt;
&lt;br /&gt;
for i in range(N_rep):&lt;br /&gt;
    ix=randsample(np.arange(0,N,1),N) # wybieramy pacjentów z powtórzeniami&lt;br /&gt;
    B=np.array(A[ix,:])&lt;br /&gt;
    for j in range(N):   # mieszamy losowo przypisując wyniki do grupy przed i po&lt;br /&gt;
                         # zakładając, że pacjent może uzyskać dwukrotnie taki sam wynik&lt;br /&gt;
        s = np.random.rand()&lt;br /&gt;
        if s &amp;gt; 0.5:&lt;br /&gt;
            przed[j]=B[j,0]&lt;br /&gt;
        else:&lt;br /&gt;
            przed[j]=B[j,1]&lt;br /&gt;
        s = np.random.rand()&lt;br /&gt;
        if s &amp;gt; 0.5:&lt;br /&gt;
            po[j]=B[j,1]&lt;br /&gt;
        else:&lt;br /&gt;
            po[j]=B[j,0]&lt;br /&gt;
    rr=po-przed&lt;br /&gt;
    r_boot[i] = np.mean(rr)&lt;br /&gt;
&lt;br /&gt;
hist_z_markerem(r_boot,30,mr)&lt;br /&gt;
p_h0 = np.sum( r_boot &amp;lt;=  mr)/N_rep&lt;br /&gt;
s_boot = u'dla repróbkowanego testu jednostronnego: %(p_h0).5f'%{'p_h0': p_h0}&lt;br /&gt;
print( s_boot)&lt;br /&gt;
py.title(s_boot)&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Wersja permutacyjna====&lt;br /&gt;
&lt;br /&gt;
W tym teście zakładamy, że grupa pacjentów jest unikalna, więc w procedurze wytwarzania empirycznego rozkładu statystyki  korzystamy z danych wszystkich pacjentów w każdej iteracji. &lt;br /&gt;
&lt;br /&gt;
Zgodnie z hipotezą zerową pomiary ''przed'' i ''po'' są równoważne można je zatem zamieniać. Wykonamy wszystkie możliwe zamiany ''przed'' i ''po''. Możliwych zamian jest &amp;lt;math&amp;gt;2^N&amp;lt;/math&amp;gt;.  Skorzystamy z faktu, że bity w reprezentacji binarnej liczb całkowitych od 0 do &amp;lt;math&amp;gt;2^{N-1}&amp;lt;/math&amp;gt; zawierają wszystkie możliwe permutacje ciągów zer i jedynek o długości ''N''. Wartości 1 zamienimy na logiczne True a wartości 0 na False. Zinterpretujemy True jako zamianę  i False jako brak zamiany. &lt;br /&gt;
&lt;br /&gt;
Dla każdej permutacji obliczamy wartość statystyki uśredniając  różnice indywidualne.&lt;br /&gt;
Wartości statystyki otrzymane dla wszystkich permutacji tworzą jej empiryczny rozkład, przy założeniu, że hipoteza zerowa jest prawdziwa. Jako estymator prawdopodobieństwa zaobserwowania oryginalnej wartości statystyki ''mr'' przy prawdziwej hipotezie zerowej przyjmujemy frakcję rozkładu empirycznego, w której wartości statystyki były nie większe niż ''mr''. Wynik ilustrujemy histogramem rozkładu empirycznego z zaznaczoną ową frakcją. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
 &lt;br /&gt;
def dec2bin(n, l):&lt;br /&gt;
    '''konwertuje dziesiętną liczbę całkowitą na tablicę &lt;br /&gt;
    przedstawiającą reprezentację binarną tej liczby&lt;br /&gt;
    n liczba do konwersji&lt;br /&gt;
    l długość reprezentacji binarnej &lt;br /&gt;
    zwracana jest binarna reprezentacja liczby &lt;br /&gt;
    skonwertowana do tablicy logicznej (0-&amp;gt;False, 1-&amp;gt; True)&lt;br /&gt;
    '''&lt;br /&gt;
    b = np.zeros(l, dtype = bool)&lt;br /&gt;
    if n &amp;lt; 0:  raise ValueError(&amp;quot;must be a positive integer&amp;quot;)&lt;br /&gt;
    i = 1&lt;br /&gt;
    while n &amp;gt; 0:&lt;br /&gt;
        b[l-i] = bool( n % 2 ) &lt;br /&gt;
        n = n &amp;gt;&amp;gt; 1&lt;br /&gt;
        i += 1&lt;br /&gt;
    return b&lt;br /&gt;
 &lt;br /&gt;
def hist_z_markerem(x, N_bins, marker):&lt;br /&gt;
	'''Rysuje histogram wartości w tablicy x, używając N_bins binów. &lt;br /&gt;
	Na lewo od wartości wskazanej przez marker dorysowywany jest prostokąt'''&lt;br /&gt;
 &lt;br /&gt;
	r = np.max(x) - np.min(x)	&lt;br /&gt;
	szer_binu = r/N_bins&lt;br /&gt;
 &lt;br /&gt;
	#konstruujemy biny&lt;br /&gt;
        # robimy biny od markera co szerokość binu aż do x minimalnego&lt;br /&gt;
	biny_na_lewo = np.arange( marker, np.min(x), -szer_binu)&lt;br /&gt;
        # odwracamy kolejność tej sekwencji żeby była rosnąca&lt;br /&gt;
	biny_na_lewo = biny_na_lewo[-1::-1] &lt;br /&gt;
         # robimy biny od markera co szerokość binu aż do x maksymalnego&lt;br /&gt;
	biny_na_prawo = np.arange(marker,np.max(x), szer_binu)&lt;br /&gt;
        # sklejamy oba zakresy binów&lt;br /&gt;
	biny = np.concatenate((biny_na_lewo, biny_na_prawo))&lt;br /&gt;
	(n,xx,patch) = py.hist(x,bins = biny )&lt;br /&gt;
	py.fill([np.min(xx), np.min(xx), marker, marker] , [0, np.max(n), np.max(n), 0] ,'r' ,alpha = 0.2)&lt;br /&gt;
 &lt;br /&gt;
A=np.array([[1.83, 0.878], [0.50, 0.647], [1.62, 0.598], [2.48, 2.05], [1.68, 1.06], [1.88, 1.29], [1.55, 1.06], [3.06, 3.14], [1.30, 1.29]])&lt;br /&gt;
 &lt;br /&gt;
r = A[:,1] - A[:,0] # od drugiej kolumny odejmuję pierwszą&lt;br /&gt;
mr = np.mean(r)  # średnia z tych różnic to wartość statystyki zaobserwowana dla oryginalnych danych&lt;br /&gt;
print( 'średnia różnica: %(mr).2f'%{'mr':mr} )&lt;br /&gt;
 &lt;br /&gt;
N = len(r)&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
N_perm = 2**N&lt;br /&gt;
r_perm = np.zeros(N_perm)&lt;br /&gt;
for i in range(2**N):&lt;br /&gt;
	B = np.array(A)   # B zawiera kopię tablicy A&lt;br /&gt;
	zamiana = dec2bin(i,N) # w których wierszach dokonać zamiany?&lt;br /&gt;
	# print( i,': ', zamiana )&lt;br /&gt;
	# wiersze tablicy B wskazane przez True w wektorze indeksów ind zamieniamy wartości  'przed' z wartościami 'po'&lt;br /&gt;
	B[zamiana, 0] = A[zamiana, 1] &lt;br /&gt;
	B[zamiana, 1] = A[zamiana, 0]&lt;br /&gt;
	rr = B[:,1] - B[:,0] # Obliczam wartości zmiennych losowych dla tej zamiany&lt;br /&gt;
	r_perm[i] = np.mean(rr) # Obliczmy wartość statystyki dla tej zamiany&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
p_h0 = np.sum( r_perm &amp;lt;=  mr)/N_perm&lt;br /&gt;
s_perm = u'dla permutacyjnego testu jednostronnego: %(p_h0).3f'%{'p_h0': p_h0}&lt;br /&gt;
print( s_perm)&lt;br /&gt;
hist_z_markerem(r_perm,30,mr)&lt;br /&gt;
py.title(s_perm)&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Wersja parametryczna====&lt;br /&gt;
&lt;br /&gt;
Jeśli badane różnice ''przed'' i ''po'' podlegają rozkładowi normalnemu to do testowania czy średnia wartość różnicy jest równa 0 można zastosować test ''t'' dla prób zależnych &amp;lt;tt&amp;gt;st.ttest_rel()&amp;lt;/tt&amp;gt;. Aby się upewnić, że możemy zastosować ten test badamy normalność różnic przy pomocy &amp;lt;tt&amp;gt;normplot()&amp;lt;/tt&amp;gt; oraz testu Shapiro-Wilka &amp;lt;tt&amp;gt;st.shapiro()&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
 &lt;br /&gt;
def normplot(x):&lt;br /&gt;
	'''normplot: x dane do testowania'''&lt;br /&gt;
 &lt;br /&gt;
	x_ord = sorted(x)&lt;br /&gt;
	N = len(x)&lt;br /&gt;
	y = np.zeros(N)&lt;br /&gt;
	y[0]=st.norm.ppf(1- 0.5**(1.0/N) )&lt;br /&gt;
	y[N-1] = st.norm.ppf(0.5**(1.0/N) )&lt;br /&gt;
	for i in range(1,N-1):&lt;br /&gt;
		arg = (i-0.3175)/(N+0.365)&lt;br /&gt;
		y[i] = st.norm.ppf(arg)&lt;br /&gt;
	py.plot(y,x_ord,'.')&lt;br /&gt;
 &lt;br /&gt;
A=np.array([[1.83, 0.878], [0.50, 0.647], [1.62, 0.598], [2.48, 2.05], [1.68, 1.06], [1.88, 1.29], [1.55, 1.06], [3.06, 3.14], [1.30, 1.29]])&lt;br /&gt;
&lt;br /&gt;
r = A[:,1] - A[:,0] # od drugiej kolumny odejmuję pierwszą&lt;br /&gt;
&lt;br /&gt;
normplot(r)&lt;br /&gt;
py.title(&amp;quot;Wyniki testów na normalność różnic\n Shapiro-Wilka:  W=%.3f, p=%.3f&amp;quot;%st.shapiro(r)&lt;br /&gt;
        +&amp;quot;\nKołmogorowa-Smirnowa: D=%.3f, p=%.3f&amp;quot;%st.kstest(r, 'norm', args=(np.mean(r),np.std(r,ddof=1))))&lt;br /&gt;
t, p = st.ttest_rel(A[:,1],A[:,0])&lt;br /&gt;
p_t = p/2 # aby test był jednostronny&lt;br /&gt;
s_t = u'dla parametrycznego testu jednostronnego: %(p_h0).3f'%{'p_h0': p_t}&lt;br /&gt;
print(s_t)&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Wersja nieparametryczna====&lt;br /&gt;
&lt;br /&gt;
W ogólności, nie zakładając normalności różnic można by przeprowadzić test Wilcoxona. W aktualnej implementacji tego testu w scipy.stats jest on dla naszych danych niedokładny, gdyż mamy małą liczebność grupy, a implementacja stosuje przybliżenia asymptotyczne.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
A=np.array([[1.83, 0.878], [0.50, 0.647], [1.62, 0.598], [2.48, 2.05], [1.68, 1.06], [1.88, 1.29], [1.55, 1.06], [3.06, 3.14], [1.30, 1.29]])&lt;br /&gt;
z, p = st.wilcoxon(A[:,1],A[:,0] )&lt;br /&gt;
p_w = p/2 # aby test był jednostronny&lt;br /&gt;
s_w = u'dla nieparametrycznego testu jednostronnego: %(p_h0).3f'%{'p_h0': p_w}&lt;br /&gt;
print( s_w)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Podsumowanie====&lt;br /&gt;
 średnia różnica: -0.43&lt;br /&gt;
 dla repróbkowanego testu jednostronnego: 0.0013&lt;br /&gt;
 dla permutacyjnego testu jednostronnego: 0.014&lt;br /&gt;
 Wynik testu Shapiro-Wilka na normalność różnic &lt;br /&gt;
 	 statystyka W: 0.921 &lt;br /&gt;
 	 prawdopodobieństwo takiej wartości statystyki dla rozkładu normalnego: 0.404&lt;br /&gt;
 dla parametrycznego testu jednostronnego: 0.008&lt;br /&gt;
 dla nieparametrycznego testu jednostronnego: 0.019&lt;br /&gt;
&lt;br /&gt;
Wszystkie testy wskazują prawdopodobieństwo zaobserwowania odpowiadających im statystyk poniżej przyjętego poziomu istotności &amp;lt;math&amp;gt;\alpha = 0.05&amp;lt;/math&amp;gt;. Zatem hipotezę zerową należy odrzucić i przyjąć hipotezę alternatywną.&lt;br /&gt;
&lt;br /&gt;
==Zadania==&lt;br /&gt;
&lt;br /&gt;
===Zanieczyszczenie środowiska===&lt;br /&gt;
Agencja ochrony środowiska ustaliła limit na koncentrację zanieczyszczeń emitowanych przez fabryki. Załóżmy, że dopuszczalny poziom zanieczyszczeń wynosi 55 cząstek na milion (cz/m) w promieniu dwóch kilometrów od fabryki. Kontrola przeprowadza 100 pomiarów o różnej porze dnia i roku w promieniu dwóch km od pewnej fabryki. Średnia z próby wyniosła 60 cz/m a odchylenie standardowe &amp;lt;math&amp;gt;s = 20&amp;lt;/math&amp;gt; cz/m. Czy dane te są wystarczające by na poziomie istotności &amp;lt;math&amp;gt;\alpha = 0,01&amp;lt;/math&amp;gt; uznać, że fabryka łamie prawo?&lt;br /&gt;
&lt;br /&gt;
Fabryka łamie prawo jeśli emituje zanieczyszczenia na poziomie wyższym niż dopuszczalny więc należy przeprowadzić test jednostronny (w tym przypadku prawostronny). Czy moglibyśmy odrzucić &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; na tym samym poziomie stosując test dwustronny?&lt;br /&gt;
Jest ważne aby w zależności od problemu wybrać odpowiedni test: jedno- lub dwustronny.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import numpy as np&lt;br /&gt;
 &lt;br /&gt;
x_c = 55 #cząstek na milion (cz/m) w promieniu dwóch kilometrów od fabryki. &lt;br /&gt;
#Kontrola przeprowadza &lt;br /&gt;
N = 100 # pomiarów o różnej porze dnia i roku w promieniu dwóch km. od pewnej fabryki. &lt;br /&gt;
#średnia z próby wyniosła &lt;br /&gt;
x_s = 60 # cz/m &lt;br /&gt;
# a odchylenie standardowe &lt;br /&gt;
s = 20 # cz/m. &lt;br /&gt;
# Czy dane te są wystarczające by uznać, że fabryka łamie prawo ?&lt;br /&gt;
alpha = 0.01&lt;br /&gt;
 &lt;br /&gt;
# H0: mu &amp;lt;=x_c&lt;br /&gt;
# H1: mu &amp;gt; x_c&lt;br /&gt;
# wystarczy sprawdzić jakie jest p dla największego dopuszczalnego stężenia &lt;br /&gt;
# mu = x_c zaobserwowania wartości średniej większej bądź równej zaobserwowanej x_s. &lt;br /&gt;
# Odchylenie std. dane jest dla populacji i trzeba je przeliczyć na odchylenie std. średniej.&lt;br /&gt;
p = 1 - st.t.cdf(x_s, df=N-1, loc = x_c, scale = s/np.sqrt(N) )&lt;br /&gt;
print(&amp;quot;poziom p&amp;quot;,p)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
############################&lt;br /&gt;
#inne (tożsame) rozwiązania:&lt;br /&gt;
&lt;br /&gt;
##wykorzystaniem &amp;quot;Survival function&amp;quot; zamiast dystrybuanty&lt;br /&gt;
p = st.t.sf(x_s, df=N-1, loc = x_c, scale = s/np.sqrt(N) )&lt;br /&gt;
print(&amp;quot;poziom p&amp;quot;,p)&lt;br /&gt;
&lt;br /&gt;
##obliczając statystykę t&lt;br /&gt;
t=(x_s-x_c)/(s/N**0.5)&lt;br /&gt;
p = 1-st.t.cdf(t,df=N-1)&lt;br /&gt;
print(&amp;quot;poziom p&amp;quot;,p)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Odp. &amp;lt;math&amp;gt;p=0,007&amp;lt;\alpha&amp;lt;/math&amp;gt;, zatem możemy odrzucić hipotezę &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; (głoszącą, że fabryka nie łamie prawa) na poziomie &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;  = 0,01.&lt;br /&gt;
&lt;br /&gt;
===Wzrost mocy turbin===&lt;br /&gt;
Turbina hydroelektryczna generuje moc średnią 25,2 kW. Po unowocześnieniu maszyny chcemy przetestować czy średnia moc generowana zmieniła się (na + lub &amp;amp;minus;). Przeprowadzono 115 pomiarów, które dały średnią 26,1 kW i odch. std. 3,2 kW. Przeprowadzić test statystyczny na poziomie istotności 1%, zinterpretować wynik. Wnioskowanie przeprowadzić także w oparciu oprzedział ufności.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
#-*- coding:utf-8 -*-&lt;br /&gt;
import numpy as np&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
N=115&lt;br /&gt;
m=25.2	#hipoteza zerowa mówi, że tyle wynosi moc&lt;br /&gt;
sr=26.1	#w pomiarach uzyskaliśmy taką średnią moc&lt;br /&gt;
s=3.2	#przy takim odchyleniu standardowym&lt;br /&gt;
&lt;br /&gt;
alfa=0.01&lt;br /&gt;
&lt;br /&gt;
#obliczenie poziomu p&lt;br /&gt;
t=(m-sr)/(s/N**0.5)&lt;br /&gt;
p = st.t.cdf(t,df=N-1) * 2 #mnozymy przez 2, bo chcemy testu dwustronnego&lt;br /&gt;
print(&amp;quot;poziom p&amp;quot;,p)&lt;br /&gt;
&lt;br /&gt;
#alternatywnie - obliczenie przedziału ufności&lt;br /&gt;
lo,hi = st.t.ppf([alfa/2, 1-alfa/2],df=N-1,loc=sr,scale=s/N**0.5)&lt;br /&gt;
print(&amp;quot;przedzial ufnosci [%.3g,%.3g]&amp;quot;%(lo,hi))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Odp.: &amp;lt;math&amp;gt;p=0,\!003&amp;lt;\alpha=0,\!01&amp;lt;/math&amp;gt;, zatem odrzucamy H0.&lt;br /&gt;
&lt;br /&gt;
Odp. (alt.): &amp;lt;math&amp;gt;\mu = 25,\!2 \not\in[25,\!3; 26,\!9]&amp;lt;/math&amp;gt;, zatem odrzucamy H0.&lt;br /&gt;
&lt;br /&gt;
===Sonda===&lt;br /&gt;
Władze miasta chciałyby wiedzieć, czy przyznać koncesję operatorowi sieci kablowej. W tym celu zleciły nam przeprowadzenie sondy wśród mieszkańców. Zapytaliśmy o zdanie 50 przypadkowo wybranych osób. 30 osób powiedziało &amp;amp;bdquo;tak&amp;amp;rdquo; a 20 &amp;amp;bdquo;nie&amp;amp;rdquo;. Na ile pewnie otrzymane wyniki wskazują, że mieszkańcy chcą tej kablówki?&lt;br /&gt;
&lt;br /&gt;
Celem naszych badań jest uniknięcie błędu polegającego na tym, że powiemy iż większość mieszkańców chce kablówki podczas gdy tak na prawdę to nie chce. &lt;br /&gt;
&lt;br /&gt;
Wskazówka: Granicznym przypadkiem popełnienia tego błędu jest proporcja 1:1 zwolenników i przeciwników kablówki. Jeśli przeciwników kablówki byłoby jeszcze więcej to uzyskanie naszych wyników byłoby jeszcze mniej prawdopodobne.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import numpy.random as rnd&lt;br /&gt;
&lt;br /&gt;
N=50&lt;br /&gt;
odp_na_tak=30&lt;br /&gt;
odp_na_nie=20&lt;br /&gt;
&lt;br /&gt;
#przypadek graniczny, który daje najwyższe prawdopodobieństwo uzyskania fałszywego wyniku na 'tak',&lt;br /&gt;
#to mieszkańcy niezdecydowani, czyli proporcja 1:1&lt;br /&gt;
#(proporcja przechylona w kierunki 'nie', da nam niższe oszacowanie,&lt;br /&gt;
#a proporcja przechylona w kierunku 'tak' nie oznaczałaby fałszywego wyniku sondy)&lt;br /&gt;
#zatem hipoteza zerowa brzmi, że nasz wynik pochodzi z populacji niezdecydowanej:&lt;br /&gt;
P=0.5 #prawdopodobieństwo, że respondent udzieli odpowiedzi na 'tak'&lt;br /&gt;
# jest to najwyższe prawdopodobieństwo jeszcze fałszywego wyniku&lt;br /&gt;
&lt;br /&gt;
#rozwiązanie parametryczne wymaga użycia rozkładu dwumianowego:&lt;br /&gt;
p = 1 - st.binom.cdf(29,50,P) #od 1 odejmujemy sumaryczne prawdopodobieństwo wszystkich przypadków udzielenia mniej niż 30 odpowiedzi na tak (czyli do 29 włącznie)&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;poziom p (parametrycznie)&amp;quot;,p)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#rozwiązanie przez symulację:&lt;br /&gt;
Nrand=100000&lt;br /&gt;
R=0 #rezultat, czyli liczba przypadków, w których przynajmniej 30 osób odpowiedziało tak&lt;br /&gt;
for i in range(Nrand):&lt;br /&gt;
	odpowiedzi = (rnd.random(N)&amp;lt;P) #losujemy odpowiedzi od N osób&lt;br /&gt;
	if odpowiedzi.sum() &amp;gt;=odp_na_tak: #jeśli zdarzyło się co najmniej 30 odpowiedzi na tak, to dodajemy jeden do liczby takich przypadków&lt;br /&gt;
		R+=1&lt;br /&gt;
	&lt;br /&gt;
print(&amp;quot;poziom p (z symulacji)&amp;quot;,R/Nrand) #na koniec dzielimy przez liczbę wszystkich sond w symulacji&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Wybory prezydenckie===&lt;br /&gt;
W ankiecie uzyskaliśmy 840 głosów popierających kandydaturę A i 660 kandydaturę B. Jaka jest szansa, że tak naprawdę kandydat B ma  poparcie 50% lub większe? Jakie jest prawdopodobieństwo pojawienia sie zaobserwowanej próbki lub próbki wskazującej na jeszcze większe poparcie dla kandydata A, jeśli w rzeczywistości poparcie kandydata A byłoby  50% lub mniej.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import numpy.random as rnd&lt;br /&gt;
&lt;br /&gt;
# rozwiązanie parametryczne&lt;br /&gt;
A = 840&lt;br /&gt;
B = 660&lt;br /&gt;
N = A+B&lt;br /&gt;
&lt;br /&gt;
#przypadek graniczny, który daje najwyższe prawdopodobieństwo uzyskania fałszywego wyniku na 'tak',&lt;br /&gt;
#to mieszkańcy niezdecydowani, czyli propocja 1:1&lt;br /&gt;
#propocja przechylona w kierunki 'nie', da nam niższe oszacowanie&lt;br /&gt;
#a propocja przechylona w kierunku 'tak' nie oznaczałaby fałszywego wyniku sondy&lt;br /&gt;
#zatem hipoteza zerowa brzmi, że nasz wynik pochodzi z populacji niezdecydowanej:&lt;br /&gt;
p_sukces = 0.5&lt;br /&gt;
&lt;br /&gt;
#rozwiązanie parametryczne&lt;br /&gt;
p = 1 - st.binom.cdf(A-1,N,p_sukces)&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;poziom p (parametrycznie)&amp;quot;,p)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#rozwiązanie przez symulację:&lt;br /&gt;
&lt;br /&gt;
#wiemy już, że musimy oszacować bardzo niskie prawdopodobieństwo, zatem symulacja musi być długa&lt;br /&gt;
#(gdybyśmy nie wiedzieli, to łatwo byśmy zauważyli, że krótka symulacja nie daje w ogóle zdarzeń sprzyjających dając wynik p=0)&lt;br /&gt;
#niestety trzeba pokusić się o optymalizację (mimo to kod będzie się wykonywał kilkadziesiąt sekund do kilku minut):&lt;br /&gt;
#chemy mieć przynajmniej 10^7 sond, ale każda sonda to 1500 odpowiedzi, zatem łącznie musimy wylosować 1.5*10^10 liczb&lt;br /&gt;
#losowanie w pętli 10^7 razy kolejnych sond po 1500 odpowiedzi zajmie bardzo bardzo dużo czasu&lt;br /&gt;
#tablica 1.5*10^10 odpowiedzi wygenerowana jednym poleceniem nie zmieści się w pamięci&lt;br /&gt;
#musimy skorzystać z rozwiązania pośredniego&lt;br /&gt;
#będziemy losować 100 razy po 1.5*10^8 odpowiedzi i dodamy wyniki&lt;br /&gt;
&lt;br /&gt;
Nrand_1=100    # 10^2&lt;br /&gt;
Nrand_2=100000 # 10^5&lt;br /&gt;
N = A+B        # 1.5*10^3&lt;br /&gt;
&lt;br /&gt;
Nrand_total = Nrand_1*Nrand_2&lt;br /&gt;
&lt;br /&gt;
R=0 #liczba sond, w których kandydat A uzyskał poparcie 840 lub większe&lt;br /&gt;
#po każdym przebiegu pętli będziemy dodawać liczbę takich przypadków (jeśli wystąpiły w danej iteracji)&lt;br /&gt;
&lt;br /&gt;
for i in range(Nrand_1):&lt;br /&gt;
	#w każdej iteracji losujemy odpowiedzi od N osób w Nrand_2 sondach&lt;br /&gt;
	#iteracji będzie w sumie Nrand_1, co da nam łącznie N osób w Nrand_total sondach&lt;br /&gt;
	#jako, że zakładamy równe prawdopodobieństwo, to może możemy wylosować tablicę zawierającą tylko 0 i 1&lt;br /&gt;
	#gdzie 1 oznacza sukces (głos na kandydata A), a 0 porażkę&lt;br /&gt;
	#korzystając z funksji randint, która zwraca (pseudo)losowe liczby całkowite z zakresu [a,b)&lt;br /&gt;
	a,b = 0,2 &lt;br /&gt;
	odpowiedzi = rnd.randint(a,b,size=(N,Nrand_2)) &lt;br /&gt;
	S = np.sum(odpowiedzi,axis=0)  #wyniki kolejnych sond (sumujemy sukcesy w wierszach)&lt;br /&gt;
&lt;br /&gt;
	R+=np.sum(S&amp;gt;=A) #dodajemy liczbę sond, w których kandydat A uzyskał poparcie 840 lub większe (w danej iteracji pętli)&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;poziom p (z symulacji)&amp;quot;,R/Nrand_total) #na koniec dzielimy przez liczbę wszystkich sond w symulacji&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Czy stosunek do marihuany się zmienił?===&lt;br /&gt;
Rozważmy dwie ankiety przeprowadzone w USA, pytano 1500 respondentów o stosunek do legalizacji marihuany. Pierwszą ankietę przeprowadzono w 1980, wówczas za legalizacją opowiadało się 52% a drugą w 1985 i za legalizacją było 46%. Czy wyniki tych dwóch ankiet są istotnie różne?&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
# rozwiązanie parametryczne&lt;br /&gt;
za1 = int(0.52*1500)&lt;br /&gt;
za2 = int(0.46*1500)&lt;br /&gt;
N = 1500&lt;br /&gt;
&lt;br /&gt;
# H0: stosunek się nie zmienił zatem p_za było w obu anlietach takie samo:&lt;br /&gt;
p_za = (0.52+0.46)/2&lt;br /&gt;
&lt;br /&gt;
# Jakie jest prawdopodobieństwo zaobserwowoania wyników ankiet o takiej bądź większej &lt;br /&gt;
# różnicy głosów za, jeśli obie są zgodne z H0 ?&lt;br /&gt;
D = za1 - za2&lt;br /&gt;
&lt;br /&gt;
#musimy zsumować wszystkie możliwości, w których wystąpiła taka różnica lub większa&lt;br /&gt;
#zrobimy to w pętli&lt;br /&gt;
p_binom = 0.0&lt;br /&gt;
for k in range(N-D+1):&lt;br /&gt;
	p1 = st.binom.pmf(k,N,p_za) # prawdopodobieństwo uzyskania dokładnie k głosów za&lt;br /&gt;
	&lt;br /&gt;
	# sumujemy prawdopodobieństwa uzyskania liczby głosów różnej przynajmniej o D&lt;br /&gt;
	przypadki_o_roznicy_przynajmniej_D = np.arange(k+D,N+1)&lt;br /&gt;
	p2 = np.sum(st.binom.pmf(przypadki_o_roznicy_przynajmniej_D,N,p_za))&lt;br /&gt;
	#co jest równoważne:&lt;br /&gt;
	#p2 = 1-st.binom.cdf(k+D-1,N,p_za)&lt;br /&gt;
	&lt;br /&gt;
	#sumujemy dla kolejnych k&lt;br /&gt;
	p_binom += p1*p2 # mnożymy prawdopodobieństwa ponieważ są wyniki obu sond są niezależne&lt;br /&gt;
	&lt;br /&gt;
p=2*p_binom #mnożymy przez 2, ponieważ robimy test dwustronny (różnica mogła wystąpić również w drugą stronę)&lt;br /&gt;
print(&amp;quot;p =&amp;quot;,p)&lt;br /&gt;
&lt;br /&gt;
# rozwiązanie symulacyjne (tym razem skorzystamy z randsample)&lt;br /&gt;
def randsample(x, N):&lt;br /&gt;
	'''zwraca wektor z losowo wybranymi elementami wektora x. Losowanie odbywa się z powtórzeniami''' &lt;br /&gt;
	n=len(x)&lt;br /&gt;
	ind = np.random.randint(n, size = N)&lt;br /&gt;
	y = x[ind]&lt;br /&gt;
	return y&lt;br /&gt;
&lt;br /&gt;
N_rep = 100000&lt;br /&gt;
# świat zgodny z H0:&lt;br /&gt;
H0 = np.concatenate((np.zeros(N*(1-p_za)), np.ones(N*p_za)))&lt;br /&gt;
&lt;br /&gt;
a = np.zeros(N_rep)&lt;br /&gt;
for i in range(N_rep):&lt;br /&gt;
	w1 = np.sum(randsample(H0,N))&lt;br /&gt;
	w2 = np.sum(randsample(H0,N))&lt;br /&gt;
	a[i] = np.abs(w1-w2)&lt;br /&gt;
p = np.sum(a&amp;gt;=D)/N_rep&lt;br /&gt;
print(p)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zawały serca i cholesterol===&lt;br /&gt;
Badano grupę 605 osób. 135 osób z tej grupy miało wysoki poziom cholesterolu a 470 niski. W grupie z wysokim poziomem cholesterolu odnotowano 10 przypadków zawału serca a w grupie z niskim poziomem 21, w czasie 16 lat obserwacji. Nasze pytanie brzmi: Czy możemy uznać, że wysoki poziom cholesterolu zwiększa ryzyko zawału serca?&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
# rozwiązanie parametryczne&lt;br /&gt;
wysoki = 135&lt;br /&gt;
niski = 470&lt;br /&gt;
N = 605&lt;br /&gt;
wysoki_zawaly = 10&lt;br /&gt;
niski_zawaly = 21&lt;br /&gt;
N_zaw = wysoki_zawaly + niski_zawaly &lt;br /&gt;
&lt;br /&gt;
# H0: proporcja zawałowców w obu grupach taka sama:&lt;br /&gt;
p_zawalu = N_zaw/N&lt;br /&gt;
# H1: proporcja jest różna, test jednostronny (wysoki cholesterol ZWIĘKSZA ryzyko)&lt;br /&gt;
&lt;br /&gt;
# Jakie jest prawdopodobieństwo zaobserwowania wyników badania o takiej bądź większej &lt;br /&gt;
# różnicy proporcji zawałów, jeśli obie są zgodne z H0 ?&lt;br /&gt;
roznica = wysoki_zawaly/wysoki - niski_zawaly/niski&lt;br /&gt;
&lt;br /&gt;
p_binom = 0.0&lt;br /&gt;
for k_wys in range(wysoki+1):&lt;br /&gt;
	p_wys = st.binom.pmf(k_wys,wysoki,p_zawalu) # prawdopodobieństwo uzyskania k_wys zawałów grupie o liczebności wysoki&lt;br /&gt;
	for k_nis in range(niski+1): &lt;br /&gt;
		if k_wys/wysoki - k_nis/niski&amp;gt;=roznica: # czy liczebności k_wys i k_nis dają większą bądź równą różnice proporcji?&lt;br /&gt;
			p_nis = st.binom.pmf(k_nis,niski,p_zawalu) # prawdopodobieństwo uzyskania k_nis zawałów w grupie o niskim cholesterolu&lt;br /&gt;
			p_binom += p_wys*p_nis # zdarzenia są niezależne&lt;br /&gt;
&lt;br /&gt;
print(p_binom)&lt;br /&gt;
&lt;br /&gt;
# rozwiązanie symulacyjne&lt;br /&gt;
def randsample(x, N):&lt;br /&gt;
	'''zwraca wektor z losowo wybranymi elementami wektora x. Losowanie odbywa się z powtórzeniami''' &lt;br /&gt;
	n=len(x)&lt;br /&gt;
	ind = np.random.randint(n, size = N)&lt;br /&gt;
	y = x[ind]&lt;br /&gt;
	return y&lt;br /&gt;
&lt;br /&gt;
N_rep = 100000&lt;br /&gt;
# świat zgodny z H0:&lt;br /&gt;
H0 = np.concatenate((np.zeros(N-N_zaw), np.ones(N_zaw)))&lt;br /&gt;
&lt;br /&gt;
wyn = np.zeros(N_rep)&lt;br /&gt;
for i in range(N_rep):&lt;br /&gt;
	wysoki_zawaly_r = np.sum(randsample(H0,wysoki))&lt;br /&gt;
	niski_zawaly_r = np.sum(randsample(H0,niski))&lt;br /&gt;
	wyn[i] = wysoki_zawaly_r/wysoki - niski_zawaly_r/niski&lt;br /&gt;
p = np.sum(wyn&amp;gt;=roznica)/N_rep&lt;br /&gt;
print(p)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Czy gęstości planet się różnią?===&lt;br /&gt;
Rozważmy pięć planet znanych w antycznym świecie. Chcemy zbadać, czy planety wewnętrzne Merkury (0,68) i Wenus (0,94) mają istotnie większe gęstości niż planety zewnętrzne Mars (0,71) Jowisz (0,24) i Saturn (0,12)?&lt;br /&gt;
&lt;br /&gt;
Wskazówki: &lt;br /&gt;
* Unikalność zestawu planet wskazuje na zastosowanie testu permutacyjnego.&lt;br /&gt;
* Moduł implementujący funkcje kombinatoryczne w pythonie to &amp;lt;tt&amp;gt;itertools &amp;lt;/tt&amp;gt;. Zawiera on funkcję &amp;lt;tt&amp;gt;permutations&amp;lt;/tt&amp;gt;. Wywołanie &amp;lt;tt&amp;gt;itertools.permutations(sekwencja[, r])&amp;lt;/tt&amp;gt; zwraca obiekt permutacji. Obiekt ten zwraca kolejne permutacje o długości r elementów w sekwencji (np. w wektorze). Przykład:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
import itertools&lt;br /&gt;
for kolejny in itertools.permutations(range(3), 2):&lt;br /&gt;
    print(kolejny)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import itertools as itt&lt;br /&gt;
PLANETY = np.array([0.68,0.94,0.71,0.24,0.12])&lt;br /&gt;
N=len(PLANETY)&lt;br /&gt;
&lt;br /&gt;
r=[] #używamy listy, bo nie chcemy obliczać ile będzie przypadków (aczkolwiek można to zrobić)&lt;br /&gt;
&lt;br /&gt;
for planety in itt.permutations(PLANETY):&lt;br /&gt;
	r.append(np.mean(planety[:2])-np.mean(planety[2:]))&lt;br /&gt;
&lt;br /&gt;
R=np.mean(PLANETY[:2])-np.mean(PLANETY[2:]) #prawdziwa różnica&lt;br /&gt;
&lt;br /&gt;
r=np.array(r) #porównanie z liczbą działa tylko dla tablic numpy, a nie dla list&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;p =&amp;quot;,np.sum(r&amp;gt;=R)/len(r))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Elektrownia jądrowa===&lt;br /&gt;
Przed wybudowaniem elektrowni jądrowej przeprowadzono pomiary intensywności promieniowania jonizującego w pobliżu planowanego budynku reaktora. Powtórzono te pomiary po uruchomieniu reaktora. Czy zebrane dane pozwalają stwierdzić, że poziom promieniowania istotnie wzrósł? Dane pomiarowe wczytaj z [[Media:pomiary_skazen.txt| pliku]].&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
&lt;br /&gt;
alfa = 0.01 # poziom istotności&lt;br /&gt;
&lt;br /&gt;
PRZED, PO = np.loadtxt('Pomiary_skazen.txt') #wczytanie danych (dwa zbiory przed uruchomieniem i po)&lt;br /&gt;
&lt;br /&gt;
t, p = st.ttest_ind(PRZED, PO) # wykorzystanie gotowej funkcji wykonującej DWUSTRONNY test t na różnicę średnich&lt;br /&gt;
                            # dla danych NIESPAROWANYCH (niezależnych)&lt;br /&gt;
                            # ttest_ind  - ind od independent &lt;br /&gt;
                            # ttest_rel  - rel od related &lt;br /&gt;
&lt;br /&gt;
p/=2 # dzielimy przez dwa ponieważ chcemy zrobić test jednostronny&lt;br /&gt;
print(&amp;quot;Poziom p&amp;quot;,p)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Odp. &amp;lt;math&amp;gt;p=0,\!39&amp;gt;\alpha=0,\!01&amp;lt;/math&amp;gt;, zatem nie mamy podstaw do odrzucenia hipotezy &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt;, że poziom promieniowania istotnie wzrósł.&lt;/div&gt;</summary>
		<author><name>Maciek</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=WnioskowanieStatystyczne/_Testowanie_hipotez&amp;diff=11335</id>
		<title>WnioskowanieStatystyczne/ Testowanie hipotez</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=WnioskowanieStatystyczne/_Testowanie_hipotez&amp;diff=11335"/>
		<updated>2025-05-12T10:00:04Z</updated>

		<summary type="html">&lt;p&gt;Maciek: /* Zadanie: Porównanie lekarstwa i placebo */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Testowanie hipotez dotyczących jednej lub dwóch populacji ==&lt;br /&gt;
===Wstęp===&lt;br /&gt;
Schemat weryfikowania hipotez omówiony jest w wykładzie [[WnioskowanieStatystyczne/Weryfikacja hipotez |Weryfikacja hipotez statystycznych]]. Tu przypomnimy tylko krótko podstawowe pojęcia i decyzje, które trzeba pojąć w procedurze weryfikacji.&lt;br /&gt;
====Hipoteza zerowa i alternatywna====&lt;br /&gt;
Podstawą sukcesu w statystycznym testowaniu hipotez jest prawidłowe ich sformułowanie. &lt;br /&gt;
Hipotezy muszą być rozłączne. Najczęściej jako hipotezę zerową przyjmujemy zdanie, które chcemy odrzucić, &lt;br /&gt;
gdyż błąd takiej decyzji można kontrolować. Logika testowania jest następująca: tworzymy &lt;br /&gt;
funkcję od zmiennych losowych, dla której przy spełnieniu przez owe zmienne hipotezy zerowej potrafimy &lt;br /&gt;
podać prawdopodobieństwa z jakimi przyjmuje ona różne wartości. Ta funkcja nazywana jest ''statystyką''. &lt;br /&gt;
Następnie obliczamy wartość tej funkcji dla badanej próby. Jeśli prawdopodobieństwo osiągnięcia otrzymanej &lt;br /&gt;
bądź jeszcze bardziej ekstremalnej wartości statystyki jest niskie to wątpimy, że nasze dane są zgodne&lt;br /&gt;
z hipotezą zerową i jesteśmy skłonni przyjąć hipotezę alternatywną.&lt;br /&gt;
&lt;br /&gt;
====Wybór statystyki====&lt;br /&gt;
Wybierając statystykę można posłużyć się następującym schematem:&lt;br /&gt;
* Jeżeli znamy rozkład prawdopodobieństwa, z którego pochodzą nasze dane, lub umiemy je przetransformować do znanego rozkładu, to wybierzemy klasyczny test parametryczny np. test ''t'' ([http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.mstats.ttest_rel.html ttest_rel], [http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.ttest_ind.html ttest_ind]), &amp;lt;math&amp;gt;\chi^2&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; itp.&lt;br /&gt;
* Jeżeli nie znamy rozkładu prawdopodobieństwa naszych danych albo nie chcemy nic o nim zakładać to mamy dwie możliwości: &lt;br /&gt;
** korzystamy z klasycznego [[WnioskowanieStatystyczne/Test_Wilcoxona|testu nieparametrycznego]] np.:&lt;br /&gt;
&amp;lt;!--http://mail.scipy.org/pipermail/scipy-user/2009-July/021679.html--&amp;gt;&lt;br /&gt;
**; test Wilcoxona dla obserwacji sparowanych: testuje hipotezę zerową, że dwie próby &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, które ze sobą porównujemy pochodzą z tej samej populacji ciągłej (przekłada się to na równość dystrybuant). Próby &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; '''są''' sparowane. W pythonie mamy ten test zaimplementowany jako: [http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.wilcoxon.html &amp;lt;tt&amp;gt;scipy.stats.wilcoxon(x, y=None)&amp;lt;/tt&amp;gt;]. Ta implementacja stosuje przybliżenie dużych prób i zalecana jest dla &amp;lt;math&amp;gt;n&amp;gt;20&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;!--    Calculate the Wilcoxon signed-rank test&lt;br /&gt;
&lt;br /&gt;
    The Wilcoxon signed-rank test tests the null hypothesis that two related samples come from the same distribution. It is a a non-parametric version of the paired T-test.&lt;br /&gt;
    Parameters:	&lt;br /&gt;
    x : array_like&lt;br /&gt;
        The first set of measurements&lt;br /&gt;
    y : array_like, optional, default None&lt;br /&gt;
        The second set of measurements. If y is not given, then the x array is considered to be the differences between the two sets of measurements.&lt;br /&gt;
    Returns:	&lt;br /&gt;
    z-statistic : float&lt;br /&gt;
        The test statistic under the large-sample approximation that the signed-rank statistic is normally distributed.&lt;br /&gt;
    p-value : float&lt;br /&gt;
        The two-sided p-value for the test&lt;br /&gt;
    Notes&lt;br /&gt;
    Because the normal approximation is used for the calculations, the samples used should be large. A typical rule is to require that n &amp;gt; 20.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
scipy.stats.ranksums(x, y)&lt;br /&gt;
&lt;br /&gt;
    Compute the Wilcoxon rank-sum statistic for two samples.&lt;br /&gt;
&lt;br /&gt;
    The Wilcoxon rank-sum test tests the null hypothesis that two sets of measurements are drawn from the same distribution. The alternative hypothesis is that values in one sample are more likely to be larger than the values in the other sample.&lt;br /&gt;
&lt;br /&gt;
    This test should be used to compare two samples from continuous distributions. It does not handle ties between measurements in x and y. For tie-handling and an optional continuity correction see `stats.mannwhitneyu`_&lt;br /&gt;
    Parameters:	&lt;br /&gt;
&lt;br /&gt;
    x,y : array_like&lt;br /&gt;
&lt;br /&gt;
        The data from the two samples&lt;br /&gt;
&lt;br /&gt;
    Returns:	&lt;br /&gt;
&lt;br /&gt;
    z-statistic : float&lt;br /&gt;
&lt;br /&gt;
        The test statistic under the large-sample approximation that the rank sum statistic is normally distributed&lt;br /&gt;
&lt;br /&gt;
    p-value : float&lt;br /&gt;
&lt;br /&gt;
        The two-sided p-value of the test&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
**; test Manna-Whitney'a : testuje hipotezę zerową, że dwie próby &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, które ze sobą porównujemy pochodzą z tej samej populacji ciągłej. Próby &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; i&amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; '''nie są''' sparowane. Implementacja w pyhtonie: [http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.mannwhitneyu.html &amp;lt;tt&amp;gt;scipy.stats.mannwhitneyu(x, y, use_continuity=True)&amp;lt;/tt&amp;gt;] stosuje przybliżenia i zalecana jest dla &amp;lt;math&amp;gt;n&amp;gt;20&amp;lt;/math&amp;gt; w każdej z prób. Funkcja zwraca wartość ''p'' dla hipotezy jednostronnej. Jeśli testujemy hipotezę dwustronną trzeba otrzymane ''p'' pomnożyć przez 2.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
scipy.stats.mannwhitneyu(x, y, use_continuity=True)¶&lt;br /&gt;
&lt;br /&gt;
    Computes the Mann-Whitney rank test on samples x and y.&lt;br /&gt;
    Parameters:	&lt;br /&gt;
    x, y : array_like&lt;br /&gt;
        Array of samples, should be one-dimensional.&lt;br /&gt;
    use_continuity : bool, optional&lt;br /&gt;
        Whether a continuity correction (1/2.) should be taken into account. Default is True.&lt;br /&gt;
    Returns:	&lt;br /&gt;
    u : float&lt;br /&gt;
        The Mann-Whitney statistics.&lt;br /&gt;
    prob : float&lt;br /&gt;
        One-sided p-value assuming a asymptotic normal distribution.&lt;br /&gt;
    Notes&lt;br /&gt;
    Use only when the number of observation in each sample is &amp;gt; 20 and you have 2 independent samples of ranks. Mann-Whitney U is significant if the u-obtained is LESS THAN or equal to the critical value of U.&lt;br /&gt;
&lt;br /&gt;
    This test corrects for ties and by default uses a continuity correction. The reported p-value is for a one-sided hypothesis, to get the two-sided p-value multiply the returned p-value by 2.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
** wytwarzamy rozkład statystyki na podstawie naszych danych przez repróbkowanie ([[WnioskowanieStatystyczne/Bootstrap|bootstrap]] lub [[WnioskowanieStatystyczne/Testy_permutacyjne| permutacje]]). W podejściu repróbkowania tworzymy statystyczny model badanego procesu '''zgodny z hipotezą zerową''' i następnie badamy w drodze symulacji prawdopodobieństwa generowania przez ten model interesujących nas sytuacji. Największą uwagę musimy tu poświęcić na prawidłowe sformułowanie modelu, a następnie precyzyjne określenie prawdopodobieństwo jakiego zdarzenia nas naprawdę interesuje.&lt;br /&gt;
&lt;br /&gt;
===Poziom istotności &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; i wartość &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;===&lt;br /&gt;
; Błąd pierwszego rodzaju : błąd polegający na odrzuceniu hipotezy zerowej, która w rzeczywistości jest prawdziwa. Oszacowanie prawdopodobieństwa popełnienia błędu pierwszego rodzaju oznaczamy symbolem &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; i nazywamy poziomem istotności testu.&lt;br /&gt;
; Błąd drugiego rodzaju : polegaja na nieodrzuceniu hipotezy zerowej, która jest w rzeczywistości fałszywa. Oszacowanie prawdopodobieństwo popełnienia błędu drugiego rodzaju oznaczamy symbolem &amp;lt;math&amp;gt; \beta&amp;lt;/math&amp;gt;, a jego dopełnienie do jedności nazywane jest '''mocą testu'''.&lt;br /&gt;
&lt;br /&gt;
Wartość &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; jest to wartość prawdopodobieństwa, że wobec posiadanych danych  hipoteza zerowa jest prawdziwa. Jest ono obliczane jako prawdopodobieństwo zaobserwowania wartości ''statystyki'' takiej jak dla badanej próby, lub bardziej ekstremalnej, przy prawdziwej hipotezie zerowej.&lt;br /&gt;
Najczęściej porównujemy ''p'' z wcześniej ustalonym poziomem istotności &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;. Poziom istotności &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; to wartość krytyczna prawdopodobieństwa, taka że jeżeli &amp;lt;math&amp;gt; p&amp;lt; \alpha&amp;lt;/math&amp;gt; to odrzucamy hipotezę zerową.&lt;br /&gt;
&lt;br /&gt;
==Formułowanie hipotez==&lt;br /&gt;
===Przykład: mutacje muszek owocowych===&lt;br /&gt;
Załóżmy, że badamy muszki owocowe. W standardowej populacji proporcja samic do samców jest 1:1. Opracowaliśmy metodę powodującą taką mutację muszek owocowych, że potomstwo ich nie będzie miało jednakowej szansy na bycie samcem lub samiczką. W pierwszych 20 zbadanych przypadkach uzyskujemy 14 samców i 6 samiczek.&lt;br /&gt;
; Pytanie naukowe: Czy wyniki eksperymentu potwierdzają, że nasza metoda zaburza proporcję płci?&lt;br /&gt;
Najpierw musimy przetłumaczyć pytanie naukowe na pytanie statystyczne. &lt;br /&gt;
; Pytanie statystyczne: Jakie jest prawdopodobieństwo uzyskania zaobserwowanej proporcji (14:6), lub bardziej ekstremalnej w próbie 20 osobników,  jeśli rzeczywista proporcja płci jest 1:1?&lt;br /&gt;
&lt;br /&gt;
Z tego pytania wynikają dwie możliwe hipotezy:&lt;br /&gt;
* Hipoteza zerowa: Nowa metoda nie zaburza proporcji płci 1:1. Zaobserwowana próbka pochodzi z populacji, w której proporcja płci ''jest'' 1:1&lt;br /&gt;
* Hipoteza alternatywna: Zaobserwowana próbka pochodzi z populacji, w której proporcja płci ''nie jest'' 1:1.&lt;br /&gt;
; Prawdopodobieństwo, które musimy oszacować: Jakie jest prawdopodobieństwo uzyskania 14 lub więcej jedynek w serii 20 prób, jeśli prawdopodobieństwo jedynki jest &amp;lt;math&amp;gt;1/2&amp;lt;/math&amp;gt;?  &lt;br /&gt;
# Oznaczmy 1: samiec 0: samiczka.&lt;br /&gt;
# Zróbmy wektor 20-elementowy zawierający 10 zer i 10 jedynek.&lt;br /&gt;
# Wylosujmy ze zwracaniem nowy wektor 20-elementowy. (Jest to nasz model uzyskiwania 20 elementowej próbki z populacji o proporcji 1:1.) Zapamiętajmy liczbę jedynek.&lt;br /&gt;
# Powtórzmy poprzedni krok 1000 razy&lt;br /&gt;
# Zróbmy histogram ilości jedynek.&lt;br /&gt;
# Policzmy ile razy zdarzyło sie 14 lub więcej jedynek (to odpowiada 14 lub więcej samców) i dodajmy do tego ilość przypadków gdy mieliśmy 6 lub mniej jedynek (to odpowiada 14 lub więcej samiczek). Wynik podzielmy przez ilość losowań (1000).&lt;br /&gt;
&lt;br /&gt;
Powyższa procedura opisuje test dwustronny. Testu dwustronnego musimy użyć jeśli nie mamy ''istotnych'' powodów, żeby wierzyć, że nowa metoda działa ''jedynie na zwiększenie'' szansy pojawienia się samca.&lt;br /&gt;
&lt;br /&gt;
Jak powyższy problem rozwiązać w sposób parametryczny? &lt;br /&gt;
Próby podlegają rozkładowi dwumianowemu, można więc obliczyć szukane prawdopodobieństwo korzystając z jego dystrybuanty.&lt;br /&gt;
&lt;br /&gt;
==Testowanie hipotez na temat średniej==&lt;br /&gt;
Firma rozwożąca przesyłki po mieście deklaruje średni czas dostarczenia 28 minut. Przeprowadźmy test tej hipotezy na poziomie istotności 5%.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_0: \mu = 28&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;H_1: \mu \ne 28&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wybieramy losową próbę 100 przesyłek, mierzymy czas dostarczenia, liczymy średnią z próby &amp;lt;math&amp;gt;\bar x = 31,5&amp;lt;/math&amp;gt; minut i odchylenie standardowe próby &amp;lt;math&amp;gt;s = 5&amp;lt;/math&amp;gt; minut. &lt;br /&gt;
&lt;br /&gt;
Test ten można przeprowadzić z użyciem przedziałów ufności:&lt;br /&gt;
* Konstruujemy przedziały ufności 95% dla średniej &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.Formalnie, ponieważ wyliczyliśmy odchylenie standardowe z próby powinniśmy zastosować wartości krytyczne z rozkładu t. Rozmiar próby wynosi 100 więc rozkład t ma 99 stopni swobody. Wartość krytyczna w tym rozkladzie to &amp;lt;math&amp;gt;t_{97.5} =  1.984 &amp;lt;/math&amp;gt;. Mamy zatem:&lt;br /&gt;
&amp;lt;math&amp;gt;\bar x \pm 1,984 \frac{s}{\sqrt{n}} = 31,5 \pm 1,984*\frac{5}{\sqrt{100}} = 31,5 \pm 0,992 = [30,51 \quad 32,49]&amp;lt;/math&amp;gt;&lt;br /&gt;
* Wnioskowanie: Możemy więc być na 95% pewni, że nieznana średnia leży pomiędzy 30,51 a 32,49 a więc na 95% nie leży poza tym przedziałem. &lt;br /&gt;
Skoro &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; podaje &amp;lt;math&amp;gt;\mu = 28&amp;lt;/math&amp;gt; (poza przedziałem), możemy odrzucić tę hipotezę.  Jeśli &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; jest prawdziwe, istnieje prawdopodobieństwo 0,05, że skonstruowany przedział nie będzie zawierał &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. Istnieje zatem prawdopodobieństwo 0,05 popełnienia błądu I-go rodzaju. Mówimy, że przeprowadziliśmy test na poziomie istotności 0,05.&lt;br /&gt;
&lt;br /&gt;
Test można też przeprowadzić następująco:&lt;br /&gt;
* Jako statystykę wybieramy &amp;lt;math&amp;gt;t = \frac{\bar x - \mu}{s/\sqrt{n}} &amp;lt;/math&amp;gt;&lt;br /&gt;
* Obliczmy jej wartość dla danych z próby: &amp;lt;math&amp;gt;t = \frac{\bar x - \mu}{s/\sqrt{n}}  = (31,5 -28)/(5/\sqrt{100}) = 7 &amp;lt;/math&amp;gt;&lt;br /&gt;
* Porównujemy otrzymaną wartość z wartością krytyczna dla przyjętego poziomu istotności &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;. Konstuowany przez nas test ma być testem dwustronnym więc musimy wziąć do porównania wartość krytyczna dla &amp;lt;math&amp;gt;\alpha/2&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt; t_{\alpha/2} = t_{0,025}= -1,984&amp;lt;/math&amp;gt;&lt;br /&gt;
* Wnioskowanie: Dla naszej próby otrzymaliśmy wartość statystyki równą 6.96. Dla przyjętego poziomu istotności wartość statystyki wynosi 1,984. Prawdopodobieństwo zaobserwowania statystyki o wartości 7 lub bardziej ekstremalnej (tu: większej) jest mniejsze niż założony poziom istotności więc odrzucamy &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; na poziomie &amp;lt;math&amp;gt;\alpha = 0,05&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Testowanie hipotez na temat wariancji==&lt;br /&gt;
&lt;br /&gt;
Do testowania hipotez na temat wariancji używamy statystyki chi-kwadrat o &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; stopniach swobody:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\chi^2 = \frac{(n-1)s^2}{\sigma_0^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\sigma_0^2&amp;lt;/math&amp;gt; jest wartością wariancji podaną w &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
===Przykład===&lt;br /&gt;
Do produkcji baterii używane są metalowe płytki o średniej średnicy 5 mm. Jeśli wariancja średnicy płytki jest nie większa niż 1 mm&amp;lt;math&amp;gt;^2&amp;lt;/math&amp;gt;, produkcja jest kontynuowana. Jeśli wariancja przekracza 1 mm&amp;lt;math&amp;gt;^2&amp;lt;/math&amp;gt; proces produkcji trzeba przerwać. Kontroler przeprowadza test na poziomie istotności &amp;lt;math&amp;gt;\alpha = 5&amp;lt;/math&amp;gt;%: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_0:&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\sigma^2 \le 1&amp;lt;/math&amp;gt; i &lt;br /&gt;
&amp;lt;math&amp;gt;H_1:&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\sigma^2 &amp;gt; 1&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Wybiera losową próbę 31 płytek i znajduje wariancję próby &amp;lt;math&amp;gt;s^2 = 1,62&amp;lt;/math&amp;gt;. Czy daje to podstawy do przerwania produkcji?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\chi^2 = \frac{(31-1) \cdot 1,62}{1} = 48,6&amp;lt;/math&amp;gt;. Znajdujemy poziom &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; dla tej wartości &amp;lt;math&amp;gt;\chi^2&amp;lt;/math&amp;gt; z 30 stopniami swobody. &lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
p = 1-st.chi2.cdf(48.6,30)&lt;br /&gt;
print(p)&lt;br /&gt;
&lt;br /&gt;
#ilustracja&lt;br /&gt;
x = py.arange(0,60,1)  &lt;br /&gt;
py.plot(x, st.chi2.pdf(x,30)) #rysujemy funkcję gęstości prawdopodobieństwa chi2 o 30 st. swobody&lt;br /&gt;
x2 = py.arange(48.8,60,1)&lt;br /&gt;
py.fill_between(x2,st.chi2.pdf(x2,30)) #cieniujemy obszar pod funkcją geęstości prawdopodobieństwa odpowiadający obliczonemu p&lt;br /&gt;
&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Otrzymaliśmy &amp;lt;math&amp;gt; p = 0,017 &amp;lt;/math&amp;gt;.&lt;br /&gt;
Wniosek:  Odrzucamy &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Błąd drugiego rodzaju. Moc testu.==&lt;br /&gt;
Błąd II-go rodzaju popełniamy wtedy gdy przyjmujemy &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; a prawdziwe jest &amp;lt;math&amp;gt;H_1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Przykład===&lt;br /&gt;
Załóżmy następujący test:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_0: \mu = 60&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_1: \mu = 65&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Niech rozmiar próby wynosi &amp;lt;math&amp;gt;n = 100&amp;lt;/math&amp;gt; a odchylenie standardowe w populacji &amp;lt;math&amp;gt;\sigma = 20&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Powinniśmy tu zastosować test jednostronny (mamy tylko dwie możliwości: &amp;lt;math&amp;gt;\mu = 60&amp;lt;/math&amp;gt; lub &amp;lt;math&amp;gt;65&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
Znajdźmy punkt krytyczny &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; dla poziomu istotności &amp;lt;math&amp;gt;\alpha =  0,05&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;C = \mu_0 + 1,645\frac{\sigma}{\sqrt{n}} = 60 + 1,645(20/10) = 63,29&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Błąd pierwszego rodzaju popełnimy gdy &amp;lt;math&amp;gt;\bar x &amp;gt; C&amp;lt;/math&amp;gt; i prawdziwe będzie &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt;. Prawdopodobieństwo błędu pierwszego rodzaju ustaliliśmy z góry na poziomie &amp;lt;math&amp;gt;\alpha = 0,05&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\alpha = P(\bar x &amp;gt; C| \mu = \mu_0)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Błąd drugiego rodzaju popełnimy gdy &amp;lt;math&amp;gt;\bar x &amp;lt; C&amp;lt;/math&amp;gt; a prawdziwe będzie &amp;lt;math&amp;gt;H_1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Prawdopodobieństwo popełnienia tego błędu wynosi:&lt;br /&gt;
&amp;lt;math&amp;gt;\beta = P(\bar x &amp;lt; C| \mu = \mu_1) = P\left( \frac{\bar x - \mu_1}{\sigma/\sqrt{n}}  &amp;lt; \frac{C - \mu_1}{\sigma/\sqrt{n}}\right)= &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;= P\left( Z &amp;lt; \frac{63,29 - 65}{20/10}\right)  = P(Z &amp;lt; -0,855) = 0,1963&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Moc testu jest dopełnieniem błędu II rodzaju.&lt;br /&gt;
A moc testu czyli prawdopodobieństwo odrzucenia hipotezy zerowej podczas gdy jest ona fałszywa wynosi:&lt;br /&gt;
&amp;lt;math&amp;gt;1 - \beta = 0,8037&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Porównanie dwóch populacji==&lt;br /&gt;
[[WnioskowanieStatystyczne/Test_t#Test_t_.28Studenta.29_r.C3.B3.C5.BCnicy_.C5.9Brednich|Dla przypomnienia]]:&lt;br /&gt;
Jeśli mamy dwie próbki danych:&lt;br /&gt;
:&amp;lt;math&amp;gt;x_1&amp;lt;/math&amp;gt; o liczebności &amp;lt;math&amp;gt;n_1&amp;lt;/math&amp;gt; i estymowanej wariancji &amp;lt;math&amp;gt;s_1^2&amp;lt;/math&amp;gt; i &lt;br /&gt;
:&amp;lt;math&amp;gt;x_2&amp;lt;/math&amp;gt; o liczebności &amp;lt;math&amp;gt;n_2&amp;lt;/math&amp;gt; i estymowanej wariancji &amp;lt;math&amp;gt;s_2^2&amp;lt;/math&amp;gt;  &lt;br /&gt;
:gdzie &amp;lt;math&amp;gt;s_{i}^2= \frac{1}{(n_i-1)}\sum\limits_{j=1}^{n_i} (x_{j}-\overline{x}_{i})^{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
pochodzących z rozkładu normalnego o takiej samej wariancji &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; to:&lt;br /&gt;
*wspólna wariancja może być estymowana jako: &amp;lt;math&amp;gt;s^2=\frac{(n_1-1)s_1^2+(n_2-1)s_2^2}{n_1+n_2-2} &amp;lt;/math&amp;gt;&lt;br /&gt;
*wariancja różnicy średnich może być estymowana jako: &amp;lt;math&amp;gt;s_{\Delta}^2=s_{\bar{x}_1}^2+s_{\bar{x}_2}^2=\frac{1}{n_1}s_1^2+\frac{1}{n_2}s_2^2 = \frac{n_1+n_2}{n_1n_2}s^2&amp;lt;/math&amp;gt;&lt;br /&gt;
Jeśli postawimy hipotezę zerową: &amp;lt;math&amp;gt;H_0:\; \mu_1 = \mu_2&amp;lt;/math&amp;gt; to&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
t= \frac{\bar{x}_1-\bar{x}_2}{s_{\Delta}}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
pochodzi z rozkładu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; o &amp;lt;math&amp;gt;n_1+n_2-2&amp;lt;/math&amp;gt; stopniach swobody.&lt;br /&gt;
&lt;br /&gt;
===Przykład: promocja===&lt;br /&gt;
Producent odtwarzaczy CD chce sprawdzić czy małe obniżenie ceny produktu wpłynie korzystnie na sprzedaż. Losowa próba 15 tygodni sprzedaży przed obniżką dała średni dochód 6598 zł i standardowe odchylenie 844 zł. Losowa próba 12 tygodni sprzedaży w trakcie promocji dała średnią 6870 i odchylenie standardowe 669 zł. Czy dane te wykazują poprawę sprzedaży w trakcie promocji (przyjąć poziom istotności 5%) ?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\bar{x}_1 = 6598&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\bar{x}_2 = 6870&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Treść zadania odpowiada testowi jednostronnemu z poniższymi hipotezami:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_0: \mu_1 = \mu_2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_1: \mu_1 &amp;lt; \mu_2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Różnica średnich wynosi:&lt;br /&gt;
&amp;lt;math&amp;gt;\bar{x}_1-\bar{x}_2 = 6598 - 6870 = -272 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Estymowana wariancja różnicy średnich:&lt;br /&gt;
&amp;lt;math&amp;gt;s_{\Delta}^2 =  \frac{1}{n_1}s_1^2+\frac{1}{n_2}s_2^2 = \frac{844^2}{15} + \frac{669^2}{12} = 84785,82&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
zatem:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;s_{\Delta} = 291,18&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; t = -272/ 291,18 = - 0,934&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ilość stopni swobody: &amp;lt;math&amp;gt;n_1+n_2-2 = 25&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;P(t_{25} \le -0,934) = 0.18 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wniosek: Nie możemy odrzucić &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt;. Nie mamy podstaw by uznać że mała obniżka cen poprawiła sprzedaż.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Do testowania równości wariancji w dwóch populacjach stosuje się test &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;F_{(n1 -1, n2 - 1)} = \frac{s_1^2}{s_2^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
W przykładzie powyżej założyliśmy równość wariancji. Korzystając z testu &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; sprawdzić czy założenie było uzasadnione.&lt;br /&gt;
&lt;br /&gt;
==Badanie założenia o normalności rozkładu==&lt;br /&gt;
We wszystkich wspomnianych powyżej klasycznych testach statystycznych &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\chi^2&amp;lt;/math&amp;gt; istotnym założeniem jest to, że dane wejściowe w próbie mają rozkład normalny. W powyższych zadaniach po prostu to zakładaliśmy, ale w praktyce, kiedy dostajemy próbę do analizy, musimy sami sprawdzić,  czy możemy uznać ją za pochodzącą z rozkładu normalnego. Do weryfikacji takiej hipotezy służą narzędzia graficzne:&lt;br /&gt;
&lt;br /&gt;
=== Histfit: histogram z naniesionym fitem rozkładu normalnego ===&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
def histfit(x,N_bins):  &lt;br /&gt;
''' &lt;br /&gt;
x - dane&lt;br /&gt;
N_bins -ilość binów w histogramie&lt;br /&gt;
&lt;br /&gt;
Funkcja rysuje histogram i na jego tle dorysowuje wykres &lt;br /&gt;
funkcji gęstości prawdopodobieństwa rozkładu normalnego &lt;br /&gt;
o średniej i wariancji estymowanych z x.&lt;br /&gt;
&lt;br /&gt;
Funkcja wymaga zaimportowania modułów pylab as py i scipy.stats as st''' &lt;br /&gt;
 &lt;br /&gt;
	n, bins, patches = py.hist(x, N_bins, density=True, facecolor='green', alpha=0.75)&lt;br /&gt;
	# Rysujemy histogram i w jawny sposób odbieramy zwracane przez p.hist obiekty&lt;br /&gt;
	#   - normujemy histogram do jedności&lt;br /&gt;
	#   - ustalamy kolor prostokątów na zielony&lt;br /&gt;
	#   - ustawiamy przezroczystość prostokątów na 0.75&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	bincenters = 0.5*(bins[1:]+bins[:-1])&lt;br /&gt;
	# wytwarzamy tablicę z centrami binów korzystając z granic binów&lt;br /&gt;
	# zwróconych przez py.hist w macierzy bins&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	y = st.norm.pdf( bincenters, loc = np.mean(x), scale = np.std(x))&lt;br /&gt;
	# obliczamy momenty rozkładu x: średnią i wariancję (tak naprawdę to jej pierwiastek czyli standardowe odchylenie)&lt;br /&gt;
	# obliczamy wartości w normalnym rozkładzie gęstości prawdopodobieństwa&lt;br /&gt;
	# o średniej np.mean(x) i standardowym odchyleniu np.std(x) dla wartości bincenters&lt;br /&gt;
 &lt;br /&gt;
	l = py.plot(bincenters, y, 'r--', linewidth=1)&lt;br /&gt;
	# do histogramu dorysowujemy linię &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Normplot ===&lt;br /&gt;
Jest to wykres wartości w próbie, wzg. prawdopodobieństwa uzyskania takiej wartości w rozkładzie normalnym. Wykres ten jest szczególnym przypadkiem kwantylowego wykresu prawdopodobieństwa [http://en.wikipedia.org/wiki/Q-Q_plot]. Konstruuje się go następująco: &lt;br /&gt;
*Na osi pionowej odkładamy uporządkowane zaobserwowane wartości &amp;lt;math&amp;gt;x_1 \le x_2 \le \dots \le x_n &amp;lt;/math&amp;gt;. Estymują one położenie kwantyli w populacji.&lt;br /&gt;
*Na osi poziomej odkładamy położenia kwantyli w rozkładzie normalnym. Obliczamy je: &amp;lt;math&amp;gt;F^{-1}\left(\frac{i-r_{pop}}{n+n_{pop}} \right)&amp;lt;/math&amp;gt; gdzie &amp;lt;math&amp;gt;F^{-1}&amp;lt;/math&amp;gt; jest funkcją odwrotną do dystrybuanty rozkładu teoretycznego (w tym szczególnym przypadku normalnego) &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; jest numerem obserwacji a &amp;lt;math&amp;gt;r_{pop}, n_{pop}&amp;lt;/math&amp;gt; są czynnikami (&amp;lt;math&amp;gt;\le 0.5 &amp;lt;/math&amp;gt;) zapewniającymi, że argument funkcji odwrotnej do dystrybuanty nie przyjmuje wartości 0 ani 1. &lt;br /&gt;
Jeśli dane ''x'' podlegają rozkładowi normalnemu to ich położenia kwantyli powinny być zgodne z położeniami kwantyli w rozkładzie normalnym, zatem wykres powinien przedstawiać linię prostą. Odstępstwa od prostej świadczą o odstępstwie od rozkładu normalnego.&lt;br /&gt;
W pythonie możemy ten typ wykresu zaimplementować np. tak (współczynniki zaczerpnięte z [http://www.itl.nist.gov/div898/handbook/eda/section3/normprpl.htm]):&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
def normplot(x):&lt;br /&gt;
	'''normplot: x dane do testowania'''&lt;br /&gt;
	x_ord = sorted(x)&lt;br /&gt;
	N = len(x)&lt;br /&gt;
	y = np.zeros(N)&lt;br /&gt;
	y[0]=st.norm.ppf(1- 0.5**(1.0/N) )&lt;br /&gt;
	y[N-1] = st.norm.ppf(0.5**(1.0/N) )&lt;br /&gt;
	for i in range(1,N-1):&lt;br /&gt;
		arg = float(i-0.3175)/(N+0.365)&lt;br /&gt;
		y[i] = st.norm.ppf(arg)&lt;br /&gt;
	py.plot(y,x_ord,'.')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Test Shapiro-Wilka ===&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;W,p = st.shapiro(x)&amp;lt;/source&amp;gt;&lt;br /&gt;
Funkcja ta zwraca wartość statystyki ''W'' i prawdopodobieństwo ''p''  zaobserwowania takiej lub bardziej ekstremalnej wartości statystyki ''W'' dla danych podlegających rozkładowi normalnemu. Jeśli ''p'' ma wysoką wartość (większą niż przyjęta &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;) to nie możemy odrzucić hipotezy, że dane podlegają  rozkładowi normalnemu. Test Shapiro-Wilka nie jest wrażliwy na parametry rozkładu, z którego pochodzą dane (dane mogą pochodzić z rozkładu o dowolnej średniej i dowolnym odchyleniu standardowym).&lt;br /&gt;
&lt;br /&gt;
=== Test Kołmogorowa-Smirnowa ===&lt;br /&gt;
Jest on oparty  na badaniu maksymalnej różnicy pomiędzy dystrybuantą empiryczną (z próby) a teoretyczną dystrybuantą rozkładu. Dla testowania normalności próby powinniśmy wywołać &lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
D , p = st.kstest(x, 'norm', args=(np.mean(x),np.std(x,ddof=1)) #sposób zalecany&lt;br /&gt;
#lub &lt;br /&gt;
D , p = st.kstest((x-np.mean(x))/np.std(x,ddof=1), 'norm') #sposób niezalecany, ale również prawidłowy&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Funkcja zwraca wartość statystyki ''D'' i prawdopodobieństwo zaobserwowania takiej bądź bardziej ekstremalnej wartości statystyki jeśli testowane dane pochodzą z tego samego rozkładu. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;'''UWAGA!''' Test Kołmogorowa-Smirnowa '''jest wrażliwy na parametry rozkładu''', z którego pochodzą dane. Wywołanie poniższego kodu jest błędem:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
D , p = st.kstest(x, 'norm') #BŁĘDNE użycie testu Kołmogorowa-Smirnowa&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Test dla innych postaci rozkładu====&lt;br /&gt;
Za pomocą testu Kołmogorowa-Smirnowa możemy zbadać również założenie o pochodzeniu danych z populacji podlegającej dowolnemu innemu rozkładowi ciągłemu. W tym celu należy podać zamiast 'norm' odpowiednią nazwę rozkładu z modułu scipy.stats oraz parametry tegoż rozkładu w odpowiedniej kolejności (należy w tym celu zajrzeć do dokumentacji). Przykład jak to należy zrobić dla rozkładu wykładniczego:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
D , p = st.kstest(x, 'expon', args=(0, 1/np.mean(x)) #test, czy dane podlegają rozkładowi wykładniczemu&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Przykład===&lt;br /&gt;
Proszę wygenerować 1000 liczb z rozkładu normalnego. Liczby te obejrzyjmy na wykresach &amp;lt;tt&amp;gt;histfit&amp;lt;/tt&amp;gt; oraz &amp;lt;tt&amp;gt;normplot&amp;lt;/tt&amp;gt; i zbadamy ich normalność testem  Shapiro-Wilka i Kołmogorova-Smirnova. &lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
 &lt;br /&gt;
def normplot(x):&lt;br /&gt;
	'''normplot: x dane do testowania'''&lt;br /&gt;
	x_ord = sorted(x)&lt;br /&gt;
	N = len(x)&lt;br /&gt;
	y = np.zeros(N)&lt;br /&gt;
	y[0]=st.norm.ppf(1- 0.5**(1.0/N) )&lt;br /&gt;
	y[N-1] = st.norm.ppf(0.5**(1.0/N) )&lt;br /&gt;
	for i in range(1,N-1):&lt;br /&gt;
		arg = float(i-0.3175)/(N+0.365)&lt;br /&gt;
		y[i] = st.norm.ppf(arg)&lt;br /&gt;
	py.plot(y,x_ord,'.')&lt;br /&gt;
 &lt;br /&gt;
def histfit(x,N_bins):  &lt;br /&gt;
	''' funkcja rysuje histogram i na jego tle dorysowuje wykres &lt;br /&gt;
	funkcji gęstości prawdopodobieństwa rozkładu normalnego &lt;br /&gt;
	o średniej i wariancji estymowanych z x &lt;br /&gt;
	Funkcja wymaga zaimportowania modułów pylab as py i scipy.stats as st'''  &lt;br /&gt;
	n, bins, patches = py.hist(x, N_bins, normed=True, facecolor='green', alpha=0.75)&lt;br /&gt;
	bincenters = 0.5*(bins[1:]+bins[:-1]) &lt;br /&gt;
	y = st.norm.pdf( bincenters, loc = np.mean(x), scale = np.std(x,ddof=1)) &lt;br /&gt;
	l = py.plot(bincenters, y, 'r--', linewidth=1)&lt;br /&gt;
def porownania(x):&lt;br /&gt;
	py.subplot(2,2,1)&lt;br /&gt;
	normplot(x)&lt;br /&gt;
	py.subplot(2,2,2)&lt;br /&gt;
	histfit(x,15)&lt;br /&gt;
	W,p_sw = st.shapiro(x)&lt;br /&gt;
	D,p_ks = st.kstest(x, 'norm', args=(np.mean(x),np.std(x,ddof=1)))&lt;br /&gt;
	title = 'SW: %(sw).2f KS: %(ks).2f'%{'sw':p_sw, 'ks':p_ks}&lt;br /&gt;
	&lt;br /&gt;
	py.title(title)&lt;br /&gt;
	# wybieramy pierwsze dziesięć punktów  &lt;br /&gt;
	y=x[0:10]&lt;br /&gt;
	py.subplot(2,2,3)&lt;br /&gt;
	normplot(y)&lt;br /&gt;
	py.subplot(2,2,4)&lt;br /&gt;
	histfit(y,15)&lt;br /&gt;
	W,p_sw = st.shapiro(y)&lt;br /&gt;
	D,p_ks = st.kstest(y, 'norm', args=(np.mean(x),np.std(x,ddof=1)))&lt;br /&gt;
	title = 'SW: %(sw).2f KS: %(ks).2f'%{'sw':p_sw, 'ks':p_ks}&lt;br /&gt;
	py.title(title)&lt;br /&gt;
 &lt;br /&gt;
x = st.norm.rvs(size=1000, loc=0, scale=10)&lt;br /&gt;
py.figure(1)&lt;br /&gt;
porownania(x)&lt;br /&gt;
# A teraz zbadajmy dane z rozkładów innych niż normalny:&lt;br /&gt;
 &lt;br /&gt;
x = st.t.rvs(df = 2, size=1000, loc=0, scale=1)&lt;br /&gt;
py.figure(2)&lt;br /&gt;
porownania(x)&lt;br /&gt;
 &lt;br /&gt;
x = st.expon.rvs(size=1000,loc=0,scale=1)&lt;br /&gt;
py.figure(3)&lt;br /&gt;
porownania(x)&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Proszę zapuścić skrypt kilka razy i zwrócić uwagę na to, jak trudno jest ocenić normalność danych przy małych próbach.&lt;br /&gt;
&lt;br /&gt;
===Przykład: transformacja Boxa-Coxa===&lt;br /&gt;
Często normalność danych można poprawić przez zastosowanie odpowiedniej transformacji. Ogólną rodzinę transformacji, które często prowadzą do normalizacji danych można zapisać tak (trasformacja Box-Cox'a [http://www.jstor.org/stable/2984418]):&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y^{(\lambda)}=\left\{\begin{matrix} \frac{y^\lambda-1} {\lambda} &amp;amp; \mbox{dla }\lambda \ne 0 \\ \ln(y) &amp;amp; \mbox{dla }\lambda = 0\end{matrix}\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W module scipy.stats mamy tę transformację zaimplementowaną jako &amp;lt;tt&amp;gt;boxcox()&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Zobaczmy jej działanie na następującym przykładzie:&lt;br /&gt;
&lt;br /&gt;
Proszę pobrać i zapisać w pliku tekstowym następujące &lt;br /&gt;
[[Media:Samochody.txt| dane]]. Zawierają one 8 kolumn charakterystyk samochodów:&lt;br /&gt;
*zużycie paliwa&lt;br /&gt;
*cylindry&lt;br /&gt;
*pojemność skokowa&lt;br /&gt;
*moc w koniach mechanicznych&lt;br /&gt;
*masa&lt;br /&gt;
*przyspieszenie&lt;br /&gt;
*rocznik&lt;br /&gt;
*pochodzenie&lt;br /&gt;
&lt;br /&gt;
Proszę narysować histfit i normplot  oraz policzyć testy Shapiro-Wilka i Kolmogorowa-Smirnowa dla masy pojazdów, a następnie zastosować do niej transformację Boxa-Coxa i zbadać normalność przetransformowanych danych.&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
def normplot(x):&lt;br /&gt;
	'''normplot: x dane do testowania'''&lt;br /&gt;
	x_ord = sorted(list(x))&lt;br /&gt;
	N = len(x)&lt;br /&gt;
	y = np.zeros(N)&lt;br /&gt;
	y[0]=st.norm.ppf(1- 0.5**(1.0/N) )&lt;br /&gt;
	y[N-1] = st.norm.ppf(0.5**(1.0/N) )&lt;br /&gt;
	for i in range(1,N-1):&lt;br /&gt;
		arg = float(i-0.3175)/(N+0.365)&lt;br /&gt;
		y[i] = st.norm.ppf(arg)&lt;br /&gt;
	py.plot(y,x_ord,'.')&lt;br /&gt;
	&lt;br /&gt;
def histfit(x,N_bins):  &lt;br /&gt;
	''' funkcja rysuje histogram i na jego tle dorysowuje wykres &lt;br /&gt;
	funkcji gęstości prawdopodobieństwa rozkładu normalnego &lt;br /&gt;
	o średniej i wariancji estymowanych z x &lt;br /&gt;
	Funkcja wymaga zaimportowania modułów pylab as py i scipy.stats as st'''  &lt;br /&gt;
	n, bins, patches = py.hist(x, N_bins, normed=True, facecolor='green', alpha=0.75)&lt;br /&gt;
	bincenters = 0.5*(bins[1:]+bins[:-1]) &lt;br /&gt;
	y = st.norm.pdf( bincenters, loc = np.mean(x), scale = np.std(x)) &lt;br /&gt;
	l = py.plot(bincenters, y, 'r--', linewidth=1)&lt;br /&gt;
def porownania(x):&lt;br /&gt;
	py.subplot(2,1,1)&lt;br /&gt;
	normplot(x);&lt;br /&gt;
	py.subplot(2,1,2)&lt;br /&gt;
	histfit(x,15)&lt;br /&gt;
	W,p_sw = st.shapiro(x);&lt;br /&gt;
	D,p_ks = st.kstest(x,'norm',args=(np.mean(x),np.std(x) ))&lt;br /&gt;
	title = 'SW: %(sw).2f KS: %(ks).2f'%{'sw':p_sw, 'ks':p_ks}&lt;br /&gt;
	py.title(title)&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
dane = np.loadtxt('Samochody.txt')&lt;br /&gt;
# Badamy przyspieszenia&lt;br /&gt;
w = dane[:,5]&lt;br /&gt;
py.figure(1)&lt;br /&gt;
porownania(w)&lt;br /&gt;
# A teraz stosujemy transformację Box-Coxa&lt;br /&gt;
wt,lam = st.boxcox(w)&lt;br /&gt;
py.figure(2)&lt;br /&gt;
porownania(wt)&lt;br /&gt;
&lt;br /&gt;
# badamy masy&lt;br /&gt;
w = dane[:,4]&lt;br /&gt;
py.figure(3)&lt;br /&gt;
porownania(w)&lt;br /&gt;
# A teraz stosujemy transformację Box-Coxa&lt;br /&gt;
wt,lam = st.boxcox(w)&lt;br /&gt;
py.figure(4)&lt;br /&gt;
porownania(wt)&lt;br /&gt;
&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W pierwszym przypadku - asymetrię rozkładu przyspieszeń udało się transformacją B-C poprawić, ale w drugim przypadku, masa, asymetrię dało się skorygować (widać to na histfit) ale nie da się poprawić ''ciężkich ogonów'' - widać to zarówno na normplocie jak i na wynikach testów.&lt;br /&gt;
Ogólnie: zanim zaczniemy analizować dane dobrze jest je pooglądać na różnych wykresach i chwilę ''pomyśleć''.&lt;br /&gt;
&lt;br /&gt;
==Przykład (zastosowanie różnych testów do tych samych danych): karma==&lt;br /&gt;
Badamy dwie nowe karmy A i B. Mamy dwie grupy po 12 zwierząt. Uzyskane przyrosty masy są następujące:&lt;br /&gt;
&lt;br /&gt;
A: 31 34 29 26 32 35 38 34 31 29 32 31&lt;br /&gt;
&lt;br /&gt;
B: 26 24 28 29 30 29 31 29 32 26 28 32&lt;br /&gt;
&lt;br /&gt;
Pytanie:&lt;br /&gt;
Czy któraś z karm daje istotnie większe przyrosty masy?&lt;br /&gt;
&lt;br /&gt;
Poniżej rozwiążemy to zadanie stopniowo różnymi metodami. Kolejne kawałki kodu można dopisywać do tego samego pliku.&lt;br /&gt;
&lt;br /&gt;
ROZWIĄZANIE:&lt;br /&gt;
Przyjmujemy poziom istotności, na którym przeprowadzamy testy &amp;lt;math&amp;gt;\alpha = 0.05&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Badamy rozkłady danych:===&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
A=[ 31, 34, 29, 26, 32, 35, 38, 34, 31, 29, 32, 31];&lt;br /&gt;
B=[ 26, 24, 28, 29, 30, 29, 31, 29, 32, 26, 28, 32];&lt;br /&gt;
W, p_A = st.shapiro(A)&lt;br /&gt;
print('Dla grupy A:', p_A)&lt;br /&gt;
W, p_B = st.shapiro(B)&lt;br /&gt;
print('Dla grupy B:', p_B)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dla obu grup test Shapiro-Wilka nie daje nam podstaw do odrzucenia założenia o normalności rozkładów.&lt;br /&gt;
&lt;br /&gt;
===Test parametryczny===&lt;br /&gt;
Nie odrzuciliśmy hipotezy o normalnym rozkładzie danych zatem możemy zastosować  [[WnioskowanieStatystyczne/Test_t | test ''t'' ]] dla różnicy średnich.&lt;br /&gt;
&lt;br /&gt;
Formułujemy hipotezy:&lt;br /&gt;
* &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt;: średni przyrost masy w grupie A &amp;lt;math&amp;gt;=&amp;lt;/math&amp;gt; średni przyrost masy w grupie B&lt;br /&gt;
* &amp;lt;math&amp;gt;H_1&amp;lt;/math&amp;gt;: średni przyrost masy w grupie A &amp;lt;math&amp;gt;\ne&amp;lt;/math&amp;gt; średni przyrost masy w grupie B&lt;br /&gt;
Przeprowadzamy test:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
t, p = st.ttest_ind(A,B)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Otrzymujemy ''p'' = 0.01.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;p &amp;lt; \alpha &amp;lt;/math&amp;gt;,  zatem na przyjętym poziomie istotności odrzucamy hipotezę zerową i stwierdzamy, że grupa A ma inną średnią niż grupa B.&lt;br /&gt;
&lt;br /&gt;
===Test nieparametryczny ===&lt;br /&gt;
Nie zakładajac postaci  rozkładu danych mozemy zastosować test [[WnioskowanieStatystyczne/Test_Wilcoxona| ze statystykami opartymi na rangach]]. &lt;br /&gt;
Formułujemy hipotezy:&lt;br /&gt;
* &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt;: mediana przyrostu masy w grupie A &amp;lt;math&amp;gt;=&amp;lt;/math&amp;gt; mediana przyrostu masy w grupie B&lt;br /&gt;
* &amp;lt;math&amp;gt;H_1&amp;lt;/math&amp;gt;: mediana przyrostu masy w grupie A&amp;lt;math&amp;gt;\ne&amp;lt;/math&amp;gt; mediana przyrostu masy w grupie B&lt;br /&gt;
Przeprowadzamy test:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
U, p = st.mannwhitneyu(A, B)&lt;br /&gt;
p_dwustronne = 2*p&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
W pythonie zaimplementowana jest wersja jednostronna tego testu. Aby otrzymać prawdopodobieństwo ''p'' dla testu dwustronnego musimy pomnożyć je przez 2.&lt;br /&gt;
&lt;br /&gt;
===Testy bootstrapowe===&lt;br /&gt;
Teraz to samo sprawdzimy za pomocą testu repróbkowanego.&lt;br /&gt;
Przyda nam się tu funkcja do pobierania losowej próbki z powtórzeniami z danych:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
def randsample(x, N):&lt;br /&gt;
	'''zwraca wektor o dłougości N z losowo wybranymi elementami wektora x. Losowanie odbywa się z powtórzeniami''' &lt;br /&gt;
	n=len(x)&lt;br /&gt;
	ind = np.random.randint(n, size = N)&lt;br /&gt;
	y = x[ind]&lt;br /&gt;
	return y&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W testech repróbkowanych statystykę możemy wybrać dość dowolnie, ale jak pokażemy poniżej nie każda jest równie dobra.&lt;br /&gt;
Zgodnie z hipotezą zerową próbka A i  B pochodza z tej samej populacji.&lt;br /&gt;
Nasza najlepsza wiedza o owej populacji to połączone próbki A i B:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
POP=np.concatenate((A, B))&lt;br /&gt;
&lt;br /&gt;
N=len(POP)&lt;br /&gt;
NA=len(A)&lt;br /&gt;
NB=len(B)&lt;br /&gt;
# Zasymulujemy N_rep razy wyciagniecie z POP prob o rozmiarach NA i NB i&lt;br /&gt;
# zobaczymy jak czesto zdarzają się wartości statystyki  sie roznica srednich taka jak w oryginalnym&lt;br /&gt;
# pomiarze lub jeszcze wieksza. &lt;br /&gt;
N_rep=10000&lt;br /&gt;
# oryginalna roznica srednich i median:&lt;br /&gt;
mi_0 = np.abs(np.mean(A) - np.mean(B))&lt;br /&gt;
T_0  = np.abs(np.mean(A) - np.mean(B))/np.std(POP)&lt;br /&gt;
me_0 = np.abs(np.median(A) - np.median(B))&lt;br /&gt;
&lt;br /&gt;
mi = np.zeros(N_rep)&lt;br /&gt;
T  = np.zeros(N_rep)&lt;br /&gt;
me = np.zeros(N_rep)&lt;br /&gt;
&lt;br /&gt;
for i in range(N_rep):&lt;br /&gt;
	AA = randsample(POP,NA)&lt;br /&gt;
	BB = randsample(POP,NB)&lt;br /&gt;
	R_POP = np.concatenate((AA,BB))&lt;br /&gt;
	mi[i] = np.abs(np.mean(AA)-np.mean(BB)) # abs bo test dwustronny&lt;br /&gt;
	T[i]  = np.abs(np.mean(AA)-np.mean(BB))/np.std(R_POP)&lt;br /&gt;
	me[i] = np.abs(np.median(AA)-np.median(BB))&lt;br /&gt;
&lt;br /&gt;
p_mi = np.sum(mi&amp;gt;=mi_0)/N_rep&lt;br /&gt;
p_T  = np.sum( T&amp;gt;=T_0 )/N_rep&lt;br /&gt;
p_me = np.sum(me&amp;gt;=me_0)/N_rep&lt;br /&gt;
&lt;br /&gt;
print('testy repróbkowane: ')&lt;br /&gt;
print('rożnica średnich: ', p_mi)&lt;br /&gt;
print('pseudo T: ', p_T)&lt;br /&gt;
print('różnica median: ', p_me)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Widzimy, że dla testu ze statystyką różnicy średnich i  pseudo T dostajemy podobne wyniki, z tym, że pseudo T jest nieco silniejszy. Test ze statystyką różnicy średnich jest na tyle słaby, że nie pozwala na odrzucenie hipotezy zerowej.&lt;br /&gt;
&lt;br /&gt;
===Wnioskowanie w oparciu o przedziały ufności ===&lt;br /&gt;
Wnioskowanie o równości średnich dwóch grup można też przerowadzić w oparciu o przedziały ufności. W naszym przykładzie przedziały można skonstruować zarówno parametrycznie jak i nieparametrycznie.&lt;br /&gt;
==== Wersja parametryczna ====&lt;br /&gt;
Konstruujemy 95% przedział ufności wokół oryginalnej różnicy średnich.&lt;br /&gt;
Dla dwóch grup wariancję różnicy średnich znajdujemy sumując wariancje śrenich estymowane dla każdej z grup:&lt;br /&gt;
:&amp;lt;math&amp;gt; &lt;br /&gt;
\mathrm{var}_{\Delta} = \frac{1}{N_1}\mathrm{var}(x_1) + \frac{1}{N_2} \mathrm{var}(x_2)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
ilość stopni swobody:&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
 df = N_1+N_2-2&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
co prowadzi do estymatora&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
s^2_\Delta = \frac{N_1s_1^2 + N_2s_2^2}{N_1+N_2-2} \cdot \frac{N_1+N_2}{N_1N_2}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
roznica_oryginalna = np.mean(A) - np.mean(B)&lt;br /&gt;
f = NA+NB-2;&lt;br /&gt;
v_A = np.var(A)&lt;br /&gt;
v_B = np.var(B)&lt;br /&gt;
sig = np.sqrt( ((NA*v_A +NB*v_B))/f * (NA + NB)/(NA*NB) )&lt;br /&gt;
t_2_5 = st.t.ppf(0.025,f);&lt;br /&gt;
t_97_5 = st.t.ppf(0.975,f);&lt;br /&gt;
print('przedział ufności dla różnicy średnich przy założeniu normalności %(d).2f %(g).2f'%{'d':sig*t_2_5+ roznica_oryginalna,'g':sig*t_97_5+roznica_oryginalna})&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Otrzymujemy w wyniku &amp;lt;tt&amp;gt;przedział ufności dla różnicy średnich przy założeniu normalności 0.77 5.56&amp;lt;/tt&amp;gt;. Oznacza to, że w 95% analogicznych badań powinniśmy otrzymać różnicę średnich zawartą w tym przedziale. Przedził ten nie zawiera wartości 0, zatem na przyjętym poziomie istotności średnie grupy A i B są różne.&lt;br /&gt;
&lt;br /&gt;
====Wersja nieparametryczna ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# POP zawiera świat zgodny z H0&lt;br /&gt;
roznica_oryginalna = np.mean(A) - np.mean(B)&lt;br /&gt;
alfa = 0.05&lt;br /&gt;
N_rep = 10000&lt;br /&gt;
r = np.zeros(N_rep)&lt;br /&gt;
for i in range(N_rep):&lt;br /&gt;
	gA = randsample(POP, NA)&lt;br /&gt;
	gB = randsample(POP, NB)&lt;br /&gt;
	r[i] = np.mean(gA) - np.mean(gB)&lt;br /&gt;
ci_d = st.scoreatpercentile(r, per = alfa/2*100)&lt;br /&gt;
ci_g = st.scoreatpercentile(r, per = (1-alfa/2)*100)&lt;br /&gt;
# print('przedział ufności: %(d).2f %(g).2f'%{'m':np.mean(r),'d':ci_d+roznica_oryginalna, 'g':ci_g+roznica_oryginalna})&lt;br /&gt;
print('przedział ufności: %(d).2f %(g).2f'%{'m':np.mean(r),'d':ci_d, 'g':ci_g})&lt;br /&gt;
print('oryginalna różnica średnich: %(ro).2f'%{'ro':roznica_oryginalna})&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Wynik:&lt;br /&gt;
&amp;lt;tt&amp;gt;przedział ufności: -2.50 2.50&lt;br /&gt;
oryginalna różnica średnich: 3.17&amp;lt;/tt&amp;gt;.&lt;br /&gt;
Przedział ufności 95% na różnicę skonstruowany zgodnie z &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; nie zawiera oryginalnej różnicy średnich, &lt;br /&gt;
zatem różnica 3.17 w świecie zgodnym z &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; zdarza się nie częściej niż w 5% przypadków. Wniosek: średnie grup A i B są różne  na przyjętym poziomie ufności.&lt;br /&gt;
&lt;br /&gt;
== Zadanie: Przeżywalność myszy ==&lt;br /&gt;
Mamy 7 myszy, którym podano środek, który miał poprawić ich przeżywalność po operacji oraz 9 myszy kontrolnych, którym owego środka nie podano. Myszy traktowane specjalnie przeżyły &amp;lt;br&amp;gt;&lt;br /&gt;
94, 38, 23, 197, 99, 16, 141 dni&amp;lt;br&amp;gt;&lt;br /&gt;
a myszy traktowane standardowo:&amp;lt;br&amp;gt;&lt;br /&gt;
52, 10, 40, 104, 51, 27, 146, 30, 46 dni&amp;lt;br&amp;gt;&lt;br /&gt;
Średnia różnica wynosi 30,63 dni dłużej dla myszy traktowanych po nowemu.&lt;br /&gt;
Pytanie, na które chcielibyśmy znać odpowiedź to: Czy nowy środek faktycznie poprawia przeżywalność.&lt;br /&gt;
Zadanie proszę rozwiązać wszystkimi możliwymi sposobami, analogicznie do powyższego przykładu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Odp'': &lt;br /&gt;
:przedział ufności: [&amp;amp;minus;51,64 52,89]&lt;br /&gt;
:oryginalna różnica średnich: 30,63&lt;br /&gt;
:przedział ufności dla różnicy średnich przy założeniu normalności [&amp;amp;minus;27,99  89,26]&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
'''Przedział ufności dla różnicy dwóch średnich&lt;br /&gt;
&lt;br /&gt;
Mamy 7 myszy, którym podano środek, który miał poprawić ich przeżywalność &lt;br /&gt;
po operacji oraz 9 myszy kontrolnych, którym owego środka nie podano. &lt;br /&gt;
Myszy traktowane specjalnie przeżyły&lt;br /&gt;
94 38 23 197 99 16 141 dni&lt;br /&gt;
a myszy traktowane standardowo:&lt;br /&gt;
52 10 40 104 51 27 146 30 46 dni&lt;br /&gt;
Średnia różnica wynosi 30.63 dni dłużej dla myszy traktowanych po nowemu. &lt;br /&gt;
Pytanie, na które chcielibyśmy znać odpowiedź to: Czy nowy środek faktycznie &lt;br /&gt;
poprawia przeżywalność.&lt;br /&gt;
&lt;br /&gt;
Skonstruujmy przedział ufności 95% dla średniej różnicy w przeżywalności.&lt;br /&gt;
&lt;br /&gt;
Uwaga: przy tym problemie każdą z grup traktujemy jako reprezentantów bardzo &lt;br /&gt;
dużych populacji. '''&lt;br /&gt;
def randsample(x,ile):&lt;br /&gt;
	ind = st.randint.rvs(0,len(x),size = ile)&lt;br /&gt;
	y = x[ind]&lt;br /&gt;
	return y&lt;br /&gt;
&lt;br /&gt;
m_sp = np.array([94, 38, 23, 197, 99, 16, 141])&lt;br /&gt;
N_sp = len(m_sp)&lt;br /&gt;
m_st = np.array([52, 10, 40, 104, 51, 27, 146, 30, 46])&lt;br /&gt;
N_st = len(m_st)&lt;br /&gt;
alfa = 0.05&lt;br /&gt;
# zgodnie z hipotezą zerową (H0) nie ma różnicy między grupami&lt;br /&gt;
&lt;br /&gt;
# symulacja&lt;br /&gt;
# tworzymy świat zgodny z H0&lt;br /&gt;
m = np.concatenate((m_sp,m_st))&lt;br /&gt;
&lt;br /&gt;
roznica_oryginalna = np.mean(m_sp) - np.mean(m_st)&lt;br /&gt;
&lt;br /&gt;
N_rep = 10000&lt;br /&gt;
r = np.zeros(N_rep)&lt;br /&gt;
for i in range(N_rep):&lt;br /&gt;
	g1 = randsample(m, N_sp)&lt;br /&gt;
	g2 = randsample(m, N_st)&lt;br /&gt;
	r[i] = np.mean(g1) - np.mean(g2)&lt;br /&gt;
ci_d = st.scoreatpercentile(r, per = alfa/2*100)&lt;br /&gt;
ci_g = st.scoreatpercentile(r, per = (1-alfa/2)*100)&lt;br /&gt;
print('przedział ufności: %(d).2f %(g).2f'%{'m':np.mean(r),'d':ci_d, 'g':ci_g})&lt;br /&gt;
print('oryginalna różnica średnich: %(ro).2f'%{'ro':roznica_oryginalna})&lt;br /&gt;
# przedział ufności na różnicę skonstruowany zgodnie z H0 zawiera oryginalną różnicę średnich, &lt;br /&gt;
# zatem różnica taka jest na przyjętym poziomie ufności możliwa &lt;br /&gt;
# do zaobserwowania w przypadku braku różnicy między grupami&lt;br /&gt;
&lt;br /&gt;
# zakładając normalność&lt;br /&gt;
f = N_sp+N_st-2;&lt;br /&gt;
v_1 = np.var(m_sp)&lt;br /&gt;
v_2 = np.var(m_st)&lt;br /&gt;
sig = np.sqrt( ((N_sp*v_1 +N_st*v_2))/f * (N_sp + N_st)/float(N_sp*N_st) )&lt;br /&gt;
t_2_5 = st.t.ppf(0.025,f);&lt;br /&gt;
t_97_5 = st.t.ppf(0.975,f);&lt;br /&gt;
print('przedział ufności dla różnicy średnich przy założeniu normalności %(d).2f %(g).2f'%{'d':sig*t_2_5+ roznica_oryginalna,'g':sig*t_97_5+roznica_oryginalna})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
print('przedział ufności dla różnicy średnich przy założeniu normalności %(d).2f %(g).2f'%{'d':s_delta*t_2_5+ roznica_oryginalna,'g':s_delta*t_97_5+roznica_oryginalna})&lt;br /&gt;
# skonstruowany wokoł oryginalnej różnicy średnich przedział ufności zawiera 0, zatem nie możemy odrzucić możliwości,&lt;br /&gt;
# że nie ma różnicy między grupami&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zadanie: Linie lotnicze==&lt;br /&gt;
Linie lotnicze, projektując nowy samolot chcą sprawdzić czy średnia waga bagażu ręcznego zabieranego przez pasażerów nie zmieniła się od czasu poprzednich badań i wynosi wciąż 12 kg. Analiza ma być przeprowadzona na poziomie istotności &amp;lt;math&amp;gt;\alpha = 0,05&amp;lt;/math&amp;gt;. Analityk pobrał próbę bagażu ręcznego 144 pasażerów i obliczył wartość średnią z próby &amp;lt;math&amp;gt;\bar x = 14,6&amp;lt;/math&amp;gt; kg i odchylenie standardowe z próby &amp;lt;math&amp;gt;s = 7,8&amp;lt;/math&amp;gt;. Przeprowadź test hipotezy, że &amp;lt;math&amp;gt;\mu = 12&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
Standardowe importy modułów&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zmienne występujące w treści przykładu&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
mu_0=12&lt;br /&gt;
a=0.05&lt;br /&gt;
N=144&lt;br /&gt;
x=14.6&lt;br /&gt;
s=7.8&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Test dotyczy średniej wiec obliczamy odchylenie standardowe średniej:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
std_mu=s/np.sqrt(N)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wyjaśnienie |title= Obliczamy wartość statystyki:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt; &lt;br /&gt;
t=(mu_0-x)/std_mu&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Odchylenie standardowe estymowaliśmy z próby. Wartości powyższej statystyki podlegają zatem rozkładowi  t. Obliczamy wartości krytyczne odpowiadające poziomowi istotności a. Test jest dwustronny mamy wiec dwie wartości krytyczne: jedna odcina obszar pod funkcja gęstości prawdopodobieństwa na lewo,  a druga na prawo od siebie. Pole każdego z tych obszarów wynosi a/2:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt; &lt;br /&gt;
  &lt;br /&gt;
t_kryt_lewy = st.t.ppf(a/2,N-1)&lt;br /&gt;
t_kryt_prawy = st.t.ppf( 1-a/2, N-1)&lt;br /&gt;
&lt;br /&gt;
print('obliczona wartość statystyki t: ', t)&lt;br /&gt;
print('wartości krytyczne t: %(tl).2f %(tp).2f '%{'tl':t_kryt_lewy, 'tp':t_kryt_prawy})&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Możemy też obliczyć prawdopodobieństwo zaobserwowania wartości ''t'' takiej jak w naszym zadaniu lub bardziej ekstremalnej:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt; &lt;br /&gt;
p =  (st.t.cdf(-np.abs(t),N-1)) + (1-st.t.cdf(np.abs(t), N-1))  # sumujemy po obu ogonach  bo test jest dwustronny&lt;br /&gt;
print('Prawdopodobieństwo zaobserwowania bardziej ekstremalnych wartości t: %(p).4f'%{'p':p})&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wyniki te możemy zilustrować:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt; &lt;br /&gt;
os_t = np.arange(-5, 5, 0.1)&lt;br /&gt;
py.plot(os_t, st.t.pdf(os_t,N-1)) #rysujemy funkcję gęstości prawdopodobieństwa t o N-1 st. swobody&lt;br /&gt;
&lt;br /&gt;
#cieniujemy lewy obszary pod funkcją gęstości prawdopodobieństwa odpowiadający obliczonemu p&lt;br /&gt;
os_t2 = np.arange(-5, t_kryt_lewy, 0.1)&lt;br /&gt;
py.fill_between(os_t2,st.t.pdf(os_t2,N-1)) &lt;br /&gt;
#cieniujemy prawy obszary pod funkcją gęstości prawdopodobieństwa odpowiadający obliczonemu p&lt;br /&gt;
os_t2 = np.arange(t_kryt_prawy, 5,  0.1)&lt;br /&gt;
py.fill_between(os_t2,st.t.pdf(os_t2,N-1)) &lt;br /&gt;
&lt;br /&gt;
# zaznaczamy obliczoną wartość statystyki:&lt;br /&gt;
py.plot((t,), (0,), 'ro')&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Odpowiedź: Wyliczone ''t'' leży poza obszarem akceptacji hipotezy zerowej, zatem odrzucamy hipotezę zerową i akceptujemy alternatywną.&lt;br /&gt;
&lt;br /&gt;
==Zadanie: Agencja nieruchomości==&lt;br /&gt;
Agencja nieruchomości w Japonii podała, że ceny gruntu w centrum Tokio wzrosły o 49% w ciągu ostatniego roku. Inwestor chcąc przetestować te dane, znajduje próbę 18 nieruchomości w centrum Tokio, dla których zna cenę obecna i sprzed roku. Zakłada, że ceny podlegają rozkładowi normalnemu. Dla każdej nieruchomości oblicza procentowy wzrost wartości a następnie znajduje średnią i odchylenie standardowe z próby. Estymatory dla próby wynoszą &amp;lt;math&amp;gt;\bar x = 38&amp;lt;/math&amp;gt;% i &amp;lt;math&amp;gt;s = 14&amp;lt;/math&amp;gt;%. Przeprowadź test na poziomie istotności &amp;lt;math&amp;gt;\alpha = 0,01&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
mu_0=49;&lt;br /&gt;
x=38;&lt;br /&gt;
s=14;&lt;br /&gt;
N=18;&lt;br /&gt;
a=0.01;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# test dotyczy sredniej wiec jej std:&lt;br /&gt;
std_mu=s/np.sqrt(N)&lt;br /&gt;
&lt;br /&gt;
# odchylenie std obliczylismy z proby =&amp;gt; stosujemy test t&lt;br /&gt;
# obliczamy wartość statystyki &lt;br /&gt;
t=(mu_0-x)/std_mu&lt;br /&gt;
# obliczamy wartości krytyczne odpowiadające poziomowi istotności a&lt;br /&gt;
# test jest dwustronny mamy wiec dwie wartosci krytyczne &lt;br /&gt;
# jedna odcina obszar pod funkcja gęstości prawdopodobieństwa na lewo, &lt;br /&gt;
# a druga na prawo od siebie. Pole każdego z tych obszarów wynosi a/2&lt;br /&gt;
  &lt;br /&gt;
t_kryt_lewy = st.t.ppf(a/2,N-1)&lt;br /&gt;
t_kryt_prawy = st.t.ppf( 1-a/2, N-1)&lt;br /&gt;
&lt;br /&gt;
print('obliczona wartość statystyki t: ', t)&lt;br /&gt;
print('wartości krytyczne t: %(tl).2f %(tp).2f '%{'tl':t_kryt_lewy, 'tp':t_kryt_prawy})&lt;br /&gt;
&lt;br /&gt;
# Możemy też obliczyć prawdopodobieństwo zaobserwowania wrtości t takiej jak w naszym zadaniu &lt;br /&gt;
# lub bardziej ekstremalnej:&lt;br /&gt;
p = (1-st.t.cdf(t, N-1)) + (st.t.cdf(-t,N-1)) # sumujemy po obu ogonach  bo test jest dwustronny&lt;br /&gt;
		&lt;br /&gt;
print('Prawdopodobieństwo zaobserwowania bardziej ekstremalnych wrtości t: %(p).3f'%{'p':p})&lt;br /&gt;
# Wyniki te możemy zilustrować&lt;br /&gt;
os_t = np.arange(-5, 5, 0.1)&lt;br /&gt;
py.plot(os_t, st.t.pdf(os_t,N-1)) #rysujemy funkcję gęstości prawdopodobieństwa t o N-1 st. swobody&lt;br /&gt;
&lt;br /&gt;
#cieniujemy lewy obszary pod funkcją gęstości prawdopodobieństwa odpowiadający obliczonemu p&lt;br /&gt;
os_t2 = np.arange(-5, t_kryt_lewy, 0.1)&lt;br /&gt;
py.fill_between(os_t2,st.t.pdf(os_t2,N-1)) &lt;br /&gt;
#cieniujemy prawy obszary pod funkcją gęstości prawdopodobieństwa odpowiadający obliczonemu p&lt;br /&gt;
os_t2 = np.arange(t_kryt_prawy, 5,  0.1)&lt;br /&gt;
py.fill_between(os_t2,st.t.pdf(os_t2,N-1)) &lt;br /&gt;
&lt;br /&gt;
# zaznaczamy obliczoną wartość statystyki:&lt;br /&gt;
py.plot(t, 0, 'ro')&lt;br /&gt;
py.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# 'Odp: Wyliczone t lezy poza obszarem akceptacji hipotezy zerowej,&lt;br /&gt;
# zatej odrzucamy hipoteze zerowa i akceptujemy alternatywna.'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Odp. Odrzucamy &amp;lt;math&amp;gt;H_0:&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\mu_0 = 49&amp;lt;/math&amp;gt;, na poziomie istotności 0,01.&lt;br /&gt;
&lt;br /&gt;
==Zadanie: Zabiegi bio-inżynieryjne==&lt;br /&gt;
Załóżmy, że krowy są bardziej wartościowe od byków. Bio-inżynier twierdzi, że przy pomocy pewnych zabiegów jest w stanie spowodować zwiększenie szansy na urodzenie się krowy powyżej 50%. W jego eksperymencie na 10 urodzonych zwierząt 9 było krowami, a tylko 1 bykiem. Czy powinnniśmy wierzyć temu bio-inżynierowi? Jakia jest szansa na uzyskanie takiego, bądź bardziej ekstremalnego wyniku przy założeniu, że procedura stosowana przez naszego inżyniera nia ma żadnych efektów? W tym problemie dla odmiany założymy, że w normalnych warunkach 100 spośród 206 cieląt to krowy.&lt;br /&gt;
Zadanie rozwiązać metodą parametryczną i przez repróbkowanie. [[WnioskowanieStatystyczne/_Testowanie_hipotez#Przykład:_mutacje_muszek_owocowych|Wskazówka]]&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
def randsample(x, N):&lt;br /&gt;
	'''zwraca wektor z losowo wybranymi elementami wektora x. Losowanie odbywa się z powtórzeniami''' &lt;br /&gt;
	n=len(x)&lt;br /&gt;
	ind = np.random.randint(n, size = N)&lt;br /&gt;
	y = x[ind]&lt;br /&gt;
	return y&lt;br /&gt;
&lt;br /&gt;
# sposób pierwszy:&lt;br /&gt;
# zmienna urodzenie byka/krowy podlega rozkladowi dwumianowemu &lt;br /&gt;
p = 100.0/206&lt;br /&gt;
N = 10&lt;br /&gt;
k = 9&lt;br /&gt;
p_bino = 1-st.binom.cdf(k-1,N,p) #prawdopodobieństwo wylosowania 9 lub 10 krów w 10 probach &lt;br /&gt;
print('Prawdopodobieństwo wylosowania 9 lub 10 krów w 10 probach: %(p).4f'%{'p':p_bino})&lt;br /&gt;
# W jego mwetodzie chyba cos jest&lt;br /&gt;
&lt;br /&gt;
# sposob drugi: repróbkowanie&lt;br /&gt;
# model swiata z ktorego pochodza byki(0)/krowy(1):&lt;br /&gt;
w = np.concatenate((np.ones(100), np.zeros(106)))&lt;br /&gt;
&lt;br /&gt;
N_rep = 100000&lt;br /&gt;
wynik = np.zeros(N_rep)&lt;br /&gt;
for i in range(N_rep):&lt;br /&gt;
	wynik[i] = np.sum(randsample(w,10))&lt;br /&gt;
&lt;br /&gt;
p_rep = float(np.sum(wynik&amp;gt;=k))/N_rep&lt;br /&gt;
print('Prawdopodobieństwo wylosowania 9 lub 10 krów w 10 probach estymowane z symulacji: %(p).4f'%{'p':p_rep})&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''Odp'':  ''p'' = 0,008. Odrzucamy ''H''&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; o braku efektów.&lt;br /&gt;
&lt;br /&gt;
==Zadanie: Porównanie lekarstwa i placebo==&lt;br /&gt;
Badamy skuteczność leku na raka. Mamy grupę 12 chorych: 6 osobom podajemy lek &amp;amp;mdash; poprawa wystąpiła u 5 osób, pozostałym sześciu osobom podajemy placebo &amp;amp;mdash; poprawa wystąpiła u 2 osób. Czy te wyniki upoważniają do stwierdzenia, że lek istotnie zwiększa szansę poprawy? Test przeprowadzić na poziomie istotności 5%.&lt;br /&gt;
&lt;br /&gt;
Wskazówka: jako statystykę przyjąć różnicę w ilości popraw między grupą z lekiem a grupą z placebo. Interesuje nas prawdopodobieństwo zaobserwowania takiej (3) bądź większej różnicy. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
def randsample(x, N):&lt;br /&gt;
	'''zwraca wektor z losowo wybranymi elementami wektora x. Losowanie odbywa się z powtórzeniami''' &lt;br /&gt;
	n=len(x)&lt;br /&gt;
	ind = np.random.randint(n, size = N)&lt;br /&gt;
	y = x[ind]&lt;br /&gt;
	return y&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Formułujemy hipotezy &lt;br /&gt;
# H0: lek nie daje poprawy &lt;br /&gt;
# H1: lek daje poprawę&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# zgodnie z H0 obie próby pochodzą ze świata:&lt;br /&gt;
# pierwszy sposób: repróbkowanie&lt;br /&gt;
w = np.concatenate((np.ones(7), np.zeros(5))) # jedynki -&amp;gt; wystąpiła poprawa&lt;br /&gt;
&lt;br /&gt;
n_l = 5 # ilosc popraw w grupie leku&lt;br /&gt;
n_p = 2 #ilosc popraw w grupie placebo&lt;br /&gt;
# jako statystykę testową przyjmiemy różnicę w ilości popraw miedzy grupami&lt;br /&gt;
# w tym problemie istotne jest zwiększenie ilości popraw wiec stosujemy test&lt;br /&gt;
# jednostronny&lt;br /&gt;
N_rep = 100000&lt;br /&gt;
&lt;br /&gt;
st_0= n_l - n_p&lt;br /&gt;
st_rep=np.zeros(N_rep)&lt;br /&gt;
&lt;br /&gt;
for i in range(N_rep):&lt;br /&gt;
    n_l_rep   = np.sum(randsample(w,6))&lt;br /&gt;
    n_p_rep   = np.sum(randsample(w,6))&lt;br /&gt;
    st_rep[i] = n_l_rep - n_p_rep # wartość statystyki w i-tym repróbkowaniu&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
p_rep = float(np.sum(st_rep &amp;gt;= st_0))/N_rep&lt;br /&gt;
print('''Prawdopodobieństwo wylosowania takiej samej bądź większej różnicy w ilości popraw estymowane z symulacji: %(p).4f'''%{'p':p_rep})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# drugi sposób:&lt;br /&gt;
# zmienna uzyskanie poprawy podlega rozkładowi dwumianowemu &lt;br /&gt;
p = 7.0/12&lt;br /&gt;
N = 6&lt;br /&gt;
k1 = 5&lt;br /&gt;
k2 = 2&lt;br /&gt;
p_param = 0&lt;br /&gt;
for d in range(N-st_0+1):  # w tej pętli sumujemy prawdopodobieństwa zdarzeń  sprzyjających zaobserwowaniu różnicy co najmniej st_0 popraw &lt;br /&gt;
# Poprawy w jednej i drugiej grupie traktujemy jako zdarzenia niezależne&lt;br /&gt;
# Pętla &amp;quot;for d&amp;quot; przechodzi przez możliwe liczby popraw w pierwszej grupie&lt;br /&gt;
	p_bino1 = st.binom.pmf(d,N,p)   # prawdopodobieństwo uzyskania poprawy w d próbach&lt;br /&gt;
# Jeśli w pierwszej grupie było d popraw, to w drugiej może być od d+st_0 do N popraw&lt;br /&gt;
	p_bino2 = 1-st.binom.cdf( d+st_0 - 1, N, p)  # prawdopodobieństwo uzyskania poprawy w co najmniej st_0 +d próbach&lt;br /&gt;
	p_param += p_bino1 * p_bino2 # prawdopodobieństwo zaobserwowania jednocześnie obu powyższych sytuacji&lt;br /&gt;
&lt;br /&gt;
print('Prawdopodobieństwo estymowane parametrycznie: %(p).4f'%{'p':p_param})&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: Odp: Prawdopodobieństwo wylosowania takiej samej bądź większej różnicy w ilości popraw estymowane z symulacji: 0,0702&lt;br /&gt;
Prawdopodobieństwo estymowane parametrycznie: 0,0699. Wniosek: nie mamy podstaw do odrzucenia hipotezy zerowej.&lt;br /&gt;
&lt;br /&gt;
==Zadanie: Pomiar masy cząstki elementarnej==&lt;br /&gt;
W pomiarach wstępnych zbadano masę spoczynkową pewnej cząstki elementarnej. Otrzymano następujące wyniki [MeV/c²]:&lt;br /&gt;
&lt;br /&gt;
139.20, 139.34, 140.22, 139.56, 139.42, 139.64, 139.22, 139.74, 139.38, 139.54,&lt;br /&gt;
139.38, 139.46, 140.09, 139.77, 139.52, 139.47, 139.89, 138.95, 139.99, 139.64,&lt;br /&gt;
139.37, 139.49, 139.15, 139.77, 140.10, 139.48, 139.84, 139.44, 140.13&lt;br /&gt;
&lt;br /&gt;
Zbadaj na poziomie istotności 1%, czy cząstką tą mógł być naładowany pion.&lt;br /&gt;
&lt;br /&gt;
Zbadaj na poziomie istotności 1%, czy cząstką tą mógł być neutralny pion.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
&lt;br /&gt;
alfa = 0.01 # poziom istotności&lt;br /&gt;
dane = np.array([139.20, 139.34, 140.22, 139.56, 139.42, 139.64, 139.22, 139.74,&lt;br /&gt;
                 139.38, 139.54, 139.38, 139.46, 140.09, 139.77, 139.52, 139.47,&lt;br /&gt;
                 139.89, 138.95, 139.99, 139.64, 139.37, 139.49, 139.15, 139.77,&lt;br /&gt;
                 140.10, 139.48, 139.84, 139.44, 140.13])&lt;br /&gt;
&lt;br /&gt;
Pi_plus_min = 139.57 # masa pionów naładowanych Pi+ i Pi-&lt;br /&gt;
Pi_neutral = 134.98  # masa pionu neutralnego Pi0&lt;br /&gt;
&lt;br /&gt;
# test t hipotezy H0, że dane pochodzą z rozkładu normalnego o wartości oczekiwanej Pi_plus_min&lt;br /&gt;
t1, p1 = st.ttest_1samp(dane,Pi_plus_min)&lt;br /&gt;
print(&amp;quot;Poziom p dla hipotezy, że był do pion naładowany&amp;quot;,p1)&lt;br /&gt;
if p1&amp;gt;=alfa: print(&amp;quot;Nie możemy odrzucić tej hipotezy na poziomie istotności {}%&amp;quot;.format(100*alfa))&lt;br /&gt;
else: print(&amp;quot;Możemy odrzucić tę hipotezę na poziomie istotności {}%&amp;quot;.format(100*alfa))&lt;br /&gt;
&lt;br /&gt;
# test t hipotezy H0, że dane pochodzą z rozkładu normalnego o średniej Pi_neutral&lt;br /&gt;
t2, p2 = st.ttest_1samp(dane,Pi_neutral)&lt;br /&gt;
print(&amp;quot;\nPoziom p dla hipotezy, że był do pion neutralny&amp;quot;,p2)&lt;br /&gt;
if p2&amp;gt;=alfa: print(&amp;quot;Nie możemy odrzucić tej hipotezy na poziomie istotności {}%&amp;quot;.format(100*alfa))&lt;br /&gt;
else: print(&amp;quot;Możemy odrzucić tę hipotezę na poziomie istotności {}%&amp;quot;.format(100*alfa))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Przykład: Średnie grup sparowanych: Lek przeciwdepresyjny==&lt;br /&gt;
Poniższa tabela prezentuje wyniki 9 pacjentów wykonujących pewien test diagnostyczny przed podaniem leku i po podaniu leku. &lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class='wikitable'&lt;br /&gt;
!przed	&lt;br /&gt;
!po&lt;br /&gt;
|-&lt;br /&gt;
|1,83	&lt;br /&gt;
|0,878&lt;br /&gt;
|-&lt;br /&gt;
|0,50	&lt;br /&gt;
|0,647&lt;br /&gt;
|-&lt;br /&gt;
|1,62	&lt;br /&gt;
|0,598&lt;br /&gt;
|-&lt;br /&gt;
|2,48	&lt;br /&gt;
|2,05&lt;br /&gt;
|-&lt;br /&gt;
|1,68	&lt;br /&gt;
|1,06&lt;br /&gt;
|-&lt;br /&gt;
|1,88	&lt;br /&gt;
|1,29&lt;br /&gt;
|-&lt;br /&gt;
|1,55	&lt;br /&gt;
|1,06&lt;br /&gt;
|-&lt;br /&gt;
|3,06	&lt;br /&gt;
|3,14&lt;br /&gt;
|-&lt;br /&gt;
|1,3	&lt;br /&gt;
|1,29&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
PRZED = [1.83, 0.5, 1.62, 2.48, 1.68, 1.88, 1.55, 3.06, 1.3]&lt;br /&gt;
PO = [0.878, 0.647, 0.598, 2.05, 1.06, 1.29, 1.06, 3.14, 1.29]&lt;br /&gt;
&lt;br /&gt;
Skonstruować test, który pozwoli stwierdzić czy lek jest skuteczny. Porównać różne wersje testu:&lt;br /&gt;
* bootstrapową (losowanie z powtórzeniami), &lt;br /&gt;
* permutacyjną, &lt;br /&gt;
* test parametryczny &lt;br /&gt;
* test nieparametryczny. &lt;br /&gt;
&lt;br /&gt;
Jakie założenia przyjmujemy przy każdej z wersji testu?&lt;br /&gt;
&lt;br /&gt;
===Rozwiązanie===&lt;br /&gt;
W tym zadaniu mamy dwie grupy ''przed'' i ''po'' ale oprócz tego istnieje ścisły porządek w parach, bez sensu jest porównywanie ''przed'' od jednego pacjenta z ''po'' drugiego pacjenta. Musimy stosować testy, które biorą ten porządek pod uwagę (testy pairwise).&lt;br /&gt;
&lt;br /&gt;
Jako miarę tego czy lek jest skuteczny przyjmiemy różnicę (''po'' - ''przed'').  Każda z zaobserwowanych różnic to zmienna losowa. Ich średnia to nasza STATYSTYKA. Będziemy wierzyli, że lek działa jeśli ta różnica jest istotnie mniejsza od zera. Mamy stąd hipotezy:&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;math&amp;gt;H_0: \bar r \geq 0&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;math&amp;gt;H_1: \bar r &amp;lt; 0 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Wersja bootstrapowa====&lt;br /&gt;
&lt;br /&gt;
Założenie, które czynimy w wersji bootstrapowej testu jest następujące:&lt;br /&gt;
Zaobserwowana grupa pacjentów jest reprezentatywna, tzn. istnieje duża populacja pacjentów spośród której moglibyśmy pobrać wiele innych grup podobnych pod względem interesujących nas parametrów do grupy zaobserwowanej w tym konkretnym eksperymencie. Konsekwencją tego założenia jest to, że jeśli w naszej grupie mamy już pacjenta z wynikami: [1.83,	0.878], to szansa na wylosowanie kolejnego pacjenta o takich wynikach się nie zmienia i nadal wynosi 1/9. Prowadzi to do implementacji zawierającej losowanie z powtórzeniami.&lt;br /&gt;
&lt;br /&gt;
Losowość występuje tu w dwóch miejscach:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; losujemy pacjentów z powtórzeniami - zakładamy, że badana grupa jest reprezentatywna dla bardzo dużej populacji.&lt;br /&gt;
&amp;lt;li&amp;gt; dla każdego z wybranych pacjentów losujemy jego wynik ''przed'' oraz wynik ''po'' z wyników, które uzyskał w rzeczywistości --- to jest zgodne z hipotezą zerową.&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Dla każdego losowania obliczamy wartość statystyki w tym losowania uśredniając  różnice indywidualne.&lt;br /&gt;
Wartości statystyki otrzymane dla wszystkich losowań tworzą jej empiryczny rozkład, przy założeniu, że hipoteza zerowa jest prawdziwa. Jako estymator prawdopodobieństwa zaobserwowania oryginalnej wartości statystyki ''mr'' (średnia różnica) przy prawdziwej hipotezie zerowej przyjmujemy frakcję rozkładu empirycznego, w której wartości statystyki były nie większe niż ''mr''. Wynik ilustrujemy histogramem rozkładu empirycznego z zaznaczoną ową frakcją.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
def randsample(x, N):&lt;br /&gt;
	'''zwraca wektor z losowo wybranymi elementami wektora x. &lt;br /&gt;
         Losowanie odbywa się z powtórzeniami''' &lt;br /&gt;
&lt;br /&gt;
	n=len(x)&lt;br /&gt;
	ind = np.random.randint(n, size = N)&lt;br /&gt;
	y = x[ind]&lt;br /&gt;
	return y&lt;br /&gt;
&lt;br /&gt;
def hist_z_markerem(x, N_bins, marker):&lt;br /&gt;
	'''Rysuje histogram wartości w tablicy x, używając N_bins binów. &lt;br /&gt;
	Na lewo od wartości wskazanej przez marker dorysowywany jest prostokąt'''&lt;br /&gt;
	&lt;br /&gt;
	r = np.max(x) - np.min(x)&lt;br /&gt;
	szer_binu = r/N_bins&lt;br /&gt;
&lt;br /&gt;
	#konstruujemy biny&lt;br /&gt;
        # robimy biny od markera co szerokość binu aż do x minimalnego&lt;br /&gt;
	biny_na_lewo = np.arange( marker, np.min(x), -szer_binu)&lt;br /&gt;
        # odwracamy kolejność tej sekwencji żeby była rosnąca&lt;br /&gt;
	biny_na_lewo = biny_na_lewo[-1::-1] &lt;br /&gt;
         # robimy biny od markera co szerokość binu aż do x maksymalnego&lt;br /&gt;
	biny_na_prawo = np.arange(marker,np.max(x), szer_binu)&lt;br /&gt;
        # sklejamy oba zakresy binów&lt;br /&gt;
	biny = np.concatenate((biny_na_lewo, biny_na_prawo))&lt;br /&gt;
	(n,xx,patch) = py.hist(x,bins = biny)&lt;br /&gt;
	py.fill([np.min(xx), np.min(xx), marker, marker] , [0, np.max(n), np.max(n), 0] ,'r' ,alpha = 0.2)&lt;br /&gt;
&lt;br /&gt;
A=np.array([[1.83,	0.878],&lt;br /&gt;
[0.50,	0.647],&lt;br /&gt;
[1.62,	0.598],&lt;br /&gt;
[2.48,	2.05],&lt;br /&gt;
[1.68,	1.06],&lt;br /&gt;
[1.88,	1.29],&lt;br /&gt;
[1.55,	1.06],&lt;br /&gt;
[3.06,	3.14],&lt;br /&gt;
[1.30,	1.29]])&lt;br /&gt;
&lt;br /&gt;
r = A[:,1] - A[:,0] # od drugiej kolumny odejmuję pierwszą&lt;br /&gt;
mr = np.mean(r)  # średnia z tych różnic to wartość statystyki zaobserwowana dla oryginalnych danych&lt;br /&gt;
print( 'średnia różnica: %(mr).2f'%{'mr':mr})&lt;br /&gt;
&lt;br /&gt;
N = len(r)&lt;br /&gt;
&lt;br /&gt;
N_rep = 100000&lt;br /&gt;
r_boot = np.zeros(N_rep)&lt;br /&gt;
przed = np.zeros(N)&lt;br /&gt;
po = np.zeros(N)&lt;br /&gt;
&lt;br /&gt;
for i in range(N_rep):&lt;br /&gt;
    ix=randsample(np.arange(0,N,1),N) # wybieramy pacjentów z powtórzeniami&lt;br /&gt;
    B=np.array(A[ix,:])&lt;br /&gt;
    for j in range(N):   # mieszamy losowo przypisując wyniki do grupy przed i po&lt;br /&gt;
                         # zakładając, że pacjent może uzyskać dwukrotnie taki sam wynik&lt;br /&gt;
        s = np.random.rand()&lt;br /&gt;
        if s &amp;gt; 0.5:&lt;br /&gt;
            przed[j]=B[j,0]&lt;br /&gt;
        else:&lt;br /&gt;
            przed[j]=B[j,1]&lt;br /&gt;
        s = np.random.rand()&lt;br /&gt;
        if s &amp;gt; 0.5:&lt;br /&gt;
            po[j]=B[j,1]&lt;br /&gt;
        else:&lt;br /&gt;
            po[j]=B[j,0]&lt;br /&gt;
    rr=po-przed&lt;br /&gt;
    r_boot[i] = np.mean(rr)&lt;br /&gt;
&lt;br /&gt;
hist_z_markerem(r_boot,30,mr)&lt;br /&gt;
p_h0 = np.sum( r_boot &amp;lt;=  mr)/N_rep&lt;br /&gt;
s_boot = u'dla repróbkowanego testu jednostronnego: %(p_h0).5f'%{'p_h0': p_h0}&lt;br /&gt;
print( s_boot)&lt;br /&gt;
py.title(s_boot)&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Wersja permutacyjna====&lt;br /&gt;
&lt;br /&gt;
W tym teście zakładamy, że grupa pacjentów jest unikalna, więc w procedurze wytwarzania empirycznego rozkładu statystyki  korzystamy z danych wszystkich pacjentów w każdej iteracji. &lt;br /&gt;
&lt;br /&gt;
Zgodnie z hipotezą zerową pomiary ''przed'' i ''po'' są równoważne można je zatem zamieniać. Wykonamy wszystkie możliwe zamiany ''przed'' i ''po''. Możliwych zamian jest &amp;lt;math&amp;gt;2^N&amp;lt;/math&amp;gt;.  Skorzystamy z faktu, że bity w reprezentacji binarnej liczb całkowitych od 0 do &amp;lt;math&amp;gt;2^{N-1}&amp;lt;/math&amp;gt; zawierają wszystkie możliwe permutacje ciągów zer i jedynek o długości ''N''. Wartości 1 zamienimy na logiczne True a wartości 0 na False. Zinterpretujemy True jako zamianę  i False jako brak zamiany. &lt;br /&gt;
&lt;br /&gt;
Dla każdej permutacji obliczamy wartość statystyki uśredniając  różnice indywidualne.&lt;br /&gt;
Wartości statystyki otrzymane dla wszystkich permutacji tworzą jej empiryczny rozkład, przy założeniu, że hipoteza zerowa jest prawdziwa. Jako estymator prawdopodobieństwa zaobserwowania oryginalnej wartości statystyki ''mr'' przy prawdziwej hipotezie zerowej przyjmujemy frakcję rozkładu empirycznego, w której wartości statystyki były nie większe niż ''mr''. Wynik ilustrujemy histogramem rozkładu empirycznego z zaznaczoną ową frakcją. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
 &lt;br /&gt;
def dec2bin(n, l):&lt;br /&gt;
    '''konwertuje dziesiętną liczbę całkowitą na tablicę &lt;br /&gt;
    przedstawiającą reprezentację binarną tej liczby&lt;br /&gt;
    n liczba do konwersji&lt;br /&gt;
    l długość reprezentacji binarnej &lt;br /&gt;
    zwracana jest binarna reprezentacja liczby &lt;br /&gt;
    skonwertowana do tablicy logicznej (0-&amp;gt;False, 1-&amp;gt; True)&lt;br /&gt;
    '''&lt;br /&gt;
    b = np.zeros(l, dtype = bool)&lt;br /&gt;
    if n &amp;lt; 0:  raise ValueError(&amp;quot;must be a positive integer&amp;quot;)&lt;br /&gt;
    i = 1&lt;br /&gt;
    while n &amp;gt; 0:&lt;br /&gt;
        b[l-i] = bool( n % 2 ) &lt;br /&gt;
        n = n &amp;gt;&amp;gt; 1&lt;br /&gt;
        i += 1&lt;br /&gt;
    return b&lt;br /&gt;
 &lt;br /&gt;
def hist_z_markerem(x, N_bins, marker):&lt;br /&gt;
	'''Rysuje histogram wartości w tablicy x, używając N_bins binów. &lt;br /&gt;
	Na lewo od wartości wskazanej przez marker dorysowywany jest prostokąt'''&lt;br /&gt;
 &lt;br /&gt;
	r = np.max(x) - np.min(x)	&lt;br /&gt;
	szer_binu = r/N_bins&lt;br /&gt;
 &lt;br /&gt;
	#konstruujemy biny&lt;br /&gt;
        # robimy biny od markera co szerokość binu aż do x minimalnego&lt;br /&gt;
	biny_na_lewo = np.arange( marker, np.min(x), -szer_binu)&lt;br /&gt;
        # odwracamy kolejność tej sekwencji żeby była rosnąca&lt;br /&gt;
	biny_na_lewo = biny_na_lewo[-1::-1] &lt;br /&gt;
         # robimy biny od markera co szerokość binu aż do x maksymalnego&lt;br /&gt;
	biny_na_prawo = np.arange(marker,np.max(x), szer_binu)&lt;br /&gt;
        # sklejamy oba zakresy binów&lt;br /&gt;
	biny = np.concatenate((biny_na_lewo, biny_na_prawo))&lt;br /&gt;
	(n,xx,patch) = py.hist(x,bins = biny )&lt;br /&gt;
	py.fill([np.min(xx), np.min(xx), marker, marker] , [0, np.max(n), np.max(n), 0] ,'r' ,alpha = 0.2)&lt;br /&gt;
 &lt;br /&gt;
A=np.array([[1.83, 0.878], [0.50, 0.647], [1.62, 0.598], [2.48, 2.05], [1.68, 1.06], [1.88, 1.29], [1.55, 1.06], [3.06, 3.14], [1.30, 1.29]])&lt;br /&gt;
 &lt;br /&gt;
r = A[:,1] - A[:,0] # od drugiej kolumny odejmuję pierwszą&lt;br /&gt;
mr = np.mean(r)  # średnia z tych różnic to wartość statystyki zaobserwowana dla oryginalnych danych&lt;br /&gt;
print( 'średnia różnica: %(mr).2f'%{'mr':mr} )&lt;br /&gt;
 &lt;br /&gt;
N = len(r)&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
N_perm = 2**N&lt;br /&gt;
r_perm = np.zeros(N_perm)&lt;br /&gt;
for i in range(2**N):&lt;br /&gt;
	B = np.array(A)   # B zawiera kopię tablicy A&lt;br /&gt;
	zamiana = dec2bin(i,N) # w których wierszach dokonać zamiany?&lt;br /&gt;
	# print( i,': ', zamiana )&lt;br /&gt;
	# wiersze tablicy B wskazane przez True w wektorze indeksów ind zamieniamy wartości  'przed' z wartościami 'po'&lt;br /&gt;
	B[zamiana, 0] = A[zamiana, 1] &lt;br /&gt;
	B[zamiana, 1] = A[zamiana, 0]&lt;br /&gt;
	rr = B[:,1] - B[:,0] # Obliczam wartości zmiennych losowych dla tej zamiany&lt;br /&gt;
	r_perm[i] = np.mean(rr) # Obliczmy wartość statystyki dla tej zamiany&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
p_h0 = np.sum( r_perm &amp;lt;=  mr)/N_perm&lt;br /&gt;
s_perm = u'dla permutacyjnego testu jednostronnego: %(p_h0).3f'%{'p_h0': p_h0}&lt;br /&gt;
print( s_perm)&lt;br /&gt;
hist_z_markerem(r_perm,30,mr)&lt;br /&gt;
py.title(s_perm)&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Wersja parametryczna====&lt;br /&gt;
&lt;br /&gt;
Jeśli badane różnice ''przed'' i ''po'' podlegają rozkładowi normalnemu to do testowania czy średnia wartość różnicy jest równa 0 można zastosować test ''t'' dla prób zależnych &amp;lt;tt&amp;gt;st.ttest_rel()&amp;lt;/tt&amp;gt;. Aby się upewnić, że możemy zastosować ten test badamy normalność różnic przy pomocy &amp;lt;tt&amp;gt;normplot()&amp;lt;/tt&amp;gt; oraz testu Shapiro-Wilka &amp;lt;tt&amp;gt;st.shapiro()&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
 &lt;br /&gt;
def normplot(x):&lt;br /&gt;
	'''normplot: x dane do testowania'''&lt;br /&gt;
 &lt;br /&gt;
	x_ord = sorted(x)&lt;br /&gt;
	N = len(x)&lt;br /&gt;
	y = np.zeros(N)&lt;br /&gt;
	y[0]=st.norm.ppf(1- 0.5**(1.0/N) )&lt;br /&gt;
	y[N-1] = st.norm.ppf(0.5**(1.0/N) )&lt;br /&gt;
	for i in range(1,N-1):&lt;br /&gt;
		arg = (i-0.3175)/(N+0.365)&lt;br /&gt;
		y[i] = st.norm.ppf(arg)&lt;br /&gt;
	py.plot(y,x_ord,'.')&lt;br /&gt;
 &lt;br /&gt;
A=np.array([[1.83, 0.878], [0.50, 0.647], [1.62, 0.598], [2.48, 2.05], [1.68, 1.06], [1.88, 1.29], [1.55, 1.06], [3.06, 3.14], [1.30, 1.29]])&lt;br /&gt;
&lt;br /&gt;
r = A[:,1] - A[:,0] # od drugiej kolumny odejmuję pierwszą&lt;br /&gt;
&lt;br /&gt;
normplot(r)&lt;br /&gt;
py.title(&amp;quot;Wyniki testów na normalność różnic\n Shapiro-Wilka:  W=%.3f, p=%.3f&amp;quot;%st.shapiro(r)&lt;br /&gt;
        +&amp;quot;\nKołmogorowa-Smirnowa: D=%.3f, p=%.3f&amp;quot;%st.kstest(r, 'norm', args=(np.mean(r),np.std(r,ddof=1))))&lt;br /&gt;
t, p = st.ttest_rel(A[:,1],A[:,0])&lt;br /&gt;
p_t = p/2 # aby test był jednostronny&lt;br /&gt;
s_t = u'dla parametrycznego testu jednostronnego: %(p_h0).3f'%{'p_h0': p_t}&lt;br /&gt;
print(s_t)&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Wersja nieparametryczna====&lt;br /&gt;
&lt;br /&gt;
W ogólności, nie zakładając normalności różnic można by przeprowadzić test Wilcoxona. W aktualnej implementacji tego testu w scipy.stats jest on dla naszych danych niedokładny, gdyż mamy małą liczebność grupy, a implementacja stosuje przybliżenia asymptotyczne.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
A=np.array([[1.83, 0.878], [0.50, 0.647], [1.62, 0.598], [2.48, 2.05], [1.68, 1.06], [1.88, 1.29], [1.55, 1.06], [3.06, 3.14], [1.30, 1.29]])&lt;br /&gt;
z, p = st.wilcoxon(A[:,1],A[:,0] )&lt;br /&gt;
p_w = p/2 # aby test był jednostronny&lt;br /&gt;
s_w = u'dla nieparametrycznego testu jednostronnego: %(p_h0).3f'%{'p_h0': p_w}&lt;br /&gt;
print( s_w)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Podsumowanie====&lt;br /&gt;
 średnia różnica: -0.43&lt;br /&gt;
 dla repróbkowanego testu jednostronnego: 0.0013&lt;br /&gt;
 dla permutacyjnego testu jednostronnego: 0.014&lt;br /&gt;
 Wynik testu Shapiro-Wilka na normalność różnic &lt;br /&gt;
 	 statystyka W: 0.921 &lt;br /&gt;
 	 prawdopodobieństwo takiej wartości statystyki dla rozkładu normalnego: 0.404&lt;br /&gt;
 dla parametrycznego testu jednostronnego: 0.008&lt;br /&gt;
 dla nieparametrycznego testu jednostronnego: 0.019&lt;br /&gt;
&lt;br /&gt;
Wszystkie testy wskazują prawdopodobieństwo zaobserwowania odpowiadających im statystyk poniżej przyjętego poziomu istotności &amp;lt;math&amp;gt;\alpha = 0.05&amp;lt;/math&amp;gt;. Zatem hipotezę zerową należy odrzucić i przyjąć hipotezę alternatywną.&lt;br /&gt;
&lt;br /&gt;
==Zadania==&lt;br /&gt;
&lt;br /&gt;
===Zanieczyszczenie środowiska===&lt;br /&gt;
Agencja ochrony środowiska ustaliła limit na koncentrację zanieczyszczeń emitowanych przez fabryki. Załóżmy, że dopuszczalny poziom zanieczyszczeń wynosi 55 cząstek na milion (cz/m) w promieniu dwóch kilometrów od fabryki. Kontrola przeprowadza 100 pomiarów o różnej porze dnia i roku w promieniu dwóch km od pewnej fabryki. Średnia z próby wyniosła 60 cz/m a odchylenie standardowe &amp;lt;math&amp;gt;s = 20&amp;lt;/math&amp;gt; cz/m. Czy dane te są wystarczające by na poziomie istotności &amp;lt;math&amp;gt;\alpha = 0,01&amp;lt;/math&amp;gt; uznać, że fabryka łamie prawo?&lt;br /&gt;
&lt;br /&gt;
Fabryka łamie prawo jeśli emituje zanieczyszczenia na poziomie wyższym niż dopuszczalny więc należy przeprowadzić test jednostronny (w tym przypadku prawostronny). Czy moglibyśmy odrzucić &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; na tym samym poziomie stosując test dwustronny?&lt;br /&gt;
Jest ważne aby w zależności od problemu wybrać odpowiedni test: jedno- lub dwustronny.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import numpy as np&lt;br /&gt;
 &lt;br /&gt;
x_c = 55 #cząstek na milion (cz/m) w promieniu dwóch kilometrów od fabryki. &lt;br /&gt;
#Kontrola przeprowadza &lt;br /&gt;
N = 100 # pomiarów o różnej porze dnia i roku w promieniu dwóch km. od pewnej fabryki. &lt;br /&gt;
#średnia z próby wyniosła &lt;br /&gt;
x_s = 60 # cz/m &lt;br /&gt;
# a odchylenie standardowe &lt;br /&gt;
s = 20 # cz/m. &lt;br /&gt;
# Czy dane te są wystarczające by uznać, że fabryka łamie prawo ?&lt;br /&gt;
alpha = 0.01&lt;br /&gt;
 &lt;br /&gt;
# H0: mu &amp;lt;=x_c&lt;br /&gt;
# H1: mu &amp;gt; x_c&lt;br /&gt;
# wystarczy sprawdzić jakie jest p dla największego dopuszczalnego stężenia &lt;br /&gt;
# mu = x_c zaobserwowania wartości średniej większej bądź równej zaobserwowanej x_s. &lt;br /&gt;
# Odchylenie std. dane jest dla populacji i trzeba je przeliczyć na odchylenie std. średniej.&lt;br /&gt;
p = 1 - st.t.cdf(x_s, df=N-1, loc = x_c, scale = s/np.sqrt(N) )&lt;br /&gt;
print(&amp;quot;poziom p&amp;quot;,p)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
############################&lt;br /&gt;
#inne (tożsame) rozwiązania:&lt;br /&gt;
&lt;br /&gt;
##wykorzystaniem &amp;quot;Survival function&amp;quot; zamiast dystrybuanty&lt;br /&gt;
p = st.t.sf(x_s, df=N-1, loc = x_c, scale = s/np.sqrt(N) )&lt;br /&gt;
print(&amp;quot;poziom p&amp;quot;,p)&lt;br /&gt;
&lt;br /&gt;
##obliczając statystykę t&lt;br /&gt;
t=(x_s-x_c)/(s/N**0.5)&lt;br /&gt;
p = 1-st.t.cdf(t,df=N-1)&lt;br /&gt;
print(&amp;quot;poziom p&amp;quot;,p)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Odp. &amp;lt;math&amp;gt;p=0,007&amp;lt;\alpha&amp;lt;/math&amp;gt;, zatem możemy odrzucić hipotezę &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; (głoszącą, że fabryka nie łamie prawa) na poziomie &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;  = 0,01.&lt;br /&gt;
&lt;br /&gt;
===Wzrost mocy turbin===&lt;br /&gt;
Turbina hydroelektryczna generuje moc średnią 25,2 kW. Po unowocześnieniu maszyny chcemy przetestować czy średnia moc generowana zmieniła się (na + lub &amp;amp;minus;). Przeprowadzono 115 pomiarów, które dały średnią 26,1 kW i odch. std. 3,2 kW. Przeprowadzić test statystyczny na poziomie istotności 1%, zinterpretować wynik. Wnioskowanie przeprowadzić także w oparciu oprzedział ufności.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
#-*- coding:utf-8 -*-&lt;br /&gt;
import numpy as np&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
N=115&lt;br /&gt;
m=25.2	#hipoteza zerowa mówi, że tyle wynosi moc&lt;br /&gt;
sr=26.1	#w pomiarach uzyskaliśmy taką średnią moc&lt;br /&gt;
s=3.2	#przy takim odchyleniu standardowym&lt;br /&gt;
&lt;br /&gt;
alfa=0.01&lt;br /&gt;
&lt;br /&gt;
#obliczenie poziomu p&lt;br /&gt;
t=(m-sr)/(s/N**0.5)&lt;br /&gt;
p = st.t.cdf(t,df=N-1) * 2 #mnozymy przez 2, bo chcemy testu dwustronnego&lt;br /&gt;
print(&amp;quot;poziom p&amp;quot;,p)&lt;br /&gt;
&lt;br /&gt;
#alternatywnie - obliczenie przedziału ufności&lt;br /&gt;
lo,hi = st.t.ppf([alfa/2, 1-alfa/2],df=N-1,loc=sr,scale=s/N**0.5)&lt;br /&gt;
print(&amp;quot;przedzial ufnosci [%.3g,%.3g]&amp;quot;%(lo,hi))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Odp.: &amp;lt;math&amp;gt;p=0,\!003&amp;lt;\alpha=0,\!01&amp;lt;/math&amp;gt;, zatem odrzucamy H0.&lt;br /&gt;
&lt;br /&gt;
Odp. (alt.): &amp;lt;math&amp;gt;\mu = 25,\!2 \not\in[25,\!3; 26,\!9]&amp;lt;/math&amp;gt;, zatem odrzucamy H0.&lt;br /&gt;
&lt;br /&gt;
===Sonda===&lt;br /&gt;
Władze miasta chciałyby wiedzieć, czy przyznać koncesję operatorowi sieci kablowej. W tym celu zleciły nam przeprowadzenie sondy wśród mieszkańców. Zapytaliśmy o zdanie 50 przypadkowo wybranych osób. 30 osób powiedziało &amp;amp;bdquo;tak&amp;amp;rdquo; a 20 &amp;amp;bdquo;nie&amp;amp;rdquo;. Na ile pewnie otrzymane wyniki wskazują, że mieszkańcy chcą tej kablówki?&lt;br /&gt;
&lt;br /&gt;
Celem naszych badań jest uniknięcie błędu polegającego na tym, że powiemy iż większość mieszkańców chce kablówki podczas gdy tak na prawdę to nie chce. &lt;br /&gt;
&lt;br /&gt;
Wskazówka: Granicznym przypadkiem popełnienia tego błędu jest proporcja 1:1 zwolenników i przeciwników kablówki. Jeśli przeciwników kablówki byłoby jeszcze więcej to uzyskanie naszych wyników byłoby jeszcze mniej prawdopodobne.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import numpy.random as rnd&lt;br /&gt;
&lt;br /&gt;
N=50&lt;br /&gt;
odp_na_tak=30&lt;br /&gt;
odp_na_nie=20&lt;br /&gt;
&lt;br /&gt;
#przypadek graniczny, który daje najwyższe prawdopodobieństwo uzyskania fałszywego wyniku na 'tak',&lt;br /&gt;
#to mieszkańcy niezdecydowani, czyli proporcja 1:1&lt;br /&gt;
#(proporcja przechylona w kierunki 'nie', da nam niższe oszacowanie,&lt;br /&gt;
#a proporcja przechylona w kierunku 'tak' nie oznaczałaby fałszywego wyniku sondy)&lt;br /&gt;
#zatem hipoteza zerowa brzmi, że nasz wynik pochodzi z populacji niezdecydowanej:&lt;br /&gt;
P=0.5 #prawdopodobieństwo, że respondent udzieli odpowiedzi na 'tak'&lt;br /&gt;
# jest to najwyższe prawdopodobieństwo jeszcze fałszywego wyniku&lt;br /&gt;
&lt;br /&gt;
#rozwiązanie parametryczne wymaga użycia rozkładu dwumianowego:&lt;br /&gt;
p = 1 - st.binom.cdf(29,50,P) #od 1 odejmujemy sumaryczne prawdopodobieństwo wszystkich przypadków udzielenia mniej niż 30 odpowiedzi na tak (czyli do 29 włącznie)&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;poziom p (parametrycznie)&amp;quot;,p)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#rozwiązanie przez symulację:&lt;br /&gt;
Nrand=100000&lt;br /&gt;
R=0 #rezultat, czyli liczba przypadków, w których przynajmniej 30 osób odpowiedziało tak&lt;br /&gt;
for i in range(Nrand):&lt;br /&gt;
	odpowiedzi = (rnd.random(N)&amp;lt;P) #losujemy odpowiedzi od N osób&lt;br /&gt;
	if odpowiedzi.sum() &amp;gt;=odp_na_tak: #jeśli zdarzyło się co najmniej 30 odpowiedzi na tak, to dodajemy jeden do liczby takich przypadków&lt;br /&gt;
		R+=1&lt;br /&gt;
	&lt;br /&gt;
print(&amp;quot;poziom p (z symulacji)&amp;quot;,R/Nrand) #na koniec dzielimy przez liczbę wszystkich sond w symulacji&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Wybory prezydenckie===&lt;br /&gt;
W ankiecie uzyskaliśmy 840 głosów popierających kandydaturę A i 660 kandydaturę B. Jaka jest szansa, że tak naprawdę kandydat B ma  poparcie 50% lub większe? Jakie jest prawdopodobieństwo pojawienia sie zaobserwowanej próbki lub próbki wskazującej na jeszcze większe poparcie dla kandydata A, jeśli w rzeczywistości poparcie kandydata A byłoby  50% lub mniej.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import numpy.random as rnd&lt;br /&gt;
&lt;br /&gt;
# rozwiązanie parametryczne&lt;br /&gt;
A = 840&lt;br /&gt;
B = 660&lt;br /&gt;
N = A+B&lt;br /&gt;
&lt;br /&gt;
#przypadek graniczny, który daje najwyższe prawdopodobieństwo uzyskania fałszywego wyniku na 'tak',&lt;br /&gt;
#to mieszkańcy niezdecydowani, czyli propocja 1:1&lt;br /&gt;
#propocja przechylona w kierunki 'nie', da nam niższe oszacowanie&lt;br /&gt;
#a propocja przechylona w kierunku 'tak' nie oznaczałaby fałszywego wyniku sondy&lt;br /&gt;
#zatem hipoteza zerowa brzmi, że nasz wynik pochodzi z populacji niezdecydowanej:&lt;br /&gt;
p_sukces = 0.5&lt;br /&gt;
&lt;br /&gt;
#rozwiązanie parametryczne&lt;br /&gt;
p = 1 - st.binom.cdf(A-1,N,p_sukces)&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;poziom p (parametrycznie)&amp;quot;,p)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#rozwiązanie przez symulację:&lt;br /&gt;
&lt;br /&gt;
#wiemy już, że musimy oszacować bardzo niskie prawdopodobieństwo, zatem symulacja musi być długa&lt;br /&gt;
#(gdybyśmy nie wiedzieli, to łatwo byśmy zauważyli, że krótka symulacja nie daje w ogóle zdarzeń sprzyjających dając wynik p=0)&lt;br /&gt;
#niestety trzeba pokusić się o optymalizację (mimo to kod będzie się wykonywał kilkadziesiąt sekund do kilku minut):&lt;br /&gt;
#chemy mieć przynajmniej 10^7 sond, ale każda sonda to 1500 odpowiedzi, zatem łącznie musimy wylosować 1.5*10^10 liczb&lt;br /&gt;
#losowanie w pętli 10^7 razy kolejnych sond po 1500 odpowiedzi zajmie bardzo bardzo dużo czasu&lt;br /&gt;
#tablica 1.5*10^10 odpowiedzi wygenerowana jednym poleceniem nie zmieści się w pamięci&lt;br /&gt;
#musimy skorzystać z rozwiązania pośredniego&lt;br /&gt;
#będziemy losować 100 razy po 1.5*10^8 odpowiedzi i dodamy wyniki&lt;br /&gt;
&lt;br /&gt;
Nrand_1=100    # 10^2&lt;br /&gt;
Nrand_2=100000 # 10^5&lt;br /&gt;
N = A+B        # 1.5*10^3&lt;br /&gt;
&lt;br /&gt;
Nrand_total = Nrand_1*Nrand_2&lt;br /&gt;
&lt;br /&gt;
R=0 #liczba sond, w których kandydat A uzyskał poparcie 840 lub większe&lt;br /&gt;
#po każdym przebiegu pętli będziemy dodawać liczbę takich przypadków (jeśli wystąpiły w danej iteracji)&lt;br /&gt;
&lt;br /&gt;
for i in range(Nrand_1):&lt;br /&gt;
	#w każdej iteracji losujemy odpowiedzi od N osób w Nrand_2 sondach&lt;br /&gt;
	#iteracji będzie w sumie Nrand_1, co da nam łącznie N osób w Nrand_total sondach&lt;br /&gt;
	#jako, że zakładamy równe prawdopodobieństwo, to może możemy wylosować tablicę zawierającą tylko 0 i 1&lt;br /&gt;
	#gdzie 1 oznacza sukces (głos na kandydata A), a 0 porażkę&lt;br /&gt;
	#korzystając z funksji randint, która zwraca (pseudo)losowe liczby całkowite z zakresu [a,b)&lt;br /&gt;
	a,b = 0,2 &lt;br /&gt;
	odpowiedzi = rnd.randint(a,b,size=(N,Nrand_2)) &lt;br /&gt;
	S = np.sum(odpowiedzi,axis=0)  #wyniki kolejnych sond (sumujemy sukcesy w wierszach)&lt;br /&gt;
&lt;br /&gt;
	R+=np.sum(S&amp;gt;=A) #dodajemy liczbę sond, w których kandydat A uzyskał poparcie 840 lub większe (w danej iteracji pętli)&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;poziom p (z symulacji)&amp;quot;,R/Nrand_total) #na koniec dzielimy przez liczbę wszystkich sond w symulacji&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Czy stosunek do marihuany się zmienił?===&lt;br /&gt;
Rozważmy dwie ankiety przeprowadzone w USA, pytano 1500 respondentów o stosunek do legalizacji marihuany. Pierwszą ankietę przeprowadzono w 1980, wówczas za legalizacją opowiadało się 52% a drugą w 1985 i za legalizacją było 46%. Czy wyniki tych dwóch ankiet są istotnie różne?&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
# rozwiązanie parametryczne&lt;br /&gt;
za1 = int(0.52*1500)&lt;br /&gt;
za2 = int(0.46*1500)&lt;br /&gt;
N = 1500&lt;br /&gt;
&lt;br /&gt;
# H0: stosunek się nie zmienił zatem p_za było w obu anlietach takie samo:&lt;br /&gt;
p_za = (0.52+0.46)/2&lt;br /&gt;
&lt;br /&gt;
# Jakie jest prawdopodobieństwo zaobserwowoania wyników ankiet o takiej bądź większej &lt;br /&gt;
# różnicy głosów za, jeśli obie są zgodne z H0 ?&lt;br /&gt;
D = za1 - za2&lt;br /&gt;
&lt;br /&gt;
#musimy zsumować wszystkie możliwości, w których wystąpiła taka różnica lub większa&lt;br /&gt;
#zrobimy to w pętli&lt;br /&gt;
p_binom = 0.0&lt;br /&gt;
for k in range(N-D+1):&lt;br /&gt;
	p1 = st.binom.pmf(k,N,p_za) # prawdopodobieństwo uzyskania dokładnie k głosów za&lt;br /&gt;
	&lt;br /&gt;
	# sumujemy prawdopodobieństwa uzyskania liczby głosów różnej przynajmniej o D&lt;br /&gt;
	przypadki_o_roznicy_przynajmniej_D = np.arange(k+D,N+1)&lt;br /&gt;
	p2 = np.sum(st.binom.pmf(przypadki_o_roznicy_przynajmniej_D,N,p_za))&lt;br /&gt;
	#co jest równoważne:&lt;br /&gt;
	#p2 = 1-st.binom.cdf(k+D-1,N,p_za)&lt;br /&gt;
	&lt;br /&gt;
	#sumujemy dla kolejnych k&lt;br /&gt;
	p_binom += p1*p2 # mnożymy prawdopodobieństwa ponieważ są wyniki obu sond są niezależne&lt;br /&gt;
	&lt;br /&gt;
p=2*p_binom #mnożymy przez 2, ponieważ robimy test dwustronny (różnica mogła wystąpić również w drugą stronę)&lt;br /&gt;
print(&amp;quot;p =&amp;quot;,p)&lt;br /&gt;
&lt;br /&gt;
# rozwiązanie symulacyjne (tym razem skorzystamy z randsample)&lt;br /&gt;
def randsample(x, N):&lt;br /&gt;
	'''zwraca wektor z losowo wybranymi elementami wektora x. Losowanie odbywa się z powtórzeniami''' &lt;br /&gt;
	n=len(x)&lt;br /&gt;
	ind = np.random.randint(n, size = N)&lt;br /&gt;
	y = x[ind]&lt;br /&gt;
	return y&lt;br /&gt;
&lt;br /&gt;
N_rep = 100000&lt;br /&gt;
# świat zgodny z H0:&lt;br /&gt;
H0 = np.concatenate((np.zeros(N*(1-p_za)), np.ones(N*p_za)))&lt;br /&gt;
&lt;br /&gt;
a = np.zeros(N_rep)&lt;br /&gt;
for i in range(N_rep):&lt;br /&gt;
	w1 = np.sum(randsample(H0,N))&lt;br /&gt;
	w2 = np.sum(randsample(H0,N))&lt;br /&gt;
	a[i] = np.abs(w1-w2)&lt;br /&gt;
p = np.sum(a&amp;gt;=D)/N_rep&lt;br /&gt;
print(p)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zawały serca i cholesterol===&lt;br /&gt;
Badano grupę 605 osób. 135 osób z tej grupy miało wysoki poziom cholesterolu a 470 niski. W grupie z wysokim poziomem cholesterolu odnotowano 10 przypadków zawału serca a w grupie z niskim poziomem 21, w czasie 16 lat obserwacji. Nasze pytanie brzmi: Czy możemy uznać, że wysoki poziom cholesterolu zwiększa ryzyko zawału serca?&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
# rozwiązanie parametryczne&lt;br /&gt;
wysoki = 135&lt;br /&gt;
niski = 470&lt;br /&gt;
N = 605&lt;br /&gt;
wysoki_zawaly = 10&lt;br /&gt;
niski_zawaly = 21&lt;br /&gt;
N_zaw = wysoki_zawaly + niski_zawaly &lt;br /&gt;
&lt;br /&gt;
# H0: proporcja zawałowców w obu grupach taka sama:&lt;br /&gt;
p_zawalu = N_zaw/N&lt;br /&gt;
# H1: proporcja jest różna, test jednostronny (wysoki cholesterol ZWIĘKSZA ryzyko)&lt;br /&gt;
&lt;br /&gt;
# Jakie jest prawdopodobieństwo zaobserwowania wyników badania o takiej bądź większej &lt;br /&gt;
# różnicy proporcji zawałów, jeśli obie są zgodne z H0 ?&lt;br /&gt;
roznica = wysoki_zawaly/wysoki - niski_zawaly/niski&lt;br /&gt;
&lt;br /&gt;
p_binom = 0.0&lt;br /&gt;
for k_wys in range(wysoki+1):&lt;br /&gt;
	p_wys = st.binom.pmf(k_wys,wysoki,p_zawalu) # prawdopodobieństwo uzyskania k_wys zawałów grupie o liczebności wysoki&lt;br /&gt;
	for k_nis in range(niski+1): &lt;br /&gt;
		if k_wys/wysoki - k_nis/niski&amp;gt;=roznica: # czy liczebności k_wys i k_nis dają większą bądź równą różnice proporcji?&lt;br /&gt;
			p_nis = st.binom.pmf(k_nis,niski,p_zawalu) # prawdopodobieństwo uzyskania k_nis zawałów w grupie o niskim cholesterolu&lt;br /&gt;
			p_binom += p_wys*p_nis # zdarzenia są niezależne&lt;br /&gt;
&lt;br /&gt;
print(p_binom)&lt;br /&gt;
&lt;br /&gt;
# rozwiązanie symulacyjne&lt;br /&gt;
def randsample(x, N):&lt;br /&gt;
	'''zwraca wektor z losowo wybranymi elementami wektora x. Losowanie odbywa się z powtórzeniami''' &lt;br /&gt;
	n=len(x)&lt;br /&gt;
	ind = np.random.randint(n, size = N)&lt;br /&gt;
	y = x[ind]&lt;br /&gt;
	return y&lt;br /&gt;
&lt;br /&gt;
N_rep = 100000&lt;br /&gt;
# świat zgodny z H0:&lt;br /&gt;
H0 = np.concatenate((np.zeros(N-N_zaw), np.ones(N_zaw)))&lt;br /&gt;
&lt;br /&gt;
wyn = np.zeros(N_rep)&lt;br /&gt;
for i in range(N_rep):&lt;br /&gt;
	wysoki_zawaly_r = np.sum(randsample(H0,wysoki))&lt;br /&gt;
	niski_zawaly_r = np.sum(randsample(H0,niski))&lt;br /&gt;
	wyn[i] = wysoki_zawaly_r/wysoki - niski_zawaly_r/niski&lt;br /&gt;
p = np.sum(wyn&amp;gt;=roznica)/N_rep&lt;br /&gt;
print(p)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Czy gęstości planet się różnią?===&lt;br /&gt;
Rozważmy pięć planet znanych w antycznym świecie. Chcemy zbadać, czy planety wewnętrzne Merkury (0,68) i Wenus (0,94) mają istotnie większe gęstości niż planety zewnętrzne Mars (0,71) Jowisz (0,24) i Saturn (0,12)?&lt;br /&gt;
&lt;br /&gt;
Wskazówki: &lt;br /&gt;
* Unikalność zestawu planet wskazuje na zastosowanie testu permutacyjnego.&lt;br /&gt;
* Moduł implementujący funkcje kombinatoryczne w pythonie to &amp;lt;tt&amp;gt;itertools &amp;lt;/tt&amp;gt;. Zawiera on funkcję &amp;lt;tt&amp;gt;permutations&amp;lt;/tt&amp;gt;. Wywołanie &amp;lt;tt&amp;gt;itertools.permutations(sekwencja[, r])&amp;lt;/tt&amp;gt; zwraca obiekt permutacji. Obiekt ten zwraca kolejne permutacje o długości r elementów w sekwencji (np. w wektorze). Przykład:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
import itertools&lt;br /&gt;
for kolejny in itertools.permutations(range(3), 2):&lt;br /&gt;
    print(kolejny)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import itertools as itt&lt;br /&gt;
PLANETY = np.array([0.68,0.94,0.71,0.24,0.12])&lt;br /&gt;
N=len(PLANETY)&lt;br /&gt;
&lt;br /&gt;
r=[] #używamy listy, bo nie chcemy obliczać ile będzie przypadków (aczkolwiek można to zrobić)&lt;br /&gt;
&lt;br /&gt;
for planety in itt.permutations(PLANETY):&lt;br /&gt;
	r.append(np.mean(planety[:2])-np.mean(planety[2:]))&lt;br /&gt;
&lt;br /&gt;
R=np.mean(PLANETY[:2])-np.mean(PLANETY[2:]) #prawdziwa różnica&lt;br /&gt;
&lt;br /&gt;
r=np.array(r) #porównanie z liczbą działa tylko dla tablic numpy, a nie dla list&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;p =&amp;quot;,np.sum(r&amp;gt;=R)/len(r))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Elektrownia jądrowa===&lt;br /&gt;
Przed wybudowaniem elektrowni jądrowej przeprowadzono pomiary intensywności promieniowania jonizującego w pobliżu planowanego budynku reaktora. Powtórzono te pomiary po uruchomieniu reaktora. Czy zebrane dane pozwalają stwierdzić, że poziom promieniowania istotnie wzrósł? Dane pomiarowe wczytaj z [[Media:pomiary_skazen.txt| pliku]].&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
&lt;br /&gt;
alfa = 0.01 # poziom istotności&lt;br /&gt;
&lt;br /&gt;
PRZED, PO = np.loadtxt('Pomiary_skazen.txt') #wczytanie danych (dwa zbiory przed uruchomieniem i po)&lt;br /&gt;
&lt;br /&gt;
t, p = st.ttest_ind(PRZED, PO) # wykorzystanie gotowej funkcji wykonującej DWUSTRONNY test t na różnicę średnich&lt;br /&gt;
                            # dla danych NIESPAROWANYCH (niezależnych)&lt;br /&gt;
                            # ttest_ind  - ind od independent &lt;br /&gt;
                            # ttest_rel  - rel od related &lt;br /&gt;
&lt;br /&gt;
p/=2 # dzielimy przez dwa ponieważ chcemy zrobić test jednostronny&lt;br /&gt;
print(&amp;quot;Poziom p&amp;quot;,p)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Odp. &amp;lt;math&amp;gt;p=0,\!39&amp;gt;\alpha=0,\!01&amp;lt;/math&amp;gt;, zatem nie mamy podstaw do odrzucenia hipotezy &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt;, że poziom promieniowania istotnie wzrósł.&lt;/div&gt;</summary>
		<author><name>Maciek</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=WnioskowanieStatystyczne/_Testowanie_hipotez&amp;diff=11334</id>
		<title>WnioskowanieStatystyczne/ Testowanie hipotez</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=WnioskowanieStatystyczne/_Testowanie_hipotez&amp;diff=11334"/>
		<updated>2025-05-12T09:57:56Z</updated>

		<summary type="html">&lt;p&gt;Maciek: /* Zadanie: Porównanie lekarstwa i placebo */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Testowanie hipotez dotyczących jednej lub dwóch populacji ==&lt;br /&gt;
===Wstęp===&lt;br /&gt;
Schemat weryfikowania hipotez omówiony jest w wykładzie [[WnioskowanieStatystyczne/Weryfikacja hipotez |Weryfikacja hipotez statystycznych]]. Tu przypomnimy tylko krótko podstawowe pojęcia i decyzje, które trzeba pojąć w procedurze weryfikacji.&lt;br /&gt;
====Hipoteza zerowa i alternatywna====&lt;br /&gt;
Podstawą sukcesu w statystycznym testowaniu hipotez jest prawidłowe ich sformułowanie. &lt;br /&gt;
Hipotezy muszą być rozłączne. Najczęściej jako hipotezę zerową przyjmujemy zdanie, które chcemy odrzucić, &lt;br /&gt;
gdyż błąd takiej decyzji można kontrolować. Logika testowania jest następująca: tworzymy &lt;br /&gt;
funkcję od zmiennych losowych, dla której przy spełnieniu przez owe zmienne hipotezy zerowej potrafimy &lt;br /&gt;
podać prawdopodobieństwa z jakimi przyjmuje ona różne wartości. Ta funkcja nazywana jest ''statystyką''. &lt;br /&gt;
Następnie obliczamy wartość tej funkcji dla badanej próby. Jeśli prawdopodobieństwo osiągnięcia otrzymanej &lt;br /&gt;
bądź jeszcze bardziej ekstremalnej wartości statystyki jest niskie to wątpimy, że nasze dane są zgodne&lt;br /&gt;
z hipotezą zerową i jesteśmy skłonni przyjąć hipotezę alternatywną.&lt;br /&gt;
&lt;br /&gt;
====Wybór statystyki====&lt;br /&gt;
Wybierając statystykę można posłużyć się następującym schematem:&lt;br /&gt;
* Jeżeli znamy rozkład prawdopodobieństwa, z którego pochodzą nasze dane, lub umiemy je przetransformować do znanego rozkładu, to wybierzemy klasyczny test parametryczny np. test ''t'' ([http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.mstats.ttest_rel.html ttest_rel], [http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.ttest_ind.html ttest_ind]), &amp;lt;math&amp;gt;\chi^2&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; itp.&lt;br /&gt;
* Jeżeli nie znamy rozkładu prawdopodobieństwa naszych danych albo nie chcemy nic o nim zakładać to mamy dwie możliwości: &lt;br /&gt;
** korzystamy z klasycznego [[WnioskowanieStatystyczne/Test_Wilcoxona|testu nieparametrycznego]] np.:&lt;br /&gt;
&amp;lt;!--http://mail.scipy.org/pipermail/scipy-user/2009-July/021679.html--&amp;gt;&lt;br /&gt;
**; test Wilcoxona dla obserwacji sparowanych: testuje hipotezę zerową, że dwie próby &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, które ze sobą porównujemy pochodzą z tej samej populacji ciągłej (przekłada się to na równość dystrybuant). Próby &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; '''są''' sparowane. W pythonie mamy ten test zaimplementowany jako: [http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.wilcoxon.html &amp;lt;tt&amp;gt;scipy.stats.wilcoxon(x, y=None)&amp;lt;/tt&amp;gt;]. Ta implementacja stosuje przybliżenie dużych prób i zalecana jest dla &amp;lt;math&amp;gt;n&amp;gt;20&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;!--    Calculate the Wilcoxon signed-rank test&lt;br /&gt;
&lt;br /&gt;
    The Wilcoxon signed-rank test tests the null hypothesis that two related samples come from the same distribution. It is a a non-parametric version of the paired T-test.&lt;br /&gt;
    Parameters:	&lt;br /&gt;
    x : array_like&lt;br /&gt;
        The first set of measurements&lt;br /&gt;
    y : array_like, optional, default None&lt;br /&gt;
        The second set of measurements. If y is not given, then the x array is considered to be the differences between the two sets of measurements.&lt;br /&gt;
    Returns:	&lt;br /&gt;
    z-statistic : float&lt;br /&gt;
        The test statistic under the large-sample approximation that the signed-rank statistic is normally distributed.&lt;br /&gt;
    p-value : float&lt;br /&gt;
        The two-sided p-value for the test&lt;br /&gt;
    Notes&lt;br /&gt;
    Because the normal approximation is used for the calculations, the samples used should be large. A typical rule is to require that n &amp;gt; 20.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
scipy.stats.ranksums(x, y)&lt;br /&gt;
&lt;br /&gt;
    Compute the Wilcoxon rank-sum statistic for two samples.&lt;br /&gt;
&lt;br /&gt;
    The Wilcoxon rank-sum test tests the null hypothesis that two sets of measurements are drawn from the same distribution. The alternative hypothesis is that values in one sample are more likely to be larger than the values in the other sample.&lt;br /&gt;
&lt;br /&gt;
    This test should be used to compare two samples from continuous distributions. It does not handle ties between measurements in x and y. For tie-handling and an optional continuity correction see `stats.mannwhitneyu`_&lt;br /&gt;
    Parameters:	&lt;br /&gt;
&lt;br /&gt;
    x,y : array_like&lt;br /&gt;
&lt;br /&gt;
        The data from the two samples&lt;br /&gt;
&lt;br /&gt;
    Returns:	&lt;br /&gt;
&lt;br /&gt;
    z-statistic : float&lt;br /&gt;
&lt;br /&gt;
        The test statistic under the large-sample approximation that the rank sum statistic is normally distributed&lt;br /&gt;
&lt;br /&gt;
    p-value : float&lt;br /&gt;
&lt;br /&gt;
        The two-sided p-value of the test&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
**; test Manna-Whitney'a : testuje hipotezę zerową, że dwie próby &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, które ze sobą porównujemy pochodzą z tej samej populacji ciągłej. Próby &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; i&amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; '''nie są''' sparowane. Implementacja w pyhtonie: [http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.mannwhitneyu.html &amp;lt;tt&amp;gt;scipy.stats.mannwhitneyu(x, y, use_continuity=True)&amp;lt;/tt&amp;gt;] stosuje przybliżenia i zalecana jest dla &amp;lt;math&amp;gt;n&amp;gt;20&amp;lt;/math&amp;gt; w każdej z prób. Funkcja zwraca wartość ''p'' dla hipotezy jednostronnej. Jeśli testujemy hipotezę dwustronną trzeba otrzymane ''p'' pomnożyć przez 2.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
scipy.stats.mannwhitneyu(x, y, use_continuity=True)¶&lt;br /&gt;
&lt;br /&gt;
    Computes the Mann-Whitney rank test on samples x and y.&lt;br /&gt;
    Parameters:	&lt;br /&gt;
    x, y : array_like&lt;br /&gt;
        Array of samples, should be one-dimensional.&lt;br /&gt;
    use_continuity : bool, optional&lt;br /&gt;
        Whether a continuity correction (1/2.) should be taken into account. Default is True.&lt;br /&gt;
    Returns:	&lt;br /&gt;
    u : float&lt;br /&gt;
        The Mann-Whitney statistics.&lt;br /&gt;
    prob : float&lt;br /&gt;
        One-sided p-value assuming a asymptotic normal distribution.&lt;br /&gt;
    Notes&lt;br /&gt;
    Use only when the number of observation in each sample is &amp;gt; 20 and you have 2 independent samples of ranks. Mann-Whitney U is significant if the u-obtained is LESS THAN or equal to the critical value of U.&lt;br /&gt;
&lt;br /&gt;
    This test corrects for ties and by default uses a continuity correction. The reported p-value is for a one-sided hypothesis, to get the two-sided p-value multiply the returned p-value by 2.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
** wytwarzamy rozkład statystyki na podstawie naszych danych przez repróbkowanie ([[WnioskowanieStatystyczne/Bootstrap|bootstrap]] lub [[WnioskowanieStatystyczne/Testy_permutacyjne| permutacje]]). W podejściu repróbkowania tworzymy statystyczny model badanego procesu '''zgodny z hipotezą zerową''' i następnie badamy w drodze symulacji prawdopodobieństwa generowania przez ten model interesujących nas sytuacji. Największą uwagę musimy tu poświęcić na prawidłowe sformułowanie modelu, a następnie precyzyjne określenie prawdopodobieństwo jakiego zdarzenia nas naprawdę interesuje.&lt;br /&gt;
&lt;br /&gt;
===Poziom istotności &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; i wartość &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;===&lt;br /&gt;
; Błąd pierwszego rodzaju : błąd polegający na odrzuceniu hipotezy zerowej, która w rzeczywistości jest prawdziwa. Oszacowanie prawdopodobieństwa popełnienia błędu pierwszego rodzaju oznaczamy symbolem &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; i nazywamy poziomem istotności testu.&lt;br /&gt;
; Błąd drugiego rodzaju : polegaja na nieodrzuceniu hipotezy zerowej, która jest w rzeczywistości fałszywa. Oszacowanie prawdopodobieństwo popełnienia błędu drugiego rodzaju oznaczamy symbolem &amp;lt;math&amp;gt; \beta&amp;lt;/math&amp;gt;, a jego dopełnienie do jedności nazywane jest '''mocą testu'''.&lt;br /&gt;
&lt;br /&gt;
Wartość &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; jest to wartość prawdopodobieństwa, że wobec posiadanych danych  hipoteza zerowa jest prawdziwa. Jest ono obliczane jako prawdopodobieństwo zaobserwowania wartości ''statystyki'' takiej jak dla badanej próby, lub bardziej ekstremalnej, przy prawdziwej hipotezie zerowej.&lt;br /&gt;
Najczęściej porównujemy ''p'' z wcześniej ustalonym poziomem istotności &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;. Poziom istotności &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; to wartość krytyczna prawdopodobieństwa, taka że jeżeli &amp;lt;math&amp;gt; p&amp;lt; \alpha&amp;lt;/math&amp;gt; to odrzucamy hipotezę zerową.&lt;br /&gt;
&lt;br /&gt;
==Formułowanie hipotez==&lt;br /&gt;
===Przykład: mutacje muszek owocowych===&lt;br /&gt;
Załóżmy, że badamy muszki owocowe. W standardowej populacji proporcja samic do samców jest 1:1. Opracowaliśmy metodę powodującą taką mutację muszek owocowych, że potomstwo ich nie będzie miało jednakowej szansy na bycie samcem lub samiczką. W pierwszych 20 zbadanych przypadkach uzyskujemy 14 samców i 6 samiczek.&lt;br /&gt;
; Pytanie naukowe: Czy wyniki eksperymentu potwierdzają, że nasza metoda zaburza proporcję płci?&lt;br /&gt;
Najpierw musimy przetłumaczyć pytanie naukowe na pytanie statystyczne. &lt;br /&gt;
; Pytanie statystyczne: Jakie jest prawdopodobieństwo uzyskania zaobserwowanej proporcji (14:6), lub bardziej ekstremalnej w próbie 20 osobników,  jeśli rzeczywista proporcja płci jest 1:1?&lt;br /&gt;
&lt;br /&gt;
Z tego pytania wynikają dwie możliwe hipotezy:&lt;br /&gt;
* Hipoteza zerowa: Nowa metoda nie zaburza proporcji płci 1:1. Zaobserwowana próbka pochodzi z populacji, w której proporcja płci ''jest'' 1:1&lt;br /&gt;
* Hipoteza alternatywna: Zaobserwowana próbka pochodzi z populacji, w której proporcja płci ''nie jest'' 1:1.&lt;br /&gt;
; Prawdopodobieństwo, które musimy oszacować: Jakie jest prawdopodobieństwo uzyskania 14 lub więcej jedynek w serii 20 prób, jeśli prawdopodobieństwo jedynki jest &amp;lt;math&amp;gt;1/2&amp;lt;/math&amp;gt;?  &lt;br /&gt;
# Oznaczmy 1: samiec 0: samiczka.&lt;br /&gt;
# Zróbmy wektor 20-elementowy zawierający 10 zer i 10 jedynek.&lt;br /&gt;
# Wylosujmy ze zwracaniem nowy wektor 20-elementowy. (Jest to nasz model uzyskiwania 20 elementowej próbki z populacji o proporcji 1:1.) Zapamiętajmy liczbę jedynek.&lt;br /&gt;
# Powtórzmy poprzedni krok 1000 razy&lt;br /&gt;
# Zróbmy histogram ilości jedynek.&lt;br /&gt;
# Policzmy ile razy zdarzyło sie 14 lub więcej jedynek (to odpowiada 14 lub więcej samców) i dodajmy do tego ilość przypadków gdy mieliśmy 6 lub mniej jedynek (to odpowiada 14 lub więcej samiczek). Wynik podzielmy przez ilość losowań (1000).&lt;br /&gt;
&lt;br /&gt;
Powyższa procedura opisuje test dwustronny. Testu dwustronnego musimy użyć jeśli nie mamy ''istotnych'' powodów, żeby wierzyć, że nowa metoda działa ''jedynie na zwiększenie'' szansy pojawienia się samca.&lt;br /&gt;
&lt;br /&gt;
Jak powyższy problem rozwiązać w sposób parametryczny? &lt;br /&gt;
Próby podlegają rozkładowi dwumianowemu, można więc obliczyć szukane prawdopodobieństwo korzystając z jego dystrybuanty.&lt;br /&gt;
&lt;br /&gt;
==Testowanie hipotez na temat średniej==&lt;br /&gt;
Firma rozwożąca przesyłki po mieście deklaruje średni czas dostarczenia 28 minut. Przeprowadźmy test tej hipotezy na poziomie istotności 5%.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_0: \mu = 28&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;H_1: \mu \ne 28&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wybieramy losową próbę 100 przesyłek, mierzymy czas dostarczenia, liczymy średnią z próby &amp;lt;math&amp;gt;\bar x = 31,5&amp;lt;/math&amp;gt; minut i odchylenie standardowe próby &amp;lt;math&amp;gt;s = 5&amp;lt;/math&amp;gt; minut. &lt;br /&gt;
&lt;br /&gt;
Test ten można przeprowadzić z użyciem przedziałów ufności:&lt;br /&gt;
* Konstruujemy przedziały ufności 95% dla średniej &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.Formalnie, ponieważ wyliczyliśmy odchylenie standardowe z próby powinniśmy zastosować wartości krytyczne z rozkładu t. Rozmiar próby wynosi 100 więc rozkład t ma 99 stopni swobody. Wartość krytyczna w tym rozkladzie to &amp;lt;math&amp;gt;t_{97.5} =  1.984 &amp;lt;/math&amp;gt;. Mamy zatem:&lt;br /&gt;
&amp;lt;math&amp;gt;\bar x \pm 1,984 \frac{s}{\sqrt{n}} = 31,5 \pm 1,984*\frac{5}{\sqrt{100}} = 31,5 \pm 0,992 = [30,51 \quad 32,49]&amp;lt;/math&amp;gt;&lt;br /&gt;
* Wnioskowanie: Możemy więc być na 95% pewni, że nieznana średnia leży pomiędzy 30,51 a 32,49 a więc na 95% nie leży poza tym przedziałem. &lt;br /&gt;
Skoro &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; podaje &amp;lt;math&amp;gt;\mu = 28&amp;lt;/math&amp;gt; (poza przedziałem), możemy odrzucić tę hipotezę.  Jeśli &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; jest prawdziwe, istnieje prawdopodobieństwo 0,05, że skonstruowany przedział nie będzie zawierał &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. Istnieje zatem prawdopodobieństwo 0,05 popełnienia błądu I-go rodzaju. Mówimy, że przeprowadziliśmy test na poziomie istotności 0,05.&lt;br /&gt;
&lt;br /&gt;
Test można też przeprowadzić następująco:&lt;br /&gt;
* Jako statystykę wybieramy &amp;lt;math&amp;gt;t = \frac{\bar x - \mu}{s/\sqrt{n}} &amp;lt;/math&amp;gt;&lt;br /&gt;
* Obliczmy jej wartość dla danych z próby: &amp;lt;math&amp;gt;t = \frac{\bar x - \mu}{s/\sqrt{n}}  = (31,5 -28)/(5/\sqrt{100}) = 7 &amp;lt;/math&amp;gt;&lt;br /&gt;
* Porównujemy otrzymaną wartość z wartością krytyczna dla przyjętego poziomu istotności &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;. Konstuowany przez nas test ma być testem dwustronnym więc musimy wziąć do porównania wartość krytyczna dla &amp;lt;math&amp;gt;\alpha/2&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt; t_{\alpha/2} = t_{0,025}= -1,984&amp;lt;/math&amp;gt;&lt;br /&gt;
* Wnioskowanie: Dla naszej próby otrzymaliśmy wartość statystyki równą 6.96. Dla przyjętego poziomu istotności wartość statystyki wynosi 1,984. Prawdopodobieństwo zaobserwowania statystyki o wartości 7 lub bardziej ekstremalnej (tu: większej) jest mniejsze niż założony poziom istotności więc odrzucamy &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; na poziomie &amp;lt;math&amp;gt;\alpha = 0,05&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Testowanie hipotez na temat wariancji==&lt;br /&gt;
&lt;br /&gt;
Do testowania hipotez na temat wariancji używamy statystyki chi-kwadrat o &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; stopniach swobody:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\chi^2 = \frac{(n-1)s^2}{\sigma_0^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\sigma_0^2&amp;lt;/math&amp;gt; jest wartością wariancji podaną w &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
===Przykład===&lt;br /&gt;
Do produkcji baterii używane są metalowe płytki o średniej średnicy 5 mm. Jeśli wariancja średnicy płytki jest nie większa niż 1 mm&amp;lt;math&amp;gt;^2&amp;lt;/math&amp;gt;, produkcja jest kontynuowana. Jeśli wariancja przekracza 1 mm&amp;lt;math&amp;gt;^2&amp;lt;/math&amp;gt; proces produkcji trzeba przerwać. Kontroler przeprowadza test na poziomie istotności &amp;lt;math&amp;gt;\alpha = 5&amp;lt;/math&amp;gt;%: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_0:&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\sigma^2 \le 1&amp;lt;/math&amp;gt; i &lt;br /&gt;
&amp;lt;math&amp;gt;H_1:&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\sigma^2 &amp;gt; 1&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Wybiera losową próbę 31 płytek i znajduje wariancję próby &amp;lt;math&amp;gt;s^2 = 1,62&amp;lt;/math&amp;gt;. Czy daje to podstawy do przerwania produkcji?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\chi^2 = \frac{(31-1) \cdot 1,62}{1} = 48,6&amp;lt;/math&amp;gt;. Znajdujemy poziom &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; dla tej wartości &amp;lt;math&amp;gt;\chi^2&amp;lt;/math&amp;gt; z 30 stopniami swobody. &lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
p = 1-st.chi2.cdf(48.6,30)&lt;br /&gt;
print(p)&lt;br /&gt;
&lt;br /&gt;
#ilustracja&lt;br /&gt;
x = py.arange(0,60,1)  &lt;br /&gt;
py.plot(x, st.chi2.pdf(x,30)) #rysujemy funkcję gęstości prawdopodobieństwa chi2 o 30 st. swobody&lt;br /&gt;
x2 = py.arange(48.8,60,1)&lt;br /&gt;
py.fill_between(x2,st.chi2.pdf(x2,30)) #cieniujemy obszar pod funkcją geęstości prawdopodobieństwa odpowiadający obliczonemu p&lt;br /&gt;
&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Otrzymaliśmy &amp;lt;math&amp;gt; p = 0,017 &amp;lt;/math&amp;gt;.&lt;br /&gt;
Wniosek:  Odrzucamy &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Błąd drugiego rodzaju. Moc testu.==&lt;br /&gt;
Błąd II-go rodzaju popełniamy wtedy gdy przyjmujemy &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; a prawdziwe jest &amp;lt;math&amp;gt;H_1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Przykład===&lt;br /&gt;
Załóżmy następujący test:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_0: \mu = 60&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_1: \mu = 65&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Niech rozmiar próby wynosi &amp;lt;math&amp;gt;n = 100&amp;lt;/math&amp;gt; a odchylenie standardowe w populacji &amp;lt;math&amp;gt;\sigma = 20&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Powinniśmy tu zastosować test jednostronny (mamy tylko dwie możliwości: &amp;lt;math&amp;gt;\mu = 60&amp;lt;/math&amp;gt; lub &amp;lt;math&amp;gt;65&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
Znajdźmy punkt krytyczny &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; dla poziomu istotności &amp;lt;math&amp;gt;\alpha =  0,05&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;C = \mu_0 + 1,645\frac{\sigma}{\sqrt{n}} = 60 + 1,645(20/10) = 63,29&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Błąd pierwszego rodzaju popełnimy gdy &amp;lt;math&amp;gt;\bar x &amp;gt; C&amp;lt;/math&amp;gt; i prawdziwe będzie &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt;. Prawdopodobieństwo błędu pierwszego rodzaju ustaliliśmy z góry na poziomie &amp;lt;math&amp;gt;\alpha = 0,05&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\alpha = P(\bar x &amp;gt; C| \mu = \mu_0)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Błąd drugiego rodzaju popełnimy gdy &amp;lt;math&amp;gt;\bar x &amp;lt; C&amp;lt;/math&amp;gt; a prawdziwe będzie &amp;lt;math&amp;gt;H_1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Prawdopodobieństwo popełnienia tego błędu wynosi:&lt;br /&gt;
&amp;lt;math&amp;gt;\beta = P(\bar x &amp;lt; C| \mu = \mu_1) = P\left( \frac{\bar x - \mu_1}{\sigma/\sqrt{n}}  &amp;lt; \frac{C - \mu_1}{\sigma/\sqrt{n}}\right)= &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;= P\left( Z &amp;lt; \frac{63,29 - 65}{20/10}\right)  = P(Z &amp;lt; -0,855) = 0,1963&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Moc testu jest dopełnieniem błędu II rodzaju.&lt;br /&gt;
A moc testu czyli prawdopodobieństwo odrzucenia hipotezy zerowej podczas gdy jest ona fałszywa wynosi:&lt;br /&gt;
&amp;lt;math&amp;gt;1 - \beta = 0,8037&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Porównanie dwóch populacji==&lt;br /&gt;
[[WnioskowanieStatystyczne/Test_t#Test_t_.28Studenta.29_r.C3.B3.C5.BCnicy_.C5.9Brednich|Dla przypomnienia]]:&lt;br /&gt;
Jeśli mamy dwie próbki danych:&lt;br /&gt;
:&amp;lt;math&amp;gt;x_1&amp;lt;/math&amp;gt; o liczebności &amp;lt;math&amp;gt;n_1&amp;lt;/math&amp;gt; i estymowanej wariancji &amp;lt;math&amp;gt;s_1^2&amp;lt;/math&amp;gt; i &lt;br /&gt;
:&amp;lt;math&amp;gt;x_2&amp;lt;/math&amp;gt; o liczebności &amp;lt;math&amp;gt;n_2&amp;lt;/math&amp;gt; i estymowanej wariancji &amp;lt;math&amp;gt;s_2^2&amp;lt;/math&amp;gt;  &lt;br /&gt;
:gdzie &amp;lt;math&amp;gt;s_{i}^2= \frac{1}{(n_i-1)}\sum\limits_{j=1}^{n_i} (x_{j}-\overline{x}_{i})^{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
pochodzących z rozkładu normalnego o takiej samej wariancji &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; to:&lt;br /&gt;
*wspólna wariancja może być estymowana jako: &amp;lt;math&amp;gt;s^2=\frac{(n_1-1)s_1^2+(n_2-1)s_2^2}{n_1+n_2-2} &amp;lt;/math&amp;gt;&lt;br /&gt;
*wariancja różnicy średnich może być estymowana jako: &amp;lt;math&amp;gt;s_{\Delta}^2=s_{\bar{x}_1}^2+s_{\bar{x}_2}^2=\frac{1}{n_1}s_1^2+\frac{1}{n_2}s_2^2 = \frac{n_1+n_2}{n_1n_2}s^2&amp;lt;/math&amp;gt;&lt;br /&gt;
Jeśli postawimy hipotezę zerową: &amp;lt;math&amp;gt;H_0:\; \mu_1 = \mu_2&amp;lt;/math&amp;gt; to&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
t= \frac{\bar{x}_1-\bar{x}_2}{s_{\Delta}}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
pochodzi z rozkładu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; o &amp;lt;math&amp;gt;n_1+n_2-2&amp;lt;/math&amp;gt; stopniach swobody.&lt;br /&gt;
&lt;br /&gt;
===Przykład: promocja===&lt;br /&gt;
Producent odtwarzaczy CD chce sprawdzić czy małe obniżenie ceny produktu wpłynie korzystnie na sprzedaż. Losowa próba 15 tygodni sprzedaży przed obniżką dała średni dochód 6598 zł i standardowe odchylenie 844 zł. Losowa próba 12 tygodni sprzedaży w trakcie promocji dała średnią 6870 i odchylenie standardowe 669 zł. Czy dane te wykazują poprawę sprzedaży w trakcie promocji (przyjąć poziom istotności 5%) ?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\bar{x}_1 = 6598&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\bar{x}_2 = 6870&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Treść zadania odpowiada testowi jednostronnemu z poniższymi hipotezami:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_0: \mu_1 = \mu_2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_1: \mu_1 &amp;lt; \mu_2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Różnica średnich wynosi:&lt;br /&gt;
&amp;lt;math&amp;gt;\bar{x}_1-\bar{x}_2 = 6598 - 6870 = -272 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Estymowana wariancja różnicy średnich:&lt;br /&gt;
&amp;lt;math&amp;gt;s_{\Delta}^2 =  \frac{1}{n_1}s_1^2+\frac{1}{n_2}s_2^2 = \frac{844^2}{15} + \frac{669^2}{12} = 84785,82&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
zatem:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;s_{\Delta} = 291,18&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; t = -272/ 291,18 = - 0,934&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ilość stopni swobody: &amp;lt;math&amp;gt;n_1+n_2-2 = 25&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;P(t_{25} \le -0,934) = 0.18 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wniosek: Nie możemy odrzucić &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt;. Nie mamy podstaw by uznać że mała obniżka cen poprawiła sprzedaż.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Do testowania równości wariancji w dwóch populacjach stosuje się test &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;F_{(n1 -1, n2 - 1)} = \frac{s_1^2}{s_2^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
W przykładzie powyżej założyliśmy równość wariancji. Korzystając z testu &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; sprawdzić czy założenie było uzasadnione.&lt;br /&gt;
&lt;br /&gt;
==Badanie założenia o normalności rozkładu==&lt;br /&gt;
We wszystkich wspomnianych powyżej klasycznych testach statystycznych &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\chi^2&amp;lt;/math&amp;gt; istotnym założeniem jest to, że dane wejściowe w próbie mają rozkład normalny. W powyższych zadaniach po prostu to zakładaliśmy, ale w praktyce, kiedy dostajemy próbę do analizy, musimy sami sprawdzić,  czy możemy uznać ją za pochodzącą z rozkładu normalnego. Do weryfikacji takiej hipotezy służą narzędzia graficzne:&lt;br /&gt;
&lt;br /&gt;
=== Histfit: histogram z naniesionym fitem rozkładu normalnego ===&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
def histfit(x,N_bins):  &lt;br /&gt;
''' &lt;br /&gt;
x - dane&lt;br /&gt;
N_bins -ilość binów w histogramie&lt;br /&gt;
&lt;br /&gt;
Funkcja rysuje histogram i na jego tle dorysowuje wykres &lt;br /&gt;
funkcji gęstości prawdopodobieństwa rozkładu normalnego &lt;br /&gt;
o średniej i wariancji estymowanych z x.&lt;br /&gt;
&lt;br /&gt;
Funkcja wymaga zaimportowania modułów pylab as py i scipy.stats as st''' &lt;br /&gt;
 &lt;br /&gt;
	n, bins, patches = py.hist(x, N_bins, density=True, facecolor='green', alpha=0.75)&lt;br /&gt;
	# Rysujemy histogram i w jawny sposób odbieramy zwracane przez p.hist obiekty&lt;br /&gt;
	#   - normujemy histogram do jedności&lt;br /&gt;
	#   - ustalamy kolor prostokątów na zielony&lt;br /&gt;
	#   - ustawiamy przezroczystość prostokątów na 0.75&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	bincenters = 0.5*(bins[1:]+bins[:-1])&lt;br /&gt;
	# wytwarzamy tablicę z centrami binów korzystając z granic binów&lt;br /&gt;
	# zwróconych przez py.hist w macierzy bins&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	y = st.norm.pdf( bincenters, loc = np.mean(x), scale = np.std(x))&lt;br /&gt;
	# obliczamy momenty rozkładu x: średnią i wariancję (tak naprawdę to jej pierwiastek czyli standardowe odchylenie)&lt;br /&gt;
	# obliczamy wartości w normalnym rozkładzie gęstości prawdopodobieństwa&lt;br /&gt;
	# o średniej np.mean(x) i standardowym odchyleniu np.std(x) dla wartości bincenters&lt;br /&gt;
 &lt;br /&gt;
	l = py.plot(bincenters, y, 'r--', linewidth=1)&lt;br /&gt;
	# do histogramu dorysowujemy linię &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Normplot ===&lt;br /&gt;
Jest to wykres wartości w próbie, wzg. prawdopodobieństwa uzyskania takiej wartości w rozkładzie normalnym. Wykres ten jest szczególnym przypadkiem kwantylowego wykresu prawdopodobieństwa [http://en.wikipedia.org/wiki/Q-Q_plot]. Konstruuje się go następująco: &lt;br /&gt;
*Na osi pionowej odkładamy uporządkowane zaobserwowane wartości &amp;lt;math&amp;gt;x_1 \le x_2 \le \dots \le x_n &amp;lt;/math&amp;gt;. Estymują one położenie kwantyli w populacji.&lt;br /&gt;
*Na osi poziomej odkładamy położenia kwantyli w rozkładzie normalnym. Obliczamy je: &amp;lt;math&amp;gt;F^{-1}\left(\frac{i-r_{pop}}{n+n_{pop}} \right)&amp;lt;/math&amp;gt; gdzie &amp;lt;math&amp;gt;F^{-1}&amp;lt;/math&amp;gt; jest funkcją odwrotną do dystrybuanty rozkładu teoretycznego (w tym szczególnym przypadku normalnego) &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; jest numerem obserwacji a &amp;lt;math&amp;gt;r_{pop}, n_{pop}&amp;lt;/math&amp;gt; są czynnikami (&amp;lt;math&amp;gt;\le 0.5 &amp;lt;/math&amp;gt;) zapewniającymi, że argument funkcji odwrotnej do dystrybuanty nie przyjmuje wartości 0 ani 1. &lt;br /&gt;
Jeśli dane ''x'' podlegają rozkładowi normalnemu to ich położenia kwantyli powinny być zgodne z położeniami kwantyli w rozkładzie normalnym, zatem wykres powinien przedstawiać linię prostą. Odstępstwa od prostej świadczą o odstępstwie od rozkładu normalnego.&lt;br /&gt;
W pythonie możemy ten typ wykresu zaimplementować np. tak (współczynniki zaczerpnięte z [http://www.itl.nist.gov/div898/handbook/eda/section3/normprpl.htm]):&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
def normplot(x):&lt;br /&gt;
	'''normplot: x dane do testowania'''&lt;br /&gt;
	x_ord = sorted(x)&lt;br /&gt;
	N = len(x)&lt;br /&gt;
	y = np.zeros(N)&lt;br /&gt;
	y[0]=st.norm.ppf(1- 0.5**(1.0/N) )&lt;br /&gt;
	y[N-1] = st.norm.ppf(0.5**(1.0/N) )&lt;br /&gt;
	for i in range(1,N-1):&lt;br /&gt;
		arg = float(i-0.3175)/(N+0.365)&lt;br /&gt;
		y[i] = st.norm.ppf(arg)&lt;br /&gt;
	py.plot(y,x_ord,'.')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Test Shapiro-Wilka ===&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;W,p = st.shapiro(x)&amp;lt;/source&amp;gt;&lt;br /&gt;
Funkcja ta zwraca wartość statystyki ''W'' i prawdopodobieństwo ''p''  zaobserwowania takiej lub bardziej ekstremalnej wartości statystyki ''W'' dla danych podlegających rozkładowi normalnemu. Jeśli ''p'' ma wysoką wartość (większą niż przyjęta &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;) to nie możemy odrzucić hipotezy, że dane podlegają  rozkładowi normalnemu. Test Shapiro-Wilka nie jest wrażliwy na parametry rozkładu, z którego pochodzą dane (dane mogą pochodzić z rozkładu o dowolnej średniej i dowolnym odchyleniu standardowym).&lt;br /&gt;
&lt;br /&gt;
=== Test Kołmogorowa-Smirnowa ===&lt;br /&gt;
Jest on oparty  na badaniu maksymalnej różnicy pomiędzy dystrybuantą empiryczną (z próby) a teoretyczną dystrybuantą rozkładu. Dla testowania normalności próby powinniśmy wywołać &lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
D , p = st.kstest(x, 'norm', args=(np.mean(x),np.std(x,ddof=1)) #sposób zalecany&lt;br /&gt;
#lub &lt;br /&gt;
D , p = st.kstest((x-np.mean(x))/np.std(x,ddof=1), 'norm') #sposób niezalecany, ale również prawidłowy&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Funkcja zwraca wartość statystyki ''D'' i prawdopodobieństwo zaobserwowania takiej bądź bardziej ekstremalnej wartości statystyki jeśli testowane dane pochodzą z tego samego rozkładu. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;'''UWAGA!''' Test Kołmogorowa-Smirnowa '''jest wrażliwy na parametry rozkładu''', z którego pochodzą dane. Wywołanie poniższego kodu jest błędem:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
D , p = st.kstest(x, 'norm') #BŁĘDNE użycie testu Kołmogorowa-Smirnowa&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Test dla innych postaci rozkładu====&lt;br /&gt;
Za pomocą testu Kołmogorowa-Smirnowa możemy zbadać również założenie o pochodzeniu danych z populacji podlegającej dowolnemu innemu rozkładowi ciągłemu. W tym celu należy podać zamiast 'norm' odpowiednią nazwę rozkładu z modułu scipy.stats oraz parametry tegoż rozkładu w odpowiedniej kolejności (należy w tym celu zajrzeć do dokumentacji). Przykład jak to należy zrobić dla rozkładu wykładniczego:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
D , p = st.kstest(x, 'expon', args=(0, 1/np.mean(x)) #test, czy dane podlegają rozkładowi wykładniczemu&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Przykład===&lt;br /&gt;
Proszę wygenerować 1000 liczb z rozkładu normalnego. Liczby te obejrzyjmy na wykresach &amp;lt;tt&amp;gt;histfit&amp;lt;/tt&amp;gt; oraz &amp;lt;tt&amp;gt;normplot&amp;lt;/tt&amp;gt; i zbadamy ich normalność testem  Shapiro-Wilka i Kołmogorova-Smirnova. &lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
 &lt;br /&gt;
def normplot(x):&lt;br /&gt;
	'''normplot: x dane do testowania'''&lt;br /&gt;
	x_ord = sorted(x)&lt;br /&gt;
	N = len(x)&lt;br /&gt;
	y = np.zeros(N)&lt;br /&gt;
	y[0]=st.norm.ppf(1- 0.5**(1.0/N) )&lt;br /&gt;
	y[N-1] = st.norm.ppf(0.5**(1.0/N) )&lt;br /&gt;
	for i in range(1,N-1):&lt;br /&gt;
		arg = float(i-0.3175)/(N+0.365)&lt;br /&gt;
		y[i] = st.norm.ppf(arg)&lt;br /&gt;
	py.plot(y,x_ord,'.')&lt;br /&gt;
 &lt;br /&gt;
def histfit(x,N_bins):  &lt;br /&gt;
	''' funkcja rysuje histogram i na jego tle dorysowuje wykres &lt;br /&gt;
	funkcji gęstości prawdopodobieństwa rozkładu normalnego &lt;br /&gt;
	o średniej i wariancji estymowanych z x &lt;br /&gt;
	Funkcja wymaga zaimportowania modułów pylab as py i scipy.stats as st'''  &lt;br /&gt;
	n, bins, patches = py.hist(x, N_bins, normed=True, facecolor='green', alpha=0.75)&lt;br /&gt;
	bincenters = 0.5*(bins[1:]+bins[:-1]) &lt;br /&gt;
	y = st.norm.pdf( bincenters, loc = np.mean(x), scale = np.std(x,ddof=1)) &lt;br /&gt;
	l = py.plot(bincenters, y, 'r--', linewidth=1)&lt;br /&gt;
def porownania(x):&lt;br /&gt;
	py.subplot(2,2,1)&lt;br /&gt;
	normplot(x)&lt;br /&gt;
	py.subplot(2,2,2)&lt;br /&gt;
	histfit(x,15)&lt;br /&gt;
	W,p_sw = st.shapiro(x)&lt;br /&gt;
	D,p_ks = st.kstest(x, 'norm', args=(np.mean(x),np.std(x,ddof=1)))&lt;br /&gt;
	title = 'SW: %(sw).2f KS: %(ks).2f'%{'sw':p_sw, 'ks':p_ks}&lt;br /&gt;
	&lt;br /&gt;
	py.title(title)&lt;br /&gt;
	# wybieramy pierwsze dziesięć punktów  &lt;br /&gt;
	y=x[0:10]&lt;br /&gt;
	py.subplot(2,2,3)&lt;br /&gt;
	normplot(y)&lt;br /&gt;
	py.subplot(2,2,4)&lt;br /&gt;
	histfit(y,15)&lt;br /&gt;
	W,p_sw = st.shapiro(y)&lt;br /&gt;
	D,p_ks = st.kstest(y, 'norm', args=(np.mean(x),np.std(x,ddof=1)))&lt;br /&gt;
	title = 'SW: %(sw).2f KS: %(ks).2f'%{'sw':p_sw, 'ks':p_ks}&lt;br /&gt;
	py.title(title)&lt;br /&gt;
 &lt;br /&gt;
x = st.norm.rvs(size=1000, loc=0, scale=10)&lt;br /&gt;
py.figure(1)&lt;br /&gt;
porownania(x)&lt;br /&gt;
# A teraz zbadajmy dane z rozkładów innych niż normalny:&lt;br /&gt;
 &lt;br /&gt;
x = st.t.rvs(df = 2, size=1000, loc=0, scale=1)&lt;br /&gt;
py.figure(2)&lt;br /&gt;
porownania(x)&lt;br /&gt;
 &lt;br /&gt;
x = st.expon.rvs(size=1000,loc=0,scale=1)&lt;br /&gt;
py.figure(3)&lt;br /&gt;
porownania(x)&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Proszę zapuścić skrypt kilka razy i zwrócić uwagę na to, jak trudno jest ocenić normalność danych przy małych próbach.&lt;br /&gt;
&lt;br /&gt;
===Przykład: transformacja Boxa-Coxa===&lt;br /&gt;
Często normalność danych można poprawić przez zastosowanie odpowiedniej transformacji. Ogólną rodzinę transformacji, które często prowadzą do normalizacji danych można zapisać tak (trasformacja Box-Cox'a [http://www.jstor.org/stable/2984418]):&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y^{(\lambda)}=\left\{\begin{matrix} \frac{y^\lambda-1} {\lambda} &amp;amp; \mbox{dla }\lambda \ne 0 \\ \ln(y) &amp;amp; \mbox{dla }\lambda = 0\end{matrix}\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W module scipy.stats mamy tę transformację zaimplementowaną jako &amp;lt;tt&amp;gt;boxcox()&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Zobaczmy jej działanie na następującym przykładzie:&lt;br /&gt;
&lt;br /&gt;
Proszę pobrać i zapisać w pliku tekstowym następujące &lt;br /&gt;
[[Media:Samochody.txt| dane]]. Zawierają one 8 kolumn charakterystyk samochodów:&lt;br /&gt;
*zużycie paliwa&lt;br /&gt;
*cylindry&lt;br /&gt;
*pojemność skokowa&lt;br /&gt;
*moc w koniach mechanicznych&lt;br /&gt;
*masa&lt;br /&gt;
*przyspieszenie&lt;br /&gt;
*rocznik&lt;br /&gt;
*pochodzenie&lt;br /&gt;
&lt;br /&gt;
Proszę narysować histfit i normplot  oraz policzyć testy Shapiro-Wilka i Kolmogorowa-Smirnowa dla masy pojazdów, a następnie zastosować do niej transformację Boxa-Coxa i zbadać normalność przetransformowanych danych.&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
def normplot(x):&lt;br /&gt;
	'''normplot: x dane do testowania'''&lt;br /&gt;
	x_ord = sorted(list(x))&lt;br /&gt;
	N = len(x)&lt;br /&gt;
	y = np.zeros(N)&lt;br /&gt;
	y[0]=st.norm.ppf(1- 0.5**(1.0/N) )&lt;br /&gt;
	y[N-1] = st.norm.ppf(0.5**(1.0/N) )&lt;br /&gt;
	for i in range(1,N-1):&lt;br /&gt;
		arg = float(i-0.3175)/(N+0.365)&lt;br /&gt;
		y[i] = st.norm.ppf(arg)&lt;br /&gt;
	py.plot(y,x_ord,'.')&lt;br /&gt;
	&lt;br /&gt;
def histfit(x,N_bins):  &lt;br /&gt;
	''' funkcja rysuje histogram i na jego tle dorysowuje wykres &lt;br /&gt;
	funkcji gęstości prawdopodobieństwa rozkładu normalnego &lt;br /&gt;
	o średniej i wariancji estymowanych z x &lt;br /&gt;
	Funkcja wymaga zaimportowania modułów pylab as py i scipy.stats as st'''  &lt;br /&gt;
	n, bins, patches = py.hist(x, N_bins, normed=True, facecolor='green', alpha=0.75)&lt;br /&gt;
	bincenters = 0.5*(bins[1:]+bins[:-1]) &lt;br /&gt;
	y = st.norm.pdf( bincenters, loc = np.mean(x), scale = np.std(x)) &lt;br /&gt;
	l = py.plot(bincenters, y, 'r--', linewidth=1)&lt;br /&gt;
def porownania(x):&lt;br /&gt;
	py.subplot(2,1,1)&lt;br /&gt;
	normplot(x);&lt;br /&gt;
	py.subplot(2,1,2)&lt;br /&gt;
	histfit(x,15)&lt;br /&gt;
	W,p_sw = st.shapiro(x);&lt;br /&gt;
	D,p_ks = st.kstest(x,'norm',args=(np.mean(x),np.std(x) ))&lt;br /&gt;
	title = 'SW: %(sw).2f KS: %(ks).2f'%{'sw':p_sw, 'ks':p_ks}&lt;br /&gt;
	py.title(title)&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
dane = np.loadtxt('Samochody.txt')&lt;br /&gt;
# Badamy przyspieszenia&lt;br /&gt;
w = dane[:,5]&lt;br /&gt;
py.figure(1)&lt;br /&gt;
porownania(w)&lt;br /&gt;
# A teraz stosujemy transformację Box-Coxa&lt;br /&gt;
wt,lam = st.boxcox(w)&lt;br /&gt;
py.figure(2)&lt;br /&gt;
porownania(wt)&lt;br /&gt;
&lt;br /&gt;
# badamy masy&lt;br /&gt;
w = dane[:,4]&lt;br /&gt;
py.figure(3)&lt;br /&gt;
porownania(w)&lt;br /&gt;
# A teraz stosujemy transformację Box-Coxa&lt;br /&gt;
wt,lam = st.boxcox(w)&lt;br /&gt;
py.figure(4)&lt;br /&gt;
porownania(wt)&lt;br /&gt;
&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W pierwszym przypadku - asymetrię rozkładu przyspieszeń udało się transformacją B-C poprawić, ale w drugim przypadku, masa, asymetrię dało się skorygować (widać to na histfit) ale nie da się poprawić ''ciężkich ogonów'' - widać to zarówno na normplocie jak i na wynikach testów.&lt;br /&gt;
Ogólnie: zanim zaczniemy analizować dane dobrze jest je pooglądać na różnych wykresach i chwilę ''pomyśleć''.&lt;br /&gt;
&lt;br /&gt;
==Przykład (zastosowanie różnych testów do tych samych danych): karma==&lt;br /&gt;
Badamy dwie nowe karmy A i B. Mamy dwie grupy po 12 zwierząt. Uzyskane przyrosty masy są następujące:&lt;br /&gt;
&lt;br /&gt;
A: 31 34 29 26 32 35 38 34 31 29 32 31&lt;br /&gt;
&lt;br /&gt;
B: 26 24 28 29 30 29 31 29 32 26 28 32&lt;br /&gt;
&lt;br /&gt;
Pytanie:&lt;br /&gt;
Czy któraś z karm daje istotnie większe przyrosty masy?&lt;br /&gt;
&lt;br /&gt;
Poniżej rozwiążemy to zadanie stopniowo różnymi metodami. Kolejne kawałki kodu można dopisywać do tego samego pliku.&lt;br /&gt;
&lt;br /&gt;
ROZWIĄZANIE:&lt;br /&gt;
Przyjmujemy poziom istotności, na którym przeprowadzamy testy &amp;lt;math&amp;gt;\alpha = 0.05&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Badamy rozkłady danych:===&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
A=[ 31, 34, 29, 26, 32, 35, 38, 34, 31, 29, 32, 31];&lt;br /&gt;
B=[ 26, 24, 28, 29, 30, 29, 31, 29, 32, 26, 28, 32];&lt;br /&gt;
W, p_A = st.shapiro(A)&lt;br /&gt;
print('Dla grupy A:', p_A)&lt;br /&gt;
W, p_B = st.shapiro(B)&lt;br /&gt;
print('Dla grupy B:', p_B)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dla obu grup test Shapiro-Wilka nie daje nam podstaw do odrzucenia założenia o normalności rozkładów.&lt;br /&gt;
&lt;br /&gt;
===Test parametryczny===&lt;br /&gt;
Nie odrzuciliśmy hipotezy o normalnym rozkładzie danych zatem możemy zastosować  [[WnioskowanieStatystyczne/Test_t | test ''t'' ]] dla różnicy średnich.&lt;br /&gt;
&lt;br /&gt;
Formułujemy hipotezy:&lt;br /&gt;
* &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt;: średni przyrost masy w grupie A &amp;lt;math&amp;gt;=&amp;lt;/math&amp;gt; średni przyrost masy w grupie B&lt;br /&gt;
* &amp;lt;math&amp;gt;H_1&amp;lt;/math&amp;gt;: średni przyrost masy w grupie A &amp;lt;math&amp;gt;\ne&amp;lt;/math&amp;gt; średni przyrost masy w grupie B&lt;br /&gt;
Przeprowadzamy test:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
t, p = st.ttest_ind(A,B)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Otrzymujemy ''p'' = 0.01.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;p &amp;lt; \alpha &amp;lt;/math&amp;gt;,  zatem na przyjętym poziomie istotności odrzucamy hipotezę zerową i stwierdzamy, że grupa A ma inną średnią niż grupa B.&lt;br /&gt;
&lt;br /&gt;
===Test nieparametryczny ===&lt;br /&gt;
Nie zakładajac postaci  rozkładu danych mozemy zastosować test [[WnioskowanieStatystyczne/Test_Wilcoxona| ze statystykami opartymi na rangach]]. &lt;br /&gt;
Formułujemy hipotezy:&lt;br /&gt;
* &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt;: mediana przyrostu masy w grupie A &amp;lt;math&amp;gt;=&amp;lt;/math&amp;gt; mediana przyrostu masy w grupie B&lt;br /&gt;
* &amp;lt;math&amp;gt;H_1&amp;lt;/math&amp;gt;: mediana przyrostu masy w grupie A&amp;lt;math&amp;gt;\ne&amp;lt;/math&amp;gt; mediana przyrostu masy w grupie B&lt;br /&gt;
Przeprowadzamy test:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
U, p = st.mannwhitneyu(A, B)&lt;br /&gt;
p_dwustronne = 2*p&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
W pythonie zaimplementowana jest wersja jednostronna tego testu. Aby otrzymać prawdopodobieństwo ''p'' dla testu dwustronnego musimy pomnożyć je przez 2.&lt;br /&gt;
&lt;br /&gt;
===Testy bootstrapowe===&lt;br /&gt;
Teraz to samo sprawdzimy za pomocą testu repróbkowanego.&lt;br /&gt;
Przyda nam się tu funkcja do pobierania losowej próbki z powtórzeniami z danych:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
def randsample(x, N):&lt;br /&gt;
	'''zwraca wektor o dłougości N z losowo wybranymi elementami wektora x. Losowanie odbywa się z powtórzeniami''' &lt;br /&gt;
	n=len(x)&lt;br /&gt;
	ind = np.random.randint(n, size = N)&lt;br /&gt;
	y = x[ind]&lt;br /&gt;
	return y&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W testech repróbkowanych statystykę możemy wybrać dość dowolnie, ale jak pokażemy poniżej nie każda jest równie dobra.&lt;br /&gt;
Zgodnie z hipotezą zerową próbka A i  B pochodza z tej samej populacji.&lt;br /&gt;
Nasza najlepsza wiedza o owej populacji to połączone próbki A i B:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
POP=np.concatenate((A, B))&lt;br /&gt;
&lt;br /&gt;
N=len(POP)&lt;br /&gt;
NA=len(A)&lt;br /&gt;
NB=len(B)&lt;br /&gt;
# Zasymulujemy N_rep razy wyciagniecie z POP prob o rozmiarach NA i NB i&lt;br /&gt;
# zobaczymy jak czesto zdarzają się wartości statystyki  sie roznica srednich taka jak w oryginalnym&lt;br /&gt;
# pomiarze lub jeszcze wieksza. &lt;br /&gt;
N_rep=10000&lt;br /&gt;
# oryginalna roznica srednich i median:&lt;br /&gt;
mi_0 = np.abs(np.mean(A) - np.mean(B))&lt;br /&gt;
T_0  = np.abs(np.mean(A) - np.mean(B))/np.std(POP)&lt;br /&gt;
me_0 = np.abs(np.median(A) - np.median(B))&lt;br /&gt;
&lt;br /&gt;
mi = np.zeros(N_rep)&lt;br /&gt;
T  = np.zeros(N_rep)&lt;br /&gt;
me = np.zeros(N_rep)&lt;br /&gt;
&lt;br /&gt;
for i in range(N_rep):&lt;br /&gt;
	AA = randsample(POP,NA)&lt;br /&gt;
	BB = randsample(POP,NB)&lt;br /&gt;
	R_POP = np.concatenate((AA,BB))&lt;br /&gt;
	mi[i] = np.abs(np.mean(AA)-np.mean(BB)) # abs bo test dwustronny&lt;br /&gt;
	T[i]  = np.abs(np.mean(AA)-np.mean(BB))/np.std(R_POP)&lt;br /&gt;
	me[i] = np.abs(np.median(AA)-np.median(BB))&lt;br /&gt;
&lt;br /&gt;
p_mi = np.sum(mi&amp;gt;=mi_0)/N_rep&lt;br /&gt;
p_T  = np.sum( T&amp;gt;=T_0 )/N_rep&lt;br /&gt;
p_me = np.sum(me&amp;gt;=me_0)/N_rep&lt;br /&gt;
&lt;br /&gt;
print('testy repróbkowane: ')&lt;br /&gt;
print('rożnica średnich: ', p_mi)&lt;br /&gt;
print('pseudo T: ', p_T)&lt;br /&gt;
print('różnica median: ', p_me)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Widzimy, że dla testu ze statystyką różnicy średnich i  pseudo T dostajemy podobne wyniki, z tym, że pseudo T jest nieco silniejszy. Test ze statystyką różnicy średnich jest na tyle słaby, że nie pozwala na odrzucenie hipotezy zerowej.&lt;br /&gt;
&lt;br /&gt;
===Wnioskowanie w oparciu o przedziały ufności ===&lt;br /&gt;
Wnioskowanie o równości średnich dwóch grup można też przerowadzić w oparciu o przedziały ufności. W naszym przykładzie przedziały można skonstruować zarówno parametrycznie jak i nieparametrycznie.&lt;br /&gt;
==== Wersja parametryczna ====&lt;br /&gt;
Konstruujemy 95% przedział ufności wokół oryginalnej różnicy średnich.&lt;br /&gt;
Dla dwóch grup wariancję różnicy średnich znajdujemy sumując wariancje śrenich estymowane dla każdej z grup:&lt;br /&gt;
:&amp;lt;math&amp;gt; &lt;br /&gt;
\mathrm{var}_{\Delta} = \frac{1}{N_1}\mathrm{var}(x_1) + \frac{1}{N_2} \mathrm{var}(x_2)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
ilość stopni swobody:&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
 df = N_1+N_2-2&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
co prowadzi do estymatora&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
s^2_\Delta = \frac{N_1s_1^2 + N_2s_2^2}{N_1+N_2-2} \cdot \frac{N_1+N_2}{N_1N_2}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
roznica_oryginalna = np.mean(A) - np.mean(B)&lt;br /&gt;
f = NA+NB-2;&lt;br /&gt;
v_A = np.var(A)&lt;br /&gt;
v_B = np.var(B)&lt;br /&gt;
sig = np.sqrt( ((NA*v_A +NB*v_B))/f * (NA + NB)/(NA*NB) )&lt;br /&gt;
t_2_5 = st.t.ppf(0.025,f);&lt;br /&gt;
t_97_5 = st.t.ppf(0.975,f);&lt;br /&gt;
print('przedział ufności dla różnicy średnich przy założeniu normalności %(d).2f %(g).2f'%{'d':sig*t_2_5+ roznica_oryginalna,'g':sig*t_97_5+roznica_oryginalna})&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Otrzymujemy w wyniku &amp;lt;tt&amp;gt;przedział ufności dla różnicy średnich przy założeniu normalności 0.77 5.56&amp;lt;/tt&amp;gt;. Oznacza to, że w 95% analogicznych badań powinniśmy otrzymać różnicę średnich zawartą w tym przedziale. Przedził ten nie zawiera wartości 0, zatem na przyjętym poziomie istotności średnie grupy A i B są różne.&lt;br /&gt;
&lt;br /&gt;
====Wersja nieparametryczna ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# POP zawiera świat zgodny z H0&lt;br /&gt;
roznica_oryginalna = np.mean(A) - np.mean(B)&lt;br /&gt;
alfa = 0.05&lt;br /&gt;
N_rep = 10000&lt;br /&gt;
r = np.zeros(N_rep)&lt;br /&gt;
for i in range(N_rep):&lt;br /&gt;
	gA = randsample(POP, NA)&lt;br /&gt;
	gB = randsample(POP, NB)&lt;br /&gt;
	r[i] = np.mean(gA) - np.mean(gB)&lt;br /&gt;
ci_d = st.scoreatpercentile(r, per = alfa/2*100)&lt;br /&gt;
ci_g = st.scoreatpercentile(r, per = (1-alfa/2)*100)&lt;br /&gt;
# print('przedział ufności: %(d).2f %(g).2f'%{'m':np.mean(r),'d':ci_d+roznica_oryginalna, 'g':ci_g+roznica_oryginalna})&lt;br /&gt;
print('przedział ufności: %(d).2f %(g).2f'%{'m':np.mean(r),'d':ci_d, 'g':ci_g})&lt;br /&gt;
print('oryginalna różnica średnich: %(ro).2f'%{'ro':roznica_oryginalna})&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Wynik:&lt;br /&gt;
&amp;lt;tt&amp;gt;przedział ufności: -2.50 2.50&lt;br /&gt;
oryginalna różnica średnich: 3.17&amp;lt;/tt&amp;gt;.&lt;br /&gt;
Przedział ufności 95% na różnicę skonstruowany zgodnie z &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; nie zawiera oryginalnej różnicy średnich, &lt;br /&gt;
zatem różnica 3.17 w świecie zgodnym z &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; zdarza się nie częściej niż w 5% przypadków. Wniosek: średnie grup A i B są różne  na przyjętym poziomie ufności.&lt;br /&gt;
&lt;br /&gt;
== Zadanie: Przeżywalność myszy ==&lt;br /&gt;
Mamy 7 myszy, którym podano środek, który miał poprawić ich przeżywalność po operacji oraz 9 myszy kontrolnych, którym owego środka nie podano. Myszy traktowane specjalnie przeżyły &amp;lt;br&amp;gt;&lt;br /&gt;
94, 38, 23, 197, 99, 16, 141 dni&amp;lt;br&amp;gt;&lt;br /&gt;
a myszy traktowane standardowo:&amp;lt;br&amp;gt;&lt;br /&gt;
52, 10, 40, 104, 51, 27, 146, 30, 46 dni&amp;lt;br&amp;gt;&lt;br /&gt;
Średnia różnica wynosi 30,63 dni dłużej dla myszy traktowanych po nowemu.&lt;br /&gt;
Pytanie, na które chcielibyśmy znać odpowiedź to: Czy nowy środek faktycznie poprawia przeżywalność.&lt;br /&gt;
Zadanie proszę rozwiązać wszystkimi możliwymi sposobami, analogicznie do powyższego przykładu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Odp'': &lt;br /&gt;
:przedział ufności: [&amp;amp;minus;51,64 52,89]&lt;br /&gt;
:oryginalna różnica średnich: 30,63&lt;br /&gt;
:przedział ufności dla różnicy średnich przy założeniu normalności [&amp;amp;minus;27,99  89,26]&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
'''Przedział ufności dla różnicy dwóch średnich&lt;br /&gt;
&lt;br /&gt;
Mamy 7 myszy, którym podano środek, który miał poprawić ich przeżywalność &lt;br /&gt;
po operacji oraz 9 myszy kontrolnych, którym owego środka nie podano. &lt;br /&gt;
Myszy traktowane specjalnie przeżyły&lt;br /&gt;
94 38 23 197 99 16 141 dni&lt;br /&gt;
a myszy traktowane standardowo:&lt;br /&gt;
52 10 40 104 51 27 146 30 46 dni&lt;br /&gt;
Średnia różnica wynosi 30.63 dni dłużej dla myszy traktowanych po nowemu. &lt;br /&gt;
Pytanie, na które chcielibyśmy znać odpowiedź to: Czy nowy środek faktycznie &lt;br /&gt;
poprawia przeżywalność.&lt;br /&gt;
&lt;br /&gt;
Skonstruujmy przedział ufności 95% dla średniej różnicy w przeżywalności.&lt;br /&gt;
&lt;br /&gt;
Uwaga: przy tym problemie każdą z grup traktujemy jako reprezentantów bardzo &lt;br /&gt;
dużych populacji. '''&lt;br /&gt;
def randsample(x,ile):&lt;br /&gt;
	ind = st.randint.rvs(0,len(x),size = ile)&lt;br /&gt;
	y = x[ind]&lt;br /&gt;
	return y&lt;br /&gt;
&lt;br /&gt;
m_sp = np.array([94, 38, 23, 197, 99, 16, 141])&lt;br /&gt;
N_sp = len(m_sp)&lt;br /&gt;
m_st = np.array([52, 10, 40, 104, 51, 27, 146, 30, 46])&lt;br /&gt;
N_st = len(m_st)&lt;br /&gt;
alfa = 0.05&lt;br /&gt;
# zgodnie z hipotezą zerową (H0) nie ma różnicy między grupami&lt;br /&gt;
&lt;br /&gt;
# symulacja&lt;br /&gt;
# tworzymy świat zgodny z H0&lt;br /&gt;
m = np.concatenate((m_sp,m_st))&lt;br /&gt;
&lt;br /&gt;
roznica_oryginalna = np.mean(m_sp) - np.mean(m_st)&lt;br /&gt;
&lt;br /&gt;
N_rep = 10000&lt;br /&gt;
r = np.zeros(N_rep)&lt;br /&gt;
for i in range(N_rep):&lt;br /&gt;
	g1 = randsample(m, N_sp)&lt;br /&gt;
	g2 = randsample(m, N_st)&lt;br /&gt;
	r[i] = np.mean(g1) - np.mean(g2)&lt;br /&gt;
ci_d = st.scoreatpercentile(r, per = alfa/2*100)&lt;br /&gt;
ci_g = st.scoreatpercentile(r, per = (1-alfa/2)*100)&lt;br /&gt;
print('przedział ufności: %(d).2f %(g).2f'%{'m':np.mean(r),'d':ci_d, 'g':ci_g})&lt;br /&gt;
print('oryginalna różnica średnich: %(ro).2f'%{'ro':roznica_oryginalna})&lt;br /&gt;
# przedział ufności na różnicę skonstruowany zgodnie z H0 zawiera oryginalną różnicę średnich, &lt;br /&gt;
# zatem różnica taka jest na przyjętym poziomie ufności możliwa &lt;br /&gt;
# do zaobserwowania w przypadku braku różnicy między grupami&lt;br /&gt;
&lt;br /&gt;
# zakładając normalność&lt;br /&gt;
f = N_sp+N_st-2;&lt;br /&gt;
v_1 = np.var(m_sp)&lt;br /&gt;
v_2 = np.var(m_st)&lt;br /&gt;
sig = np.sqrt( ((N_sp*v_1 +N_st*v_2))/f * (N_sp + N_st)/float(N_sp*N_st) )&lt;br /&gt;
t_2_5 = st.t.ppf(0.025,f);&lt;br /&gt;
t_97_5 = st.t.ppf(0.975,f);&lt;br /&gt;
print('przedział ufności dla różnicy średnich przy założeniu normalności %(d).2f %(g).2f'%{'d':sig*t_2_5+ roznica_oryginalna,'g':sig*t_97_5+roznica_oryginalna})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
print('przedział ufności dla różnicy średnich przy założeniu normalności %(d).2f %(g).2f'%{'d':s_delta*t_2_5+ roznica_oryginalna,'g':s_delta*t_97_5+roznica_oryginalna})&lt;br /&gt;
# skonstruowany wokoł oryginalnej różnicy średnich przedział ufności zawiera 0, zatem nie możemy odrzucić możliwości,&lt;br /&gt;
# że nie ma różnicy między grupami&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zadanie: Linie lotnicze==&lt;br /&gt;
Linie lotnicze, projektując nowy samolot chcą sprawdzić czy średnia waga bagażu ręcznego zabieranego przez pasażerów nie zmieniła się od czasu poprzednich badań i wynosi wciąż 12 kg. Analiza ma być przeprowadzona na poziomie istotności &amp;lt;math&amp;gt;\alpha = 0,05&amp;lt;/math&amp;gt;. Analityk pobrał próbę bagażu ręcznego 144 pasażerów i obliczył wartość średnią z próby &amp;lt;math&amp;gt;\bar x = 14,6&amp;lt;/math&amp;gt; kg i odchylenie standardowe z próby &amp;lt;math&amp;gt;s = 7,8&amp;lt;/math&amp;gt;. Przeprowadź test hipotezy, że &amp;lt;math&amp;gt;\mu = 12&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
Standardowe importy modułów&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zmienne występujące w treści przykładu&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
mu_0=12&lt;br /&gt;
a=0.05&lt;br /&gt;
N=144&lt;br /&gt;
x=14.6&lt;br /&gt;
s=7.8&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Test dotyczy średniej wiec obliczamy odchylenie standardowe średniej:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
std_mu=s/np.sqrt(N)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wyjaśnienie |title= Obliczamy wartość statystyki:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt; &lt;br /&gt;
t=(mu_0-x)/std_mu&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Odchylenie standardowe estymowaliśmy z próby. Wartości powyższej statystyki podlegają zatem rozkładowi  t. Obliczamy wartości krytyczne odpowiadające poziomowi istotności a. Test jest dwustronny mamy wiec dwie wartości krytyczne: jedna odcina obszar pod funkcja gęstości prawdopodobieństwa na lewo,  a druga na prawo od siebie. Pole każdego z tych obszarów wynosi a/2:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt; &lt;br /&gt;
  &lt;br /&gt;
t_kryt_lewy = st.t.ppf(a/2,N-1)&lt;br /&gt;
t_kryt_prawy = st.t.ppf( 1-a/2, N-1)&lt;br /&gt;
&lt;br /&gt;
print('obliczona wartość statystyki t: ', t)&lt;br /&gt;
print('wartości krytyczne t: %(tl).2f %(tp).2f '%{'tl':t_kryt_lewy, 'tp':t_kryt_prawy})&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Możemy też obliczyć prawdopodobieństwo zaobserwowania wartości ''t'' takiej jak w naszym zadaniu lub bardziej ekstremalnej:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt; &lt;br /&gt;
p =  (st.t.cdf(-np.abs(t),N-1)) + (1-st.t.cdf(np.abs(t), N-1))  # sumujemy po obu ogonach  bo test jest dwustronny&lt;br /&gt;
print('Prawdopodobieństwo zaobserwowania bardziej ekstremalnych wartości t: %(p).4f'%{'p':p})&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wyniki te możemy zilustrować:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt; &lt;br /&gt;
os_t = np.arange(-5, 5, 0.1)&lt;br /&gt;
py.plot(os_t, st.t.pdf(os_t,N-1)) #rysujemy funkcję gęstości prawdopodobieństwa t o N-1 st. swobody&lt;br /&gt;
&lt;br /&gt;
#cieniujemy lewy obszary pod funkcją gęstości prawdopodobieństwa odpowiadający obliczonemu p&lt;br /&gt;
os_t2 = np.arange(-5, t_kryt_lewy, 0.1)&lt;br /&gt;
py.fill_between(os_t2,st.t.pdf(os_t2,N-1)) &lt;br /&gt;
#cieniujemy prawy obszary pod funkcją gęstości prawdopodobieństwa odpowiadający obliczonemu p&lt;br /&gt;
os_t2 = np.arange(t_kryt_prawy, 5,  0.1)&lt;br /&gt;
py.fill_between(os_t2,st.t.pdf(os_t2,N-1)) &lt;br /&gt;
&lt;br /&gt;
# zaznaczamy obliczoną wartość statystyki:&lt;br /&gt;
py.plot((t,), (0,), 'ro')&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Odpowiedź: Wyliczone ''t'' leży poza obszarem akceptacji hipotezy zerowej, zatem odrzucamy hipotezę zerową i akceptujemy alternatywną.&lt;br /&gt;
&lt;br /&gt;
==Zadanie: Agencja nieruchomości==&lt;br /&gt;
Agencja nieruchomości w Japonii podała, że ceny gruntu w centrum Tokio wzrosły o 49% w ciągu ostatniego roku. Inwestor chcąc przetestować te dane, znajduje próbę 18 nieruchomości w centrum Tokio, dla których zna cenę obecna i sprzed roku. Zakłada, że ceny podlegają rozkładowi normalnemu. Dla każdej nieruchomości oblicza procentowy wzrost wartości a następnie znajduje średnią i odchylenie standardowe z próby. Estymatory dla próby wynoszą &amp;lt;math&amp;gt;\bar x = 38&amp;lt;/math&amp;gt;% i &amp;lt;math&amp;gt;s = 14&amp;lt;/math&amp;gt;%. Przeprowadź test na poziomie istotności &amp;lt;math&amp;gt;\alpha = 0,01&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
mu_0=49;&lt;br /&gt;
x=38;&lt;br /&gt;
s=14;&lt;br /&gt;
N=18;&lt;br /&gt;
a=0.01;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# test dotyczy sredniej wiec jej std:&lt;br /&gt;
std_mu=s/np.sqrt(N)&lt;br /&gt;
&lt;br /&gt;
# odchylenie std obliczylismy z proby =&amp;gt; stosujemy test t&lt;br /&gt;
# obliczamy wartość statystyki &lt;br /&gt;
t=(mu_0-x)/std_mu&lt;br /&gt;
# obliczamy wartości krytyczne odpowiadające poziomowi istotności a&lt;br /&gt;
# test jest dwustronny mamy wiec dwie wartosci krytyczne &lt;br /&gt;
# jedna odcina obszar pod funkcja gęstości prawdopodobieństwa na lewo, &lt;br /&gt;
# a druga na prawo od siebie. Pole każdego z tych obszarów wynosi a/2&lt;br /&gt;
  &lt;br /&gt;
t_kryt_lewy = st.t.ppf(a/2,N-1)&lt;br /&gt;
t_kryt_prawy = st.t.ppf( 1-a/2, N-1)&lt;br /&gt;
&lt;br /&gt;
print('obliczona wartość statystyki t: ', t)&lt;br /&gt;
print('wartości krytyczne t: %(tl).2f %(tp).2f '%{'tl':t_kryt_lewy, 'tp':t_kryt_prawy})&lt;br /&gt;
&lt;br /&gt;
# Możemy też obliczyć prawdopodobieństwo zaobserwowania wrtości t takiej jak w naszym zadaniu &lt;br /&gt;
# lub bardziej ekstremalnej:&lt;br /&gt;
p = (1-st.t.cdf(t, N-1)) + (st.t.cdf(-t,N-1)) # sumujemy po obu ogonach  bo test jest dwustronny&lt;br /&gt;
		&lt;br /&gt;
print('Prawdopodobieństwo zaobserwowania bardziej ekstremalnych wrtości t: %(p).3f'%{'p':p})&lt;br /&gt;
# Wyniki te możemy zilustrować&lt;br /&gt;
os_t = np.arange(-5, 5, 0.1)&lt;br /&gt;
py.plot(os_t, st.t.pdf(os_t,N-1)) #rysujemy funkcję gęstości prawdopodobieństwa t o N-1 st. swobody&lt;br /&gt;
&lt;br /&gt;
#cieniujemy lewy obszary pod funkcją gęstości prawdopodobieństwa odpowiadający obliczonemu p&lt;br /&gt;
os_t2 = np.arange(-5, t_kryt_lewy, 0.1)&lt;br /&gt;
py.fill_between(os_t2,st.t.pdf(os_t2,N-1)) &lt;br /&gt;
#cieniujemy prawy obszary pod funkcją gęstości prawdopodobieństwa odpowiadający obliczonemu p&lt;br /&gt;
os_t2 = np.arange(t_kryt_prawy, 5,  0.1)&lt;br /&gt;
py.fill_between(os_t2,st.t.pdf(os_t2,N-1)) &lt;br /&gt;
&lt;br /&gt;
# zaznaczamy obliczoną wartość statystyki:&lt;br /&gt;
py.plot(t, 0, 'ro')&lt;br /&gt;
py.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# 'Odp: Wyliczone t lezy poza obszarem akceptacji hipotezy zerowej,&lt;br /&gt;
# zatej odrzucamy hipoteze zerowa i akceptujemy alternatywna.'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Odp. Odrzucamy &amp;lt;math&amp;gt;H_0:&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\mu_0 = 49&amp;lt;/math&amp;gt;, na poziomie istotności 0,01.&lt;br /&gt;
&lt;br /&gt;
==Zadanie: Zabiegi bio-inżynieryjne==&lt;br /&gt;
Załóżmy, że krowy są bardziej wartościowe od byków. Bio-inżynier twierdzi, że przy pomocy pewnych zabiegów jest w stanie spowodować zwiększenie szansy na urodzenie się krowy powyżej 50%. W jego eksperymencie na 10 urodzonych zwierząt 9 było krowami, a tylko 1 bykiem. Czy powinnniśmy wierzyć temu bio-inżynierowi? Jakia jest szansa na uzyskanie takiego, bądź bardziej ekstremalnego wyniku przy założeniu, że procedura stosowana przez naszego inżyniera nia ma żadnych efektów? W tym problemie dla odmiany założymy, że w normalnych warunkach 100 spośród 206 cieląt to krowy.&lt;br /&gt;
Zadanie rozwiązać metodą parametryczną i przez repróbkowanie. [[WnioskowanieStatystyczne/_Testowanie_hipotez#Przykład:_mutacje_muszek_owocowych|Wskazówka]]&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
def randsample(x, N):&lt;br /&gt;
	'''zwraca wektor z losowo wybranymi elementami wektora x. Losowanie odbywa się z powtórzeniami''' &lt;br /&gt;
	n=len(x)&lt;br /&gt;
	ind = np.random.randint(n, size = N)&lt;br /&gt;
	y = x[ind]&lt;br /&gt;
	return y&lt;br /&gt;
&lt;br /&gt;
# sposób pierwszy:&lt;br /&gt;
# zmienna urodzenie byka/krowy podlega rozkladowi dwumianowemu &lt;br /&gt;
p = 100.0/206&lt;br /&gt;
N = 10&lt;br /&gt;
k = 9&lt;br /&gt;
p_bino = 1-st.binom.cdf(k-1,N,p) #prawdopodobieństwo wylosowania 9 lub 10 krów w 10 probach &lt;br /&gt;
print('Prawdopodobieństwo wylosowania 9 lub 10 krów w 10 probach: %(p).4f'%{'p':p_bino})&lt;br /&gt;
# W jego mwetodzie chyba cos jest&lt;br /&gt;
&lt;br /&gt;
# sposob drugi: repróbkowanie&lt;br /&gt;
# model swiata z ktorego pochodza byki(0)/krowy(1):&lt;br /&gt;
w = np.concatenate((np.ones(100), np.zeros(106)))&lt;br /&gt;
&lt;br /&gt;
N_rep = 100000&lt;br /&gt;
wynik = np.zeros(N_rep)&lt;br /&gt;
for i in range(N_rep):&lt;br /&gt;
	wynik[i] = np.sum(randsample(w,10))&lt;br /&gt;
&lt;br /&gt;
p_rep = float(np.sum(wynik&amp;gt;=k))/N_rep&lt;br /&gt;
print('Prawdopodobieństwo wylosowania 9 lub 10 krów w 10 probach estymowane z symulacji: %(p).4f'%{'p':p_rep})&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''Odp'':  ''p'' = 0,008. Odrzucamy ''H''&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; o braku efektów.&lt;br /&gt;
&lt;br /&gt;
==Zadanie: Porównanie lekarstwa i placebo==&lt;br /&gt;
Badamy skuteczność leku na raka. Mamy grupę 12 chorych: 6 osobom podajemy lek &amp;amp;mdash; poprawa wystąpiła u 5 osób, pozostałym sześciu osobom podajemy placebo &amp;amp;mdash; poprawa wystąpiła u 2 osób. Czy te wyniki upoważniają do stwierdzenia, że lek istotnie zwiększa szansę poprawy? Test przeprowadzić na poziomie istotności 5%.&lt;br /&gt;
&lt;br /&gt;
Wskazówka: jako statystykę przyjąć różnicę w ilości popraw między grupą z lekiem a grupą z placebo. Interesuje nas prawdopodobieństwo zaobserwowania takiej (3) bądź większej różnicy. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
def randsample(x, N):&lt;br /&gt;
	'''zwraca wektor z losowo wybranymi elementami wektora x. Losowanie odbywa się z powtórzeniami''' &lt;br /&gt;
	n=len(x)&lt;br /&gt;
	ind = np.random.randint(n, size = N)&lt;br /&gt;
	y = x[ind]&lt;br /&gt;
	return y&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Formułujemy hipotezy &lt;br /&gt;
# H0: lek nie daje poprawy &lt;br /&gt;
# H1: lek daje poprawę&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# zgodnie z H0 obie próby pochodzą ze świata:&lt;br /&gt;
# pierwszy sposób: repróbkowanie&lt;br /&gt;
w = np.concatenate((np.ones(7), np.zeros(5))) # jedynki -&amp;gt; wystąpiła poprawa&lt;br /&gt;
&lt;br /&gt;
n_l = 5 # ilosc popraw w grupie leku&lt;br /&gt;
n_p = 2 #ilosc popraw w grupie placebo&lt;br /&gt;
# jako statystykę testową przyjmiemy różnicę w ilości popraw miedzy grupami&lt;br /&gt;
# w tym problemie istotne jest zwiększenie ilości popraw wiec stosujemy test&lt;br /&gt;
# jednostronny&lt;br /&gt;
N_rep = 100000&lt;br /&gt;
&lt;br /&gt;
st_0= n_l - n_p&lt;br /&gt;
st_rep=np.zeros(N_rep)&lt;br /&gt;
&lt;br /&gt;
for i in range(N_rep):&lt;br /&gt;
    n_l_rep   = np.sum(randsample(w,6))&lt;br /&gt;
    n_p_rep   = np.sum(randsample(w,6))&lt;br /&gt;
    st_rep[i] = n_l_rep - n_p_rep # wartość statystyki w i-tym repróbkowaniu&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
p_rep = float(np.sum(st_rep &amp;gt;= st_0))/N_rep&lt;br /&gt;
print('''Prawdopodobieństwo wylosowania takiej samej bądź większej różnicy w ilości popraw estymowane z symulacji: %(p).4f'''%{'p':p_rep})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# drugi sposób:&lt;br /&gt;
# zmienna uzyskanie poprawy podlega rozkładowi dwumianowemu &lt;br /&gt;
p = 7.0/12&lt;br /&gt;
N = 6&lt;br /&gt;
k1 = 5&lt;br /&gt;
k2 = 2&lt;br /&gt;
p_param = 0&lt;br /&gt;
for d in range(N-st_0+1):  # w tej pętli sumujemy prawdopodobieństwa zdarzeń  sprzyjających zaobserwowaniu różnicy co najmniej st_0 popraw &lt;br /&gt;
# Poprawy w jednej i drugiej grupie traktujemy jako zdarzenia niezależne&lt;br /&gt;
# Pętla &amp;quot;for d&amp;quot; przechodzi przez możliwe liczby popraw w pierwszej grupie&lt;br /&gt;
	p_bino1 = st.binom.pmf(d,N,p)   # prawdopodobieństwo uzyskania poprawy w d próbach&lt;br /&gt;
# Jeśli w pierwszej grupie było d popraw, to w drugiej może być od d+st_0 do N popraw&lt;br /&gt;
	p_bino2 = 1-st.binom.cdf(st_0 - 1 +d, N, p)  # prawdopodobieństwo uzyskania poprawy w co najmniej st_0 +d próbach&lt;br /&gt;
	p_param += p_bino1 * p_bino2 # prawdopodobieństwo zaobserwowania jednocześnie obu powyższych sytuacji&lt;br /&gt;
&lt;br /&gt;
print('Prawdopodobieństwo estymowane parametrycznie: %(p).4f'%{'p':p_param})&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: Odp: Prawdopodobieństwo wylosowania takiej samej bądź większej różnicy w ilości popraw estymowane z symulacji: 0,0702&lt;br /&gt;
Prawdopodobieństwo estymowane parametrycznie: 0,0699. Wniosek: nie mamy podstaw do odrzucenia hipotezy zerowej.&lt;br /&gt;
&lt;br /&gt;
==Zadanie: Pomiar masy cząstki elementarnej==&lt;br /&gt;
W pomiarach wstępnych zbadano masę spoczynkową pewnej cząstki elementarnej. Otrzymano następujące wyniki [MeV/c²]:&lt;br /&gt;
&lt;br /&gt;
139.20, 139.34, 140.22, 139.56, 139.42, 139.64, 139.22, 139.74, 139.38, 139.54,&lt;br /&gt;
139.38, 139.46, 140.09, 139.77, 139.52, 139.47, 139.89, 138.95, 139.99, 139.64,&lt;br /&gt;
139.37, 139.49, 139.15, 139.77, 140.10, 139.48, 139.84, 139.44, 140.13&lt;br /&gt;
&lt;br /&gt;
Zbadaj na poziomie istotności 1%, czy cząstką tą mógł być naładowany pion.&lt;br /&gt;
&lt;br /&gt;
Zbadaj na poziomie istotności 1%, czy cząstką tą mógł być neutralny pion.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
&lt;br /&gt;
alfa = 0.01 # poziom istotności&lt;br /&gt;
dane = np.array([139.20, 139.34, 140.22, 139.56, 139.42, 139.64, 139.22, 139.74,&lt;br /&gt;
                 139.38, 139.54, 139.38, 139.46, 140.09, 139.77, 139.52, 139.47,&lt;br /&gt;
                 139.89, 138.95, 139.99, 139.64, 139.37, 139.49, 139.15, 139.77,&lt;br /&gt;
                 140.10, 139.48, 139.84, 139.44, 140.13])&lt;br /&gt;
&lt;br /&gt;
Pi_plus_min = 139.57 # masa pionów naładowanych Pi+ i Pi-&lt;br /&gt;
Pi_neutral = 134.98  # masa pionu neutralnego Pi0&lt;br /&gt;
&lt;br /&gt;
# test t hipotezy H0, że dane pochodzą z rozkładu normalnego o wartości oczekiwanej Pi_plus_min&lt;br /&gt;
t1, p1 = st.ttest_1samp(dane,Pi_plus_min)&lt;br /&gt;
print(&amp;quot;Poziom p dla hipotezy, że był do pion naładowany&amp;quot;,p1)&lt;br /&gt;
if p1&amp;gt;=alfa: print(&amp;quot;Nie możemy odrzucić tej hipotezy na poziomie istotności {}%&amp;quot;.format(100*alfa))&lt;br /&gt;
else: print(&amp;quot;Możemy odrzucić tę hipotezę na poziomie istotności {}%&amp;quot;.format(100*alfa))&lt;br /&gt;
&lt;br /&gt;
# test t hipotezy H0, że dane pochodzą z rozkładu normalnego o średniej Pi_neutral&lt;br /&gt;
t2, p2 = st.ttest_1samp(dane,Pi_neutral)&lt;br /&gt;
print(&amp;quot;\nPoziom p dla hipotezy, że był do pion neutralny&amp;quot;,p2)&lt;br /&gt;
if p2&amp;gt;=alfa: print(&amp;quot;Nie możemy odrzucić tej hipotezy na poziomie istotności {}%&amp;quot;.format(100*alfa))&lt;br /&gt;
else: print(&amp;quot;Możemy odrzucić tę hipotezę na poziomie istotności {}%&amp;quot;.format(100*alfa))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Przykład: Średnie grup sparowanych: Lek przeciwdepresyjny==&lt;br /&gt;
Poniższa tabela prezentuje wyniki 9 pacjentów wykonujących pewien test diagnostyczny przed podaniem leku i po podaniu leku. &lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class='wikitable'&lt;br /&gt;
!przed	&lt;br /&gt;
!po&lt;br /&gt;
|-&lt;br /&gt;
|1,83	&lt;br /&gt;
|0,878&lt;br /&gt;
|-&lt;br /&gt;
|0,50	&lt;br /&gt;
|0,647&lt;br /&gt;
|-&lt;br /&gt;
|1,62	&lt;br /&gt;
|0,598&lt;br /&gt;
|-&lt;br /&gt;
|2,48	&lt;br /&gt;
|2,05&lt;br /&gt;
|-&lt;br /&gt;
|1,68	&lt;br /&gt;
|1,06&lt;br /&gt;
|-&lt;br /&gt;
|1,88	&lt;br /&gt;
|1,29&lt;br /&gt;
|-&lt;br /&gt;
|1,55	&lt;br /&gt;
|1,06&lt;br /&gt;
|-&lt;br /&gt;
|3,06	&lt;br /&gt;
|3,14&lt;br /&gt;
|-&lt;br /&gt;
|1,3	&lt;br /&gt;
|1,29&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
PRZED = [1.83, 0.5, 1.62, 2.48, 1.68, 1.88, 1.55, 3.06, 1.3]&lt;br /&gt;
PO = [0.878, 0.647, 0.598, 2.05, 1.06, 1.29, 1.06, 3.14, 1.29]&lt;br /&gt;
&lt;br /&gt;
Skonstruować test, który pozwoli stwierdzić czy lek jest skuteczny. Porównać różne wersje testu:&lt;br /&gt;
* bootstrapową (losowanie z powtórzeniami), &lt;br /&gt;
* permutacyjną, &lt;br /&gt;
* test parametryczny &lt;br /&gt;
* test nieparametryczny. &lt;br /&gt;
&lt;br /&gt;
Jakie założenia przyjmujemy przy każdej z wersji testu?&lt;br /&gt;
&lt;br /&gt;
===Rozwiązanie===&lt;br /&gt;
W tym zadaniu mamy dwie grupy ''przed'' i ''po'' ale oprócz tego istnieje ścisły porządek w parach, bez sensu jest porównywanie ''przed'' od jednego pacjenta z ''po'' drugiego pacjenta. Musimy stosować testy, które biorą ten porządek pod uwagę (testy pairwise).&lt;br /&gt;
&lt;br /&gt;
Jako miarę tego czy lek jest skuteczny przyjmiemy różnicę (''po'' - ''przed'').  Każda z zaobserwowanych różnic to zmienna losowa. Ich średnia to nasza STATYSTYKA. Będziemy wierzyli, że lek działa jeśli ta różnica jest istotnie mniejsza od zera. Mamy stąd hipotezy:&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;math&amp;gt;H_0: \bar r \geq 0&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;math&amp;gt;H_1: \bar r &amp;lt; 0 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Wersja bootstrapowa====&lt;br /&gt;
&lt;br /&gt;
Założenie, które czynimy w wersji bootstrapowej testu jest następujące:&lt;br /&gt;
Zaobserwowana grupa pacjentów jest reprezentatywna, tzn. istnieje duża populacja pacjentów spośród której moglibyśmy pobrać wiele innych grup podobnych pod względem interesujących nas parametrów do grupy zaobserwowanej w tym konkretnym eksperymencie. Konsekwencją tego założenia jest to, że jeśli w naszej grupie mamy już pacjenta z wynikami: [1.83,	0.878], to szansa na wylosowanie kolejnego pacjenta o takich wynikach się nie zmienia i nadal wynosi 1/9. Prowadzi to do implementacji zawierającej losowanie z powtórzeniami.&lt;br /&gt;
&lt;br /&gt;
Losowość występuje tu w dwóch miejscach:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; losujemy pacjentów z powtórzeniami - zakładamy, że badana grupa jest reprezentatywna dla bardzo dużej populacji.&lt;br /&gt;
&amp;lt;li&amp;gt; dla każdego z wybranych pacjentów losujemy jego wynik ''przed'' oraz wynik ''po'' z wyników, które uzyskał w rzeczywistości --- to jest zgodne z hipotezą zerową.&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Dla każdego losowania obliczamy wartość statystyki w tym losowania uśredniając  różnice indywidualne.&lt;br /&gt;
Wartości statystyki otrzymane dla wszystkich losowań tworzą jej empiryczny rozkład, przy założeniu, że hipoteza zerowa jest prawdziwa. Jako estymator prawdopodobieństwa zaobserwowania oryginalnej wartości statystyki ''mr'' (średnia różnica) przy prawdziwej hipotezie zerowej przyjmujemy frakcję rozkładu empirycznego, w której wartości statystyki były nie większe niż ''mr''. Wynik ilustrujemy histogramem rozkładu empirycznego z zaznaczoną ową frakcją.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
def randsample(x, N):&lt;br /&gt;
	'''zwraca wektor z losowo wybranymi elementami wektora x. &lt;br /&gt;
         Losowanie odbywa się z powtórzeniami''' &lt;br /&gt;
&lt;br /&gt;
	n=len(x)&lt;br /&gt;
	ind = np.random.randint(n, size = N)&lt;br /&gt;
	y = x[ind]&lt;br /&gt;
	return y&lt;br /&gt;
&lt;br /&gt;
def hist_z_markerem(x, N_bins, marker):&lt;br /&gt;
	'''Rysuje histogram wartości w tablicy x, używając N_bins binów. &lt;br /&gt;
	Na lewo od wartości wskazanej przez marker dorysowywany jest prostokąt'''&lt;br /&gt;
	&lt;br /&gt;
	r = np.max(x) - np.min(x)&lt;br /&gt;
	szer_binu = r/N_bins&lt;br /&gt;
&lt;br /&gt;
	#konstruujemy biny&lt;br /&gt;
        # robimy biny od markera co szerokość binu aż do x minimalnego&lt;br /&gt;
	biny_na_lewo = np.arange( marker, np.min(x), -szer_binu)&lt;br /&gt;
        # odwracamy kolejność tej sekwencji żeby była rosnąca&lt;br /&gt;
	biny_na_lewo = biny_na_lewo[-1::-1] &lt;br /&gt;
         # robimy biny od markera co szerokość binu aż do x maksymalnego&lt;br /&gt;
	biny_na_prawo = np.arange(marker,np.max(x), szer_binu)&lt;br /&gt;
        # sklejamy oba zakresy binów&lt;br /&gt;
	biny = np.concatenate((biny_na_lewo, biny_na_prawo))&lt;br /&gt;
	(n,xx,patch) = py.hist(x,bins = biny)&lt;br /&gt;
	py.fill([np.min(xx), np.min(xx), marker, marker] , [0, np.max(n), np.max(n), 0] ,'r' ,alpha = 0.2)&lt;br /&gt;
&lt;br /&gt;
A=np.array([[1.83,	0.878],&lt;br /&gt;
[0.50,	0.647],&lt;br /&gt;
[1.62,	0.598],&lt;br /&gt;
[2.48,	2.05],&lt;br /&gt;
[1.68,	1.06],&lt;br /&gt;
[1.88,	1.29],&lt;br /&gt;
[1.55,	1.06],&lt;br /&gt;
[3.06,	3.14],&lt;br /&gt;
[1.30,	1.29]])&lt;br /&gt;
&lt;br /&gt;
r = A[:,1] - A[:,0] # od drugiej kolumny odejmuję pierwszą&lt;br /&gt;
mr = np.mean(r)  # średnia z tych różnic to wartość statystyki zaobserwowana dla oryginalnych danych&lt;br /&gt;
print( 'średnia różnica: %(mr).2f'%{'mr':mr})&lt;br /&gt;
&lt;br /&gt;
N = len(r)&lt;br /&gt;
&lt;br /&gt;
N_rep = 100000&lt;br /&gt;
r_boot = np.zeros(N_rep)&lt;br /&gt;
przed = np.zeros(N)&lt;br /&gt;
po = np.zeros(N)&lt;br /&gt;
&lt;br /&gt;
for i in range(N_rep):&lt;br /&gt;
    ix=randsample(np.arange(0,N,1),N) # wybieramy pacjentów z powtórzeniami&lt;br /&gt;
    B=np.array(A[ix,:])&lt;br /&gt;
    for j in range(N):   # mieszamy losowo przypisując wyniki do grupy przed i po&lt;br /&gt;
                         # zakładając, że pacjent może uzyskać dwukrotnie taki sam wynik&lt;br /&gt;
        s = np.random.rand()&lt;br /&gt;
        if s &amp;gt; 0.5:&lt;br /&gt;
            przed[j]=B[j,0]&lt;br /&gt;
        else:&lt;br /&gt;
            przed[j]=B[j,1]&lt;br /&gt;
        s = np.random.rand()&lt;br /&gt;
        if s &amp;gt; 0.5:&lt;br /&gt;
            po[j]=B[j,1]&lt;br /&gt;
        else:&lt;br /&gt;
            po[j]=B[j,0]&lt;br /&gt;
    rr=po-przed&lt;br /&gt;
    r_boot[i] = np.mean(rr)&lt;br /&gt;
&lt;br /&gt;
hist_z_markerem(r_boot,30,mr)&lt;br /&gt;
p_h0 = np.sum( r_boot &amp;lt;=  mr)/N_rep&lt;br /&gt;
s_boot = u'dla repróbkowanego testu jednostronnego: %(p_h0).5f'%{'p_h0': p_h0}&lt;br /&gt;
print( s_boot)&lt;br /&gt;
py.title(s_boot)&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Wersja permutacyjna====&lt;br /&gt;
&lt;br /&gt;
W tym teście zakładamy, że grupa pacjentów jest unikalna, więc w procedurze wytwarzania empirycznego rozkładu statystyki  korzystamy z danych wszystkich pacjentów w każdej iteracji. &lt;br /&gt;
&lt;br /&gt;
Zgodnie z hipotezą zerową pomiary ''przed'' i ''po'' są równoważne można je zatem zamieniać. Wykonamy wszystkie możliwe zamiany ''przed'' i ''po''. Możliwych zamian jest &amp;lt;math&amp;gt;2^N&amp;lt;/math&amp;gt;.  Skorzystamy z faktu, że bity w reprezentacji binarnej liczb całkowitych od 0 do &amp;lt;math&amp;gt;2^{N-1}&amp;lt;/math&amp;gt; zawierają wszystkie możliwe permutacje ciągów zer i jedynek o długości ''N''. Wartości 1 zamienimy na logiczne True a wartości 0 na False. Zinterpretujemy True jako zamianę  i False jako brak zamiany. &lt;br /&gt;
&lt;br /&gt;
Dla każdej permutacji obliczamy wartość statystyki uśredniając  różnice indywidualne.&lt;br /&gt;
Wartości statystyki otrzymane dla wszystkich permutacji tworzą jej empiryczny rozkład, przy założeniu, że hipoteza zerowa jest prawdziwa. Jako estymator prawdopodobieństwa zaobserwowania oryginalnej wartości statystyki ''mr'' przy prawdziwej hipotezie zerowej przyjmujemy frakcję rozkładu empirycznego, w której wartości statystyki były nie większe niż ''mr''. Wynik ilustrujemy histogramem rozkładu empirycznego z zaznaczoną ową frakcją. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
 &lt;br /&gt;
def dec2bin(n, l):&lt;br /&gt;
    '''konwertuje dziesiętną liczbę całkowitą na tablicę &lt;br /&gt;
    przedstawiającą reprezentację binarną tej liczby&lt;br /&gt;
    n liczba do konwersji&lt;br /&gt;
    l długość reprezentacji binarnej &lt;br /&gt;
    zwracana jest binarna reprezentacja liczby &lt;br /&gt;
    skonwertowana do tablicy logicznej (0-&amp;gt;False, 1-&amp;gt; True)&lt;br /&gt;
    '''&lt;br /&gt;
    b = np.zeros(l, dtype = bool)&lt;br /&gt;
    if n &amp;lt; 0:  raise ValueError(&amp;quot;must be a positive integer&amp;quot;)&lt;br /&gt;
    i = 1&lt;br /&gt;
    while n &amp;gt; 0:&lt;br /&gt;
        b[l-i] = bool( n % 2 ) &lt;br /&gt;
        n = n &amp;gt;&amp;gt; 1&lt;br /&gt;
        i += 1&lt;br /&gt;
    return b&lt;br /&gt;
 &lt;br /&gt;
def hist_z_markerem(x, N_bins, marker):&lt;br /&gt;
	'''Rysuje histogram wartości w tablicy x, używając N_bins binów. &lt;br /&gt;
	Na lewo od wartości wskazanej przez marker dorysowywany jest prostokąt'''&lt;br /&gt;
 &lt;br /&gt;
	r = np.max(x) - np.min(x)	&lt;br /&gt;
	szer_binu = r/N_bins&lt;br /&gt;
 &lt;br /&gt;
	#konstruujemy biny&lt;br /&gt;
        # robimy biny od markera co szerokość binu aż do x minimalnego&lt;br /&gt;
	biny_na_lewo = np.arange( marker, np.min(x), -szer_binu)&lt;br /&gt;
        # odwracamy kolejność tej sekwencji żeby była rosnąca&lt;br /&gt;
	biny_na_lewo = biny_na_lewo[-1::-1] &lt;br /&gt;
         # robimy biny od markera co szerokość binu aż do x maksymalnego&lt;br /&gt;
	biny_na_prawo = np.arange(marker,np.max(x), szer_binu)&lt;br /&gt;
        # sklejamy oba zakresy binów&lt;br /&gt;
	biny = np.concatenate((biny_na_lewo, biny_na_prawo))&lt;br /&gt;
	(n,xx,patch) = py.hist(x,bins = biny )&lt;br /&gt;
	py.fill([np.min(xx), np.min(xx), marker, marker] , [0, np.max(n), np.max(n), 0] ,'r' ,alpha = 0.2)&lt;br /&gt;
 &lt;br /&gt;
A=np.array([[1.83, 0.878], [0.50, 0.647], [1.62, 0.598], [2.48, 2.05], [1.68, 1.06], [1.88, 1.29], [1.55, 1.06], [3.06, 3.14], [1.30, 1.29]])&lt;br /&gt;
 &lt;br /&gt;
r = A[:,1] - A[:,0] # od drugiej kolumny odejmuję pierwszą&lt;br /&gt;
mr = np.mean(r)  # średnia z tych różnic to wartość statystyki zaobserwowana dla oryginalnych danych&lt;br /&gt;
print( 'średnia różnica: %(mr).2f'%{'mr':mr} )&lt;br /&gt;
 &lt;br /&gt;
N = len(r)&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
N_perm = 2**N&lt;br /&gt;
r_perm = np.zeros(N_perm)&lt;br /&gt;
for i in range(2**N):&lt;br /&gt;
	B = np.array(A)   # B zawiera kopię tablicy A&lt;br /&gt;
	zamiana = dec2bin(i,N) # w których wierszach dokonać zamiany?&lt;br /&gt;
	# print( i,': ', zamiana )&lt;br /&gt;
	# wiersze tablicy B wskazane przez True w wektorze indeksów ind zamieniamy wartości  'przed' z wartościami 'po'&lt;br /&gt;
	B[zamiana, 0] = A[zamiana, 1] &lt;br /&gt;
	B[zamiana, 1] = A[zamiana, 0]&lt;br /&gt;
	rr = B[:,1] - B[:,0] # Obliczam wartości zmiennych losowych dla tej zamiany&lt;br /&gt;
	r_perm[i] = np.mean(rr) # Obliczmy wartość statystyki dla tej zamiany&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
p_h0 = np.sum( r_perm &amp;lt;=  mr)/N_perm&lt;br /&gt;
s_perm = u'dla permutacyjnego testu jednostronnego: %(p_h0).3f'%{'p_h0': p_h0}&lt;br /&gt;
print( s_perm)&lt;br /&gt;
hist_z_markerem(r_perm,30,mr)&lt;br /&gt;
py.title(s_perm)&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Wersja parametryczna====&lt;br /&gt;
&lt;br /&gt;
Jeśli badane różnice ''przed'' i ''po'' podlegają rozkładowi normalnemu to do testowania czy średnia wartość różnicy jest równa 0 można zastosować test ''t'' dla prób zależnych &amp;lt;tt&amp;gt;st.ttest_rel()&amp;lt;/tt&amp;gt;. Aby się upewnić, że możemy zastosować ten test badamy normalność różnic przy pomocy &amp;lt;tt&amp;gt;normplot()&amp;lt;/tt&amp;gt; oraz testu Shapiro-Wilka &amp;lt;tt&amp;gt;st.shapiro()&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
 &lt;br /&gt;
def normplot(x):&lt;br /&gt;
	'''normplot: x dane do testowania'''&lt;br /&gt;
 &lt;br /&gt;
	x_ord = sorted(x)&lt;br /&gt;
	N = len(x)&lt;br /&gt;
	y = np.zeros(N)&lt;br /&gt;
	y[0]=st.norm.ppf(1- 0.5**(1.0/N) )&lt;br /&gt;
	y[N-1] = st.norm.ppf(0.5**(1.0/N) )&lt;br /&gt;
	for i in range(1,N-1):&lt;br /&gt;
		arg = (i-0.3175)/(N+0.365)&lt;br /&gt;
		y[i] = st.norm.ppf(arg)&lt;br /&gt;
	py.plot(y,x_ord,'.')&lt;br /&gt;
 &lt;br /&gt;
A=np.array([[1.83, 0.878], [0.50, 0.647], [1.62, 0.598], [2.48, 2.05], [1.68, 1.06], [1.88, 1.29], [1.55, 1.06], [3.06, 3.14], [1.30, 1.29]])&lt;br /&gt;
&lt;br /&gt;
r = A[:,1] - A[:,0] # od drugiej kolumny odejmuję pierwszą&lt;br /&gt;
&lt;br /&gt;
normplot(r)&lt;br /&gt;
py.title(&amp;quot;Wyniki testów na normalność różnic\n Shapiro-Wilka:  W=%.3f, p=%.3f&amp;quot;%st.shapiro(r)&lt;br /&gt;
        +&amp;quot;\nKołmogorowa-Smirnowa: D=%.3f, p=%.3f&amp;quot;%st.kstest(r, 'norm', args=(np.mean(r),np.std(r,ddof=1))))&lt;br /&gt;
t, p = st.ttest_rel(A[:,1],A[:,0])&lt;br /&gt;
p_t = p/2 # aby test był jednostronny&lt;br /&gt;
s_t = u'dla parametrycznego testu jednostronnego: %(p_h0).3f'%{'p_h0': p_t}&lt;br /&gt;
print(s_t)&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Wersja nieparametryczna====&lt;br /&gt;
&lt;br /&gt;
W ogólności, nie zakładając normalności różnic można by przeprowadzić test Wilcoxona. W aktualnej implementacji tego testu w scipy.stats jest on dla naszych danych niedokładny, gdyż mamy małą liczebność grupy, a implementacja stosuje przybliżenia asymptotyczne.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
A=np.array([[1.83, 0.878], [0.50, 0.647], [1.62, 0.598], [2.48, 2.05], [1.68, 1.06], [1.88, 1.29], [1.55, 1.06], [3.06, 3.14], [1.30, 1.29]])&lt;br /&gt;
z, p = st.wilcoxon(A[:,1],A[:,0] )&lt;br /&gt;
p_w = p/2 # aby test był jednostronny&lt;br /&gt;
s_w = u'dla nieparametrycznego testu jednostronnego: %(p_h0).3f'%{'p_h0': p_w}&lt;br /&gt;
print( s_w)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Podsumowanie====&lt;br /&gt;
 średnia różnica: -0.43&lt;br /&gt;
 dla repróbkowanego testu jednostronnego: 0.0013&lt;br /&gt;
 dla permutacyjnego testu jednostronnego: 0.014&lt;br /&gt;
 Wynik testu Shapiro-Wilka na normalność różnic &lt;br /&gt;
 	 statystyka W: 0.921 &lt;br /&gt;
 	 prawdopodobieństwo takiej wartości statystyki dla rozkładu normalnego: 0.404&lt;br /&gt;
 dla parametrycznego testu jednostronnego: 0.008&lt;br /&gt;
 dla nieparametrycznego testu jednostronnego: 0.019&lt;br /&gt;
&lt;br /&gt;
Wszystkie testy wskazują prawdopodobieństwo zaobserwowania odpowiadających im statystyk poniżej przyjętego poziomu istotności &amp;lt;math&amp;gt;\alpha = 0.05&amp;lt;/math&amp;gt;. Zatem hipotezę zerową należy odrzucić i przyjąć hipotezę alternatywną.&lt;br /&gt;
&lt;br /&gt;
==Zadania==&lt;br /&gt;
&lt;br /&gt;
===Zanieczyszczenie środowiska===&lt;br /&gt;
Agencja ochrony środowiska ustaliła limit na koncentrację zanieczyszczeń emitowanych przez fabryki. Załóżmy, że dopuszczalny poziom zanieczyszczeń wynosi 55 cząstek na milion (cz/m) w promieniu dwóch kilometrów od fabryki. Kontrola przeprowadza 100 pomiarów o różnej porze dnia i roku w promieniu dwóch km od pewnej fabryki. Średnia z próby wyniosła 60 cz/m a odchylenie standardowe &amp;lt;math&amp;gt;s = 20&amp;lt;/math&amp;gt; cz/m. Czy dane te są wystarczające by na poziomie istotności &amp;lt;math&amp;gt;\alpha = 0,01&amp;lt;/math&amp;gt; uznać, że fabryka łamie prawo?&lt;br /&gt;
&lt;br /&gt;
Fabryka łamie prawo jeśli emituje zanieczyszczenia na poziomie wyższym niż dopuszczalny więc należy przeprowadzić test jednostronny (w tym przypadku prawostronny). Czy moglibyśmy odrzucić &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; na tym samym poziomie stosując test dwustronny?&lt;br /&gt;
Jest ważne aby w zależności od problemu wybrać odpowiedni test: jedno- lub dwustronny.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import numpy as np&lt;br /&gt;
 &lt;br /&gt;
x_c = 55 #cząstek na milion (cz/m) w promieniu dwóch kilometrów od fabryki. &lt;br /&gt;
#Kontrola przeprowadza &lt;br /&gt;
N = 100 # pomiarów o różnej porze dnia i roku w promieniu dwóch km. od pewnej fabryki. &lt;br /&gt;
#średnia z próby wyniosła &lt;br /&gt;
x_s = 60 # cz/m &lt;br /&gt;
# a odchylenie standardowe &lt;br /&gt;
s = 20 # cz/m. &lt;br /&gt;
# Czy dane te są wystarczające by uznać, że fabryka łamie prawo ?&lt;br /&gt;
alpha = 0.01&lt;br /&gt;
 &lt;br /&gt;
# H0: mu &amp;lt;=x_c&lt;br /&gt;
# H1: mu &amp;gt; x_c&lt;br /&gt;
# wystarczy sprawdzić jakie jest p dla największego dopuszczalnego stężenia &lt;br /&gt;
# mu = x_c zaobserwowania wartości średniej większej bądź równej zaobserwowanej x_s. &lt;br /&gt;
# Odchylenie std. dane jest dla populacji i trzeba je przeliczyć na odchylenie std. średniej.&lt;br /&gt;
p = 1 - st.t.cdf(x_s, df=N-1, loc = x_c, scale = s/np.sqrt(N) )&lt;br /&gt;
print(&amp;quot;poziom p&amp;quot;,p)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
############################&lt;br /&gt;
#inne (tożsame) rozwiązania:&lt;br /&gt;
&lt;br /&gt;
##wykorzystaniem &amp;quot;Survival function&amp;quot; zamiast dystrybuanty&lt;br /&gt;
p = st.t.sf(x_s, df=N-1, loc = x_c, scale = s/np.sqrt(N) )&lt;br /&gt;
print(&amp;quot;poziom p&amp;quot;,p)&lt;br /&gt;
&lt;br /&gt;
##obliczając statystykę t&lt;br /&gt;
t=(x_s-x_c)/(s/N**0.5)&lt;br /&gt;
p = 1-st.t.cdf(t,df=N-1)&lt;br /&gt;
print(&amp;quot;poziom p&amp;quot;,p)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Odp. &amp;lt;math&amp;gt;p=0,007&amp;lt;\alpha&amp;lt;/math&amp;gt;, zatem możemy odrzucić hipotezę &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; (głoszącą, że fabryka nie łamie prawa) na poziomie &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;  = 0,01.&lt;br /&gt;
&lt;br /&gt;
===Wzrost mocy turbin===&lt;br /&gt;
Turbina hydroelektryczna generuje moc średnią 25,2 kW. Po unowocześnieniu maszyny chcemy przetestować czy średnia moc generowana zmieniła się (na + lub &amp;amp;minus;). Przeprowadzono 115 pomiarów, które dały średnią 26,1 kW i odch. std. 3,2 kW. Przeprowadzić test statystyczny na poziomie istotności 1%, zinterpretować wynik. Wnioskowanie przeprowadzić także w oparciu oprzedział ufności.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
#-*- coding:utf-8 -*-&lt;br /&gt;
import numpy as np&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
N=115&lt;br /&gt;
m=25.2	#hipoteza zerowa mówi, że tyle wynosi moc&lt;br /&gt;
sr=26.1	#w pomiarach uzyskaliśmy taką średnią moc&lt;br /&gt;
s=3.2	#przy takim odchyleniu standardowym&lt;br /&gt;
&lt;br /&gt;
alfa=0.01&lt;br /&gt;
&lt;br /&gt;
#obliczenie poziomu p&lt;br /&gt;
t=(m-sr)/(s/N**0.5)&lt;br /&gt;
p = st.t.cdf(t,df=N-1) * 2 #mnozymy przez 2, bo chcemy testu dwustronnego&lt;br /&gt;
print(&amp;quot;poziom p&amp;quot;,p)&lt;br /&gt;
&lt;br /&gt;
#alternatywnie - obliczenie przedziału ufności&lt;br /&gt;
lo,hi = st.t.ppf([alfa/2, 1-alfa/2],df=N-1,loc=sr,scale=s/N**0.5)&lt;br /&gt;
print(&amp;quot;przedzial ufnosci [%.3g,%.3g]&amp;quot;%(lo,hi))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Odp.: &amp;lt;math&amp;gt;p=0,\!003&amp;lt;\alpha=0,\!01&amp;lt;/math&amp;gt;, zatem odrzucamy H0.&lt;br /&gt;
&lt;br /&gt;
Odp. (alt.): &amp;lt;math&amp;gt;\mu = 25,\!2 \not\in[25,\!3; 26,\!9]&amp;lt;/math&amp;gt;, zatem odrzucamy H0.&lt;br /&gt;
&lt;br /&gt;
===Sonda===&lt;br /&gt;
Władze miasta chciałyby wiedzieć, czy przyznać koncesję operatorowi sieci kablowej. W tym celu zleciły nam przeprowadzenie sondy wśród mieszkańców. Zapytaliśmy o zdanie 50 przypadkowo wybranych osób. 30 osób powiedziało &amp;amp;bdquo;tak&amp;amp;rdquo; a 20 &amp;amp;bdquo;nie&amp;amp;rdquo;. Na ile pewnie otrzymane wyniki wskazują, że mieszkańcy chcą tej kablówki?&lt;br /&gt;
&lt;br /&gt;
Celem naszych badań jest uniknięcie błędu polegającego na tym, że powiemy iż większość mieszkańców chce kablówki podczas gdy tak na prawdę to nie chce. &lt;br /&gt;
&lt;br /&gt;
Wskazówka: Granicznym przypadkiem popełnienia tego błędu jest proporcja 1:1 zwolenników i przeciwników kablówki. Jeśli przeciwników kablówki byłoby jeszcze więcej to uzyskanie naszych wyników byłoby jeszcze mniej prawdopodobne.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import numpy.random as rnd&lt;br /&gt;
&lt;br /&gt;
N=50&lt;br /&gt;
odp_na_tak=30&lt;br /&gt;
odp_na_nie=20&lt;br /&gt;
&lt;br /&gt;
#przypadek graniczny, który daje najwyższe prawdopodobieństwo uzyskania fałszywego wyniku na 'tak',&lt;br /&gt;
#to mieszkańcy niezdecydowani, czyli proporcja 1:1&lt;br /&gt;
#(proporcja przechylona w kierunki 'nie', da nam niższe oszacowanie,&lt;br /&gt;
#a proporcja przechylona w kierunku 'tak' nie oznaczałaby fałszywego wyniku sondy)&lt;br /&gt;
#zatem hipoteza zerowa brzmi, że nasz wynik pochodzi z populacji niezdecydowanej:&lt;br /&gt;
P=0.5 #prawdopodobieństwo, że respondent udzieli odpowiedzi na 'tak'&lt;br /&gt;
# jest to najwyższe prawdopodobieństwo jeszcze fałszywego wyniku&lt;br /&gt;
&lt;br /&gt;
#rozwiązanie parametryczne wymaga użycia rozkładu dwumianowego:&lt;br /&gt;
p = 1 - st.binom.cdf(29,50,P) #od 1 odejmujemy sumaryczne prawdopodobieństwo wszystkich przypadków udzielenia mniej niż 30 odpowiedzi na tak (czyli do 29 włącznie)&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;poziom p (parametrycznie)&amp;quot;,p)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#rozwiązanie przez symulację:&lt;br /&gt;
Nrand=100000&lt;br /&gt;
R=0 #rezultat, czyli liczba przypadków, w których przynajmniej 30 osób odpowiedziało tak&lt;br /&gt;
for i in range(Nrand):&lt;br /&gt;
	odpowiedzi = (rnd.random(N)&amp;lt;P) #losujemy odpowiedzi od N osób&lt;br /&gt;
	if odpowiedzi.sum() &amp;gt;=odp_na_tak: #jeśli zdarzyło się co najmniej 30 odpowiedzi na tak, to dodajemy jeden do liczby takich przypadków&lt;br /&gt;
		R+=1&lt;br /&gt;
	&lt;br /&gt;
print(&amp;quot;poziom p (z symulacji)&amp;quot;,R/Nrand) #na koniec dzielimy przez liczbę wszystkich sond w symulacji&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Wybory prezydenckie===&lt;br /&gt;
W ankiecie uzyskaliśmy 840 głosów popierających kandydaturę A i 660 kandydaturę B. Jaka jest szansa, że tak naprawdę kandydat B ma  poparcie 50% lub większe? Jakie jest prawdopodobieństwo pojawienia sie zaobserwowanej próbki lub próbki wskazującej na jeszcze większe poparcie dla kandydata A, jeśli w rzeczywistości poparcie kandydata A byłoby  50% lub mniej.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import numpy.random as rnd&lt;br /&gt;
&lt;br /&gt;
# rozwiązanie parametryczne&lt;br /&gt;
A = 840&lt;br /&gt;
B = 660&lt;br /&gt;
N = A+B&lt;br /&gt;
&lt;br /&gt;
#przypadek graniczny, który daje najwyższe prawdopodobieństwo uzyskania fałszywego wyniku na 'tak',&lt;br /&gt;
#to mieszkańcy niezdecydowani, czyli propocja 1:1&lt;br /&gt;
#propocja przechylona w kierunki 'nie', da nam niższe oszacowanie&lt;br /&gt;
#a propocja przechylona w kierunku 'tak' nie oznaczałaby fałszywego wyniku sondy&lt;br /&gt;
#zatem hipoteza zerowa brzmi, że nasz wynik pochodzi z populacji niezdecydowanej:&lt;br /&gt;
p_sukces = 0.5&lt;br /&gt;
&lt;br /&gt;
#rozwiązanie parametryczne&lt;br /&gt;
p = 1 - st.binom.cdf(A-1,N,p_sukces)&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;poziom p (parametrycznie)&amp;quot;,p)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#rozwiązanie przez symulację:&lt;br /&gt;
&lt;br /&gt;
#wiemy już, że musimy oszacować bardzo niskie prawdopodobieństwo, zatem symulacja musi być długa&lt;br /&gt;
#(gdybyśmy nie wiedzieli, to łatwo byśmy zauważyli, że krótka symulacja nie daje w ogóle zdarzeń sprzyjających dając wynik p=0)&lt;br /&gt;
#niestety trzeba pokusić się o optymalizację (mimo to kod będzie się wykonywał kilkadziesiąt sekund do kilku minut):&lt;br /&gt;
#chemy mieć przynajmniej 10^7 sond, ale każda sonda to 1500 odpowiedzi, zatem łącznie musimy wylosować 1.5*10^10 liczb&lt;br /&gt;
#losowanie w pętli 10^7 razy kolejnych sond po 1500 odpowiedzi zajmie bardzo bardzo dużo czasu&lt;br /&gt;
#tablica 1.5*10^10 odpowiedzi wygenerowana jednym poleceniem nie zmieści się w pamięci&lt;br /&gt;
#musimy skorzystać z rozwiązania pośredniego&lt;br /&gt;
#będziemy losować 100 razy po 1.5*10^8 odpowiedzi i dodamy wyniki&lt;br /&gt;
&lt;br /&gt;
Nrand_1=100    # 10^2&lt;br /&gt;
Nrand_2=100000 # 10^5&lt;br /&gt;
N = A+B        # 1.5*10^3&lt;br /&gt;
&lt;br /&gt;
Nrand_total = Nrand_1*Nrand_2&lt;br /&gt;
&lt;br /&gt;
R=0 #liczba sond, w których kandydat A uzyskał poparcie 840 lub większe&lt;br /&gt;
#po każdym przebiegu pętli będziemy dodawać liczbę takich przypadków (jeśli wystąpiły w danej iteracji)&lt;br /&gt;
&lt;br /&gt;
for i in range(Nrand_1):&lt;br /&gt;
	#w każdej iteracji losujemy odpowiedzi od N osób w Nrand_2 sondach&lt;br /&gt;
	#iteracji będzie w sumie Nrand_1, co da nam łącznie N osób w Nrand_total sondach&lt;br /&gt;
	#jako, że zakładamy równe prawdopodobieństwo, to może możemy wylosować tablicę zawierającą tylko 0 i 1&lt;br /&gt;
	#gdzie 1 oznacza sukces (głos na kandydata A), a 0 porażkę&lt;br /&gt;
	#korzystając z funksji randint, która zwraca (pseudo)losowe liczby całkowite z zakresu [a,b)&lt;br /&gt;
	a,b = 0,2 &lt;br /&gt;
	odpowiedzi = rnd.randint(a,b,size=(N,Nrand_2)) &lt;br /&gt;
	S = np.sum(odpowiedzi,axis=0)  #wyniki kolejnych sond (sumujemy sukcesy w wierszach)&lt;br /&gt;
&lt;br /&gt;
	R+=np.sum(S&amp;gt;=A) #dodajemy liczbę sond, w których kandydat A uzyskał poparcie 840 lub większe (w danej iteracji pętli)&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;poziom p (z symulacji)&amp;quot;,R/Nrand_total) #na koniec dzielimy przez liczbę wszystkich sond w symulacji&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Czy stosunek do marihuany się zmienił?===&lt;br /&gt;
Rozważmy dwie ankiety przeprowadzone w USA, pytano 1500 respondentów o stosunek do legalizacji marihuany. Pierwszą ankietę przeprowadzono w 1980, wówczas za legalizacją opowiadało się 52% a drugą w 1985 i za legalizacją było 46%. Czy wyniki tych dwóch ankiet są istotnie różne?&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
# rozwiązanie parametryczne&lt;br /&gt;
za1 = int(0.52*1500)&lt;br /&gt;
za2 = int(0.46*1500)&lt;br /&gt;
N = 1500&lt;br /&gt;
&lt;br /&gt;
# H0: stosunek się nie zmienił zatem p_za było w obu anlietach takie samo:&lt;br /&gt;
p_za = (0.52+0.46)/2&lt;br /&gt;
&lt;br /&gt;
# Jakie jest prawdopodobieństwo zaobserwowoania wyników ankiet o takiej bądź większej &lt;br /&gt;
# różnicy głosów za, jeśli obie są zgodne z H0 ?&lt;br /&gt;
D = za1 - za2&lt;br /&gt;
&lt;br /&gt;
#musimy zsumować wszystkie możliwości, w których wystąpiła taka różnica lub większa&lt;br /&gt;
#zrobimy to w pętli&lt;br /&gt;
p_binom = 0.0&lt;br /&gt;
for k in range(N-D+1):&lt;br /&gt;
	p1 = st.binom.pmf(k,N,p_za) # prawdopodobieństwo uzyskania dokładnie k głosów za&lt;br /&gt;
	&lt;br /&gt;
	# sumujemy prawdopodobieństwa uzyskania liczby głosów różnej przynajmniej o D&lt;br /&gt;
	przypadki_o_roznicy_przynajmniej_D = np.arange(k+D,N+1)&lt;br /&gt;
	p2 = np.sum(st.binom.pmf(przypadki_o_roznicy_przynajmniej_D,N,p_za))&lt;br /&gt;
	#co jest równoważne:&lt;br /&gt;
	#p2 = 1-st.binom.cdf(k+D-1,N,p_za)&lt;br /&gt;
	&lt;br /&gt;
	#sumujemy dla kolejnych k&lt;br /&gt;
	p_binom += p1*p2 # mnożymy prawdopodobieństwa ponieważ są wyniki obu sond są niezależne&lt;br /&gt;
	&lt;br /&gt;
p=2*p_binom #mnożymy przez 2, ponieważ robimy test dwustronny (różnica mogła wystąpić również w drugą stronę)&lt;br /&gt;
print(&amp;quot;p =&amp;quot;,p)&lt;br /&gt;
&lt;br /&gt;
# rozwiązanie symulacyjne (tym razem skorzystamy z randsample)&lt;br /&gt;
def randsample(x, N):&lt;br /&gt;
	'''zwraca wektor z losowo wybranymi elementami wektora x. Losowanie odbywa się z powtórzeniami''' &lt;br /&gt;
	n=len(x)&lt;br /&gt;
	ind = np.random.randint(n, size = N)&lt;br /&gt;
	y = x[ind]&lt;br /&gt;
	return y&lt;br /&gt;
&lt;br /&gt;
N_rep = 100000&lt;br /&gt;
# świat zgodny z H0:&lt;br /&gt;
H0 = np.concatenate((np.zeros(N*(1-p_za)), np.ones(N*p_za)))&lt;br /&gt;
&lt;br /&gt;
a = np.zeros(N_rep)&lt;br /&gt;
for i in range(N_rep):&lt;br /&gt;
	w1 = np.sum(randsample(H0,N))&lt;br /&gt;
	w2 = np.sum(randsample(H0,N))&lt;br /&gt;
	a[i] = np.abs(w1-w2)&lt;br /&gt;
p = np.sum(a&amp;gt;=D)/N_rep&lt;br /&gt;
print(p)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zawały serca i cholesterol===&lt;br /&gt;
Badano grupę 605 osób. 135 osób z tej grupy miało wysoki poziom cholesterolu a 470 niski. W grupie z wysokim poziomem cholesterolu odnotowano 10 przypadków zawału serca a w grupie z niskim poziomem 21, w czasie 16 lat obserwacji. Nasze pytanie brzmi: Czy możemy uznać, że wysoki poziom cholesterolu zwiększa ryzyko zawału serca?&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
# rozwiązanie parametryczne&lt;br /&gt;
wysoki = 135&lt;br /&gt;
niski = 470&lt;br /&gt;
N = 605&lt;br /&gt;
wysoki_zawaly = 10&lt;br /&gt;
niski_zawaly = 21&lt;br /&gt;
N_zaw = wysoki_zawaly + niski_zawaly &lt;br /&gt;
&lt;br /&gt;
# H0: proporcja zawałowców w obu grupach taka sama:&lt;br /&gt;
p_zawalu = N_zaw/N&lt;br /&gt;
# H1: proporcja jest różna, test jednostronny (wysoki cholesterol ZWIĘKSZA ryzyko)&lt;br /&gt;
&lt;br /&gt;
# Jakie jest prawdopodobieństwo zaobserwowania wyników badania o takiej bądź większej &lt;br /&gt;
# różnicy proporcji zawałów, jeśli obie są zgodne z H0 ?&lt;br /&gt;
roznica = wysoki_zawaly/wysoki - niski_zawaly/niski&lt;br /&gt;
&lt;br /&gt;
p_binom = 0.0&lt;br /&gt;
for k_wys in range(wysoki+1):&lt;br /&gt;
	p_wys = st.binom.pmf(k_wys,wysoki,p_zawalu) # prawdopodobieństwo uzyskania k_wys zawałów grupie o liczebności wysoki&lt;br /&gt;
	for k_nis in range(niski+1): &lt;br /&gt;
		if k_wys/wysoki - k_nis/niski&amp;gt;=roznica: # czy liczebności k_wys i k_nis dają większą bądź równą różnice proporcji?&lt;br /&gt;
			p_nis = st.binom.pmf(k_nis,niski,p_zawalu) # prawdopodobieństwo uzyskania k_nis zawałów w grupie o niskim cholesterolu&lt;br /&gt;
			p_binom += p_wys*p_nis # zdarzenia są niezależne&lt;br /&gt;
&lt;br /&gt;
print(p_binom)&lt;br /&gt;
&lt;br /&gt;
# rozwiązanie symulacyjne&lt;br /&gt;
def randsample(x, N):&lt;br /&gt;
	'''zwraca wektor z losowo wybranymi elementami wektora x. Losowanie odbywa się z powtórzeniami''' &lt;br /&gt;
	n=len(x)&lt;br /&gt;
	ind = np.random.randint(n, size = N)&lt;br /&gt;
	y = x[ind]&lt;br /&gt;
	return y&lt;br /&gt;
&lt;br /&gt;
N_rep = 100000&lt;br /&gt;
# świat zgodny z H0:&lt;br /&gt;
H0 = np.concatenate((np.zeros(N-N_zaw), np.ones(N_zaw)))&lt;br /&gt;
&lt;br /&gt;
wyn = np.zeros(N_rep)&lt;br /&gt;
for i in range(N_rep):&lt;br /&gt;
	wysoki_zawaly_r = np.sum(randsample(H0,wysoki))&lt;br /&gt;
	niski_zawaly_r = np.sum(randsample(H0,niski))&lt;br /&gt;
	wyn[i] = wysoki_zawaly_r/wysoki - niski_zawaly_r/niski&lt;br /&gt;
p = np.sum(wyn&amp;gt;=roznica)/N_rep&lt;br /&gt;
print(p)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Czy gęstości planet się różnią?===&lt;br /&gt;
Rozważmy pięć planet znanych w antycznym świecie. Chcemy zbadać, czy planety wewnętrzne Merkury (0,68) i Wenus (0,94) mają istotnie większe gęstości niż planety zewnętrzne Mars (0,71) Jowisz (0,24) i Saturn (0,12)?&lt;br /&gt;
&lt;br /&gt;
Wskazówki: &lt;br /&gt;
* Unikalność zestawu planet wskazuje na zastosowanie testu permutacyjnego.&lt;br /&gt;
* Moduł implementujący funkcje kombinatoryczne w pythonie to &amp;lt;tt&amp;gt;itertools &amp;lt;/tt&amp;gt;. Zawiera on funkcję &amp;lt;tt&amp;gt;permutations&amp;lt;/tt&amp;gt;. Wywołanie &amp;lt;tt&amp;gt;itertools.permutations(sekwencja[, r])&amp;lt;/tt&amp;gt; zwraca obiekt permutacji. Obiekt ten zwraca kolejne permutacje o długości r elementów w sekwencji (np. w wektorze). Przykład:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
import itertools&lt;br /&gt;
for kolejny in itertools.permutations(range(3), 2):&lt;br /&gt;
    print(kolejny)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import itertools as itt&lt;br /&gt;
PLANETY = np.array([0.68,0.94,0.71,0.24,0.12])&lt;br /&gt;
N=len(PLANETY)&lt;br /&gt;
&lt;br /&gt;
r=[] #używamy listy, bo nie chcemy obliczać ile będzie przypadków (aczkolwiek można to zrobić)&lt;br /&gt;
&lt;br /&gt;
for planety in itt.permutations(PLANETY):&lt;br /&gt;
	r.append(np.mean(planety[:2])-np.mean(planety[2:]))&lt;br /&gt;
&lt;br /&gt;
R=np.mean(PLANETY[:2])-np.mean(PLANETY[2:]) #prawdziwa różnica&lt;br /&gt;
&lt;br /&gt;
r=np.array(r) #porównanie z liczbą działa tylko dla tablic numpy, a nie dla list&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;p =&amp;quot;,np.sum(r&amp;gt;=R)/len(r))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Elektrownia jądrowa===&lt;br /&gt;
Przed wybudowaniem elektrowni jądrowej przeprowadzono pomiary intensywności promieniowania jonizującego w pobliżu planowanego budynku reaktora. Powtórzono te pomiary po uruchomieniu reaktora. Czy zebrane dane pozwalają stwierdzić, że poziom promieniowania istotnie wzrósł? Dane pomiarowe wczytaj z [[Media:pomiary_skazen.txt| pliku]].&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
&lt;br /&gt;
alfa = 0.01 # poziom istotności&lt;br /&gt;
&lt;br /&gt;
PRZED, PO = np.loadtxt('Pomiary_skazen.txt') #wczytanie danych (dwa zbiory przed uruchomieniem i po)&lt;br /&gt;
&lt;br /&gt;
t, p = st.ttest_ind(PRZED, PO) # wykorzystanie gotowej funkcji wykonującej DWUSTRONNY test t na różnicę średnich&lt;br /&gt;
                            # dla danych NIESPAROWANYCH (niezależnych)&lt;br /&gt;
                            # ttest_ind  - ind od independent &lt;br /&gt;
                            # ttest_rel  - rel od related &lt;br /&gt;
&lt;br /&gt;
p/=2 # dzielimy przez dwa ponieważ chcemy zrobić test jednostronny&lt;br /&gt;
print(&amp;quot;Poziom p&amp;quot;,p)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Odp. &amp;lt;math&amp;gt;p=0,\!39&amp;gt;\alpha=0,\!01&amp;lt;/math&amp;gt;, zatem nie mamy podstaw do odrzucenia hipotezy &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt;, że poziom promieniowania istotnie wzrósł.&lt;/div&gt;</summary>
		<author><name>Maciek</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=WnioskowanieStatystyczne/_Testowanie_hipotez&amp;diff=11333</id>
		<title>WnioskowanieStatystyczne/ Testowanie hipotez</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=WnioskowanieStatystyczne/_Testowanie_hipotez&amp;diff=11333"/>
		<updated>2025-05-11T22:21:36Z</updated>

		<summary type="html">&lt;p&gt;Maciek: /* Sonda */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Testowanie hipotez dotyczących jednej lub dwóch populacji ==&lt;br /&gt;
===Wstęp===&lt;br /&gt;
Schemat weryfikowania hipotez omówiony jest w wykładzie [[WnioskowanieStatystyczne/Weryfikacja hipotez |Weryfikacja hipotez statystycznych]]. Tu przypomnimy tylko krótko podstawowe pojęcia i decyzje, które trzeba pojąć w procedurze weryfikacji.&lt;br /&gt;
====Hipoteza zerowa i alternatywna====&lt;br /&gt;
Podstawą sukcesu w statystycznym testowaniu hipotez jest prawidłowe ich sformułowanie. &lt;br /&gt;
Hipotezy muszą być rozłączne. Najczęściej jako hipotezę zerową przyjmujemy zdanie, które chcemy odrzucić, &lt;br /&gt;
gdyż błąd takiej decyzji można kontrolować. Logika testowania jest następująca: tworzymy &lt;br /&gt;
funkcję od zmiennych losowych, dla której przy spełnieniu przez owe zmienne hipotezy zerowej potrafimy &lt;br /&gt;
podać prawdopodobieństwa z jakimi przyjmuje ona różne wartości. Ta funkcja nazywana jest ''statystyką''. &lt;br /&gt;
Następnie obliczamy wartość tej funkcji dla badanej próby. Jeśli prawdopodobieństwo osiągnięcia otrzymanej &lt;br /&gt;
bądź jeszcze bardziej ekstremalnej wartości statystyki jest niskie to wątpimy, że nasze dane są zgodne&lt;br /&gt;
z hipotezą zerową i jesteśmy skłonni przyjąć hipotezę alternatywną.&lt;br /&gt;
&lt;br /&gt;
====Wybór statystyki====&lt;br /&gt;
Wybierając statystykę można posłużyć się następującym schematem:&lt;br /&gt;
* Jeżeli znamy rozkład prawdopodobieństwa, z którego pochodzą nasze dane, lub umiemy je przetransformować do znanego rozkładu, to wybierzemy klasyczny test parametryczny np. test ''t'' ([http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.mstats.ttest_rel.html ttest_rel], [http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.ttest_ind.html ttest_ind]), &amp;lt;math&amp;gt;\chi^2&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; itp.&lt;br /&gt;
* Jeżeli nie znamy rozkładu prawdopodobieństwa naszych danych albo nie chcemy nic o nim zakładać to mamy dwie możliwości: &lt;br /&gt;
** korzystamy z klasycznego [[WnioskowanieStatystyczne/Test_Wilcoxona|testu nieparametrycznego]] np.:&lt;br /&gt;
&amp;lt;!--http://mail.scipy.org/pipermail/scipy-user/2009-July/021679.html--&amp;gt;&lt;br /&gt;
**; test Wilcoxona dla obserwacji sparowanych: testuje hipotezę zerową, że dwie próby &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, które ze sobą porównujemy pochodzą z tej samej populacji ciągłej (przekłada się to na równość dystrybuant). Próby &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; '''są''' sparowane. W pythonie mamy ten test zaimplementowany jako: [http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.wilcoxon.html &amp;lt;tt&amp;gt;scipy.stats.wilcoxon(x, y=None)&amp;lt;/tt&amp;gt;]. Ta implementacja stosuje przybliżenie dużych prób i zalecana jest dla &amp;lt;math&amp;gt;n&amp;gt;20&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;!--    Calculate the Wilcoxon signed-rank test&lt;br /&gt;
&lt;br /&gt;
    The Wilcoxon signed-rank test tests the null hypothesis that two related samples come from the same distribution. It is a a non-parametric version of the paired T-test.&lt;br /&gt;
    Parameters:	&lt;br /&gt;
    x : array_like&lt;br /&gt;
        The first set of measurements&lt;br /&gt;
    y : array_like, optional, default None&lt;br /&gt;
        The second set of measurements. If y is not given, then the x array is considered to be the differences between the two sets of measurements.&lt;br /&gt;
    Returns:	&lt;br /&gt;
    z-statistic : float&lt;br /&gt;
        The test statistic under the large-sample approximation that the signed-rank statistic is normally distributed.&lt;br /&gt;
    p-value : float&lt;br /&gt;
        The two-sided p-value for the test&lt;br /&gt;
    Notes&lt;br /&gt;
    Because the normal approximation is used for the calculations, the samples used should be large. A typical rule is to require that n &amp;gt; 20.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
scipy.stats.ranksums(x, y)&lt;br /&gt;
&lt;br /&gt;
    Compute the Wilcoxon rank-sum statistic for two samples.&lt;br /&gt;
&lt;br /&gt;
    The Wilcoxon rank-sum test tests the null hypothesis that two sets of measurements are drawn from the same distribution. The alternative hypothesis is that values in one sample are more likely to be larger than the values in the other sample.&lt;br /&gt;
&lt;br /&gt;
    This test should be used to compare two samples from continuous distributions. It does not handle ties between measurements in x and y. For tie-handling and an optional continuity correction see `stats.mannwhitneyu`_&lt;br /&gt;
    Parameters:	&lt;br /&gt;
&lt;br /&gt;
    x,y : array_like&lt;br /&gt;
&lt;br /&gt;
        The data from the two samples&lt;br /&gt;
&lt;br /&gt;
    Returns:	&lt;br /&gt;
&lt;br /&gt;
    z-statistic : float&lt;br /&gt;
&lt;br /&gt;
        The test statistic under the large-sample approximation that the rank sum statistic is normally distributed&lt;br /&gt;
&lt;br /&gt;
    p-value : float&lt;br /&gt;
&lt;br /&gt;
        The two-sided p-value of the test&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
**; test Manna-Whitney'a : testuje hipotezę zerową, że dwie próby &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, które ze sobą porównujemy pochodzą z tej samej populacji ciągłej. Próby &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; i&amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; '''nie są''' sparowane. Implementacja w pyhtonie: [http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.mannwhitneyu.html &amp;lt;tt&amp;gt;scipy.stats.mannwhitneyu(x, y, use_continuity=True)&amp;lt;/tt&amp;gt;] stosuje przybliżenia i zalecana jest dla &amp;lt;math&amp;gt;n&amp;gt;20&amp;lt;/math&amp;gt; w każdej z prób. Funkcja zwraca wartość ''p'' dla hipotezy jednostronnej. Jeśli testujemy hipotezę dwustronną trzeba otrzymane ''p'' pomnożyć przez 2.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
scipy.stats.mannwhitneyu(x, y, use_continuity=True)¶&lt;br /&gt;
&lt;br /&gt;
    Computes the Mann-Whitney rank test on samples x and y.&lt;br /&gt;
    Parameters:	&lt;br /&gt;
    x, y : array_like&lt;br /&gt;
        Array of samples, should be one-dimensional.&lt;br /&gt;
    use_continuity : bool, optional&lt;br /&gt;
        Whether a continuity correction (1/2.) should be taken into account. Default is True.&lt;br /&gt;
    Returns:	&lt;br /&gt;
    u : float&lt;br /&gt;
        The Mann-Whitney statistics.&lt;br /&gt;
    prob : float&lt;br /&gt;
        One-sided p-value assuming a asymptotic normal distribution.&lt;br /&gt;
    Notes&lt;br /&gt;
    Use only when the number of observation in each sample is &amp;gt; 20 and you have 2 independent samples of ranks. Mann-Whitney U is significant if the u-obtained is LESS THAN or equal to the critical value of U.&lt;br /&gt;
&lt;br /&gt;
    This test corrects for ties and by default uses a continuity correction. The reported p-value is for a one-sided hypothesis, to get the two-sided p-value multiply the returned p-value by 2.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
** wytwarzamy rozkład statystyki na podstawie naszych danych przez repróbkowanie ([[WnioskowanieStatystyczne/Bootstrap|bootstrap]] lub [[WnioskowanieStatystyczne/Testy_permutacyjne| permutacje]]). W podejściu repróbkowania tworzymy statystyczny model badanego procesu '''zgodny z hipotezą zerową''' i następnie badamy w drodze symulacji prawdopodobieństwa generowania przez ten model interesujących nas sytuacji. Największą uwagę musimy tu poświęcić na prawidłowe sformułowanie modelu, a następnie precyzyjne określenie prawdopodobieństwo jakiego zdarzenia nas naprawdę interesuje.&lt;br /&gt;
&lt;br /&gt;
===Poziom istotności &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; i wartość &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;===&lt;br /&gt;
; Błąd pierwszego rodzaju : błąd polegający na odrzuceniu hipotezy zerowej, która w rzeczywistości jest prawdziwa. Oszacowanie prawdopodobieństwa popełnienia błędu pierwszego rodzaju oznaczamy symbolem &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; i nazywamy poziomem istotności testu.&lt;br /&gt;
; Błąd drugiego rodzaju : polegaja na nieodrzuceniu hipotezy zerowej, która jest w rzeczywistości fałszywa. Oszacowanie prawdopodobieństwo popełnienia błędu drugiego rodzaju oznaczamy symbolem &amp;lt;math&amp;gt; \beta&amp;lt;/math&amp;gt;, a jego dopełnienie do jedności nazywane jest '''mocą testu'''.&lt;br /&gt;
&lt;br /&gt;
Wartość &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; jest to wartość prawdopodobieństwa, że wobec posiadanych danych  hipoteza zerowa jest prawdziwa. Jest ono obliczane jako prawdopodobieństwo zaobserwowania wartości ''statystyki'' takiej jak dla badanej próby, lub bardziej ekstremalnej, przy prawdziwej hipotezie zerowej.&lt;br /&gt;
Najczęściej porównujemy ''p'' z wcześniej ustalonym poziomem istotności &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;. Poziom istotności &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; to wartość krytyczna prawdopodobieństwa, taka że jeżeli &amp;lt;math&amp;gt; p&amp;lt; \alpha&amp;lt;/math&amp;gt; to odrzucamy hipotezę zerową.&lt;br /&gt;
&lt;br /&gt;
==Formułowanie hipotez==&lt;br /&gt;
===Przykład: mutacje muszek owocowych===&lt;br /&gt;
Załóżmy, że badamy muszki owocowe. W standardowej populacji proporcja samic do samców jest 1:1. Opracowaliśmy metodę powodującą taką mutację muszek owocowych, że potomstwo ich nie będzie miało jednakowej szansy na bycie samcem lub samiczką. W pierwszych 20 zbadanych przypadkach uzyskujemy 14 samców i 6 samiczek.&lt;br /&gt;
; Pytanie naukowe: Czy wyniki eksperymentu potwierdzają, że nasza metoda zaburza proporcję płci?&lt;br /&gt;
Najpierw musimy przetłumaczyć pytanie naukowe na pytanie statystyczne. &lt;br /&gt;
; Pytanie statystyczne: Jakie jest prawdopodobieństwo uzyskania zaobserwowanej proporcji (14:6), lub bardziej ekstremalnej w próbie 20 osobników,  jeśli rzeczywista proporcja płci jest 1:1?&lt;br /&gt;
&lt;br /&gt;
Z tego pytania wynikają dwie możliwe hipotezy:&lt;br /&gt;
* Hipoteza zerowa: Nowa metoda nie zaburza proporcji płci 1:1. Zaobserwowana próbka pochodzi z populacji, w której proporcja płci ''jest'' 1:1&lt;br /&gt;
* Hipoteza alternatywna: Zaobserwowana próbka pochodzi z populacji, w której proporcja płci ''nie jest'' 1:1.&lt;br /&gt;
; Prawdopodobieństwo, które musimy oszacować: Jakie jest prawdopodobieństwo uzyskania 14 lub więcej jedynek w serii 20 prób, jeśli prawdopodobieństwo jedynki jest &amp;lt;math&amp;gt;1/2&amp;lt;/math&amp;gt;?  &lt;br /&gt;
# Oznaczmy 1: samiec 0: samiczka.&lt;br /&gt;
# Zróbmy wektor 20-elementowy zawierający 10 zer i 10 jedynek.&lt;br /&gt;
# Wylosujmy ze zwracaniem nowy wektor 20-elementowy. (Jest to nasz model uzyskiwania 20 elementowej próbki z populacji o proporcji 1:1.) Zapamiętajmy liczbę jedynek.&lt;br /&gt;
# Powtórzmy poprzedni krok 1000 razy&lt;br /&gt;
# Zróbmy histogram ilości jedynek.&lt;br /&gt;
# Policzmy ile razy zdarzyło sie 14 lub więcej jedynek (to odpowiada 14 lub więcej samców) i dodajmy do tego ilość przypadków gdy mieliśmy 6 lub mniej jedynek (to odpowiada 14 lub więcej samiczek). Wynik podzielmy przez ilość losowań (1000).&lt;br /&gt;
&lt;br /&gt;
Powyższa procedura opisuje test dwustronny. Testu dwustronnego musimy użyć jeśli nie mamy ''istotnych'' powodów, żeby wierzyć, że nowa metoda działa ''jedynie na zwiększenie'' szansy pojawienia się samca.&lt;br /&gt;
&lt;br /&gt;
Jak powyższy problem rozwiązać w sposób parametryczny? &lt;br /&gt;
Próby podlegają rozkładowi dwumianowemu, można więc obliczyć szukane prawdopodobieństwo korzystając z jego dystrybuanty.&lt;br /&gt;
&lt;br /&gt;
==Testowanie hipotez na temat średniej==&lt;br /&gt;
Firma rozwożąca przesyłki po mieście deklaruje średni czas dostarczenia 28 minut. Przeprowadźmy test tej hipotezy na poziomie istotności 5%.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_0: \mu = 28&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;H_1: \mu \ne 28&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wybieramy losową próbę 100 przesyłek, mierzymy czas dostarczenia, liczymy średnią z próby &amp;lt;math&amp;gt;\bar x = 31,5&amp;lt;/math&amp;gt; minut i odchylenie standardowe próby &amp;lt;math&amp;gt;s = 5&amp;lt;/math&amp;gt; minut. &lt;br /&gt;
&lt;br /&gt;
Test ten można przeprowadzić z użyciem przedziałów ufności:&lt;br /&gt;
* Konstruujemy przedziały ufności 95% dla średniej &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.Formalnie, ponieważ wyliczyliśmy odchylenie standardowe z próby powinniśmy zastosować wartości krytyczne z rozkładu t. Rozmiar próby wynosi 100 więc rozkład t ma 99 stopni swobody. Wartość krytyczna w tym rozkladzie to &amp;lt;math&amp;gt;t_{97.5} =  1.984 &amp;lt;/math&amp;gt;. Mamy zatem:&lt;br /&gt;
&amp;lt;math&amp;gt;\bar x \pm 1,984 \frac{s}{\sqrt{n}} = 31,5 \pm 1,984*\frac{5}{\sqrt{100}} = 31,5 \pm 0,992 = [30,51 \quad 32,49]&amp;lt;/math&amp;gt;&lt;br /&gt;
* Wnioskowanie: Możemy więc być na 95% pewni, że nieznana średnia leży pomiędzy 30,51 a 32,49 a więc na 95% nie leży poza tym przedziałem. &lt;br /&gt;
Skoro &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; podaje &amp;lt;math&amp;gt;\mu = 28&amp;lt;/math&amp;gt; (poza przedziałem), możemy odrzucić tę hipotezę.  Jeśli &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; jest prawdziwe, istnieje prawdopodobieństwo 0,05, że skonstruowany przedział nie będzie zawierał &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. Istnieje zatem prawdopodobieństwo 0,05 popełnienia błądu I-go rodzaju. Mówimy, że przeprowadziliśmy test na poziomie istotności 0,05.&lt;br /&gt;
&lt;br /&gt;
Test można też przeprowadzić następująco:&lt;br /&gt;
* Jako statystykę wybieramy &amp;lt;math&amp;gt;t = \frac{\bar x - \mu}{s/\sqrt{n}} &amp;lt;/math&amp;gt;&lt;br /&gt;
* Obliczmy jej wartość dla danych z próby: &amp;lt;math&amp;gt;t = \frac{\bar x - \mu}{s/\sqrt{n}}  = (31,5 -28)/(5/\sqrt{100}) = 7 &amp;lt;/math&amp;gt;&lt;br /&gt;
* Porównujemy otrzymaną wartość z wartością krytyczna dla przyjętego poziomu istotności &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;. Konstuowany przez nas test ma być testem dwustronnym więc musimy wziąć do porównania wartość krytyczna dla &amp;lt;math&amp;gt;\alpha/2&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt; t_{\alpha/2} = t_{0,025}= -1,984&amp;lt;/math&amp;gt;&lt;br /&gt;
* Wnioskowanie: Dla naszej próby otrzymaliśmy wartość statystyki równą 6.96. Dla przyjętego poziomu istotności wartość statystyki wynosi 1,984. Prawdopodobieństwo zaobserwowania statystyki o wartości 7 lub bardziej ekstremalnej (tu: większej) jest mniejsze niż założony poziom istotności więc odrzucamy &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; na poziomie &amp;lt;math&amp;gt;\alpha = 0,05&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Testowanie hipotez na temat wariancji==&lt;br /&gt;
&lt;br /&gt;
Do testowania hipotez na temat wariancji używamy statystyki chi-kwadrat o &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; stopniach swobody:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\chi^2 = \frac{(n-1)s^2}{\sigma_0^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\sigma_0^2&amp;lt;/math&amp;gt; jest wartością wariancji podaną w &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
===Przykład===&lt;br /&gt;
Do produkcji baterii używane są metalowe płytki o średniej średnicy 5 mm. Jeśli wariancja średnicy płytki jest nie większa niż 1 mm&amp;lt;math&amp;gt;^2&amp;lt;/math&amp;gt;, produkcja jest kontynuowana. Jeśli wariancja przekracza 1 mm&amp;lt;math&amp;gt;^2&amp;lt;/math&amp;gt; proces produkcji trzeba przerwać. Kontroler przeprowadza test na poziomie istotności &amp;lt;math&amp;gt;\alpha = 5&amp;lt;/math&amp;gt;%: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_0:&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\sigma^2 \le 1&amp;lt;/math&amp;gt; i &lt;br /&gt;
&amp;lt;math&amp;gt;H_1:&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\sigma^2 &amp;gt; 1&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Wybiera losową próbę 31 płytek i znajduje wariancję próby &amp;lt;math&amp;gt;s^2 = 1,62&amp;lt;/math&amp;gt;. Czy daje to podstawy do przerwania produkcji?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\chi^2 = \frac{(31-1) \cdot 1,62}{1} = 48,6&amp;lt;/math&amp;gt;. Znajdujemy poziom &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; dla tej wartości &amp;lt;math&amp;gt;\chi^2&amp;lt;/math&amp;gt; z 30 stopniami swobody. &lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
p = 1-st.chi2.cdf(48.6,30)&lt;br /&gt;
print(p)&lt;br /&gt;
&lt;br /&gt;
#ilustracja&lt;br /&gt;
x = py.arange(0,60,1)  &lt;br /&gt;
py.plot(x, st.chi2.pdf(x,30)) #rysujemy funkcję gęstości prawdopodobieństwa chi2 o 30 st. swobody&lt;br /&gt;
x2 = py.arange(48.8,60,1)&lt;br /&gt;
py.fill_between(x2,st.chi2.pdf(x2,30)) #cieniujemy obszar pod funkcją geęstości prawdopodobieństwa odpowiadający obliczonemu p&lt;br /&gt;
&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Otrzymaliśmy &amp;lt;math&amp;gt; p = 0,017 &amp;lt;/math&amp;gt;.&lt;br /&gt;
Wniosek:  Odrzucamy &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Błąd drugiego rodzaju. Moc testu.==&lt;br /&gt;
Błąd II-go rodzaju popełniamy wtedy gdy przyjmujemy &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; a prawdziwe jest &amp;lt;math&amp;gt;H_1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Przykład===&lt;br /&gt;
Załóżmy następujący test:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_0: \mu = 60&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_1: \mu = 65&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Niech rozmiar próby wynosi &amp;lt;math&amp;gt;n = 100&amp;lt;/math&amp;gt; a odchylenie standardowe w populacji &amp;lt;math&amp;gt;\sigma = 20&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Powinniśmy tu zastosować test jednostronny (mamy tylko dwie możliwości: &amp;lt;math&amp;gt;\mu = 60&amp;lt;/math&amp;gt; lub &amp;lt;math&amp;gt;65&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
Znajdźmy punkt krytyczny &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; dla poziomu istotności &amp;lt;math&amp;gt;\alpha =  0,05&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;C = \mu_0 + 1,645\frac{\sigma}{\sqrt{n}} = 60 + 1,645(20/10) = 63,29&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Błąd pierwszego rodzaju popełnimy gdy &amp;lt;math&amp;gt;\bar x &amp;gt; C&amp;lt;/math&amp;gt; i prawdziwe będzie &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt;. Prawdopodobieństwo błędu pierwszego rodzaju ustaliliśmy z góry na poziomie &amp;lt;math&amp;gt;\alpha = 0,05&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\alpha = P(\bar x &amp;gt; C| \mu = \mu_0)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Błąd drugiego rodzaju popełnimy gdy &amp;lt;math&amp;gt;\bar x &amp;lt; C&amp;lt;/math&amp;gt; a prawdziwe będzie &amp;lt;math&amp;gt;H_1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Prawdopodobieństwo popełnienia tego błędu wynosi:&lt;br /&gt;
&amp;lt;math&amp;gt;\beta = P(\bar x &amp;lt; C| \mu = \mu_1) = P\left( \frac{\bar x - \mu_1}{\sigma/\sqrt{n}}  &amp;lt; \frac{C - \mu_1}{\sigma/\sqrt{n}}\right)= &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;= P\left( Z &amp;lt; \frac{63,29 - 65}{20/10}\right)  = P(Z &amp;lt; -0,855) = 0,1963&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Moc testu jest dopełnieniem błędu II rodzaju.&lt;br /&gt;
A moc testu czyli prawdopodobieństwo odrzucenia hipotezy zerowej podczas gdy jest ona fałszywa wynosi:&lt;br /&gt;
&amp;lt;math&amp;gt;1 - \beta = 0,8037&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Porównanie dwóch populacji==&lt;br /&gt;
[[WnioskowanieStatystyczne/Test_t#Test_t_.28Studenta.29_r.C3.B3.C5.BCnicy_.C5.9Brednich|Dla przypomnienia]]:&lt;br /&gt;
Jeśli mamy dwie próbki danych:&lt;br /&gt;
:&amp;lt;math&amp;gt;x_1&amp;lt;/math&amp;gt; o liczebności &amp;lt;math&amp;gt;n_1&amp;lt;/math&amp;gt; i estymowanej wariancji &amp;lt;math&amp;gt;s_1^2&amp;lt;/math&amp;gt; i &lt;br /&gt;
:&amp;lt;math&amp;gt;x_2&amp;lt;/math&amp;gt; o liczebności &amp;lt;math&amp;gt;n_2&amp;lt;/math&amp;gt; i estymowanej wariancji &amp;lt;math&amp;gt;s_2^2&amp;lt;/math&amp;gt;  &lt;br /&gt;
:gdzie &amp;lt;math&amp;gt;s_{i}^2= \frac{1}{(n_i-1)}\sum\limits_{j=1}^{n_i} (x_{j}-\overline{x}_{i})^{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
pochodzących z rozkładu normalnego o takiej samej wariancji &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; to:&lt;br /&gt;
*wspólna wariancja może być estymowana jako: &amp;lt;math&amp;gt;s^2=\frac{(n_1-1)s_1^2+(n_2-1)s_2^2}{n_1+n_2-2} &amp;lt;/math&amp;gt;&lt;br /&gt;
*wariancja różnicy średnich może być estymowana jako: &amp;lt;math&amp;gt;s_{\Delta}^2=s_{\bar{x}_1}^2+s_{\bar{x}_2}^2=\frac{1}{n_1}s_1^2+\frac{1}{n_2}s_2^2 = \frac{n_1+n_2}{n_1n_2}s^2&amp;lt;/math&amp;gt;&lt;br /&gt;
Jeśli postawimy hipotezę zerową: &amp;lt;math&amp;gt;H_0:\; \mu_1 = \mu_2&amp;lt;/math&amp;gt; to&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
t= \frac{\bar{x}_1-\bar{x}_2}{s_{\Delta}}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
pochodzi z rozkładu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; o &amp;lt;math&amp;gt;n_1+n_2-2&amp;lt;/math&amp;gt; stopniach swobody.&lt;br /&gt;
&lt;br /&gt;
===Przykład: promocja===&lt;br /&gt;
Producent odtwarzaczy CD chce sprawdzić czy małe obniżenie ceny produktu wpłynie korzystnie na sprzedaż. Losowa próba 15 tygodni sprzedaży przed obniżką dała średni dochód 6598 zł i standardowe odchylenie 844 zł. Losowa próba 12 tygodni sprzedaży w trakcie promocji dała średnią 6870 i odchylenie standardowe 669 zł. Czy dane te wykazują poprawę sprzedaży w trakcie promocji (przyjąć poziom istotności 5%) ?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\bar{x}_1 = 6598&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\bar{x}_2 = 6870&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Treść zadania odpowiada testowi jednostronnemu z poniższymi hipotezami:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_0: \mu_1 = \mu_2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_1: \mu_1 &amp;lt; \mu_2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Różnica średnich wynosi:&lt;br /&gt;
&amp;lt;math&amp;gt;\bar{x}_1-\bar{x}_2 = 6598 - 6870 = -272 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Estymowana wariancja różnicy średnich:&lt;br /&gt;
&amp;lt;math&amp;gt;s_{\Delta}^2 =  \frac{1}{n_1}s_1^2+\frac{1}{n_2}s_2^2 = \frac{844^2}{15} + \frac{669^2}{12} = 84785,82&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
zatem:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;s_{\Delta} = 291,18&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; t = -272/ 291,18 = - 0,934&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ilość stopni swobody: &amp;lt;math&amp;gt;n_1+n_2-2 = 25&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;P(t_{25} \le -0,934) = 0.18 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wniosek: Nie możemy odrzucić &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt;. Nie mamy podstaw by uznać że mała obniżka cen poprawiła sprzedaż.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Do testowania równości wariancji w dwóch populacjach stosuje się test &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;F_{(n1 -1, n2 - 1)} = \frac{s_1^2}{s_2^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
W przykładzie powyżej założyliśmy równość wariancji. Korzystając z testu &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; sprawdzić czy założenie było uzasadnione.&lt;br /&gt;
&lt;br /&gt;
==Badanie założenia o normalności rozkładu==&lt;br /&gt;
We wszystkich wspomnianych powyżej klasycznych testach statystycznych &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\chi^2&amp;lt;/math&amp;gt; istotnym założeniem jest to, że dane wejściowe w próbie mają rozkład normalny. W powyższych zadaniach po prostu to zakładaliśmy, ale w praktyce, kiedy dostajemy próbę do analizy, musimy sami sprawdzić,  czy możemy uznać ją za pochodzącą z rozkładu normalnego. Do weryfikacji takiej hipotezy służą narzędzia graficzne:&lt;br /&gt;
&lt;br /&gt;
=== Histfit: histogram z naniesionym fitem rozkładu normalnego ===&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
def histfit(x,N_bins):  &lt;br /&gt;
''' &lt;br /&gt;
x - dane&lt;br /&gt;
N_bins -ilość binów w histogramie&lt;br /&gt;
&lt;br /&gt;
Funkcja rysuje histogram i na jego tle dorysowuje wykres &lt;br /&gt;
funkcji gęstości prawdopodobieństwa rozkładu normalnego &lt;br /&gt;
o średniej i wariancji estymowanych z x.&lt;br /&gt;
&lt;br /&gt;
Funkcja wymaga zaimportowania modułów pylab as py i scipy.stats as st''' &lt;br /&gt;
 &lt;br /&gt;
	n, bins, patches = py.hist(x, N_bins, density=True, facecolor='green', alpha=0.75)&lt;br /&gt;
	# Rysujemy histogram i w jawny sposób odbieramy zwracane przez p.hist obiekty&lt;br /&gt;
	#   - normujemy histogram do jedności&lt;br /&gt;
	#   - ustalamy kolor prostokątów na zielony&lt;br /&gt;
	#   - ustawiamy przezroczystość prostokątów na 0.75&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	bincenters = 0.5*(bins[1:]+bins[:-1])&lt;br /&gt;
	# wytwarzamy tablicę z centrami binów korzystając z granic binów&lt;br /&gt;
	# zwróconych przez py.hist w macierzy bins&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	y = st.norm.pdf( bincenters, loc = np.mean(x), scale = np.std(x))&lt;br /&gt;
	# obliczamy momenty rozkładu x: średnią i wariancję (tak naprawdę to jej pierwiastek czyli standardowe odchylenie)&lt;br /&gt;
	# obliczamy wartości w normalnym rozkładzie gęstości prawdopodobieństwa&lt;br /&gt;
	# o średniej np.mean(x) i standardowym odchyleniu np.std(x) dla wartości bincenters&lt;br /&gt;
 &lt;br /&gt;
	l = py.plot(bincenters, y, 'r--', linewidth=1)&lt;br /&gt;
	# do histogramu dorysowujemy linię &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Normplot ===&lt;br /&gt;
Jest to wykres wartości w próbie, wzg. prawdopodobieństwa uzyskania takiej wartości w rozkładzie normalnym. Wykres ten jest szczególnym przypadkiem kwantylowego wykresu prawdopodobieństwa [http://en.wikipedia.org/wiki/Q-Q_plot]. Konstruuje się go następująco: &lt;br /&gt;
*Na osi pionowej odkładamy uporządkowane zaobserwowane wartości &amp;lt;math&amp;gt;x_1 \le x_2 \le \dots \le x_n &amp;lt;/math&amp;gt;. Estymują one położenie kwantyli w populacji.&lt;br /&gt;
*Na osi poziomej odkładamy położenia kwantyli w rozkładzie normalnym. Obliczamy je: &amp;lt;math&amp;gt;F^{-1}\left(\frac{i-r_{pop}}{n+n_{pop}} \right)&amp;lt;/math&amp;gt; gdzie &amp;lt;math&amp;gt;F^{-1}&amp;lt;/math&amp;gt; jest funkcją odwrotną do dystrybuanty rozkładu teoretycznego (w tym szczególnym przypadku normalnego) &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; jest numerem obserwacji a &amp;lt;math&amp;gt;r_{pop}, n_{pop}&amp;lt;/math&amp;gt; są czynnikami (&amp;lt;math&amp;gt;\le 0.5 &amp;lt;/math&amp;gt;) zapewniającymi, że argument funkcji odwrotnej do dystrybuanty nie przyjmuje wartości 0 ani 1. &lt;br /&gt;
Jeśli dane ''x'' podlegają rozkładowi normalnemu to ich położenia kwantyli powinny być zgodne z położeniami kwantyli w rozkładzie normalnym, zatem wykres powinien przedstawiać linię prostą. Odstępstwa od prostej świadczą o odstępstwie od rozkładu normalnego.&lt;br /&gt;
W pythonie możemy ten typ wykresu zaimplementować np. tak (współczynniki zaczerpnięte z [http://www.itl.nist.gov/div898/handbook/eda/section3/normprpl.htm]):&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
def normplot(x):&lt;br /&gt;
	'''normplot: x dane do testowania'''&lt;br /&gt;
	x_ord = sorted(x)&lt;br /&gt;
	N = len(x)&lt;br /&gt;
	y = np.zeros(N)&lt;br /&gt;
	y[0]=st.norm.ppf(1- 0.5**(1.0/N) )&lt;br /&gt;
	y[N-1] = st.norm.ppf(0.5**(1.0/N) )&lt;br /&gt;
	for i in range(1,N-1):&lt;br /&gt;
		arg = float(i-0.3175)/(N+0.365)&lt;br /&gt;
		y[i] = st.norm.ppf(arg)&lt;br /&gt;
	py.plot(y,x_ord,'.')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Test Shapiro-Wilka ===&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;W,p = st.shapiro(x)&amp;lt;/source&amp;gt;&lt;br /&gt;
Funkcja ta zwraca wartość statystyki ''W'' i prawdopodobieństwo ''p''  zaobserwowania takiej lub bardziej ekstremalnej wartości statystyki ''W'' dla danych podlegających rozkładowi normalnemu. Jeśli ''p'' ma wysoką wartość (większą niż przyjęta &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;) to nie możemy odrzucić hipotezy, że dane podlegają  rozkładowi normalnemu. Test Shapiro-Wilka nie jest wrażliwy na parametry rozkładu, z którego pochodzą dane (dane mogą pochodzić z rozkładu o dowolnej średniej i dowolnym odchyleniu standardowym).&lt;br /&gt;
&lt;br /&gt;
=== Test Kołmogorowa-Smirnowa ===&lt;br /&gt;
Jest on oparty  na badaniu maksymalnej różnicy pomiędzy dystrybuantą empiryczną (z próby) a teoretyczną dystrybuantą rozkładu. Dla testowania normalności próby powinniśmy wywołać &lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
D , p = st.kstest(x, 'norm', args=(np.mean(x),np.std(x,ddof=1)) #sposób zalecany&lt;br /&gt;
#lub &lt;br /&gt;
D , p = st.kstest((x-np.mean(x))/np.std(x,ddof=1), 'norm') #sposób niezalecany, ale również prawidłowy&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Funkcja zwraca wartość statystyki ''D'' i prawdopodobieństwo zaobserwowania takiej bądź bardziej ekstremalnej wartości statystyki jeśli testowane dane pochodzą z tego samego rozkładu. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;'''UWAGA!''' Test Kołmogorowa-Smirnowa '''jest wrażliwy na parametry rozkładu''', z którego pochodzą dane. Wywołanie poniższego kodu jest błędem:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
D , p = st.kstest(x, 'norm') #BŁĘDNE użycie testu Kołmogorowa-Smirnowa&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Test dla innych postaci rozkładu====&lt;br /&gt;
Za pomocą testu Kołmogorowa-Smirnowa możemy zbadać również założenie o pochodzeniu danych z populacji podlegającej dowolnemu innemu rozkładowi ciągłemu. W tym celu należy podać zamiast 'norm' odpowiednią nazwę rozkładu z modułu scipy.stats oraz parametry tegoż rozkładu w odpowiedniej kolejności (należy w tym celu zajrzeć do dokumentacji). Przykład jak to należy zrobić dla rozkładu wykładniczego:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
D , p = st.kstest(x, 'expon', args=(0, 1/np.mean(x)) #test, czy dane podlegają rozkładowi wykładniczemu&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Przykład===&lt;br /&gt;
Proszę wygenerować 1000 liczb z rozkładu normalnego. Liczby te obejrzyjmy na wykresach &amp;lt;tt&amp;gt;histfit&amp;lt;/tt&amp;gt; oraz &amp;lt;tt&amp;gt;normplot&amp;lt;/tt&amp;gt; i zbadamy ich normalność testem  Shapiro-Wilka i Kołmogorova-Smirnova. &lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
 &lt;br /&gt;
def normplot(x):&lt;br /&gt;
	'''normplot: x dane do testowania'''&lt;br /&gt;
	x_ord = sorted(x)&lt;br /&gt;
	N = len(x)&lt;br /&gt;
	y = np.zeros(N)&lt;br /&gt;
	y[0]=st.norm.ppf(1- 0.5**(1.0/N) )&lt;br /&gt;
	y[N-1] = st.norm.ppf(0.5**(1.0/N) )&lt;br /&gt;
	for i in range(1,N-1):&lt;br /&gt;
		arg = float(i-0.3175)/(N+0.365)&lt;br /&gt;
		y[i] = st.norm.ppf(arg)&lt;br /&gt;
	py.plot(y,x_ord,'.')&lt;br /&gt;
 &lt;br /&gt;
def histfit(x,N_bins):  &lt;br /&gt;
	''' funkcja rysuje histogram i na jego tle dorysowuje wykres &lt;br /&gt;
	funkcji gęstości prawdopodobieństwa rozkładu normalnego &lt;br /&gt;
	o średniej i wariancji estymowanych z x &lt;br /&gt;
	Funkcja wymaga zaimportowania modułów pylab as py i scipy.stats as st'''  &lt;br /&gt;
	n, bins, patches = py.hist(x, N_bins, normed=True, facecolor='green', alpha=0.75)&lt;br /&gt;
	bincenters = 0.5*(bins[1:]+bins[:-1]) &lt;br /&gt;
	y = st.norm.pdf( bincenters, loc = np.mean(x), scale = np.std(x,ddof=1)) &lt;br /&gt;
	l = py.plot(bincenters, y, 'r--', linewidth=1)&lt;br /&gt;
def porownania(x):&lt;br /&gt;
	py.subplot(2,2,1)&lt;br /&gt;
	normplot(x)&lt;br /&gt;
	py.subplot(2,2,2)&lt;br /&gt;
	histfit(x,15)&lt;br /&gt;
	W,p_sw = st.shapiro(x)&lt;br /&gt;
	D,p_ks = st.kstest(x, 'norm', args=(np.mean(x),np.std(x,ddof=1)))&lt;br /&gt;
	title = 'SW: %(sw).2f KS: %(ks).2f'%{'sw':p_sw, 'ks':p_ks}&lt;br /&gt;
	&lt;br /&gt;
	py.title(title)&lt;br /&gt;
	# wybieramy pierwsze dziesięć punktów  &lt;br /&gt;
	y=x[0:10]&lt;br /&gt;
	py.subplot(2,2,3)&lt;br /&gt;
	normplot(y)&lt;br /&gt;
	py.subplot(2,2,4)&lt;br /&gt;
	histfit(y,15)&lt;br /&gt;
	W,p_sw = st.shapiro(y)&lt;br /&gt;
	D,p_ks = st.kstest(y, 'norm', args=(np.mean(x),np.std(x,ddof=1)))&lt;br /&gt;
	title = 'SW: %(sw).2f KS: %(ks).2f'%{'sw':p_sw, 'ks':p_ks}&lt;br /&gt;
	py.title(title)&lt;br /&gt;
 &lt;br /&gt;
x = st.norm.rvs(size=1000, loc=0, scale=10)&lt;br /&gt;
py.figure(1)&lt;br /&gt;
porownania(x)&lt;br /&gt;
# A teraz zbadajmy dane z rozkładów innych niż normalny:&lt;br /&gt;
 &lt;br /&gt;
x = st.t.rvs(df = 2, size=1000, loc=0, scale=1)&lt;br /&gt;
py.figure(2)&lt;br /&gt;
porownania(x)&lt;br /&gt;
 &lt;br /&gt;
x = st.expon.rvs(size=1000,loc=0,scale=1)&lt;br /&gt;
py.figure(3)&lt;br /&gt;
porownania(x)&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Proszę zapuścić skrypt kilka razy i zwrócić uwagę na to, jak trudno jest ocenić normalność danych przy małych próbach.&lt;br /&gt;
&lt;br /&gt;
===Przykład: transformacja Boxa-Coxa===&lt;br /&gt;
Często normalność danych można poprawić przez zastosowanie odpowiedniej transformacji. Ogólną rodzinę transformacji, które często prowadzą do normalizacji danych można zapisać tak (trasformacja Box-Cox'a [http://www.jstor.org/stable/2984418]):&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y^{(\lambda)}=\left\{\begin{matrix} \frac{y^\lambda-1} {\lambda} &amp;amp; \mbox{dla }\lambda \ne 0 \\ \ln(y) &amp;amp; \mbox{dla }\lambda = 0\end{matrix}\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W module scipy.stats mamy tę transformację zaimplementowaną jako &amp;lt;tt&amp;gt;boxcox()&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Zobaczmy jej działanie na następującym przykładzie:&lt;br /&gt;
&lt;br /&gt;
Proszę pobrać i zapisać w pliku tekstowym następujące &lt;br /&gt;
[[Media:Samochody.txt| dane]]. Zawierają one 8 kolumn charakterystyk samochodów:&lt;br /&gt;
*zużycie paliwa&lt;br /&gt;
*cylindry&lt;br /&gt;
*pojemność skokowa&lt;br /&gt;
*moc w koniach mechanicznych&lt;br /&gt;
*masa&lt;br /&gt;
*przyspieszenie&lt;br /&gt;
*rocznik&lt;br /&gt;
*pochodzenie&lt;br /&gt;
&lt;br /&gt;
Proszę narysować histfit i normplot  oraz policzyć testy Shapiro-Wilka i Kolmogorowa-Smirnowa dla masy pojazdów, a następnie zastosować do niej transformację Boxa-Coxa i zbadać normalność przetransformowanych danych.&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
def normplot(x):&lt;br /&gt;
	'''normplot: x dane do testowania'''&lt;br /&gt;
	x_ord = sorted(list(x))&lt;br /&gt;
	N = len(x)&lt;br /&gt;
	y = np.zeros(N)&lt;br /&gt;
	y[0]=st.norm.ppf(1- 0.5**(1.0/N) )&lt;br /&gt;
	y[N-1] = st.norm.ppf(0.5**(1.0/N) )&lt;br /&gt;
	for i in range(1,N-1):&lt;br /&gt;
		arg = float(i-0.3175)/(N+0.365)&lt;br /&gt;
		y[i] = st.norm.ppf(arg)&lt;br /&gt;
	py.plot(y,x_ord,'.')&lt;br /&gt;
	&lt;br /&gt;
def histfit(x,N_bins):  &lt;br /&gt;
	''' funkcja rysuje histogram i na jego tle dorysowuje wykres &lt;br /&gt;
	funkcji gęstości prawdopodobieństwa rozkładu normalnego &lt;br /&gt;
	o średniej i wariancji estymowanych z x &lt;br /&gt;
	Funkcja wymaga zaimportowania modułów pylab as py i scipy.stats as st'''  &lt;br /&gt;
	n, bins, patches = py.hist(x, N_bins, normed=True, facecolor='green', alpha=0.75)&lt;br /&gt;
	bincenters = 0.5*(bins[1:]+bins[:-1]) &lt;br /&gt;
	y = st.norm.pdf( bincenters, loc = np.mean(x), scale = np.std(x)) &lt;br /&gt;
	l = py.plot(bincenters, y, 'r--', linewidth=1)&lt;br /&gt;
def porownania(x):&lt;br /&gt;
	py.subplot(2,1,1)&lt;br /&gt;
	normplot(x);&lt;br /&gt;
	py.subplot(2,1,2)&lt;br /&gt;
	histfit(x,15)&lt;br /&gt;
	W,p_sw = st.shapiro(x);&lt;br /&gt;
	D,p_ks = st.kstest(x,'norm',args=(np.mean(x),np.std(x) ))&lt;br /&gt;
	title = 'SW: %(sw).2f KS: %(ks).2f'%{'sw':p_sw, 'ks':p_ks}&lt;br /&gt;
	py.title(title)&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
dane = np.loadtxt('Samochody.txt')&lt;br /&gt;
# Badamy przyspieszenia&lt;br /&gt;
w = dane[:,5]&lt;br /&gt;
py.figure(1)&lt;br /&gt;
porownania(w)&lt;br /&gt;
# A teraz stosujemy transformację Box-Coxa&lt;br /&gt;
wt,lam = st.boxcox(w)&lt;br /&gt;
py.figure(2)&lt;br /&gt;
porownania(wt)&lt;br /&gt;
&lt;br /&gt;
# badamy masy&lt;br /&gt;
w = dane[:,4]&lt;br /&gt;
py.figure(3)&lt;br /&gt;
porownania(w)&lt;br /&gt;
# A teraz stosujemy transformację Box-Coxa&lt;br /&gt;
wt,lam = st.boxcox(w)&lt;br /&gt;
py.figure(4)&lt;br /&gt;
porownania(wt)&lt;br /&gt;
&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W pierwszym przypadku - asymetrię rozkładu przyspieszeń udało się transformacją B-C poprawić, ale w drugim przypadku, masa, asymetrię dało się skorygować (widać to na histfit) ale nie da się poprawić ''ciężkich ogonów'' - widać to zarówno na normplocie jak i na wynikach testów.&lt;br /&gt;
Ogólnie: zanim zaczniemy analizować dane dobrze jest je pooglądać na różnych wykresach i chwilę ''pomyśleć''.&lt;br /&gt;
&lt;br /&gt;
==Przykład (zastosowanie różnych testów do tych samych danych): karma==&lt;br /&gt;
Badamy dwie nowe karmy A i B. Mamy dwie grupy po 12 zwierząt. Uzyskane przyrosty masy są następujące:&lt;br /&gt;
&lt;br /&gt;
A: 31 34 29 26 32 35 38 34 31 29 32 31&lt;br /&gt;
&lt;br /&gt;
B: 26 24 28 29 30 29 31 29 32 26 28 32&lt;br /&gt;
&lt;br /&gt;
Pytanie:&lt;br /&gt;
Czy któraś z karm daje istotnie większe przyrosty masy?&lt;br /&gt;
&lt;br /&gt;
Poniżej rozwiążemy to zadanie stopniowo różnymi metodami. Kolejne kawałki kodu można dopisywać do tego samego pliku.&lt;br /&gt;
&lt;br /&gt;
ROZWIĄZANIE:&lt;br /&gt;
Przyjmujemy poziom istotności, na którym przeprowadzamy testy &amp;lt;math&amp;gt;\alpha = 0.05&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Badamy rozkłady danych:===&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
A=[ 31, 34, 29, 26, 32, 35, 38, 34, 31, 29, 32, 31];&lt;br /&gt;
B=[ 26, 24, 28, 29, 30, 29, 31, 29, 32, 26, 28, 32];&lt;br /&gt;
W, p_A = st.shapiro(A)&lt;br /&gt;
print('Dla grupy A:', p_A)&lt;br /&gt;
W, p_B = st.shapiro(B)&lt;br /&gt;
print('Dla grupy B:', p_B)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dla obu grup test Shapiro-Wilka nie daje nam podstaw do odrzucenia założenia o normalności rozkładów.&lt;br /&gt;
&lt;br /&gt;
===Test parametryczny===&lt;br /&gt;
Nie odrzuciliśmy hipotezy o normalnym rozkładzie danych zatem możemy zastosować  [[WnioskowanieStatystyczne/Test_t | test ''t'' ]] dla różnicy średnich.&lt;br /&gt;
&lt;br /&gt;
Formułujemy hipotezy:&lt;br /&gt;
* &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt;: średni przyrost masy w grupie A &amp;lt;math&amp;gt;=&amp;lt;/math&amp;gt; średni przyrost masy w grupie B&lt;br /&gt;
* &amp;lt;math&amp;gt;H_1&amp;lt;/math&amp;gt;: średni przyrost masy w grupie A &amp;lt;math&amp;gt;\ne&amp;lt;/math&amp;gt; średni przyrost masy w grupie B&lt;br /&gt;
Przeprowadzamy test:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
t, p = st.ttest_ind(A,B)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Otrzymujemy ''p'' = 0.01.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;p &amp;lt; \alpha &amp;lt;/math&amp;gt;,  zatem na przyjętym poziomie istotności odrzucamy hipotezę zerową i stwierdzamy, że grupa A ma inną średnią niż grupa B.&lt;br /&gt;
&lt;br /&gt;
===Test nieparametryczny ===&lt;br /&gt;
Nie zakładajac postaci  rozkładu danych mozemy zastosować test [[WnioskowanieStatystyczne/Test_Wilcoxona| ze statystykami opartymi na rangach]]. &lt;br /&gt;
Formułujemy hipotezy:&lt;br /&gt;
* &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt;: mediana przyrostu masy w grupie A &amp;lt;math&amp;gt;=&amp;lt;/math&amp;gt; mediana przyrostu masy w grupie B&lt;br /&gt;
* &amp;lt;math&amp;gt;H_1&amp;lt;/math&amp;gt;: mediana przyrostu masy w grupie A&amp;lt;math&amp;gt;\ne&amp;lt;/math&amp;gt; mediana przyrostu masy w grupie B&lt;br /&gt;
Przeprowadzamy test:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
U, p = st.mannwhitneyu(A, B)&lt;br /&gt;
p_dwustronne = 2*p&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
W pythonie zaimplementowana jest wersja jednostronna tego testu. Aby otrzymać prawdopodobieństwo ''p'' dla testu dwustronnego musimy pomnożyć je przez 2.&lt;br /&gt;
&lt;br /&gt;
===Testy bootstrapowe===&lt;br /&gt;
Teraz to samo sprawdzimy za pomocą testu repróbkowanego.&lt;br /&gt;
Przyda nam się tu funkcja do pobierania losowej próbki z powtórzeniami z danych:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
def randsample(x, N):&lt;br /&gt;
	'''zwraca wektor o dłougości N z losowo wybranymi elementami wektora x. Losowanie odbywa się z powtórzeniami''' &lt;br /&gt;
	n=len(x)&lt;br /&gt;
	ind = np.random.randint(n, size = N)&lt;br /&gt;
	y = x[ind]&lt;br /&gt;
	return y&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W testech repróbkowanych statystykę możemy wybrać dość dowolnie, ale jak pokażemy poniżej nie każda jest równie dobra.&lt;br /&gt;
Zgodnie z hipotezą zerową próbka A i  B pochodza z tej samej populacji.&lt;br /&gt;
Nasza najlepsza wiedza o owej populacji to połączone próbki A i B:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
POP=np.concatenate((A, B))&lt;br /&gt;
&lt;br /&gt;
N=len(POP)&lt;br /&gt;
NA=len(A)&lt;br /&gt;
NB=len(B)&lt;br /&gt;
# Zasymulujemy N_rep razy wyciagniecie z POP prob o rozmiarach NA i NB i&lt;br /&gt;
# zobaczymy jak czesto zdarzają się wartości statystyki  sie roznica srednich taka jak w oryginalnym&lt;br /&gt;
# pomiarze lub jeszcze wieksza. &lt;br /&gt;
N_rep=10000&lt;br /&gt;
# oryginalna roznica srednich i median:&lt;br /&gt;
mi_0 = np.abs(np.mean(A) - np.mean(B))&lt;br /&gt;
T_0  = np.abs(np.mean(A) - np.mean(B))/np.std(POP)&lt;br /&gt;
me_0 = np.abs(np.median(A) - np.median(B))&lt;br /&gt;
&lt;br /&gt;
mi = np.zeros(N_rep)&lt;br /&gt;
T  = np.zeros(N_rep)&lt;br /&gt;
me = np.zeros(N_rep)&lt;br /&gt;
&lt;br /&gt;
for i in range(N_rep):&lt;br /&gt;
	AA = randsample(POP,NA)&lt;br /&gt;
	BB = randsample(POP,NB)&lt;br /&gt;
	R_POP = np.concatenate((AA,BB))&lt;br /&gt;
	mi[i] = np.abs(np.mean(AA)-np.mean(BB)) # abs bo test dwustronny&lt;br /&gt;
	T[i]  = np.abs(np.mean(AA)-np.mean(BB))/np.std(R_POP)&lt;br /&gt;
	me[i] = np.abs(np.median(AA)-np.median(BB))&lt;br /&gt;
&lt;br /&gt;
p_mi = np.sum(mi&amp;gt;=mi_0)/N_rep&lt;br /&gt;
p_T  = np.sum( T&amp;gt;=T_0 )/N_rep&lt;br /&gt;
p_me = np.sum(me&amp;gt;=me_0)/N_rep&lt;br /&gt;
&lt;br /&gt;
print('testy repróbkowane: ')&lt;br /&gt;
print('rożnica średnich: ', p_mi)&lt;br /&gt;
print('pseudo T: ', p_T)&lt;br /&gt;
print('różnica median: ', p_me)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Widzimy, że dla testu ze statystyką różnicy średnich i  pseudo T dostajemy podobne wyniki, z tym, że pseudo T jest nieco silniejszy. Test ze statystyką różnicy średnich jest na tyle słaby, że nie pozwala na odrzucenie hipotezy zerowej.&lt;br /&gt;
&lt;br /&gt;
===Wnioskowanie w oparciu o przedziały ufności ===&lt;br /&gt;
Wnioskowanie o równości średnich dwóch grup można też przerowadzić w oparciu o przedziały ufności. W naszym przykładzie przedziały można skonstruować zarówno parametrycznie jak i nieparametrycznie.&lt;br /&gt;
==== Wersja parametryczna ====&lt;br /&gt;
Konstruujemy 95% przedział ufności wokół oryginalnej różnicy średnich.&lt;br /&gt;
Dla dwóch grup wariancję różnicy średnich znajdujemy sumując wariancje śrenich estymowane dla każdej z grup:&lt;br /&gt;
:&amp;lt;math&amp;gt; &lt;br /&gt;
\mathrm{var}_{\Delta} = \frac{1}{N_1}\mathrm{var}(x_1) + \frac{1}{N_2} \mathrm{var}(x_2)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
ilość stopni swobody:&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
 df = N_1+N_2-2&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
co prowadzi do estymatora&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
s^2_\Delta = \frac{N_1s_1^2 + N_2s_2^2}{N_1+N_2-2} \cdot \frac{N_1+N_2}{N_1N_2}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
roznica_oryginalna = np.mean(A) - np.mean(B)&lt;br /&gt;
f = NA+NB-2;&lt;br /&gt;
v_A = np.var(A)&lt;br /&gt;
v_B = np.var(B)&lt;br /&gt;
sig = np.sqrt( ((NA*v_A +NB*v_B))/f * (NA + NB)/(NA*NB) )&lt;br /&gt;
t_2_5 = st.t.ppf(0.025,f);&lt;br /&gt;
t_97_5 = st.t.ppf(0.975,f);&lt;br /&gt;
print('przedział ufności dla różnicy średnich przy założeniu normalności %(d).2f %(g).2f'%{'d':sig*t_2_5+ roznica_oryginalna,'g':sig*t_97_5+roznica_oryginalna})&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Otrzymujemy w wyniku &amp;lt;tt&amp;gt;przedział ufności dla różnicy średnich przy założeniu normalności 0.77 5.56&amp;lt;/tt&amp;gt;. Oznacza to, że w 95% analogicznych badań powinniśmy otrzymać różnicę średnich zawartą w tym przedziale. Przedził ten nie zawiera wartości 0, zatem na przyjętym poziomie istotności średnie grupy A i B są różne.&lt;br /&gt;
&lt;br /&gt;
====Wersja nieparametryczna ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# POP zawiera świat zgodny z H0&lt;br /&gt;
roznica_oryginalna = np.mean(A) - np.mean(B)&lt;br /&gt;
alfa = 0.05&lt;br /&gt;
N_rep = 10000&lt;br /&gt;
r = np.zeros(N_rep)&lt;br /&gt;
for i in range(N_rep):&lt;br /&gt;
	gA = randsample(POP, NA)&lt;br /&gt;
	gB = randsample(POP, NB)&lt;br /&gt;
	r[i] = np.mean(gA) - np.mean(gB)&lt;br /&gt;
ci_d = st.scoreatpercentile(r, per = alfa/2*100)&lt;br /&gt;
ci_g = st.scoreatpercentile(r, per = (1-alfa/2)*100)&lt;br /&gt;
# print('przedział ufności: %(d).2f %(g).2f'%{'m':np.mean(r),'d':ci_d+roznica_oryginalna, 'g':ci_g+roznica_oryginalna})&lt;br /&gt;
print('przedział ufności: %(d).2f %(g).2f'%{'m':np.mean(r),'d':ci_d, 'g':ci_g})&lt;br /&gt;
print('oryginalna różnica średnich: %(ro).2f'%{'ro':roznica_oryginalna})&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Wynik:&lt;br /&gt;
&amp;lt;tt&amp;gt;przedział ufności: -2.50 2.50&lt;br /&gt;
oryginalna różnica średnich: 3.17&amp;lt;/tt&amp;gt;.&lt;br /&gt;
Przedział ufności 95% na różnicę skonstruowany zgodnie z &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; nie zawiera oryginalnej różnicy średnich, &lt;br /&gt;
zatem różnica 3.17 w świecie zgodnym z &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; zdarza się nie częściej niż w 5% przypadków. Wniosek: średnie grup A i B są różne  na przyjętym poziomie ufności.&lt;br /&gt;
&lt;br /&gt;
== Zadanie: Przeżywalność myszy ==&lt;br /&gt;
Mamy 7 myszy, którym podano środek, który miał poprawić ich przeżywalność po operacji oraz 9 myszy kontrolnych, którym owego środka nie podano. Myszy traktowane specjalnie przeżyły &amp;lt;br&amp;gt;&lt;br /&gt;
94, 38, 23, 197, 99, 16, 141 dni&amp;lt;br&amp;gt;&lt;br /&gt;
a myszy traktowane standardowo:&amp;lt;br&amp;gt;&lt;br /&gt;
52, 10, 40, 104, 51, 27, 146, 30, 46 dni&amp;lt;br&amp;gt;&lt;br /&gt;
Średnia różnica wynosi 30,63 dni dłużej dla myszy traktowanych po nowemu.&lt;br /&gt;
Pytanie, na które chcielibyśmy znać odpowiedź to: Czy nowy środek faktycznie poprawia przeżywalność.&lt;br /&gt;
Zadanie proszę rozwiązać wszystkimi możliwymi sposobami, analogicznie do powyższego przykładu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Odp'': &lt;br /&gt;
:przedział ufności: [&amp;amp;minus;51,64 52,89]&lt;br /&gt;
:oryginalna różnica średnich: 30,63&lt;br /&gt;
:przedział ufności dla różnicy średnich przy założeniu normalności [&amp;amp;minus;27,99  89,26]&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
'''Przedział ufności dla różnicy dwóch średnich&lt;br /&gt;
&lt;br /&gt;
Mamy 7 myszy, którym podano środek, który miał poprawić ich przeżywalność &lt;br /&gt;
po operacji oraz 9 myszy kontrolnych, którym owego środka nie podano. &lt;br /&gt;
Myszy traktowane specjalnie przeżyły&lt;br /&gt;
94 38 23 197 99 16 141 dni&lt;br /&gt;
a myszy traktowane standardowo:&lt;br /&gt;
52 10 40 104 51 27 146 30 46 dni&lt;br /&gt;
Średnia różnica wynosi 30.63 dni dłużej dla myszy traktowanych po nowemu. &lt;br /&gt;
Pytanie, na które chcielibyśmy znać odpowiedź to: Czy nowy środek faktycznie &lt;br /&gt;
poprawia przeżywalność.&lt;br /&gt;
&lt;br /&gt;
Skonstruujmy przedział ufności 95% dla średniej różnicy w przeżywalności.&lt;br /&gt;
&lt;br /&gt;
Uwaga: przy tym problemie każdą z grup traktujemy jako reprezentantów bardzo &lt;br /&gt;
dużych populacji. '''&lt;br /&gt;
def randsample(x,ile):&lt;br /&gt;
	ind = st.randint.rvs(0,len(x),size = ile)&lt;br /&gt;
	y = x[ind]&lt;br /&gt;
	return y&lt;br /&gt;
&lt;br /&gt;
m_sp = np.array([94, 38, 23, 197, 99, 16, 141])&lt;br /&gt;
N_sp = len(m_sp)&lt;br /&gt;
m_st = np.array([52, 10, 40, 104, 51, 27, 146, 30, 46])&lt;br /&gt;
N_st = len(m_st)&lt;br /&gt;
alfa = 0.05&lt;br /&gt;
# zgodnie z hipotezą zerową (H0) nie ma różnicy między grupami&lt;br /&gt;
&lt;br /&gt;
# symulacja&lt;br /&gt;
# tworzymy świat zgodny z H0&lt;br /&gt;
m = np.concatenate((m_sp,m_st))&lt;br /&gt;
&lt;br /&gt;
roznica_oryginalna = np.mean(m_sp) - np.mean(m_st)&lt;br /&gt;
&lt;br /&gt;
N_rep = 10000&lt;br /&gt;
r = np.zeros(N_rep)&lt;br /&gt;
for i in range(N_rep):&lt;br /&gt;
	g1 = randsample(m, N_sp)&lt;br /&gt;
	g2 = randsample(m, N_st)&lt;br /&gt;
	r[i] = np.mean(g1) - np.mean(g2)&lt;br /&gt;
ci_d = st.scoreatpercentile(r, per = alfa/2*100)&lt;br /&gt;
ci_g = st.scoreatpercentile(r, per = (1-alfa/2)*100)&lt;br /&gt;
print('przedział ufności: %(d).2f %(g).2f'%{'m':np.mean(r),'d':ci_d, 'g':ci_g})&lt;br /&gt;
print('oryginalna różnica średnich: %(ro).2f'%{'ro':roznica_oryginalna})&lt;br /&gt;
# przedział ufności na różnicę skonstruowany zgodnie z H0 zawiera oryginalną różnicę średnich, &lt;br /&gt;
# zatem różnica taka jest na przyjętym poziomie ufności możliwa &lt;br /&gt;
# do zaobserwowania w przypadku braku różnicy między grupami&lt;br /&gt;
&lt;br /&gt;
# zakładając normalność&lt;br /&gt;
f = N_sp+N_st-2;&lt;br /&gt;
v_1 = np.var(m_sp)&lt;br /&gt;
v_2 = np.var(m_st)&lt;br /&gt;
sig = np.sqrt( ((N_sp*v_1 +N_st*v_2))/f * (N_sp + N_st)/float(N_sp*N_st) )&lt;br /&gt;
t_2_5 = st.t.ppf(0.025,f);&lt;br /&gt;
t_97_5 = st.t.ppf(0.975,f);&lt;br /&gt;
print('przedział ufności dla różnicy średnich przy założeniu normalności %(d).2f %(g).2f'%{'d':sig*t_2_5+ roznica_oryginalna,'g':sig*t_97_5+roznica_oryginalna})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
print('przedział ufności dla różnicy średnich przy założeniu normalności %(d).2f %(g).2f'%{'d':s_delta*t_2_5+ roznica_oryginalna,'g':s_delta*t_97_5+roznica_oryginalna})&lt;br /&gt;
# skonstruowany wokoł oryginalnej różnicy średnich przedział ufności zawiera 0, zatem nie możemy odrzucić możliwości,&lt;br /&gt;
# że nie ma różnicy między grupami&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zadanie: Linie lotnicze==&lt;br /&gt;
Linie lotnicze, projektując nowy samolot chcą sprawdzić czy średnia waga bagażu ręcznego zabieranego przez pasażerów nie zmieniła się od czasu poprzednich badań i wynosi wciąż 12 kg. Analiza ma być przeprowadzona na poziomie istotności &amp;lt;math&amp;gt;\alpha = 0,05&amp;lt;/math&amp;gt;. Analityk pobrał próbę bagażu ręcznego 144 pasażerów i obliczył wartość średnią z próby &amp;lt;math&amp;gt;\bar x = 14,6&amp;lt;/math&amp;gt; kg i odchylenie standardowe z próby &amp;lt;math&amp;gt;s = 7,8&amp;lt;/math&amp;gt;. Przeprowadź test hipotezy, że &amp;lt;math&amp;gt;\mu = 12&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
Standardowe importy modułów&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zmienne występujące w treści przykładu&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
mu_0=12&lt;br /&gt;
a=0.05&lt;br /&gt;
N=144&lt;br /&gt;
x=14.6&lt;br /&gt;
s=7.8&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Test dotyczy średniej wiec obliczamy odchylenie standardowe średniej:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
std_mu=s/np.sqrt(N)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wyjaśnienie |title= Obliczamy wartość statystyki:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt; &lt;br /&gt;
t=(mu_0-x)/std_mu&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Odchylenie standardowe estymowaliśmy z próby. Wartości powyższej statystyki podlegają zatem rozkładowi  t. Obliczamy wartości krytyczne odpowiadające poziomowi istotności a. Test jest dwustronny mamy wiec dwie wartości krytyczne: jedna odcina obszar pod funkcja gęstości prawdopodobieństwa na lewo,  a druga na prawo od siebie. Pole każdego z tych obszarów wynosi a/2:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt; &lt;br /&gt;
  &lt;br /&gt;
t_kryt_lewy = st.t.ppf(a/2,N-1)&lt;br /&gt;
t_kryt_prawy = st.t.ppf( 1-a/2, N-1)&lt;br /&gt;
&lt;br /&gt;
print('obliczona wartość statystyki t: ', t)&lt;br /&gt;
print('wartości krytyczne t: %(tl).2f %(tp).2f '%{'tl':t_kryt_lewy, 'tp':t_kryt_prawy})&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Możemy też obliczyć prawdopodobieństwo zaobserwowania wartości ''t'' takiej jak w naszym zadaniu lub bardziej ekstremalnej:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt; &lt;br /&gt;
p =  (st.t.cdf(-np.abs(t),N-1)) + (1-st.t.cdf(np.abs(t), N-1))  # sumujemy po obu ogonach  bo test jest dwustronny&lt;br /&gt;
print('Prawdopodobieństwo zaobserwowania bardziej ekstremalnych wartości t: %(p).4f'%{'p':p})&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wyniki te możemy zilustrować:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt; &lt;br /&gt;
os_t = np.arange(-5, 5, 0.1)&lt;br /&gt;
py.plot(os_t, st.t.pdf(os_t,N-1)) #rysujemy funkcję gęstości prawdopodobieństwa t o N-1 st. swobody&lt;br /&gt;
&lt;br /&gt;
#cieniujemy lewy obszary pod funkcją gęstości prawdopodobieństwa odpowiadający obliczonemu p&lt;br /&gt;
os_t2 = np.arange(-5, t_kryt_lewy, 0.1)&lt;br /&gt;
py.fill_between(os_t2,st.t.pdf(os_t2,N-1)) &lt;br /&gt;
#cieniujemy prawy obszary pod funkcją gęstości prawdopodobieństwa odpowiadający obliczonemu p&lt;br /&gt;
os_t2 = np.arange(t_kryt_prawy, 5,  0.1)&lt;br /&gt;
py.fill_between(os_t2,st.t.pdf(os_t2,N-1)) &lt;br /&gt;
&lt;br /&gt;
# zaznaczamy obliczoną wartość statystyki:&lt;br /&gt;
py.plot((t,), (0,), 'ro')&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Odpowiedź: Wyliczone ''t'' leży poza obszarem akceptacji hipotezy zerowej, zatem odrzucamy hipotezę zerową i akceptujemy alternatywną.&lt;br /&gt;
&lt;br /&gt;
==Zadanie: Agencja nieruchomości==&lt;br /&gt;
Agencja nieruchomości w Japonii podała, że ceny gruntu w centrum Tokio wzrosły o 49% w ciągu ostatniego roku. Inwestor chcąc przetestować te dane, znajduje próbę 18 nieruchomości w centrum Tokio, dla których zna cenę obecna i sprzed roku. Zakłada, że ceny podlegają rozkładowi normalnemu. Dla każdej nieruchomości oblicza procentowy wzrost wartości a następnie znajduje średnią i odchylenie standardowe z próby. Estymatory dla próby wynoszą &amp;lt;math&amp;gt;\bar x = 38&amp;lt;/math&amp;gt;% i &amp;lt;math&amp;gt;s = 14&amp;lt;/math&amp;gt;%. Przeprowadź test na poziomie istotności &amp;lt;math&amp;gt;\alpha = 0,01&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
mu_0=49;&lt;br /&gt;
x=38;&lt;br /&gt;
s=14;&lt;br /&gt;
N=18;&lt;br /&gt;
a=0.01;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# test dotyczy sredniej wiec jej std:&lt;br /&gt;
std_mu=s/np.sqrt(N)&lt;br /&gt;
&lt;br /&gt;
# odchylenie std obliczylismy z proby =&amp;gt; stosujemy test t&lt;br /&gt;
# obliczamy wartość statystyki &lt;br /&gt;
t=(mu_0-x)/std_mu&lt;br /&gt;
# obliczamy wartości krytyczne odpowiadające poziomowi istotności a&lt;br /&gt;
# test jest dwustronny mamy wiec dwie wartosci krytyczne &lt;br /&gt;
# jedna odcina obszar pod funkcja gęstości prawdopodobieństwa na lewo, &lt;br /&gt;
# a druga na prawo od siebie. Pole każdego z tych obszarów wynosi a/2&lt;br /&gt;
  &lt;br /&gt;
t_kryt_lewy = st.t.ppf(a/2,N-1)&lt;br /&gt;
t_kryt_prawy = st.t.ppf( 1-a/2, N-1)&lt;br /&gt;
&lt;br /&gt;
print('obliczona wartość statystyki t: ', t)&lt;br /&gt;
print('wartości krytyczne t: %(tl).2f %(tp).2f '%{'tl':t_kryt_lewy, 'tp':t_kryt_prawy})&lt;br /&gt;
&lt;br /&gt;
# Możemy też obliczyć prawdopodobieństwo zaobserwowania wrtości t takiej jak w naszym zadaniu &lt;br /&gt;
# lub bardziej ekstremalnej:&lt;br /&gt;
p = (1-st.t.cdf(t, N-1)) + (st.t.cdf(-t,N-1)) # sumujemy po obu ogonach  bo test jest dwustronny&lt;br /&gt;
		&lt;br /&gt;
print('Prawdopodobieństwo zaobserwowania bardziej ekstremalnych wrtości t: %(p).3f'%{'p':p})&lt;br /&gt;
# Wyniki te możemy zilustrować&lt;br /&gt;
os_t = np.arange(-5, 5, 0.1)&lt;br /&gt;
py.plot(os_t, st.t.pdf(os_t,N-1)) #rysujemy funkcję gęstości prawdopodobieństwa t o N-1 st. swobody&lt;br /&gt;
&lt;br /&gt;
#cieniujemy lewy obszary pod funkcją gęstości prawdopodobieństwa odpowiadający obliczonemu p&lt;br /&gt;
os_t2 = np.arange(-5, t_kryt_lewy, 0.1)&lt;br /&gt;
py.fill_between(os_t2,st.t.pdf(os_t2,N-1)) &lt;br /&gt;
#cieniujemy prawy obszary pod funkcją gęstości prawdopodobieństwa odpowiadający obliczonemu p&lt;br /&gt;
os_t2 = np.arange(t_kryt_prawy, 5,  0.1)&lt;br /&gt;
py.fill_between(os_t2,st.t.pdf(os_t2,N-1)) &lt;br /&gt;
&lt;br /&gt;
# zaznaczamy obliczoną wartość statystyki:&lt;br /&gt;
py.plot(t, 0, 'ro')&lt;br /&gt;
py.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# 'Odp: Wyliczone t lezy poza obszarem akceptacji hipotezy zerowej,&lt;br /&gt;
# zatej odrzucamy hipoteze zerowa i akceptujemy alternatywna.'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Odp. Odrzucamy &amp;lt;math&amp;gt;H_0:&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\mu_0 = 49&amp;lt;/math&amp;gt;, na poziomie istotności 0,01.&lt;br /&gt;
&lt;br /&gt;
==Zadanie: Zabiegi bio-inżynieryjne==&lt;br /&gt;
Załóżmy, że krowy są bardziej wartościowe od byków. Bio-inżynier twierdzi, że przy pomocy pewnych zabiegów jest w stanie spowodować zwiększenie szansy na urodzenie się krowy powyżej 50%. W jego eksperymencie na 10 urodzonych zwierząt 9 było krowami, a tylko 1 bykiem. Czy powinnniśmy wierzyć temu bio-inżynierowi? Jakia jest szansa na uzyskanie takiego, bądź bardziej ekstremalnego wyniku przy założeniu, że procedura stosowana przez naszego inżyniera nia ma żadnych efektów? W tym problemie dla odmiany założymy, że w normalnych warunkach 100 spośród 206 cieląt to krowy.&lt;br /&gt;
Zadanie rozwiązać metodą parametryczną i przez repróbkowanie. [[WnioskowanieStatystyczne/_Testowanie_hipotez#Przykład:_mutacje_muszek_owocowych|Wskazówka]]&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
def randsample(x, N):&lt;br /&gt;
	'''zwraca wektor z losowo wybranymi elementami wektora x. Losowanie odbywa się z powtórzeniami''' &lt;br /&gt;
	n=len(x)&lt;br /&gt;
	ind = np.random.randint(n, size = N)&lt;br /&gt;
	y = x[ind]&lt;br /&gt;
	return y&lt;br /&gt;
&lt;br /&gt;
# sposób pierwszy:&lt;br /&gt;
# zmienna urodzenie byka/krowy podlega rozkladowi dwumianowemu &lt;br /&gt;
p = 100.0/206&lt;br /&gt;
N = 10&lt;br /&gt;
k = 9&lt;br /&gt;
p_bino = 1-st.binom.cdf(k-1,N,p) #prawdopodobieństwo wylosowania 9 lub 10 krów w 10 probach &lt;br /&gt;
print('Prawdopodobieństwo wylosowania 9 lub 10 krów w 10 probach: %(p).4f'%{'p':p_bino})&lt;br /&gt;
# W jego mwetodzie chyba cos jest&lt;br /&gt;
&lt;br /&gt;
# sposob drugi: repróbkowanie&lt;br /&gt;
# model swiata z ktorego pochodza byki(0)/krowy(1):&lt;br /&gt;
w = np.concatenate((np.ones(100), np.zeros(106)))&lt;br /&gt;
&lt;br /&gt;
N_rep = 100000&lt;br /&gt;
wynik = np.zeros(N_rep)&lt;br /&gt;
for i in range(N_rep):&lt;br /&gt;
	wynik[i] = np.sum(randsample(w,10))&lt;br /&gt;
&lt;br /&gt;
p_rep = float(np.sum(wynik&amp;gt;=k))/N_rep&lt;br /&gt;
print('Prawdopodobieństwo wylosowania 9 lub 10 krów w 10 probach estymowane z symulacji: %(p).4f'%{'p':p_rep})&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''Odp'':  ''p'' = 0,008. Odrzucamy ''H''&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; o braku efektów.&lt;br /&gt;
&lt;br /&gt;
==Zadanie: Porównanie lekarstwa i placebo==&lt;br /&gt;
Badamy skuteczność leku na raka. Mamy grupę 12 chorych: 6 osobom podajemy lek &amp;amp;mdash; poprawa wystąpiła u 5 osób, pozostałym sześciu osobom podajemy placebo &amp;amp;mdash; poprawa wystąpiła u 2 osób. Czy te wyniki upoważniają do stwierdzenia, że lek istotnie zwiększa szansę poprawy? Test przeprowadzić na poziomie istotności 5%.&lt;br /&gt;
&lt;br /&gt;
Wskazówka: jako statystykę przyjąć różnicę w ilości popraw między grupą z lekiem a grupą z placebo. Interesuje nas prawdopodobieństwo zaobserwowania takiej (3) bądź większej różnicy. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
def randsample(x, N):&lt;br /&gt;
	'''zwraca wektor z losowo wybranymi elementami wektora x. Losowanie odbywa się z powtórzeniami''' &lt;br /&gt;
	n=len(x)&lt;br /&gt;
	ind = np.random.randint(n, size = N)&lt;br /&gt;
	y = x[ind]&lt;br /&gt;
	return y&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Formułujemy hipotezy &lt;br /&gt;
# H0: lek nie daje poprawy &lt;br /&gt;
# H1: lek daje poprawę&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# zgodnie z H0 obie próby pochodzą ze świata:&lt;br /&gt;
# pierwszy sposób: repróbkowanie&lt;br /&gt;
w = np.concatenate((np.ones(7), np.zeros(5))) # jedynki -&amp;gt; wystąpiła poprawa&lt;br /&gt;
&lt;br /&gt;
n_l = 5 # ilosc popraw w grupie leku&lt;br /&gt;
n_p = 2 #ilosc popraw w grupie placebo&lt;br /&gt;
# jako statystykę testową przyjmiemy różnicę w ilości popraw miedzy grupami&lt;br /&gt;
# w tym problemie istotne jest zwiększenie ilości popraw wiec stosujemy test&lt;br /&gt;
# jednostronny&lt;br /&gt;
N_rep = 100000&lt;br /&gt;
&lt;br /&gt;
st_0= n_l - n_p&lt;br /&gt;
st_rep=np.zeros(N_rep)&lt;br /&gt;
&lt;br /&gt;
for i in range(N_rep):&lt;br /&gt;
    n_l_rep   = np.sum(randsample(w,6))&lt;br /&gt;
    n_p_rep   = np.sum(randsample(w,6))&lt;br /&gt;
    st_rep[i] = n_l_rep - n_p_rep # wartość statystyki w i-tym repróbkowaniu&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
p_rep = float(np.sum(st_rep &amp;gt;= st_0))/N_rep&lt;br /&gt;
print('''Prawdopodobieństwo wylosowania takiej samej bądź większej różnicy w ilości popraw estymowane z symulacji: %(p).4f'''%{'p':p_rep})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# drugi sposób:&lt;br /&gt;
# zmienna uzyskanie poprawy podlega rozkładowi dwumianowemu &lt;br /&gt;
p = 7.0/12&lt;br /&gt;
N = 6&lt;br /&gt;
k1 = 5&lt;br /&gt;
k2 = 2&lt;br /&gt;
p_param = 0&lt;br /&gt;
for d in range(N-st_0+1):  # w tej pętli sumujemy prawdopodobieństwa zdarzeń  sprzyjających zaobserwowaniu różnicy co najmniej st_0 popraw &lt;br /&gt;
	p_bino1 = 1-st.binom.cdf(st_0 - 1 +d, N, p)  # prawdopodobieństwo uzyskania poprawy w co najmniej st_0 +d próbach&lt;br /&gt;
	p_bino2 = st.binom.pmf(d,N,p)   # prawdopodobieństwo uzyskania poprawy w d próbach&lt;br /&gt;
	p_param += p_bino1 * p_bino2 # prawdopodobieństwo zaobserwowania jednocześnie obu powyższych sytuacji&lt;br /&gt;
&lt;br /&gt;
print('Prawdopodobieństwo estymowane parametrycznie: %(p).4f'%{'p':p_param})&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: Odp: Prawdopodobieństwo wylosowania takiej samej bądź większej różnicy w ilości popraw estymowane z symulacji: 0,0702&lt;br /&gt;
Prawdopodobieństwo estymowane parametrycznie: 0,0699. Wniosek: nie mamy podstaw do odrzucenia hipotezy zerowej.&lt;br /&gt;
&lt;br /&gt;
==Zadanie: Pomiar masy cząstki elementarnej==&lt;br /&gt;
W pomiarach wstępnych zbadano masę spoczynkową pewnej cząstki elementarnej. Otrzymano następujące wyniki [MeV/c²]:&lt;br /&gt;
&lt;br /&gt;
139.20, 139.34, 140.22, 139.56, 139.42, 139.64, 139.22, 139.74, 139.38, 139.54,&lt;br /&gt;
139.38, 139.46, 140.09, 139.77, 139.52, 139.47, 139.89, 138.95, 139.99, 139.64,&lt;br /&gt;
139.37, 139.49, 139.15, 139.77, 140.10, 139.48, 139.84, 139.44, 140.13&lt;br /&gt;
&lt;br /&gt;
Zbadaj na poziomie istotności 1%, czy cząstką tą mógł być naładowany pion.&lt;br /&gt;
&lt;br /&gt;
Zbadaj na poziomie istotności 1%, czy cząstką tą mógł być neutralny pion.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
&lt;br /&gt;
alfa = 0.01 # poziom istotności&lt;br /&gt;
dane = np.array([139.20, 139.34, 140.22, 139.56, 139.42, 139.64, 139.22, 139.74,&lt;br /&gt;
                 139.38, 139.54, 139.38, 139.46, 140.09, 139.77, 139.52, 139.47,&lt;br /&gt;
                 139.89, 138.95, 139.99, 139.64, 139.37, 139.49, 139.15, 139.77,&lt;br /&gt;
                 140.10, 139.48, 139.84, 139.44, 140.13])&lt;br /&gt;
&lt;br /&gt;
Pi_plus_min = 139.57 # masa pionów naładowanych Pi+ i Pi-&lt;br /&gt;
Pi_neutral = 134.98  # masa pionu neutralnego Pi0&lt;br /&gt;
&lt;br /&gt;
# test t hipotezy H0, że dane pochodzą z rozkładu normalnego o wartości oczekiwanej Pi_plus_min&lt;br /&gt;
t1, p1 = st.ttest_1samp(dane,Pi_plus_min)&lt;br /&gt;
print(&amp;quot;Poziom p dla hipotezy, że był do pion naładowany&amp;quot;,p1)&lt;br /&gt;
if p1&amp;gt;=alfa: print(&amp;quot;Nie możemy odrzucić tej hipotezy na poziomie istotności {}%&amp;quot;.format(100*alfa))&lt;br /&gt;
else: print(&amp;quot;Możemy odrzucić tę hipotezę na poziomie istotności {}%&amp;quot;.format(100*alfa))&lt;br /&gt;
&lt;br /&gt;
# test t hipotezy H0, że dane pochodzą z rozkładu normalnego o średniej Pi_neutral&lt;br /&gt;
t2, p2 = st.ttest_1samp(dane,Pi_neutral)&lt;br /&gt;
print(&amp;quot;\nPoziom p dla hipotezy, że był do pion neutralny&amp;quot;,p2)&lt;br /&gt;
if p2&amp;gt;=alfa: print(&amp;quot;Nie możemy odrzucić tej hipotezy na poziomie istotności {}%&amp;quot;.format(100*alfa))&lt;br /&gt;
else: print(&amp;quot;Możemy odrzucić tę hipotezę na poziomie istotności {}%&amp;quot;.format(100*alfa))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Przykład: Średnie grup sparowanych: Lek przeciwdepresyjny==&lt;br /&gt;
Poniższa tabela prezentuje wyniki 9 pacjentów wykonujących pewien test diagnostyczny przed podaniem leku i po podaniu leku. &lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class='wikitable'&lt;br /&gt;
!przed	&lt;br /&gt;
!po&lt;br /&gt;
|-&lt;br /&gt;
|1,83	&lt;br /&gt;
|0,878&lt;br /&gt;
|-&lt;br /&gt;
|0,50	&lt;br /&gt;
|0,647&lt;br /&gt;
|-&lt;br /&gt;
|1,62	&lt;br /&gt;
|0,598&lt;br /&gt;
|-&lt;br /&gt;
|2,48	&lt;br /&gt;
|2,05&lt;br /&gt;
|-&lt;br /&gt;
|1,68	&lt;br /&gt;
|1,06&lt;br /&gt;
|-&lt;br /&gt;
|1,88	&lt;br /&gt;
|1,29&lt;br /&gt;
|-&lt;br /&gt;
|1,55	&lt;br /&gt;
|1,06&lt;br /&gt;
|-&lt;br /&gt;
|3,06	&lt;br /&gt;
|3,14&lt;br /&gt;
|-&lt;br /&gt;
|1,3	&lt;br /&gt;
|1,29&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
PRZED = [1.83, 0.5, 1.62, 2.48, 1.68, 1.88, 1.55, 3.06, 1.3]&lt;br /&gt;
PO = [0.878, 0.647, 0.598, 2.05, 1.06, 1.29, 1.06, 3.14, 1.29]&lt;br /&gt;
&lt;br /&gt;
Skonstruować test, który pozwoli stwierdzić czy lek jest skuteczny. Porównać różne wersje testu:&lt;br /&gt;
* bootstrapową (losowanie z powtórzeniami), &lt;br /&gt;
* permutacyjną, &lt;br /&gt;
* test parametryczny &lt;br /&gt;
* test nieparametryczny. &lt;br /&gt;
&lt;br /&gt;
Jakie założenia przyjmujemy przy każdej z wersji testu?&lt;br /&gt;
&lt;br /&gt;
===Rozwiązanie===&lt;br /&gt;
W tym zadaniu mamy dwie grupy ''przed'' i ''po'' ale oprócz tego istnieje ścisły porządek w parach, bez sensu jest porównywanie ''przed'' od jednego pacjenta z ''po'' drugiego pacjenta. Musimy stosować testy, które biorą ten porządek pod uwagę (testy pairwise).&lt;br /&gt;
&lt;br /&gt;
Jako miarę tego czy lek jest skuteczny przyjmiemy różnicę (''po'' - ''przed'').  Każda z zaobserwowanych różnic to zmienna losowa. Ich średnia to nasza STATYSTYKA. Będziemy wierzyli, że lek działa jeśli ta różnica jest istotnie mniejsza od zera. Mamy stąd hipotezy:&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;math&amp;gt;H_0: \bar r \geq 0&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;math&amp;gt;H_1: \bar r &amp;lt; 0 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Wersja bootstrapowa====&lt;br /&gt;
&lt;br /&gt;
Założenie, które czynimy w wersji bootstrapowej testu jest następujące:&lt;br /&gt;
Zaobserwowana grupa pacjentów jest reprezentatywna, tzn. istnieje duża populacja pacjentów spośród której moglibyśmy pobrać wiele innych grup podobnych pod względem interesujących nas parametrów do grupy zaobserwowanej w tym konkretnym eksperymencie. Konsekwencją tego założenia jest to, że jeśli w naszej grupie mamy już pacjenta z wynikami: [1.83,	0.878], to szansa na wylosowanie kolejnego pacjenta o takich wynikach się nie zmienia i nadal wynosi 1/9. Prowadzi to do implementacji zawierającej losowanie z powtórzeniami.&lt;br /&gt;
&lt;br /&gt;
Losowość występuje tu w dwóch miejscach:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; losujemy pacjentów z powtórzeniami - zakładamy, że badana grupa jest reprezentatywna dla bardzo dużej populacji.&lt;br /&gt;
&amp;lt;li&amp;gt; dla każdego z wybranych pacjentów losujemy jego wynik ''przed'' oraz wynik ''po'' z wyników, które uzyskał w rzeczywistości --- to jest zgodne z hipotezą zerową.&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Dla każdego losowania obliczamy wartość statystyki w tym losowania uśredniając  różnice indywidualne.&lt;br /&gt;
Wartości statystyki otrzymane dla wszystkich losowań tworzą jej empiryczny rozkład, przy założeniu, że hipoteza zerowa jest prawdziwa. Jako estymator prawdopodobieństwa zaobserwowania oryginalnej wartości statystyki ''mr'' (średnia różnica) przy prawdziwej hipotezie zerowej przyjmujemy frakcję rozkładu empirycznego, w której wartości statystyki były nie większe niż ''mr''. Wynik ilustrujemy histogramem rozkładu empirycznego z zaznaczoną ową frakcją.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
def randsample(x, N):&lt;br /&gt;
	'''zwraca wektor z losowo wybranymi elementami wektora x. &lt;br /&gt;
         Losowanie odbywa się z powtórzeniami''' &lt;br /&gt;
&lt;br /&gt;
	n=len(x)&lt;br /&gt;
	ind = np.random.randint(n, size = N)&lt;br /&gt;
	y = x[ind]&lt;br /&gt;
	return y&lt;br /&gt;
&lt;br /&gt;
def hist_z_markerem(x, N_bins, marker):&lt;br /&gt;
	'''Rysuje histogram wartości w tablicy x, używając N_bins binów. &lt;br /&gt;
	Na lewo od wartości wskazanej przez marker dorysowywany jest prostokąt'''&lt;br /&gt;
	&lt;br /&gt;
	r = np.max(x) - np.min(x)&lt;br /&gt;
	szer_binu = r/N_bins&lt;br /&gt;
&lt;br /&gt;
	#konstruujemy biny&lt;br /&gt;
        # robimy biny od markera co szerokość binu aż do x minimalnego&lt;br /&gt;
	biny_na_lewo = np.arange( marker, np.min(x), -szer_binu)&lt;br /&gt;
        # odwracamy kolejność tej sekwencji żeby była rosnąca&lt;br /&gt;
	biny_na_lewo = biny_na_lewo[-1::-1] &lt;br /&gt;
         # robimy biny od markera co szerokość binu aż do x maksymalnego&lt;br /&gt;
	biny_na_prawo = np.arange(marker,np.max(x), szer_binu)&lt;br /&gt;
        # sklejamy oba zakresy binów&lt;br /&gt;
	biny = np.concatenate((biny_na_lewo, biny_na_prawo))&lt;br /&gt;
	(n,xx,patch) = py.hist(x,bins = biny)&lt;br /&gt;
	py.fill([np.min(xx), np.min(xx), marker, marker] , [0, np.max(n), np.max(n), 0] ,'r' ,alpha = 0.2)&lt;br /&gt;
&lt;br /&gt;
A=np.array([[1.83,	0.878],&lt;br /&gt;
[0.50,	0.647],&lt;br /&gt;
[1.62,	0.598],&lt;br /&gt;
[2.48,	2.05],&lt;br /&gt;
[1.68,	1.06],&lt;br /&gt;
[1.88,	1.29],&lt;br /&gt;
[1.55,	1.06],&lt;br /&gt;
[3.06,	3.14],&lt;br /&gt;
[1.30,	1.29]])&lt;br /&gt;
&lt;br /&gt;
r = A[:,1] - A[:,0] # od drugiej kolumny odejmuję pierwszą&lt;br /&gt;
mr = np.mean(r)  # średnia z tych różnic to wartość statystyki zaobserwowana dla oryginalnych danych&lt;br /&gt;
print( 'średnia różnica: %(mr).2f'%{'mr':mr})&lt;br /&gt;
&lt;br /&gt;
N = len(r)&lt;br /&gt;
&lt;br /&gt;
N_rep = 100000&lt;br /&gt;
r_boot = np.zeros(N_rep)&lt;br /&gt;
przed = np.zeros(N)&lt;br /&gt;
po = np.zeros(N)&lt;br /&gt;
&lt;br /&gt;
for i in range(N_rep):&lt;br /&gt;
    ix=randsample(np.arange(0,N,1),N) # wybieramy pacjentów z powtórzeniami&lt;br /&gt;
    B=np.array(A[ix,:])&lt;br /&gt;
    for j in range(N):   # mieszamy losowo przypisując wyniki do grupy przed i po&lt;br /&gt;
                         # zakładając, że pacjent może uzyskać dwukrotnie taki sam wynik&lt;br /&gt;
        s = np.random.rand()&lt;br /&gt;
        if s &amp;gt; 0.5:&lt;br /&gt;
            przed[j]=B[j,0]&lt;br /&gt;
        else:&lt;br /&gt;
            przed[j]=B[j,1]&lt;br /&gt;
        s = np.random.rand()&lt;br /&gt;
        if s &amp;gt; 0.5:&lt;br /&gt;
            po[j]=B[j,1]&lt;br /&gt;
        else:&lt;br /&gt;
            po[j]=B[j,0]&lt;br /&gt;
    rr=po-przed&lt;br /&gt;
    r_boot[i] = np.mean(rr)&lt;br /&gt;
&lt;br /&gt;
hist_z_markerem(r_boot,30,mr)&lt;br /&gt;
p_h0 = np.sum( r_boot &amp;lt;=  mr)/N_rep&lt;br /&gt;
s_boot = u'dla repróbkowanego testu jednostronnego: %(p_h0).5f'%{'p_h0': p_h0}&lt;br /&gt;
print( s_boot)&lt;br /&gt;
py.title(s_boot)&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Wersja permutacyjna====&lt;br /&gt;
&lt;br /&gt;
W tym teście zakładamy, że grupa pacjentów jest unikalna, więc w procedurze wytwarzania empirycznego rozkładu statystyki  korzystamy z danych wszystkich pacjentów w każdej iteracji. &lt;br /&gt;
&lt;br /&gt;
Zgodnie z hipotezą zerową pomiary ''przed'' i ''po'' są równoważne można je zatem zamieniać. Wykonamy wszystkie możliwe zamiany ''przed'' i ''po''. Możliwych zamian jest &amp;lt;math&amp;gt;2^N&amp;lt;/math&amp;gt;.  Skorzystamy z faktu, że bity w reprezentacji binarnej liczb całkowitych od 0 do &amp;lt;math&amp;gt;2^{N-1}&amp;lt;/math&amp;gt; zawierają wszystkie możliwe permutacje ciągów zer i jedynek o długości ''N''. Wartości 1 zamienimy na logiczne True a wartości 0 na False. Zinterpretujemy True jako zamianę  i False jako brak zamiany. &lt;br /&gt;
&lt;br /&gt;
Dla każdej permutacji obliczamy wartość statystyki uśredniając  różnice indywidualne.&lt;br /&gt;
Wartości statystyki otrzymane dla wszystkich permutacji tworzą jej empiryczny rozkład, przy założeniu, że hipoteza zerowa jest prawdziwa. Jako estymator prawdopodobieństwa zaobserwowania oryginalnej wartości statystyki ''mr'' przy prawdziwej hipotezie zerowej przyjmujemy frakcję rozkładu empirycznego, w której wartości statystyki były nie większe niż ''mr''. Wynik ilustrujemy histogramem rozkładu empirycznego z zaznaczoną ową frakcją. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
 &lt;br /&gt;
def dec2bin(n, l):&lt;br /&gt;
    '''konwertuje dziesiętną liczbę całkowitą na tablicę &lt;br /&gt;
    przedstawiającą reprezentację binarną tej liczby&lt;br /&gt;
    n liczba do konwersji&lt;br /&gt;
    l długość reprezentacji binarnej &lt;br /&gt;
    zwracana jest binarna reprezentacja liczby &lt;br /&gt;
    skonwertowana do tablicy logicznej (0-&amp;gt;False, 1-&amp;gt; True)&lt;br /&gt;
    '''&lt;br /&gt;
    b = np.zeros(l, dtype = bool)&lt;br /&gt;
    if n &amp;lt; 0:  raise ValueError(&amp;quot;must be a positive integer&amp;quot;)&lt;br /&gt;
    i = 1&lt;br /&gt;
    while n &amp;gt; 0:&lt;br /&gt;
        b[l-i] = bool( n % 2 ) &lt;br /&gt;
        n = n &amp;gt;&amp;gt; 1&lt;br /&gt;
        i += 1&lt;br /&gt;
    return b&lt;br /&gt;
 &lt;br /&gt;
def hist_z_markerem(x, N_bins, marker):&lt;br /&gt;
	'''Rysuje histogram wartości w tablicy x, używając N_bins binów. &lt;br /&gt;
	Na lewo od wartości wskazanej przez marker dorysowywany jest prostokąt'''&lt;br /&gt;
 &lt;br /&gt;
	r = np.max(x) - np.min(x)	&lt;br /&gt;
	szer_binu = r/N_bins&lt;br /&gt;
 &lt;br /&gt;
	#konstruujemy biny&lt;br /&gt;
        # robimy biny od markera co szerokość binu aż do x minimalnego&lt;br /&gt;
	biny_na_lewo = np.arange( marker, np.min(x), -szer_binu)&lt;br /&gt;
        # odwracamy kolejność tej sekwencji żeby była rosnąca&lt;br /&gt;
	biny_na_lewo = biny_na_lewo[-1::-1] &lt;br /&gt;
         # robimy biny od markera co szerokość binu aż do x maksymalnego&lt;br /&gt;
	biny_na_prawo = np.arange(marker,np.max(x), szer_binu)&lt;br /&gt;
        # sklejamy oba zakresy binów&lt;br /&gt;
	biny = np.concatenate((biny_na_lewo, biny_na_prawo))&lt;br /&gt;
	(n,xx,patch) = py.hist(x,bins = biny )&lt;br /&gt;
	py.fill([np.min(xx), np.min(xx), marker, marker] , [0, np.max(n), np.max(n), 0] ,'r' ,alpha = 0.2)&lt;br /&gt;
 &lt;br /&gt;
A=np.array([[1.83, 0.878], [0.50, 0.647], [1.62, 0.598], [2.48, 2.05], [1.68, 1.06], [1.88, 1.29], [1.55, 1.06], [3.06, 3.14], [1.30, 1.29]])&lt;br /&gt;
 &lt;br /&gt;
r = A[:,1] - A[:,0] # od drugiej kolumny odejmuję pierwszą&lt;br /&gt;
mr = np.mean(r)  # średnia z tych różnic to wartość statystyki zaobserwowana dla oryginalnych danych&lt;br /&gt;
print( 'średnia różnica: %(mr).2f'%{'mr':mr} )&lt;br /&gt;
 &lt;br /&gt;
N = len(r)&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
N_perm = 2**N&lt;br /&gt;
r_perm = np.zeros(N_perm)&lt;br /&gt;
for i in range(2**N):&lt;br /&gt;
	B = np.array(A)   # B zawiera kopię tablicy A&lt;br /&gt;
	zamiana = dec2bin(i,N) # w których wierszach dokonać zamiany?&lt;br /&gt;
	# print( i,': ', zamiana )&lt;br /&gt;
	# wiersze tablicy B wskazane przez True w wektorze indeksów ind zamieniamy wartości  'przed' z wartościami 'po'&lt;br /&gt;
	B[zamiana, 0] = A[zamiana, 1] &lt;br /&gt;
	B[zamiana, 1] = A[zamiana, 0]&lt;br /&gt;
	rr = B[:,1] - B[:,0] # Obliczam wartości zmiennych losowych dla tej zamiany&lt;br /&gt;
	r_perm[i] = np.mean(rr) # Obliczmy wartość statystyki dla tej zamiany&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
p_h0 = np.sum( r_perm &amp;lt;=  mr)/N_perm&lt;br /&gt;
s_perm = u'dla permutacyjnego testu jednostronnego: %(p_h0).3f'%{'p_h0': p_h0}&lt;br /&gt;
print( s_perm)&lt;br /&gt;
hist_z_markerem(r_perm,30,mr)&lt;br /&gt;
py.title(s_perm)&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Wersja parametryczna====&lt;br /&gt;
&lt;br /&gt;
Jeśli badane różnice ''przed'' i ''po'' podlegają rozkładowi normalnemu to do testowania czy średnia wartość różnicy jest równa 0 można zastosować test ''t'' dla prób zależnych &amp;lt;tt&amp;gt;st.ttest_rel()&amp;lt;/tt&amp;gt;. Aby się upewnić, że możemy zastosować ten test badamy normalność różnic przy pomocy &amp;lt;tt&amp;gt;normplot()&amp;lt;/tt&amp;gt; oraz testu Shapiro-Wilka &amp;lt;tt&amp;gt;st.shapiro()&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
 &lt;br /&gt;
def normplot(x):&lt;br /&gt;
	'''normplot: x dane do testowania'''&lt;br /&gt;
 &lt;br /&gt;
	x_ord = sorted(x)&lt;br /&gt;
	N = len(x)&lt;br /&gt;
	y = np.zeros(N)&lt;br /&gt;
	y[0]=st.norm.ppf(1- 0.5**(1.0/N) )&lt;br /&gt;
	y[N-1] = st.norm.ppf(0.5**(1.0/N) )&lt;br /&gt;
	for i in range(1,N-1):&lt;br /&gt;
		arg = (i-0.3175)/(N+0.365)&lt;br /&gt;
		y[i] = st.norm.ppf(arg)&lt;br /&gt;
	py.plot(y,x_ord,'.')&lt;br /&gt;
 &lt;br /&gt;
A=np.array([[1.83, 0.878], [0.50, 0.647], [1.62, 0.598], [2.48, 2.05], [1.68, 1.06], [1.88, 1.29], [1.55, 1.06], [3.06, 3.14], [1.30, 1.29]])&lt;br /&gt;
&lt;br /&gt;
r = A[:,1] - A[:,0] # od drugiej kolumny odejmuję pierwszą&lt;br /&gt;
&lt;br /&gt;
normplot(r)&lt;br /&gt;
py.title(&amp;quot;Wyniki testów na normalność różnic\n Shapiro-Wilka:  W=%.3f, p=%.3f&amp;quot;%st.shapiro(r)&lt;br /&gt;
        +&amp;quot;\nKołmogorowa-Smirnowa: D=%.3f, p=%.3f&amp;quot;%st.kstest(r, 'norm', args=(np.mean(r),np.std(r,ddof=1))))&lt;br /&gt;
t, p = st.ttest_rel(A[:,1],A[:,0])&lt;br /&gt;
p_t = p/2 # aby test był jednostronny&lt;br /&gt;
s_t = u'dla parametrycznego testu jednostronnego: %(p_h0).3f'%{'p_h0': p_t}&lt;br /&gt;
print(s_t)&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Wersja nieparametryczna====&lt;br /&gt;
&lt;br /&gt;
W ogólności, nie zakładając normalności różnic można by przeprowadzić test Wilcoxona. W aktualnej implementacji tego testu w scipy.stats jest on dla naszych danych niedokładny, gdyż mamy małą liczebność grupy, a implementacja stosuje przybliżenia asymptotyczne.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
A=np.array([[1.83, 0.878], [0.50, 0.647], [1.62, 0.598], [2.48, 2.05], [1.68, 1.06], [1.88, 1.29], [1.55, 1.06], [3.06, 3.14], [1.30, 1.29]])&lt;br /&gt;
z, p = st.wilcoxon(A[:,1],A[:,0] )&lt;br /&gt;
p_w = p/2 # aby test był jednostronny&lt;br /&gt;
s_w = u'dla nieparametrycznego testu jednostronnego: %(p_h0).3f'%{'p_h0': p_w}&lt;br /&gt;
print( s_w)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Podsumowanie====&lt;br /&gt;
 średnia różnica: -0.43&lt;br /&gt;
 dla repróbkowanego testu jednostronnego: 0.0013&lt;br /&gt;
 dla permutacyjnego testu jednostronnego: 0.014&lt;br /&gt;
 Wynik testu Shapiro-Wilka na normalność różnic &lt;br /&gt;
 	 statystyka W: 0.921 &lt;br /&gt;
 	 prawdopodobieństwo takiej wartości statystyki dla rozkładu normalnego: 0.404&lt;br /&gt;
 dla parametrycznego testu jednostronnego: 0.008&lt;br /&gt;
 dla nieparametrycznego testu jednostronnego: 0.019&lt;br /&gt;
&lt;br /&gt;
Wszystkie testy wskazują prawdopodobieństwo zaobserwowania odpowiadających im statystyk poniżej przyjętego poziomu istotności &amp;lt;math&amp;gt;\alpha = 0.05&amp;lt;/math&amp;gt;. Zatem hipotezę zerową należy odrzucić i przyjąć hipotezę alternatywną.&lt;br /&gt;
&lt;br /&gt;
==Zadania==&lt;br /&gt;
&lt;br /&gt;
===Zanieczyszczenie środowiska===&lt;br /&gt;
Agencja ochrony środowiska ustaliła limit na koncentrację zanieczyszczeń emitowanych przez fabryki. Załóżmy, że dopuszczalny poziom zanieczyszczeń wynosi 55 cząstek na milion (cz/m) w promieniu dwóch kilometrów od fabryki. Kontrola przeprowadza 100 pomiarów o różnej porze dnia i roku w promieniu dwóch km od pewnej fabryki. Średnia z próby wyniosła 60 cz/m a odchylenie standardowe &amp;lt;math&amp;gt;s = 20&amp;lt;/math&amp;gt; cz/m. Czy dane te są wystarczające by na poziomie istotności &amp;lt;math&amp;gt;\alpha = 0,01&amp;lt;/math&amp;gt; uznać, że fabryka łamie prawo?&lt;br /&gt;
&lt;br /&gt;
Fabryka łamie prawo jeśli emituje zanieczyszczenia na poziomie wyższym niż dopuszczalny więc należy przeprowadzić test jednostronny (w tym przypadku prawostronny). Czy moglibyśmy odrzucić &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; na tym samym poziomie stosując test dwustronny?&lt;br /&gt;
Jest ważne aby w zależności od problemu wybrać odpowiedni test: jedno- lub dwustronny.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import numpy as np&lt;br /&gt;
 &lt;br /&gt;
x_c = 55 #cząstek na milion (cz/m) w promieniu dwóch kilometrów od fabryki. &lt;br /&gt;
#Kontrola przeprowadza &lt;br /&gt;
N = 100 # pomiarów o różnej porze dnia i roku w promieniu dwóch km. od pewnej fabryki. &lt;br /&gt;
#średnia z próby wyniosła &lt;br /&gt;
x_s = 60 # cz/m &lt;br /&gt;
# a odchylenie standardowe &lt;br /&gt;
s = 20 # cz/m. &lt;br /&gt;
# Czy dane te są wystarczające by uznać, że fabryka łamie prawo ?&lt;br /&gt;
alpha = 0.01&lt;br /&gt;
 &lt;br /&gt;
# H0: mu &amp;lt;=x_c&lt;br /&gt;
# H1: mu &amp;gt; x_c&lt;br /&gt;
# wystarczy sprawdzić jakie jest p dla największego dopuszczalnego stężenia &lt;br /&gt;
# mu = x_c zaobserwowania wartości średniej większej bądź równej zaobserwowanej x_s. &lt;br /&gt;
# Odchylenie std. dane jest dla populacji i trzeba je przeliczyć na odchylenie std. średniej.&lt;br /&gt;
p = 1 - st.t.cdf(x_s, df=N-1, loc = x_c, scale = s/np.sqrt(N) )&lt;br /&gt;
print(&amp;quot;poziom p&amp;quot;,p)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
############################&lt;br /&gt;
#inne (tożsame) rozwiązania:&lt;br /&gt;
&lt;br /&gt;
##wykorzystaniem &amp;quot;Survival function&amp;quot; zamiast dystrybuanty&lt;br /&gt;
p = st.t.sf(x_s, df=N-1, loc = x_c, scale = s/np.sqrt(N) )&lt;br /&gt;
print(&amp;quot;poziom p&amp;quot;,p)&lt;br /&gt;
&lt;br /&gt;
##obliczając statystykę t&lt;br /&gt;
t=(x_s-x_c)/(s/N**0.5)&lt;br /&gt;
p = 1-st.t.cdf(t,df=N-1)&lt;br /&gt;
print(&amp;quot;poziom p&amp;quot;,p)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Odp. &amp;lt;math&amp;gt;p=0,007&amp;lt;\alpha&amp;lt;/math&amp;gt;, zatem możemy odrzucić hipotezę &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; (głoszącą, że fabryka nie łamie prawa) na poziomie &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;  = 0,01.&lt;br /&gt;
&lt;br /&gt;
===Wzrost mocy turbin===&lt;br /&gt;
Turbina hydroelektryczna generuje moc średnią 25,2 kW. Po unowocześnieniu maszyny chcemy przetestować czy średnia moc generowana zmieniła się (na + lub &amp;amp;minus;). Przeprowadzono 115 pomiarów, które dały średnią 26,1 kW i odch. std. 3,2 kW. Przeprowadzić test statystyczny na poziomie istotności 1%, zinterpretować wynik. Wnioskowanie przeprowadzić także w oparciu oprzedział ufności.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
#-*- coding:utf-8 -*-&lt;br /&gt;
import numpy as np&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
N=115&lt;br /&gt;
m=25.2	#hipoteza zerowa mówi, że tyle wynosi moc&lt;br /&gt;
sr=26.1	#w pomiarach uzyskaliśmy taką średnią moc&lt;br /&gt;
s=3.2	#przy takim odchyleniu standardowym&lt;br /&gt;
&lt;br /&gt;
alfa=0.01&lt;br /&gt;
&lt;br /&gt;
#obliczenie poziomu p&lt;br /&gt;
t=(m-sr)/(s/N**0.5)&lt;br /&gt;
p = st.t.cdf(t,df=N-1) * 2 #mnozymy przez 2, bo chcemy testu dwustronnego&lt;br /&gt;
print(&amp;quot;poziom p&amp;quot;,p)&lt;br /&gt;
&lt;br /&gt;
#alternatywnie - obliczenie przedziału ufności&lt;br /&gt;
lo,hi = st.t.ppf([alfa/2, 1-alfa/2],df=N-1,loc=sr,scale=s/N**0.5)&lt;br /&gt;
print(&amp;quot;przedzial ufnosci [%.3g,%.3g]&amp;quot;%(lo,hi))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Odp.: &amp;lt;math&amp;gt;p=0,\!003&amp;lt;\alpha=0,\!01&amp;lt;/math&amp;gt;, zatem odrzucamy H0.&lt;br /&gt;
&lt;br /&gt;
Odp. (alt.): &amp;lt;math&amp;gt;\mu = 25,\!2 \not\in[25,\!3; 26,\!9]&amp;lt;/math&amp;gt;, zatem odrzucamy H0.&lt;br /&gt;
&lt;br /&gt;
===Sonda===&lt;br /&gt;
Władze miasta chciałyby wiedzieć, czy przyznać koncesję operatorowi sieci kablowej. W tym celu zleciły nam przeprowadzenie sondy wśród mieszkańców. Zapytaliśmy o zdanie 50 przypadkowo wybranych osób. 30 osób powiedziało &amp;amp;bdquo;tak&amp;amp;rdquo; a 20 &amp;amp;bdquo;nie&amp;amp;rdquo;. Na ile pewnie otrzymane wyniki wskazują, że mieszkańcy chcą tej kablówki?&lt;br /&gt;
&lt;br /&gt;
Celem naszych badań jest uniknięcie błędu polegającego na tym, że powiemy iż większość mieszkańców chce kablówki podczas gdy tak na prawdę to nie chce. &lt;br /&gt;
&lt;br /&gt;
Wskazówka: Granicznym przypadkiem popełnienia tego błędu jest proporcja 1:1 zwolenników i przeciwników kablówki. Jeśli przeciwników kablówki byłoby jeszcze więcej to uzyskanie naszych wyników byłoby jeszcze mniej prawdopodobne.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import numpy.random as rnd&lt;br /&gt;
&lt;br /&gt;
N=50&lt;br /&gt;
odp_na_tak=30&lt;br /&gt;
odp_na_nie=20&lt;br /&gt;
&lt;br /&gt;
#przypadek graniczny, który daje najwyższe prawdopodobieństwo uzyskania fałszywego wyniku na 'tak',&lt;br /&gt;
#to mieszkańcy niezdecydowani, czyli proporcja 1:1&lt;br /&gt;
#(proporcja przechylona w kierunki 'nie', da nam niższe oszacowanie,&lt;br /&gt;
#a proporcja przechylona w kierunku 'tak' nie oznaczałaby fałszywego wyniku sondy)&lt;br /&gt;
#zatem hipoteza zerowa brzmi, że nasz wynik pochodzi z populacji niezdecydowanej:&lt;br /&gt;
P=0.5 #prawdopodobieństwo, że respondent udzieli odpowiedzi na 'tak'&lt;br /&gt;
# jest to najwyższe prawdopodobieństwo jeszcze fałszywego wyniku&lt;br /&gt;
&lt;br /&gt;
#rozwiązanie parametryczne wymaga użycia rozkładu dwumianowego:&lt;br /&gt;
p = 1 - st.binom.cdf(29,50,P) #od 1 odejmujemy sumaryczne prawdopodobieństwo wszystkich przypadków udzielenia mniej niż 30 odpowiedzi na tak (czyli do 29 włącznie)&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;poziom p (parametrycznie)&amp;quot;,p)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#rozwiązanie przez symulację:&lt;br /&gt;
Nrand=100000&lt;br /&gt;
R=0 #rezultat, czyli liczba przypadków, w których przynajmniej 30 osób odpowiedziało tak&lt;br /&gt;
for i in range(Nrand):&lt;br /&gt;
	odpowiedzi = (rnd.random(N)&amp;lt;P) #losujemy odpowiedzi od N osób&lt;br /&gt;
	if odpowiedzi.sum() &amp;gt;=odp_na_tak: #jeśli zdarzyło się co najmniej 30 odpowiedzi na tak, to dodajemy jeden do liczby takich przypadków&lt;br /&gt;
		R+=1&lt;br /&gt;
	&lt;br /&gt;
print(&amp;quot;poziom p (z symulacji)&amp;quot;,R/Nrand) #na koniec dzielimy przez liczbę wszystkich sond w symulacji&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Wybory prezydenckie===&lt;br /&gt;
W ankiecie uzyskaliśmy 840 głosów popierających kandydaturę A i 660 kandydaturę B. Jaka jest szansa, że tak naprawdę kandydat B ma  poparcie 50% lub większe? Jakie jest prawdopodobieństwo pojawienia sie zaobserwowanej próbki lub próbki wskazującej na jeszcze większe poparcie dla kandydata A, jeśli w rzeczywistości poparcie kandydata A byłoby  50% lub mniej.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import numpy.random as rnd&lt;br /&gt;
&lt;br /&gt;
# rozwiązanie parametryczne&lt;br /&gt;
A = 840&lt;br /&gt;
B = 660&lt;br /&gt;
N = A+B&lt;br /&gt;
&lt;br /&gt;
#przypadek graniczny, który daje najwyższe prawdopodobieństwo uzyskania fałszywego wyniku na 'tak',&lt;br /&gt;
#to mieszkańcy niezdecydowani, czyli propocja 1:1&lt;br /&gt;
#propocja przechylona w kierunki 'nie', da nam niższe oszacowanie&lt;br /&gt;
#a propocja przechylona w kierunku 'tak' nie oznaczałaby fałszywego wyniku sondy&lt;br /&gt;
#zatem hipoteza zerowa brzmi, że nasz wynik pochodzi z populacji niezdecydowanej:&lt;br /&gt;
p_sukces = 0.5&lt;br /&gt;
&lt;br /&gt;
#rozwiązanie parametryczne&lt;br /&gt;
p = 1 - st.binom.cdf(A-1,N,p_sukces)&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;poziom p (parametrycznie)&amp;quot;,p)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#rozwiązanie przez symulację:&lt;br /&gt;
&lt;br /&gt;
#wiemy już, że musimy oszacować bardzo niskie prawdopodobieństwo, zatem symulacja musi być długa&lt;br /&gt;
#(gdybyśmy nie wiedzieli, to łatwo byśmy zauważyli, że krótka symulacja nie daje w ogóle zdarzeń sprzyjających dając wynik p=0)&lt;br /&gt;
#niestety trzeba pokusić się o optymalizację (mimo to kod będzie się wykonywał kilkadziesiąt sekund do kilku minut):&lt;br /&gt;
#chemy mieć przynajmniej 10^7 sond, ale każda sonda to 1500 odpowiedzi, zatem łącznie musimy wylosować 1.5*10^10 liczb&lt;br /&gt;
#losowanie w pętli 10^7 razy kolejnych sond po 1500 odpowiedzi zajmie bardzo bardzo dużo czasu&lt;br /&gt;
#tablica 1.5*10^10 odpowiedzi wygenerowana jednym poleceniem nie zmieści się w pamięci&lt;br /&gt;
#musimy skorzystać z rozwiązania pośredniego&lt;br /&gt;
#będziemy losować 100 razy po 1.5*10^8 odpowiedzi i dodamy wyniki&lt;br /&gt;
&lt;br /&gt;
Nrand_1=100    # 10^2&lt;br /&gt;
Nrand_2=100000 # 10^5&lt;br /&gt;
N = A+B        # 1.5*10^3&lt;br /&gt;
&lt;br /&gt;
Nrand_total = Nrand_1*Nrand_2&lt;br /&gt;
&lt;br /&gt;
R=0 #liczba sond, w których kandydat A uzyskał poparcie 840 lub większe&lt;br /&gt;
#po każdym przebiegu pętli będziemy dodawać liczbę takich przypadków (jeśli wystąpiły w danej iteracji)&lt;br /&gt;
&lt;br /&gt;
for i in range(Nrand_1):&lt;br /&gt;
	#w każdej iteracji losujemy odpowiedzi od N osób w Nrand_2 sondach&lt;br /&gt;
	#iteracji będzie w sumie Nrand_1, co da nam łącznie N osób w Nrand_total sondach&lt;br /&gt;
	#jako, że zakładamy równe prawdopodobieństwo, to może możemy wylosować tablicę zawierającą tylko 0 i 1&lt;br /&gt;
	#gdzie 1 oznacza sukces (głos na kandydata A), a 0 porażkę&lt;br /&gt;
	#korzystając z funksji randint, która zwraca (pseudo)losowe liczby całkowite z zakresu [a,b)&lt;br /&gt;
	a,b = 0,2 &lt;br /&gt;
	odpowiedzi = rnd.randint(a,b,size=(N,Nrand_2)) &lt;br /&gt;
	S = np.sum(odpowiedzi,axis=0)  #wyniki kolejnych sond (sumujemy sukcesy w wierszach)&lt;br /&gt;
&lt;br /&gt;
	R+=np.sum(S&amp;gt;=A) #dodajemy liczbę sond, w których kandydat A uzyskał poparcie 840 lub większe (w danej iteracji pętli)&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;poziom p (z symulacji)&amp;quot;,R/Nrand_total) #na koniec dzielimy przez liczbę wszystkich sond w symulacji&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Czy stosunek do marihuany się zmienił?===&lt;br /&gt;
Rozważmy dwie ankiety przeprowadzone w USA, pytano 1500 respondentów o stosunek do legalizacji marihuany. Pierwszą ankietę przeprowadzono w 1980, wówczas za legalizacją opowiadało się 52% a drugą w 1985 i za legalizacją było 46%. Czy wyniki tych dwóch ankiet są istotnie różne?&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
# rozwiązanie parametryczne&lt;br /&gt;
za1 = int(0.52*1500)&lt;br /&gt;
za2 = int(0.46*1500)&lt;br /&gt;
N = 1500&lt;br /&gt;
&lt;br /&gt;
# H0: stosunek się nie zmienił zatem p_za było w obu anlietach takie samo:&lt;br /&gt;
p_za = (0.52+0.46)/2&lt;br /&gt;
&lt;br /&gt;
# Jakie jest prawdopodobieństwo zaobserwowoania wyników ankiet o takiej bądź większej &lt;br /&gt;
# różnicy głosów za, jeśli obie są zgodne z H0 ?&lt;br /&gt;
D = za1 - za2&lt;br /&gt;
&lt;br /&gt;
#musimy zsumować wszystkie możliwości, w których wystąpiła taka różnica lub większa&lt;br /&gt;
#zrobimy to w pętli&lt;br /&gt;
p_binom = 0.0&lt;br /&gt;
for k in range(N-D+1):&lt;br /&gt;
	p1 = st.binom.pmf(k,N,p_za) # prawdopodobieństwo uzyskania dokładnie k głosów za&lt;br /&gt;
	&lt;br /&gt;
	# sumujemy prawdopodobieństwa uzyskania liczby głosów różnej przynajmniej o D&lt;br /&gt;
	przypadki_o_roznicy_przynajmniej_D = np.arange(k+D,N+1)&lt;br /&gt;
	p2 = np.sum(st.binom.pmf(przypadki_o_roznicy_przynajmniej_D,N,p_za))&lt;br /&gt;
	#co jest równoważne:&lt;br /&gt;
	#p2 = 1-st.binom.cdf(k+D-1,N,p_za)&lt;br /&gt;
	&lt;br /&gt;
	#sumujemy dla kolejnych k&lt;br /&gt;
	p_binom += p1*p2 # mnożymy prawdopodobieństwa ponieważ są wyniki obu sond są niezależne&lt;br /&gt;
	&lt;br /&gt;
p=2*p_binom #mnożymy przez 2, ponieważ robimy test dwustronny (różnica mogła wystąpić również w drugą stronę)&lt;br /&gt;
print(&amp;quot;p =&amp;quot;,p)&lt;br /&gt;
&lt;br /&gt;
# rozwiązanie symulacyjne (tym razem skorzystamy z randsample)&lt;br /&gt;
def randsample(x, N):&lt;br /&gt;
	'''zwraca wektor z losowo wybranymi elementami wektora x. Losowanie odbywa się z powtórzeniami''' &lt;br /&gt;
	n=len(x)&lt;br /&gt;
	ind = np.random.randint(n, size = N)&lt;br /&gt;
	y = x[ind]&lt;br /&gt;
	return y&lt;br /&gt;
&lt;br /&gt;
N_rep = 100000&lt;br /&gt;
# świat zgodny z H0:&lt;br /&gt;
H0 = np.concatenate((np.zeros(N*(1-p_za)), np.ones(N*p_za)))&lt;br /&gt;
&lt;br /&gt;
a = np.zeros(N_rep)&lt;br /&gt;
for i in range(N_rep):&lt;br /&gt;
	w1 = np.sum(randsample(H0,N))&lt;br /&gt;
	w2 = np.sum(randsample(H0,N))&lt;br /&gt;
	a[i] = np.abs(w1-w2)&lt;br /&gt;
p = np.sum(a&amp;gt;=D)/N_rep&lt;br /&gt;
print(p)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zawały serca i cholesterol===&lt;br /&gt;
Badano grupę 605 osób. 135 osób z tej grupy miało wysoki poziom cholesterolu a 470 niski. W grupie z wysokim poziomem cholesterolu odnotowano 10 przypadków zawału serca a w grupie z niskim poziomem 21, w czasie 16 lat obserwacji. Nasze pytanie brzmi: Czy możemy uznać, że wysoki poziom cholesterolu zwiększa ryzyko zawału serca?&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
# rozwiązanie parametryczne&lt;br /&gt;
wysoki = 135&lt;br /&gt;
niski = 470&lt;br /&gt;
N = 605&lt;br /&gt;
wysoki_zawaly = 10&lt;br /&gt;
niski_zawaly = 21&lt;br /&gt;
N_zaw = wysoki_zawaly + niski_zawaly &lt;br /&gt;
&lt;br /&gt;
# H0: proporcja zawałowców w obu grupach taka sama:&lt;br /&gt;
p_zawalu = N_zaw/N&lt;br /&gt;
# H1: proporcja jest różna, test jednostronny (wysoki cholesterol ZWIĘKSZA ryzyko)&lt;br /&gt;
&lt;br /&gt;
# Jakie jest prawdopodobieństwo zaobserwowania wyników badania o takiej bądź większej &lt;br /&gt;
# różnicy proporcji zawałów, jeśli obie są zgodne z H0 ?&lt;br /&gt;
roznica = wysoki_zawaly/wysoki - niski_zawaly/niski&lt;br /&gt;
&lt;br /&gt;
p_binom = 0.0&lt;br /&gt;
for k_wys in range(wysoki+1):&lt;br /&gt;
	p_wys = st.binom.pmf(k_wys,wysoki,p_zawalu) # prawdopodobieństwo uzyskania k_wys zawałów grupie o liczebności wysoki&lt;br /&gt;
	for k_nis in range(niski+1): &lt;br /&gt;
		if k_wys/wysoki - k_nis/niski&amp;gt;=roznica: # czy liczebności k_wys i k_nis dają większą bądź równą różnice proporcji?&lt;br /&gt;
			p_nis = st.binom.pmf(k_nis,niski,p_zawalu) # prawdopodobieństwo uzyskania k_nis zawałów w grupie o niskim cholesterolu&lt;br /&gt;
			p_binom += p_wys*p_nis # zdarzenia są niezależne&lt;br /&gt;
&lt;br /&gt;
print(p_binom)&lt;br /&gt;
&lt;br /&gt;
# rozwiązanie symulacyjne&lt;br /&gt;
def randsample(x, N):&lt;br /&gt;
	'''zwraca wektor z losowo wybranymi elementami wektora x. Losowanie odbywa się z powtórzeniami''' &lt;br /&gt;
	n=len(x)&lt;br /&gt;
	ind = np.random.randint(n, size = N)&lt;br /&gt;
	y = x[ind]&lt;br /&gt;
	return y&lt;br /&gt;
&lt;br /&gt;
N_rep = 100000&lt;br /&gt;
# świat zgodny z H0:&lt;br /&gt;
H0 = np.concatenate((np.zeros(N-N_zaw), np.ones(N_zaw)))&lt;br /&gt;
&lt;br /&gt;
wyn = np.zeros(N_rep)&lt;br /&gt;
for i in range(N_rep):&lt;br /&gt;
	wysoki_zawaly_r = np.sum(randsample(H0,wysoki))&lt;br /&gt;
	niski_zawaly_r = np.sum(randsample(H0,niski))&lt;br /&gt;
	wyn[i] = wysoki_zawaly_r/wysoki - niski_zawaly_r/niski&lt;br /&gt;
p = np.sum(wyn&amp;gt;=roznica)/N_rep&lt;br /&gt;
print(p)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Czy gęstości planet się różnią?===&lt;br /&gt;
Rozważmy pięć planet znanych w antycznym świecie. Chcemy zbadać, czy planety wewnętrzne Merkury (0,68) i Wenus (0,94) mają istotnie większe gęstości niż planety zewnętrzne Mars (0,71) Jowisz (0,24) i Saturn (0,12)?&lt;br /&gt;
&lt;br /&gt;
Wskazówki: &lt;br /&gt;
* Unikalność zestawu planet wskazuje na zastosowanie testu permutacyjnego.&lt;br /&gt;
* Moduł implementujący funkcje kombinatoryczne w pythonie to &amp;lt;tt&amp;gt;itertools &amp;lt;/tt&amp;gt;. Zawiera on funkcję &amp;lt;tt&amp;gt;permutations&amp;lt;/tt&amp;gt;. Wywołanie &amp;lt;tt&amp;gt;itertools.permutations(sekwencja[, r])&amp;lt;/tt&amp;gt; zwraca obiekt permutacji. Obiekt ten zwraca kolejne permutacje o długości r elementów w sekwencji (np. w wektorze). Przykład:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
import itertools&lt;br /&gt;
for kolejny in itertools.permutations(range(3), 2):&lt;br /&gt;
    print(kolejny)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import itertools as itt&lt;br /&gt;
PLANETY = np.array([0.68,0.94,0.71,0.24,0.12])&lt;br /&gt;
N=len(PLANETY)&lt;br /&gt;
&lt;br /&gt;
r=[] #używamy listy, bo nie chcemy obliczać ile będzie przypadków (aczkolwiek można to zrobić)&lt;br /&gt;
&lt;br /&gt;
for planety in itt.permutations(PLANETY):&lt;br /&gt;
	r.append(np.mean(planety[:2])-np.mean(planety[2:]))&lt;br /&gt;
&lt;br /&gt;
R=np.mean(PLANETY[:2])-np.mean(PLANETY[2:]) #prawdziwa różnica&lt;br /&gt;
&lt;br /&gt;
r=np.array(r) #porównanie z liczbą działa tylko dla tablic numpy, a nie dla list&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;p =&amp;quot;,np.sum(r&amp;gt;=R)/len(r))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Elektrownia jądrowa===&lt;br /&gt;
Przed wybudowaniem elektrowni jądrowej przeprowadzono pomiary intensywności promieniowania jonizującego w pobliżu planowanego budynku reaktora. Powtórzono te pomiary po uruchomieniu reaktora. Czy zebrane dane pozwalają stwierdzić, że poziom promieniowania istotnie wzrósł? Dane pomiarowe wczytaj z [[Media:pomiary_skazen.txt| pliku]].&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
&lt;br /&gt;
alfa = 0.01 # poziom istotności&lt;br /&gt;
&lt;br /&gt;
PRZED, PO = np.loadtxt('Pomiary_skazen.txt') #wczytanie danych (dwa zbiory przed uruchomieniem i po)&lt;br /&gt;
&lt;br /&gt;
t, p = st.ttest_ind(PRZED, PO) # wykorzystanie gotowej funkcji wykonującej DWUSTRONNY test t na różnicę średnich&lt;br /&gt;
                            # dla danych NIESPAROWANYCH (niezależnych)&lt;br /&gt;
                            # ttest_ind  - ind od independent &lt;br /&gt;
                            # ttest_rel  - rel od related &lt;br /&gt;
&lt;br /&gt;
p/=2 # dzielimy przez dwa ponieważ chcemy zrobić test jednostronny&lt;br /&gt;
print(&amp;quot;Poziom p&amp;quot;,p)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Odp. &amp;lt;math&amp;gt;p=0,\!39&amp;gt;\alpha=0,\!01&amp;lt;/math&amp;gt;, zatem nie mamy podstaw do odrzucenia hipotezy &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt;, że poziom promieniowania istotnie wzrósł.&lt;/div&gt;</summary>
		<author><name>Maciek</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=WnioskowanieStatystyczne/_Testowanie_hipotez&amp;diff=11332</id>
		<title>WnioskowanieStatystyczne/ Testowanie hipotez</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=WnioskowanieStatystyczne/_Testowanie_hipotez&amp;diff=11332"/>
		<updated>2025-05-11T22:16:12Z</updated>

		<summary type="html">&lt;p&gt;Maciek: /* Sonda */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Testowanie hipotez dotyczących jednej lub dwóch populacji ==&lt;br /&gt;
===Wstęp===&lt;br /&gt;
Schemat weryfikowania hipotez omówiony jest w wykładzie [[WnioskowanieStatystyczne/Weryfikacja hipotez |Weryfikacja hipotez statystycznych]]. Tu przypomnimy tylko krótko podstawowe pojęcia i decyzje, które trzeba pojąć w procedurze weryfikacji.&lt;br /&gt;
====Hipoteza zerowa i alternatywna====&lt;br /&gt;
Podstawą sukcesu w statystycznym testowaniu hipotez jest prawidłowe ich sformułowanie. &lt;br /&gt;
Hipotezy muszą być rozłączne. Najczęściej jako hipotezę zerową przyjmujemy zdanie, które chcemy odrzucić, &lt;br /&gt;
gdyż błąd takiej decyzji można kontrolować. Logika testowania jest następująca: tworzymy &lt;br /&gt;
funkcję od zmiennych losowych, dla której przy spełnieniu przez owe zmienne hipotezy zerowej potrafimy &lt;br /&gt;
podać prawdopodobieństwa z jakimi przyjmuje ona różne wartości. Ta funkcja nazywana jest ''statystyką''. &lt;br /&gt;
Następnie obliczamy wartość tej funkcji dla badanej próby. Jeśli prawdopodobieństwo osiągnięcia otrzymanej &lt;br /&gt;
bądź jeszcze bardziej ekstremalnej wartości statystyki jest niskie to wątpimy, że nasze dane są zgodne&lt;br /&gt;
z hipotezą zerową i jesteśmy skłonni przyjąć hipotezę alternatywną.&lt;br /&gt;
&lt;br /&gt;
====Wybór statystyki====&lt;br /&gt;
Wybierając statystykę można posłużyć się następującym schematem:&lt;br /&gt;
* Jeżeli znamy rozkład prawdopodobieństwa, z którego pochodzą nasze dane, lub umiemy je przetransformować do znanego rozkładu, to wybierzemy klasyczny test parametryczny np. test ''t'' ([http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.mstats.ttest_rel.html ttest_rel], [http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.ttest_ind.html ttest_ind]), &amp;lt;math&amp;gt;\chi^2&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; itp.&lt;br /&gt;
* Jeżeli nie znamy rozkładu prawdopodobieństwa naszych danych albo nie chcemy nic o nim zakładać to mamy dwie możliwości: &lt;br /&gt;
** korzystamy z klasycznego [[WnioskowanieStatystyczne/Test_Wilcoxona|testu nieparametrycznego]] np.:&lt;br /&gt;
&amp;lt;!--http://mail.scipy.org/pipermail/scipy-user/2009-July/021679.html--&amp;gt;&lt;br /&gt;
**; test Wilcoxona dla obserwacji sparowanych: testuje hipotezę zerową, że dwie próby &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, które ze sobą porównujemy pochodzą z tej samej populacji ciągłej (przekłada się to na równość dystrybuant). Próby &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; '''są''' sparowane. W pythonie mamy ten test zaimplementowany jako: [http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.wilcoxon.html &amp;lt;tt&amp;gt;scipy.stats.wilcoxon(x, y=None)&amp;lt;/tt&amp;gt;]. Ta implementacja stosuje przybliżenie dużych prób i zalecana jest dla &amp;lt;math&amp;gt;n&amp;gt;20&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;!--    Calculate the Wilcoxon signed-rank test&lt;br /&gt;
&lt;br /&gt;
    The Wilcoxon signed-rank test tests the null hypothesis that two related samples come from the same distribution. It is a a non-parametric version of the paired T-test.&lt;br /&gt;
    Parameters:	&lt;br /&gt;
    x : array_like&lt;br /&gt;
        The first set of measurements&lt;br /&gt;
    y : array_like, optional, default None&lt;br /&gt;
        The second set of measurements. If y is not given, then the x array is considered to be the differences between the two sets of measurements.&lt;br /&gt;
    Returns:	&lt;br /&gt;
    z-statistic : float&lt;br /&gt;
        The test statistic under the large-sample approximation that the signed-rank statistic is normally distributed.&lt;br /&gt;
    p-value : float&lt;br /&gt;
        The two-sided p-value for the test&lt;br /&gt;
    Notes&lt;br /&gt;
    Because the normal approximation is used for the calculations, the samples used should be large. A typical rule is to require that n &amp;gt; 20.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
scipy.stats.ranksums(x, y)&lt;br /&gt;
&lt;br /&gt;
    Compute the Wilcoxon rank-sum statistic for two samples.&lt;br /&gt;
&lt;br /&gt;
    The Wilcoxon rank-sum test tests the null hypothesis that two sets of measurements are drawn from the same distribution. The alternative hypothesis is that values in one sample are more likely to be larger than the values in the other sample.&lt;br /&gt;
&lt;br /&gt;
    This test should be used to compare two samples from continuous distributions. It does not handle ties between measurements in x and y. For tie-handling and an optional continuity correction see `stats.mannwhitneyu`_&lt;br /&gt;
    Parameters:	&lt;br /&gt;
&lt;br /&gt;
    x,y : array_like&lt;br /&gt;
&lt;br /&gt;
        The data from the two samples&lt;br /&gt;
&lt;br /&gt;
    Returns:	&lt;br /&gt;
&lt;br /&gt;
    z-statistic : float&lt;br /&gt;
&lt;br /&gt;
        The test statistic under the large-sample approximation that the rank sum statistic is normally distributed&lt;br /&gt;
&lt;br /&gt;
    p-value : float&lt;br /&gt;
&lt;br /&gt;
        The two-sided p-value of the test&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
**; test Manna-Whitney'a : testuje hipotezę zerową, że dwie próby &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, które ze sobą porównujemy pochodzą z tej samej populacji ciągłej. Próby &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; i&amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; '''nie są''' sparowane. Implementacja w pyhtonie: [http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.mannwhitneyu.html &amp;lt;tt&amp;gt;scipy.stats.mannwhitneyu(x, y, use_continuity=True)&amp;lt;/tt&amp;gt;] stosuje przybliżenia i zalecana jest dla &amp;lt;math&amp;gt;n&amp;gt;20&amp;lt;/math&amp;gt; w każdej z prób. Funkcja zwraca wartość ''p'' dla hipotezy jednostronnej. Jeśli testujemy hipotezę dwustronną trzeba otrzymane ''p'' pomnożyć przez 2.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
scipy.stats.mannwhitneyu(x, y, use_continuity=True)¶&lt;br /&gt;
&lt;br /&gt;
    Computes the Mann-Whitney rank test on samples x and y.&lt;br /&gt;
    Parameters:	&lt;br /&gt;
    x, y : array_like&lt;br /&gt;
        Array of samples, should be one-dimensional.&lt;br /&gt;
    use_continuity : bool, optional&lt;br /&gt;
        Whether a continuity correction (1/2.) should be taken into account. Default is True.&lt;br /&gt;
    Returns:	&lt;br /&gt;
    u : float&lt;br /&gt;
        The Mann-Whitney statistics.&lt;br /&gt;
    prob : float&lt;br /&gt;
        One-sided p-value assuming a asymptotic normal distribution.&lt;br /&gt;
    Notes&lt;br /&gt;
    Use only when the number of observation in each sample is &amp;gt; 20 and you have 2 independent samples of ranks. Mann-Whitney U is significant if the u-obtained is LESS THAN or equal to the critical value of U.&lt;br /&gt;
&lt;br /&gt;
    This test corrects for ties and by default uses a continuity correction. The reported p-value is for a one-sided hypothesis, to get the two-sided p-value multiply the returned p-value by 2.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
** wytwarzamy rozkład statystyki na podstawie naszych danych przez repróbkowanie ([[WnioskowanieStatystyczne/Bootstrap|bootstrap]] lub [[WnioskowanieStatystyczne/Testy_permutacyjne| permutacje]]). W podejściu repróbkowania tworzymy statystyczny model badanego procesu '''zgodny z hipotezą zerową''' i następnie badamy w drodze symulacji prawdopodobieństwa generowania przez ten model interesujących nas sytuacji. Największą uwagę musimy tu poświęcić na prawidłowe sformułowanie modelu, a następnie precyzyjne określenie prawdopodobieństwo jakiego zdarzenia nas naprawdę interesuje.&lt;br /&gt;
&lt;br /&gt;
===Poziom istotności &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; i wartość &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;===&lt;br /&gt;
; Błąd pierwszego rodzaju : błąd polegający na odrzuceniu hipotezy zerowej, która w rzeczywistości jest prawdziwa. Oszacowanie prawdopodobieństwa popełnienia błędu pierwszego rodzaju oznaczamy symbolem &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; i nazywamy poziomem istotności testu.&lt;br /&gt;
; Błąd drugiego rodzaju : polegaja na nieodrzuceniu hipotezy zerowej, która jest w rzeczywistości fałszywa. Oszacowanie prawdopodobieństwo popełnienia błędu drugiego rodzaju oznaczamy symbolem &amp;lt;math&amp;gt; \beta&amp;lt;/math&amp;gt;, a jego dopełnienie do jedności nazywane jest '''mocą testu'''.&lt;br /&gt;
&lt;br /&gt;
Wartość &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; jest to wartość prawdopodobieństwa, że wobec posiadanych danych  hipoteza zerowa jest prawdziwa. Jest ono obliczane jako prawdopodobieństwo zaobserwowania wartości ''statystyki'' takiej jak dla badanej próby, lub bardziej ekstremalnej, przy prawdziwej hipotezie zerowej.&lt;br /&gt;
Najczęściej porównujemy ''p'' z wcześniej ustalonym poziomem istotności &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;. Poziom istotności &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; to wartość krytyczna prawdopodobieństwa, taka że jeżeli &amp;lt;math&amp;gt; p&amp;lt; \alpha&amp;lt;/math&amp;gt; to odrzucamy hipotezę zerową.&lt;br /&gt;
&lt;br /&gt;
==Formułowanie hipotez==&lt;br /&gt;
===Przykład: mutacje muszek owocowych===&lt;br /&gt;
Załóżmy, że badamy muszki owocowe. W standardowej populacji proporcja samic do samców jest 1:1. Opracowaliśmy metodę powodującą taką mutację muszek owocowych, że potomstwo ich nie będzie miało jednakowej szansy na bycie samcem lub samiczką. W pierwszych 20 zbadanych przypadkach uzyskujemy 14 samców i 6 samiczek.&lt;br /&gt;
; Pytanie naukowe: Czy wyniki eksperymentu potwierdzają, że nasza metoda zaburza proporcję płci?&lt;br /&gt;
Najpierw musimy przetłumaczyć pytanie naukowe na pytanie statystyczne. &lt;br /&gt;
; Pytanie statystyczne: Jakie jest prawdopodobieństwo uzyskania zaobserwowanej proporcji (14:6), lub bardziej ekstremalnej w próbie 20 osobników,  jeśli rzeczywista proporcja płci jest 1:1?&lt;br /&gt;
&lt;br /&gt;
Z tego pytania wynikają dwie możliwe hipotezy:&lt;br /&gt;
* Hipoteza zerowa: Nowa metoda nie zaburza proporcji płci 1:1. Zaobserwowana próbka pochodzi z populacji, w której proporcja płci ''jest'' 1:1&lt;br /&gt;
* Hipoteza alternatywna: Zaobserwowana próbka pochodzi z populacji, w której proporcja płci ''nie jest'' 1:1.&lt;br /&gt;
; Prawdopodobieństwo, które musimy oszacować: Jakie jest prawdopodobieństwo uzyskania 14 lub więcej jedynek w serii 20 prób, jeśli prawdopodobieństwo jedynki jest &amp;lt;math&amp;gt;1/2&amp;lt;/math&amp;gt;?  &lt;br /&gt;
# Oznaczmy 1: samiec 0: samiczka.&lt;br /&gt;
# Zróbmy wektor 20-elementowy zawierający 10 zer i 10 jedynek.&lt;br /&gt;
# Wylosujmy ze zwracaniem nowy wektor 20-elementowy. (Jest to nasz model uzyskiwania 20 elementowej próbki z populacji o proporcji 1:1.) Zapamiętajmy liczbę jedynek.&lt;br /&gt;
# Powtórzmy poprzedni krok 1000 razy&lt;br /&gt;
# Zróbmy histogram ilości jedynek.&lt;br /&gt;
# Policzmy ile razy zdarzyło sie 14 lub więcej jedynek (to odpowiada 14 lub więcej samców) i dodajmy do tego ilość przypadków gdy mieliśmy 6 lub mniej jedynek (to odpowiada 14 lub więcej samiczek). Wynik podzielmy przez ilość losowań (1000).&lt;br /&gt;
&lt;br /&gt;
Powyższa procedura opisuje test dwustronny. Testu dwustronnego musimy użyć jeśli nie mamy ''istotnych'' powodów, żeby wierzyć, że nowa metoda działa ''jedynie na zwiększenie'' szansy pojawienia się samca.&lt;br /&gt;
&lt;br /&gt;
Jak powyższy problem rozwiązać w sposób parametryczny? &lt;br /&gt;
Próby podlegają rozkładowi dwumianowemu, można więc obliczyć szukane prawdopodobieństwo korzystając z jego dystrybuanty.&lt;br /&gt;
&lt;br /&gt;
==Testowanie hipotez na temat średniej==&lt;br /&gt;
Firma rozwożąca przesyłki po mieście deklaruje średni czas dostarczenia 28 minut. Przeprowadźmy test tej hipotezy na poziomie istotności 5%.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_0: \mu = 28&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;H_1: \mu \ne 28&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wybieramy losową próbę 100 przesyłek, mierzymy czas dostarczenia, liczymy średnią z próby &amp;lt;math&amp;gt;\bar x = 31,5&amp;lt;/math&amp;gt; minut i odchylenie standardowe próby &amp;lt;math&amp;gt;s = 5&amp;lt;/math&amp;gt; minut. &lt;br /&gt;
&lt;br /&gt;
Test ten można przeprowadzić z użyciem przedziałów ufności:&lt;br /&gt;
* Konstruujemy przedziały ufności 95% dla średniej &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.Formalnie, ponieważ wyliczyliśmy odchylenie standardowe z próby powinniśmy zastosować wartości krytyczne z rozkładu t. Rozmiar próby wynosi 100 więc rozkład t ma 99 stopni swobody. Wartość krytyczna w tym rozkladzie to &amp;lt;math&amp;gt;t_{97.5} =  1.984 &amp;lt;/math&amp;gt;. Mamy zatem:&lt;br /&gt;
&amp;lt;math&amp;gt;\bar x \pm 1,984 \frac{s}{\sqrt{n}} = 31,5 \pm 1,984*\frac{5}{\sqrt{100}} = 31,5 \pm 0,992 = [30,51 \quad 32,49]&amp;lt;/math&amp;gt;&lt;br /&gt;
* Wnioskowanie: Możemy więc być na 95% pewni, że nieznana średnia leży pomiędzy 30,51 a 32,49 a więc na 95% nie leży poza tym przedziałem. &lt;br /&gt;
Skoro &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; podaje &amp;lt;math&amp;gt;\mu = 28&amp;lt;/math&amp;gt; (poza przedziałem), możemy odrzucić tę hipotezę.  Jeśli &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; jest prawdziwe, istnieje prawdopodobieństwo 0,05, że skonstruowany przedział nie będzie zawierał &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. Istnieje zatem prawdopodobieństwo 0,05 popełnienia błądu I-go rodzaju. Mówimy, że przeprowadziliśmy test na poziomie istotności 0,05.&lt;br /&gt;
&lt;br /&gt;
Test można też przeprowadzić następująco:&lt;br /&gt;
* Jako statystykę wybieramy &amp;lt;math&amp;gt;t = \frac{\bar x - \mu}{s/\sqrt{n}} &amp;lt;/math&amp;gt;&lt;br /&gt;
* Obliczmy jej wartość dla danych z próby: &amp;lt;math&amp;gt;t = \frac{\bar x - \mu}{s/\sqrt{n}}  = (31,5 -28)/(5/\sqrt{100}) = 7 &amp;lt;/math&amp;gt;&lt;br /&gt;
* Porównujemy otrzymaną wartość z wartością krytyczna dla przyjętego poziomu istotności &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;. Konstuowany przez nas test ma być testem dwustronnym więc musimy wziąć do porównania wartość krytyczna dla &amp;lt;math&amp;gt;\alpha/2&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt; t_{\alpha/2} = t_{0,025}= -1,984&amp;lt;/math&amp;gt;&lt;br /&gt;
* Wnioskowanie: Dla naszej próby otrzymaliśmy wartość statystyki równą 6.96. Dla przyjętego poziomu istotności wartość statystyki wynosi 1,984. Prawdopodobieństwo zaobserwowania statystyki o wartości 7 lub bardziej ekstremalnej (tu: większej) jest mniejsze niż założony poziom istotności więc odrzucamy &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; na poziomie &amp;lt;math&amp;gt;\alpha = 0,05&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Testowanie hipotez na temat wariancji==&lt;br /&gt;
&lt;br /&gt;
Do testowania hipotez na temat wariancji używamy statystyki chi-kwadrat o &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; stopniach swobody:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\chi^2 = \frac{(n-1)s^2}{\sigma_0^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\sigma_0^2&amp;lt;/math&amp;gt; jest wartością wariancji podaną w &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
===Przykład===&lt;br /&gt;
Do produkcji baterii używane są metalowe płytki o średniej średnicy 5 mm. Jeśli wariancja średnicy płytki jest nie większa niż 1 mm&amp;lt;math&amp;gt;^2&amp;lt;/math&amp;gt;, produkcja jest kontynuowana. Jeśli wariancja przekracza 1 mm&amp;lt;math&amp;gt;^2&amp;lt;/math&amp;gt; proces produkcji trzeba przerwać. Kontroler przeprowadza test na poziomie istotności &amp;lt;math&amp;gt;\alpha = 5&amp;lt;/math&amp;gt;%: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_0:&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\sigma^2 \le 1&amp;lt;/math&amp;gt; i &lt;br /&gt;
&amp;lt;math&amp;gt;H_1:&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\sigma^2 &amp;gt; 1&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Wybiera losową próbę 31 płytek i znajduje wariancję próby &amp;lt;math&amp;gt;s^2 = 1,62&amp;lt;/math&amp;gt;. Czy daje to podstawy do przerwania produkcji?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\chi^2 = \frac{(31-1) \cdot 1,62}{1} = 48,6&amp;lt;/math&amp;gt;. Znajdujemy poziom &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; dla tej wartości &amp;lt;math&amp;gt;\chi^2&amp;lt;/math&amp;gt; z 30 stopniami swobody. &lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
p = 1-st.chi2.cdf(48.6,30)&lt;br /&gt;
print(p)&lt;br /&gt;
&lt;br /&gt;
#ilustracja&lt;br /&gt;
x = py.arange(0,60,1)  &lt;br /&gt;
py.plot(x, st.chi2.pdf(x,30)) #rysujemy funkcję gęstości prawdopodobieństwa chi2 o 30 st. swobody&lt;br /&gt;
x2 = py.arange(48.8,60,1)&lt;br /&gt;
py.fill_between(x2,st.chi2.pdf(x2,30)) #cieniujemy obszar pod funkcją geęstości prawdopodobieństwa odpowiadający obliczonemu p&lt;br /&gt;
&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Otrzymaliśmy &amp;lt;math&amp;gt; p = 0,017 &amp;lt;/math&amp;gt;.&lt;br /&gt;
Wniosek:  Odrzucamy &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Błąd drugiego rodzaju. Moc testu.==&lt;br /&gt;
Błąd II-go rodzaju popełniamy wtedy gdy przyjmujemy &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; a prawdziwe jest &amp;lt;math&amp;gt;H_1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Przykład===&lt;br /&gt;
Załóżmy następujący test:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_0: \mu = 60&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_1: \mu = 65&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Niech rozmiar próby wynosi &amp;lt;math&amp;gt;n = 100&amp;lt;/math&amp;gt; a odchylenie standardowe w populacji &amp;lt;math&amp;gt;\sigma = 20&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Powinniśmy tu zastosować test jednostronny (mamy tylko dwie możliwości: &amp;lt;math&amp;gt;\mu = 60&amp;lt;/math&amp;gt; lub &amp;lt;math&amp;gt;65&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
Znajdźmy punkt krytyczny &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; dla poziomu istotności &amp;lt;math&amp;gt;\alpha =  0,05&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;C = \mu_0 + 1,645\frac{\sigma}{\sqrt{n}} = 60 + 1,645(20/10) = 63,29&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Błąd pierwszego rodzaju popełnimy gdy &amp;lt;math&amp;gt;\bar x &amp;gt; C&amp;lt;/math&amp;gt; i prawdziwe będzie &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt;. Prawdopodobieństwo błędu pierwszego rodzaju ustaliliśmy z góry na poziomie &amp;lt;math&amp;gt;\alpha = 0,05&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\alpha = P(\bar x &amp;gt; C| \mu = \mu_0)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Błąd drugiego rodzaju popełnimy gdy &amp;lt;math&amp;gt;\bar x &amp;lt; C&amp;lt;/math&amp;gt; a prawdziwe będzie &amp;lt;math&amp;gt;H_1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Prawdopodobieństwo popełnienia tego błędu wynosi:&lt;br /&gt;
&amp;lt;math&amp;gt;\beta = P(\bar x &amp;lt; C| \mu = \mu_1) = P\left( \frac{\bar x - \mu_1}{\sigma/\sqrt{n}}  &amp;lt; \frac{C - \mu_1}{\sigma/\sqrt{n}}\right)= &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;= P\left( Z &amp;lt; \frac{63,29 - 65}{20/10}\right)  = P(Z &amp;lt; -0,855) = 0,1963&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Moc testu jest dopełnieniem błędu II rodzaju.&lt;br /&gt;
A moc testu czyli prawdopodobieństwo odrzucenia hipotezy zerowej podczas gdy jest ona fałszywa wynosi:&lt;br /&gt;
&amp;lt;math&amp;gt;1 - \beta = 0,8037&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Porównanie dwóch populacji==&lt;br /&gt;
[[WnioskowanieStatystyczne/Test_t#Test_t_.28Studenta.29_r.C3.B3.C5.BCnicy_.C5.9Brednich|Dla przypomnienia]]:&lt;br /&gt;
Jeśli mamy dwie próbki danych:&lt;br /&gt;
:&amp;lt;math&amp;gt;x_1&amp;lt;/math&amp;gt; o liczebności &amp;lt;math&amp;gt;n_1&amp;lt;/math&amp;gt; i estymowanej wariancji &amp;lt;math&amp;gt;s_1^2&amp;lt;/math&amp;gt; i &lt;br /&gt;
:&amp;lt;math&amp;gt;x_2&amp;lt;/math&amp;gt; o liczebności &amp;lt;math&amp;gt;n_2&amp;lt;/math&amp;gt; i estymowanej wariancji &amp;lt;math&amp;gt;s_2^2&amp;lt;/math&amp;gt;  &lt;br /&gt;
:gdzie &amp;lt;math&amp;gt;s_{i}^2= \frac{1}{(n_i-1)}\sum\limits_{j=1}^{n_i} (x_{j}-\overline{x}_{i})^{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
pochodzących z rozkładu normalnego o takiej samej wariancji &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; to:&lt;br /&gt;
*wspólna wariancja może być estymowana jako: &amp;lt;math&amp;gt;s^2=\frac{(n_1-1)s_1^2+(n_2-1)s_2^2}{n_1+n_2-2} &amp;lt;/math&amp;gt;&lt;br /&gt;
*wariancja różnicy średnich może być estymowana jako: &amp;lt;math&amp;gt;s_{\Delta}^2=s_{\bar{x}_1}^2+s_{\bar{x}_2}^2=\frac{1}{n_1}s_1^2+\frac{1}{n_2}s_2^2 = \frac{n_1+n_2}{n_1n_2}s^2&amp;lt;/math&amp;gt;&lt;br /&gt;
Jeśli postawimy hipotezę zerową: &amp;lt;math&amp;gt;H_0:\; \mu_1 = \mu_2&amp;lt;/math&amp;gt; to&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
t= \frac{\bar{x}_1-\bar{x}_2}{s_{\Delta}}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
pochodzi z rozkładu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; o &amp;lt;math&amp;gt;n_1+n_2-2&amp;lt;/math&amp;gt; stopniach swobody.&lt;br /&gt;
&lt;br /&gt;
===Przykład: promocja===&lt;br /&gt;
Producent odtwarzaczy CD chce sprawdzić czy małe obniżenie ceny produktu wpłynie korzystnie na sprzedaż. Losowa próba 15 tygodni sprzedaży przed obniżką dała średni dochód 6598 zł i standardowe odchylenie 844 zł. Losowa próba 12 tygodni sprzedaży w trakcie promocji dała średnią 6870 i odchylenie standardowe 669 zł. Czy dane te wykazują poprawę sprzedaży w trakcie promocji (przyjąć poziom istotności 5%) ?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\bar{x}_1 = 6598&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\bar{x}_2 = 6870&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Treść zadania odpowiada testowi jednostronnemu z poniższymi hipotezami:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_0: \mu_1 = \mu_2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_1: \mu_1 &amp;lt; \mu_2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Różnica średnich wynosi:&lt;br /&gt;
&amp;lt;math&amp;gt;\bar{x}_1-\bar{x}_2 = 6598 - 6870 = -272 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Estymowana wariancja różnicy średnich:&lt;br /&gt;
&amp;lt;math&amp;gt;s_{\Delta}^2 =  \frac{1}{n_1}s_1^2+\frac{1}{n_2}s_2^2 = \frac{844^2}{15} + \frac{669^2}{12} = 84785,82&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
zatem:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;s_{\Delta} = 291,18&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; t = -272/ 291,18 = - 0,934&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ilość stopni swobody: &amp;lt;math&amp;gt;n_1+n_2-2 = 25&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;P(t_{25} \le -0,934) = 0.18 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wniosek: Nie możemy odrzucić &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt;. Nie mamy podstaw by uznać że mała obniżka cen poprawiła sprzedaż.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Do testowania równości wariancji w dwóch populacjach stosuje się test &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;F_{(n1 -1, n2 - 1)} = \frac{s_1^2}{s_2^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
W przykładzie powyżej założyliśmy równość wariancji. Korzystając z testu &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; sprawdzić czy założenie było uzasadnione.&lt;br /&gt;
&lt;br /&gt;
==Badanie założenia o normalności rozkładu==&lt;br /&gt;
We wszystkich wspomnianych powyżej klasycznych testach statystycznych &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\chi^2&amp;lt;/math&amp;gt; istotnym założeniem jest to, że dane wejściowe w próbie mają rozkład normalny. W powyższych zadaniach po prostu to zakładaliśmy, ale w praktyce, kiedy dostajemy próbę do analizy, musimy sami sprawdzić,  czy możemy uznać ją za pochodzącą z rozkładu normalnego. Do weryfikacji takiej hipotezy służą narzędzia graficzne:&lt;br /&gt;
&lt;br /&gt;
=== Histfit: histogram z naniesionym fitem rozkładu normalnego ===&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
def histfit(x,N_bins):  &lt;br /&gt;
''' &lt;br /&gt;
x - dane&lt;br /&gt;
N_bins -ilość binów w histogramie&lt;br /&gt;
&lt;br /&gt;
Funkcja rysuje histogram i na jego tle dorysowuje wykres &lt;br /&gt;
funkcji gęstości prawdopodobieństwa rozkładu normalnego &lt;br /&gt;
o średniej i wariancji estymowanych z x.&lt;br /&gt;
&lt;br /&gt;
Funkcja wymaga zaimportowania modułów pylab as py i scipy.stats as st''' &lt;br /&gt;
 &lt;br /&gt;
	n, bins, patches = py.hist(x, N_bins, density=True, facecolor='green', alpha=0.75)&lt;br /&gt;
	# Rysujemy histogram i w jawny sposób odbieramy zwracane przez p.hist obiekty&lt;br /&gt;
	#   - normujemy histogram do jedności&lt;br /&gt;
	#   - ustalamy kolor prostokątów na zielony&lt;br /&gt;
	#   - ustawiamy przezroczystość prostokątów na 0.75&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	bincenters = 0.5*(bins[1:]+bins[:-1])&lt;br /&gt;
	# wytwarzamy tablicę z centrami binów korzystając z granic binów&lt;br /&gt;
	# zwróconych przez py.hist w macierzy bins&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	y = st.norm.pdf( bincenters, loc = np.mean(x), scale = np.std(x))&lt;br /&gt;
	# obliczamy momenty rozkładu x: średnią i wariancję (tak naprawdę to jej pierwiastek czyli standardowe odchylenie)&lt;br /&gt;
	# obliczamy wartości w normalnym rozkładzie gęstości prawdopodobieństwa&lt;br /&gt;
	# o średniej np.mean(x) i standardowym odchyleniu np.std(x) dla wartości bincenters&lt;br /&gt;
 &lt;br /&gt;
	l = py.plot(bincenters, y, 'r--', linewidth=1)&lt;br /&gt;
	# do histogramu dorysowujemy linię &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Normplot ===&lt;br /&gt;
Jest to wykres wartości w próbie, wzg. prawdopodobieństwa uzyskania takiej wartości w rozkładzie normalnym. Wykres ten jest szczególnym przypadkiem kwantylowego wykresu prawdopodobieństwa [http://en.wikipedia.org/wiki/Q-Q_plot]. Konstruuje się go następująco: &lt;br /&gt;
*Na osi pionowej odkładamy uporządkowane zaobserwowane wartości &amp;lt;math&amp;gt;x_1 \le x_2 \le \dots \le x_n &amp;lt;/math&amp;gt;. Estymują one położenie kwantyli w populacji.&lt;br /&gt;
*Na osi poziomej odkładamy położenia kwantyli w rozkładzie normalnym. Obliczamy je: &amp;lt;math&amp;gt;F^{-1}\left(\frac{i-r_{pop}}{n+n_{pop}} \right)&amp;lt;/math&amp;gt; gdzie &amp;lt;math&amp;gt;F^{-1}&amp;lt;/math&amp;gt; jest funkcją odwrotną do dystrybuanty rozkładu teoretycznego (w tym szczególnym przypadku normalnego) &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; jest numerem obserwacji a &amp;lt;math&amp;gt;r_{pop}, n_{pop}&amp;lt;/math&amp;gt; są czynnikami (&amp;lt;math&amp;gt;\le 0.5 &amp;lt;/math&amp;gt;) zapewniającymi, że argument funkcji odwrotnej do dystrybuanty nie przyjmuje wartości 0 ani 1. &lt;br /&gt;
Jeśli dane ''x'' podlegają rozkładowi normalnemu to ich położenia kwantyli powinny być zgodne z położeniami kwantyli w rozkładzie normalnym, zatem wykres powinien przedstawiać linię prostą. Odstępstwa od prostej świadczą o odstępstwie od rozkładu normalnego.&lt;br /&gt;
W pythonie możemy ten typ wykresu zaimplementować np. tak (współczynniki zaczerpnięte z [http://www.itl.nist.gov/div898/handbook/eda/section3/normprpl.htm]):&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
def normplot(x):&lt;br /&gt;
	'''normplot: x dane do testowania'''&lt;br /&gt;
	x_ord = sorted(x)&lt;br /&gt;
	N = len(x)&lt;br /&gt;
	y = np.zeros(N)&lt;br /&gt;
	y[0]=st.norm.ppf(1- 0.5**(1.0/N) )&lt;br /&gt;
	y[N-1] = st.norm.ppf(0.5**(1.0/N) )&lt;br /&gt;
	for i in range(1,N-1):&lt;br /&gt;
		arg = float(i-0.3175)/(N+0.365)&lt;br /&gt;
		y[i] = st.norm.ppf(arg)&lt;br /&gt;
	py.plot(y,x_ord,'.')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Test Shapiro-Wilka ===&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;W,p = st.shapiro(x)&amp;lt;/source&amp;gt;&lt;br /&gt;
Funkcja ta zwraca wartość statystyki ''W'' i prawdopodobieństwo ''p''  zaobserwowania takiej lub bardziej ekstremalnej wartości statystyki ''W'' dla danych podlegających rozkładowi normalnemu. Jeśli ''p'' ma wysoką wartość (większą niż przyjęta &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;) to nie możemy odrzucić hipotezy, że dane podlegają  rozkładowi normalnemu. Test Shapiro-Wilka nie jest wrażliwy na parametry rozkładu, z którego pochodzą dane (dane mogą pochodzić z rozkładu o dowolnej średniej i dowolnym odchyleniu standardowym).&lt;br /&gt;
&lt;br /&gt;
=== Test Kołmogorowa-Smirnowa ===&lt;br /&gt;
Jest on oparty  na badaniu maksymalnej różnicy pomiędzy dystrybuantą empiryczną (z próby) a teoretyczną dystrybuantą rozkładu. Dla testowania normalności próby powinniśmy wywołać &lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
D , p = st.kstest(x, 'norm', args=(np.mean(x),np.std(x,ddof=1)) #sposób zalecany&lt;br /&gt;
#lub &lt;br /&gt;
D , p = st.kstest((x-np.mean(x))/np.std(x,ddof=1), 'norm') #sposób niezalecany, ale również prawidłowy&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Funkcja zwraca wartość statystyki ''D'' i prawdopodobieństwo zaobserwowania takiej bądź bardziej ekstremalnej wartości statystyki jeśli testowane dane pochodzą z tego samego rozkładu. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;'''UWAGA!''' Test Kołmogorowa-Smirnowa '''jest wrażliwy na parametry rozkładu''', z którego pochodzą dane. Wywołanie poniższego kodu jest błędem:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
D , p = st.kstest(x, 'norm') #BŁĘDNE użycie testu Kołmogorowa-Smirnowa&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Test dla innych postaci rozkładu====&lt;br /&gt;
Za pomocą testu Kołmogorowa-Smirnowa możemy zbadać również założenie o pochodzeniu danych z populacji podlegającej dowolnemu innemu rozkładowi ciągłemu. W tym celu należy podać zamiast 'norm' odpowiednią nazwę rozkładu z modułu scipy.stats oraz parametry tegoż rozkładu w odpowiedniej kolejności (należy w tym celu zajrzeć do dokumentacji). Przykład jak to należy zrobić dla rozkładu wykładniczego:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
D , p = st.kstest(x, 'expon', args=(0, 1/np.mean(x)) #test, czy dane podlegają rozkładowi wykładniczemu&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Przykład===&lt;br /&gt;
Proszę wygenerować 1000 liczb z rozkładu normalnego. Liczby te obejrzyjmy na wykresach &amp;lt;tt&amp;gt;histfit&amp;lt;/tt&amp;gt; oraz &amp;lt;tt&amp;gt;normplot&amp;lt;/tt&amp;gt; i zbadamy ich normalność testem  Shapiro-Wilka i Kołmogorova-Smirnova. &lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
 &lt;br /&gt;
def normplot(x):&lt;br /&gt;
	'''normplot: x dane do testowania'''&lt;br /&gt;
	x_ord = sorted(x)&lt;br /&gt;
	N = len(x)&lt;br /&gt;
	y = np.zeros(N)&lt;br /&gt;
	y[0]=st.norm.ppf(1- 0.5**(1.0/N) )&lt;br /&gt;
	y[N-1] = st.norm.ppf(0.5**(1.0/N) )&lt;br /&gt;
	for i in range(1,N-1):&lt;br /&gt;
		arg = float(i-0.3175)/(N+0.365)&lt;br /&gt;
		y[i] = st.norm.ppf(arg)&lt;br /&gt;
	py.plot(y,x_ord,'.')&lt;br /&gt;
 &lt;br /&gt;
def histfit(x,N_bins):  &lt;br /&gt;
	''' funkcja rysuje histogram i na jego tle dorysowuje wykres &lt;br /&gt;
	funkcji gęstości prawdopodobieństwa rozkładu normalnego &lt;br /&gt;
	o średniej i wariancji estymowanych z x &lt;br /&gt;
	Funkcja wymaga zaimportowania modułów pylab as py i scipy.stats as st'''  &lt;br /&gt;
	n, bins, patches = py.hist(x, N_bins, normed=True, facecolor='green', alpha=0.75)&lt;br /&gt;
	bincenters = 0.5*(bins[1:]+bins[:-1]) &lt;br /&gt;
	y = st.norm.pdf( bincenters, loc = np.mean(x), scale = np.std(x,ddof=1)) &lt;br /&gt;
	l = py.plot(bincenters, y, 'r--', linewidth=1)&lt;br /&gt;
def porownania(x):&lt;br /&gt;
	py.subplot(2,2,1)&lt;br /&gt;
	normplot(x)&lt;br /&gt;
	py.subplot(2,2,2)&lt;br /&gt;
	histfit(x,15)&lt;br /&gt;
	W,p_sw = st.shapiro(x)&lt;br /&gt;
	D,p_ks = st.kstest(x, 'norm', args=(np.mean(x),np.std(x,ddof=1)))&lt;br /&gt;
	title = 'SW: %(sw).2f KS: %(ks).2f'%{'sw':p_sw, 'ks':p_ks}&lt;br /&gt;
	&lt;br /&gt;
	py.title(title)&lt;br /&gt;
	# wybieramy pierwsze dziesięć punktów  &lt;br /&gt;
	y=x[0:10]&lt;br /&gt;
	py.subplot(2,2,3)&lt;br /&gt;
	normplot(y)&lt;br /&gt;
	py.subplot(2,2,4)&lt;br /&gt;
	histfit(y,15)&lt;br /&gt;
	W,p_sw = st.shapiro(y)&lt;br /&gt;
	D,p_ks = st.kstest(y, 'norm', args=(np.mean(x),np.std(x,ddof=1)))&lt;br /&gt;
	title = 'SW: %(sw).2f KS: %(ks).2f'%{'sw':p_sw, 'ks':p_ks}&lt;br /&gt;
	py.title(title)&lt;br /&gt;
 &lt;br /&gt;
x = st.norm.rvs(size=1000, loc=0, scale=10)&lt;br /&gt;
py.figure(1)&lt;br /&gt;
porownania(x)&lt;br /&gt;
# A teraz zbadajmy dane z rozkładów innych niż normalny:&lt;br /&gt;
 &lt;br /&gt;
x = st.t.rvs(df = 2, size=1000, loc=0, scale=1)&lt;br /&gt;
py.figure(2)&lt;br /&gt;
porownania(x)&lt;br /&gt;
 &lt;br /&gt;
x = st.expon.rvs(size=1000,loc=0,scale=1)&lt;br /&gt;
py.figure(3)&lt;br /&gt;
porownania(x)&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Proszę zapuścić skrypt kilka razy i zwrócić uwagę na to, jak trudno jest ocenić normalność danych przy małych próbach.&lt;br /&gt;
&lt;br /&gt;
===Przykład: transformacja Boxa-Coxa===&lt;br /&gt;
Często normalność danych można poprawić przez zastosowanie odpowiedniej transformacji. Ogólną rodzinę transformacji, które często prowadzą do normalizacji danych można zapisać tak (trasformacja Box-Cox'a [http://www.jstor.org/stable/2984418]):&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y^{(\lambda)}=\left\{\begin{matrix} \frac{y^\lambda-1} {\lambda} &amp;amp; \mbox{dla }\lambda \ne 0 \\ \ln(y) &amp;amp; \mbox{dla }\lambda = 0\end{matrix}\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W module scipy.stats mamy tę transformację zaimplementowaną jako &amp;lt;tt&amp;gt;boxcox()&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Zobaczmy jej działanie na następującym przykładzie:&lt;br /&gt;
&lt;br /&gt;
Proszę pobrać i zapisać w pliku tekstowym następujące &lt;br /&gt;
[[Media:Samochody.txt| dane]]. Zawierają one 8 kolumn charakterystyk samochodów:&lt;br /&gt;
*zużycie paliwa&lt;br /&gt;
*cylindry&lt;br /&gt;
*pojemność skokowa&lt;br /&gt;
*moc w koniach mechanicznych&lt;br /&gt;
*masa&lt;br /&gt;
*przyspieszenie&lt;br /&gt;
*rocznik&lt;br /&gt;
*pochodzenie&lt;br /&gt;
&lt;br /&gt;
Proszę narysować histfit i normplot  oraz policzyć testy Shapiro-Wilka i Kolmogorowa-Smirnowa dla masy pojazdów, a następnie zastosować do niej transformację Boxa-Coxa i zbadać normalność przetransformowanych danych.&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
def normplot(x):&lt;br /&gt;
	'''normplot: x dane do testowania'''&lt;br /&gt;
	x_ord = sorted(list(x))&lt;br /&gt;
	N = len(x)&lt;br /&gt;
	y = np.zeros(N)&lt;br /&gt;
	y[0]=st.norm.ppf(1- 0.5**(1.0/N) )&lt;br /&gt;
	y[N-1] = st.norm.ppf(0.5**(1.0/N) )&lt;br /&gt;
	for i in range(1,N-1):&lt;br /&gt;
		arg = float(i-0.3175)/(N+0.365)&lt;br /&gt;
		y[i] = st.norm.ppf(arg)&lt;br /&gt;
	py.plot(y,x_ord,'.')&lt;br /&gt;
	&lt;br /&gt;
def histfit(x,N_bins):  &lt;br /&gt;
	''' funkcja rysuje histogram i na jego tle dorysowuje wykres &lt;br /&gt;
	funkcji gęstości prawdopodobieństwa rozkładu normalnego &lt;br /&gt;
	o średniej i wariancji estymowanych z x &lt;br /&gt;
	Funkcja wymaga zaimportowania modułów pylab as py i scipy.stats as st'''  &lt;br /&gt;
	n, bins, patches = py.hist(x, N_bins, normed=True, facecolor='green', alpha=0.75)&lt;br /&gt;
	bincenters = 0.5*(bins[1:]+bins[:-1]) &lt;br /&gt;
	y = st.norm.pdf( bincenters, loc = np.mean(x), scale = np.std(x)) &lt;br /&gt;
	l = py.plot(bincenters, y, 'r--', linewidth=1)&lt;br /&gt;
def porownania(x):&lt;br /&gt;
	py.subplot(2,1,1)&lt;br /&gt;
	normplot(x);&lt;br /&gt;
	py.subplot(2,1,2)&lt;br /&gt;
	histfit(x,15)&lt;br /&gt;
	W,p_sw = st.shapiro(x);&lt;br /&gt;
	D,p_ks = st.kstest(x,'norm',args=(np.mean(x),np.std(x) ))&lt;br /&gt;
	title = 'SW: %(sw).2f KS: %(ks).2f'%{'sw':p_sw, 'ks':p_ks}&lt;br /&gt;
	py.title(title)&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
dane = np.loadtxt('Samochody.txt')&lt;br /&gt;
# Badamy przyspieszenia&lt;br /&gt;
w = dane[:,5]&lt;br /&gt;
py.figure(1)&lt;br /&gt;
porownania(w)&lt;br /&gt;
# A teraz stosujemy transformację Box-Coxa&lt;br /&gt;
wt,lam = st.boxcox(w)&lt;br /&gt;
py.figure(2)&lt;br /&gt;
porownania(wt)&lt;br /&gt;
&lt;br /&gt;
# badamy masy&lt;br /&gt;
w = dane[:,4]&lt;br /&gt;
py.figure(3)&lt;br /&gt;
porownania(w)&lt;br /&gt;
# A teraz stosujemy transformację Box-Coxa&lt;br /&gt;
wt,lam = st.boxcox(w)&lt;br /&gt;
py.figure(4)&lt;br /&gt;
porownania(wt)&lt;br /&gt;
&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W pierwszym przypadku - asymetrię rozkładu przyspieszeń udało się transformacją B-C poprawić, ale w drugim przypadku, masa, asymetrię dało się skorygować (widać to na histfit) ale nie da się poprawić ''ciężkich ogonów'' - widać to zarówno na normplocie jak i na wynikach testów.&lt;br /&gt;
Ogólnie: zanim zaczniemy analizować dane dobrze jest je pooglądać na różnych wykresach i chwilę ''pomyśleć''.&lt;br /&gt;
&lt;br /&gt;
==Przykład (zastosowanie różnych testów do tych samych danych): karma==&lt;br /&gt;
Badamy dwie nowe karmy A i B. Mamy dwie grupy po 12 zwierząt. Uzyskane przyrosty masy są następujące:&lt;br /&gt;
&lt;br /&gt;
A: 31 34 29 26 32 35 38 34 31 29 32 31&lt;br /&gt;
&lt;br /&gt;
B: 26 24 28 29 30 29 31 29 32 26 28 32&lt;br /&gt;
&lt;br /&gt;
Pytanie:&lt;br /&gt;
Czy któraś z karm daje istotnie większe przyrosty masy?&lt;br /&gt;
&lt;br /&gt;
Poniżej rozwiążemy to zadanie stopniowo różnymi metodami. Kolejne kawałki kodu można dopisywać do tego samego pliku.&lt;br /&gt;
&lt;br /&gt;
ROZWIĄZANIE:&lt;br /&gt;
Przyjmujemy poziom istotności, na którym przeprowadzamy testy &amp;lt;math&amp;gt;\alpha = 0.05&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Badamy rozkłady danych:===&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
A=[ 31, 34, 29, 26, 32, 35, 38, 34, 31, 29, 32, 31];&lt;br /&gt;
B=[ 26, 24, 28, 29, 30, 29, 31, 29, 32, 26, 28, 32];&lt;br /&gt;
W, p_A = st.shapiro(A)&lt;br /&gt;
print('Dla grupy A:', p_A)&lt;br /&gt;
W, p_B = st.shapiro(B)&lt;br /&gt;
print('Dla grupy B:', p_B)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dla obu grup test Shapiro-Wilka nie daje nam podstaw do odrzucenia założenia o normalności rozkładów.&lt;br /&gt;
&lt;br /&gt;
===Test parametryczny===&lt;br /&gt;
Nie odrzuciliśmy hipotezy o normalnym rozkładzie danych zatem możemy zastosować  [[WnioskowanieStatystyczne/Test_t | test ''t'' ]] dla różnicy średnich.&lt;br /&gt;
&lt;br /&gt;
Formułujemy hipotezy:&lt;br /&gt;
* &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt;: średni przyrost masy w grupie A &amp;lt;math&amp;gt;=&amp;lt;/math&amp;gt; średni przyrost masy w grupie B&lt;br /&gt;
* &amp;lt;math&amp;gt;H_1&amp;lt;/math&amp;gt;: średni przyrost masy w grupie A &amp;lt;math&amp;gt;\ne&amp;lt;/math&amp;gt; średni przyrost masy w grupie B&lt;br /&gt;
Przeprowadzamy test:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
t, p = st.ttest_ind(A,B)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Otrzymujemy ''p'' = 0.01.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;p &amp;lt; \alpha &amp;lt;/math&amp;gt;,  zatem na przyjętym poziomie istotności odrzucamy hipotezę zerową i stwierdzamy, że grupa A ma inną średnią niż grupa B.&lt;br /&gt;
&lt;br /&gt;
===Test nieparametryczny ===&lt;br /&gt;
Nie zakładajac postaci  rozkładu danych mozemy zastosować test [[WnioskowanieStatystyczne/Test_Wilcoxona| ze statystykami opartymi na rangach]]. &lt;br /&gt;
Formułujemy hipotezy:&lt;br /&gt;
* &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt;: mediana przyrostu masy w grupie A &amp;lt;math&amp;gt;=&amp;lt;/math&amp;gt; mediana przyrostu masy w grupie B&lt;br /&gt;
* &amp;lt;math&amp;gt;H_1&amp;lt;/math&amp;gt;: mediana przyrostu masy w grupie A&amp;lt;math&amp;gt;\ne&amp;lt;/math&amp;gt; mediana przyrostu masy w grupie B&lt;br /&gt;
Przeprowadzamy test:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
U, p = st.mannwhitneyu(A, B)&lt;br /&gt;
p_dwustronne = 2*p&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
W pythonie zaimplementowana jest wersja jednostronna tego testu. Aby otrzymać prawdopodobieństwo ''p'' dla testu dwustronnego musimy pomnożyć je przez 2.&lt;br /&gt;
&lt;br /&gt;
===Testy bootstrapowe===&lt;br /&gt;
Teraz to samo sprawdzimy za pomocą testu repróbkowanego.&lt;br /&gt;
Przyda nam się tu funkcja do pobierania losowej próbki z powtórzeniami z danych:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
def randsample(x, N):&lt;br /&gt;
	'''zwraca wektor o dłougości N z losowo wybranymi elementami wektora x. Losowanie odbywa się z powtórzeniami''' &lt;br /&gt;
	n=len(x)&lt;br /&gt;
	ind = np.random.randint(n, size = N)&lt;br /&gt;
	y = x[ind]&lt;br /&gt;
	return y&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W testech repróbkowanych statystykę możemy wybrać dość dowolnie, ale jak pokażemy poniżej nie każda jest równie dobra.&lt;br /&gt;
Zgodnie z hipotezą zerową próbka A i  B pochodza z tej samej populacji.&lt;br /&gt;
Nasza najlepsza wiedza o owej populacji to połączone próbki A i B:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
POP=np.concatenate((A, B))&lt;br /&gt;
&lt;br /&gt;
N=len(POP)&lt;br /&gt;
NA=len(A)&lt;br /&gt;
NB=len(B)&lt;br /&gt;
# Zasymulujemy N_rep razy wyciagniecie z POP prob o rozmiarach NA i NB i&lt;br /&gt;
# zobaczymy jak czesto zdarzają się wartości statystyki  sie roznica srednich taka jak w oryginalnym&lt;br /&gt;
# pomiarze lub jeszcze wieksza. &lt;br /&gt;
N_rep=10000&lt;br /&gt;
# oryginalna roznica srednich i median:&lt;br /&gt;
mi_0 = np.abs(np.mean(A) - np.mean(B))&lt;br /&gt;
T_0  = np.abs(np.mean(A) - np.mean(B))/np.std(POP)&lt;br /&gt;
me_0 = np.abs(np.median(A) - np.median(B))&lt;br /&gt;
&lt;br /&gt;
mi = np.zeros(N_rep)&lt;br /&gt;
T  = np.zeros(N_rep)&lt;br /&gt;
me = np.zeros(N_rep)&lt;br /&gt;
&lt;br /&gt;
for i in range(N_rep):&lt;br /&gt;
	AA = randsample(POP,NA)&lt;br /&gt;
	BB = randsample(POP,NB)&lt;br /&gt;
	R_POP = np.concatenate((AA,BB))&lt;br /&gt;
	mi[i] = np.abs(np.mean(AA)-np.mean(BB)) # abs bo test dwustronny&lt;br /&gt;
	T[i]  = np.abs(np.mean(AA)-np.mean(BB))/np.std(R_POP)&lt;br /&gt;
	me[i] = np.abs(np.median(AA)-np.median(BB))&lt;br /&gt;
&lt;br /&gt;
p_mi = np.sum(mi&amp;gt;=mi_0)/N_rep&lt;br /&gt;
p_T  = np.sum( T&amp;gt;=T_0 )/N_rep&lt;br /&gt;
p_me = np.sum(me&amp;gt;=me_0)/N_rep&lt;br /&gt;
&lt;br /&gt;
print('testy repróbkowane: ')&lt;br /&gt;
print('rożnica średnich: ', p_mi)&lt;br /&gt;
print('pseudo T: ', p_T)&lt;br /&gt;
print('różnica median: ', p_me)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Widzimy, że dla testu ze statystyką różnicy średnich i  pseudo T dostajemy podobne wyniki, z tym, że pseudo T jest nieco silniejszy. Test ze statystyką różnicy średnich jest na tyle słaby, że nie pozwala na odrzucenie hipotezy zerowej.&lt;br /&gt;
&lt;br /&gt;
===Wnioskowanie w oparciu o przedziały ufności ===&lt;br /&gt;
Wnioskowanie o równości średnich dwóch grup można też przerowadzić w oparciu o przedziały ufności. W naszym przykładzie przedziały można skonstruować zarówno parametrycznie jak i nieparametrycznie.&lt;br /&gt;
==== Wersja parametryczna ====&lt;br /&gt;
Konstruujemy 95% przedział ufności wokół oryginalnej różnicy średnich.&lt;br /&gt;
Dla dwóch grup wariancję różnicy średnich znajdujemy sumując wariancje śrenich estymowane dla każdej z grup:&lt;br /&gt;
:&amp;lt;math&amp;gt; &lt;br /&gt;
\mathrm{var}_{\Delta} = \frac{1}{N_1}\mathrm{var}(x_1) + \frac{1}{N_2} \mathrm{var}(x_2)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
ilość stopni swobody:&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
 df = N_1+N_2-2&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
co prowadzi do estymatora&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
s^2_\Delta = \frac{N_1s_1^2 + N_2s_2^2}{N_1+N_2-2} \cdot \frac{N_1+N_2}{N_1N_2}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
roznica_oryginalna = np.mean(A) - np.mean(B)&lt;br /&gt;
f = NA+NB-2;&lt;br /&gt;
v_A = np.var(A)&lt;br /&gt;
v_B = np.var(B)&lt;br /&gt;
sig = np.sqrt( ((NA*v_A +NB*v_B))/f * (NA + NB)/(NA*NB) )&lt;br /&gt;
t_2_5 = st.t.ppf(0.025,f);&lt;br /&gt;
t_97_5 = st.t.ppf(0.975,f);&lt;br /&gt;
print('przedział ufności dla różnicy średnich przy założeniu normalności %(d).2f %(g).2f'%{'d':sig*t_2_5+ roznica_oryginalna,'g':sig*t_97_5+roznica_oryginalna})&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Otrzymujemy w wyniku &amp;lt;tt&amp;gt;przedział ufności dla różnicy średnich przy założeniu normalności 0.77 5.56&amp;lt;/tt&amp;gt;. Oznacza to, że w 95% analogicznych badań powinniśmy otrzymać różnicę średnich zawartą w tym przedziale. Przedził ten nie zawiera wartości 0, zatem na przyjętym poziomie istotności średnie grupy A i B są różne.&lt;br /&gt;
&lt;br /&gt;
====Wersja nieparametryczna ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# POP zawiera świat zgodny z H0&lt;br /&gt;
roznica_oryginalna = np.mean(A) - np.mean(B)&lt;br /&gt;
alfa = 0.05&lt;br /&gt;
N_rep = 10000&lt;br /&gt;
r = np.zeros(N_rep)&lt;br /&gt;
for i in range(N_rep):&lt;br /&gt;
	gA = randsample(POP, NA)&lt;br /&gt;
	gB = randsample(POP, NB)&lt;br /&gt;
	r[i] = np.mean(gA) - np.mean(gB)&lt;br /&gt;
ci_d = st.scoreatpercentile(r, per = alfa/2*100)&lt;br /&gt;
ci_g = st.scoreatpercentile(r, per = (1-alfa/2)*100)&lt;br /&gt;
# print('przedział ufności: %(d).2f %(g).2f'%{'m':np.mean(r),'d':ci_d+roznica_oryginalna, 'g':ci_g+roznica_oryginalna})&lt;br /&gt;
print('przedział ufności: %(d).2f %(g).2f'%{'m':np.mean(r),'d':ci_d, 'g':ci_g})&lt;br /&gt;
print('oryginalna różnica średnich: %(ro).2f'%{'ro':roznica_oryginalna})&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Wynik:&lt;br /&gt;
&amp;lt;tt&amp;gt;przedział ufności: -2.50 2.50&lt;br /&gt;
oryginalna różnica średnich: 3.17&amp;lt;/tt&amp;gt;.&lt;br /&gt;
Przedział ufności 95% na różnicę skonstruowany zgodnie z &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; nie zawiera oryginalnej różnicy średnich, &lt;br /&gt;
zatem różnica 3.17 w świecie zgodnym z &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; zdarza się nie częściej niż w 5% przypadków. Wniosek: średnie grup A i B są różne  na przyjętym poziomie ufności.&lt;br /&gt;
&lt;br /&gt;
== Zadanie: Przeżywalność myszy ==&lt;br /&gt;
Mamy 7 myszy, którym podano środek, który miał poprawić ich przeżywalność po operacji oraz 9 myszy kontrolnych, którym owego środka nie podano. Myszy traktowane specjalnie przeżyły &amp;lt;br&amp;gt;&lt;br /&gt;
94, 38, 23, 197, 99, 16, 141 dni&amp;lt;br&amp;gt;&lt;br /&gt;
a myszy traktowane standardowo:&amp;lt;br&amp;gt;&lt;br /&gt;
52, 10, 40, 104, 51, 27, 146, 30, 46 dni&amp;lt;br&amp;gt;&lt;br /&gt;
Średnia różnica wynosi 30,63 dni dłużej dla myszy traktowanych po nowemu.&lt;br /&gt;
Pytanie, na które chcielibyśmy znać odpowiedź to: Czy nowy środek faktycznie poprawia przeżywalność.&lt;br /&gt;
Zadanie proszę rozwiązać wszystkimi możliwymi sposobami, analogicznie do powyższego przykładu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Odp'': &lt;br /&gt;
:przedział ufności: [&amp;amp;minus;51,64 52,89]&lt;br /&gt;
:oryginalna różnica średnich: 30,63&lt;br /&gt;
:przedział ufności dla różnicy średnich przy założeniu normalności [&amp;amp;minus;27,99  89,26]&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
'''Przedział ufności dla różnicy dwóch średnich&lt;br /&gt;
&lt;br /&gt;
Mamy 7 myszy, którym podano środek, który miał poprawić ich przeżywalność &lt;br /&gt;
po operacji oraz 9 myszy kontrolnych, którym owego środka nie podano. &lt;br /&gt;
Myszy traktowane specjalnie przeżyły&lt;br /&gt;
94 38 23 197 99 16 141 dni&lt;br /&gt;
a myszy traktowane standardowo:&lt;br /&gt;
52 10 40 104 51 27 146 30 46 dni&lt;br /&gt;
Średnia różnica wynosi 30.63 dni dłużej dla myszy traktowanych po nowemu. &lt;br /&gt;
Pytanie, na które chcielibyśmy znać odpowiedź to: Czy nowy środek faktycznie &lt;br /&gt;
poprawia przeżywalność.&lt;br /&gt;
&lt;br /&gt;
Skonstruujmy przedział ufności 95% dla średniej różnicy w przeżywalności.&lt;br /&gt;
&lt;br /&gt;
Uwaga: przy tym problemie każdą z grup traktujemy jako reprezentantów bardzo &lt;br /&gt;
dużych populacji. '''&lt;br /&gt;
def randsample(x,ile):&lt;br /&gt;
	ind = st.randint.rvs(0,len(x),size = ile)&lt;br /&gt;
	y = x[ind]&lt;br /&gt;
	return y&lt;br /&gt;
&lt;br /&gt;
m_sp = np.array([94, 38, 23, 197, 99, 16, 141])&lt;br /&gt;
N_sp = len(m_sp)&lt;br /&gt;
m_st = np.array([52, 10, 40, 104, 51, 27, 146, 30, 46])&lt;br /&gt;
N_st = len(m_st)&lt;br /&gt;
alfa = 0.05&lt;br /&gt;
# zgodnie z hipotezą zerową (H0) nie ma różnicy między grupami&lt;br /&gt;
&lt;br /&gt;
# symulacja&lt;br /&gt;
# tworzymy świat zgodny z H0&lt;br /&gt;
m = np.concatenate((m_sp,m_st))&lt;br /&gt;
&lt;br /&gt;
roznica_oryginalna = np.mean(m_sp) - np.mean(m_st)&lt;br /&gt;
&lt;br /&gt;
N_rep = 10000&lt;br /&gt;
r = np.zeros(N_rep)&lt;br /&gt;
for i in range(N_rep):&lt;br /&gt;
	g1 = randsample(m, N_sp)&lt;br /&gt;
	g2 = randsample(m, N_st)&lt;br /&gt;
	r[i] = np.mean(g1) - np.mean(g2)&lt;br /&gt;
ci_d = st.scoreatpercentile(r, per = alfa/2*100)&lt;br /&gt;
ci_g = st.scoreatpercentile(r, per = (1-alfa/2)*100)&lt;br /&gt;
print('przedział ufności: %(d).2f %(g).2f'%{'m':np.mean(r),'d':ci_d, 'g':ci_g})&lt;br /&gt;
print('oryginalna różnica średnich: %(ro).2f'%{'ro':roznica_oryginalna})&lt;br /&gt;
# przedział ufności na różnicę skonstruowany zgodnie z H0 zawiera oryginalną różnicę średnich, &lt;br /&gt;
# zatem różnica taka jest na przyjętym poziomie ufności możliwa &lt;br /&gt;
# do zaobserwowania w przypadku braku różnicy między grupami&lt;br /&gt;
&lt;br /&gt;
# zakładając normalność&lt;br /&gt;
f = N_sp+N_st-2;&lt;br /&gt;
v_1 = np.var(m_sp)&lt;br /&gt;
v_2 = np.var(m_st)&lt;br /&gt;
sig = np.sqrt( ((N_sp*v_1 +N_st*v_2))/f * (N_sp + N_st)/float(N_sp*N_st) )&lt;br /&gt;
t_2_5 = st.t.ppf(0.025,f);&lt;br /&gt;
t_97_5 = st.t.ppf(0.975,f);&lt;br /&gt;
print('przedział ufności dla różnicy średnich przy założeniu normalności %(d).2f %(g).2f'%{'d':sig*t_2_5+ roznica_oryginalna,'g':sig*t_97_5+roznica_oryginalna})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
print('przedział ufności dla różnicy średnich przy założeniu normalności %(d).2f %(g).2f'%{'d':s_delta*t_2_5+ roznica_oryginalna,'g':s_delta*t_97_5+roznica_oryginalna})&lt;br /&gt;
# skonstruowany wokoł oryginalnej różnicy średnich przedział ufności zawiera 0, zatem nie możemy odrzucić możliwości,&lt;br /&gt;
# że nie ma różnicy między grupami&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zadanie: Linie lotnicze==&lt;br /&gt;
Linie lotnicze, projektując nowy samolot chcą sprawdzić czy średnia waga bagażu ręcznego zabieranego przez pasażerów nie zmieniła się od czasu poprzednich badań i wynosi wciąż 12 kg. Analiza ma być przeprowadzona na poziomie istotności &amp;lt;math&amp;gt;\alpha = 0,05&amp;lt;/math&amp;gt;. Analityk pobrał próbę bagażu ręcznego 144 pasażerów i obliczył wartość średnią z próby &amp;lt;math&amp;gt;\bar x = 14,6&amp;lt;/math&amp;gt; kg i odchylenie standardowe z próby &amp;lt;math&amp;gt;s = 7,8&amp;lt;/math&amp;gt;. Przeprowadź test hipotezy, że &amp;lt;math&amp;gt;\mu = 12&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
Standardowe importy modułów&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zmienne występujące w treści przykładu&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
mu_0=12&lt;br /&gt;
a=0.05&lt;br /&gt;
N=144&lt;br /&gt;
x=14.6&lt;br /&gt;
s=7.8&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Test dotyczy średniej wiec obliczamy odchylenie standardowe średniej:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
std_mu=s/np.sqrt(N)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wyjaśnienie |title= Obliczamy wartość statystyki:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt; &lt;br /&gt;
t=(mu_0-x)/std_mu&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Odchylenie standardowe estymowaliśmy z próby. Wartości powyższej statystyki podlegają zatem rozkładowi  t. Obliczamy wartości krytyczne odpowiadające poziomowi istotności a. Test jest dwustronny mamy wiec dwie wartości krytyczne: jedna odcina obszar pod funkcja gęstości prawdopodobieństwa na lewo,  a druga na prawo od siebie. Pole każdego z tych obszarów wynosi a/2:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt; &lt;br /&gt;
  &lt;br /&gt;
t_kryt_lewy = st.t.ppf(a/2,N-1)&lt;br /&gt;
t_kryt_prawy = st.t.ppf( 1-a/2, N-1)&lt;br /&gt;
&lt;br /&gt;
print('obliczona wartość statystyki t: ', t)&lt;br /&gt;
print('wartości krytyczne t: %(tl).2f %(tp).2f '%{'tl':t_kryt_lewy, 'tp':t_kryt_prawy})&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Możemy też obliczyć prawdopodobieństwo zaobserwowania wartości ''t'' takiej jak w naszym zadaniu lub bardziej ekstremalnej:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt; &lt;br /&gt;
p =  (st.t.cdf(-np.abs(t),N-1)) + (1-st.t.cdf(np.abs(t), N-1))  # sumujemy po obu ogonach  bo test jest dwustronny&lt;br /&gt;
print('Prawdopodobieństwo zaobserwowania bardziej ekstremalnych wartości t: %(p).4f'%{'p':p})&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wyniki te możemy zilustrować:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt; &lt;br /&gt;
os_t = np.arange(-5, 5, 0.1)&lt;br /&gt;
py.plot(os_t, st.t.pdf(os_t,N-1)) #rysujemy funkcję gęstości prawdopodobieństwa t o N-1 st. swobody&lt;br /&gt;
&lt;br /&gt;
#cieniujemy lewy obszary pod funkcją gęstości prawdopodobieństwa odpowiadający obliczonemu p&lt;br /&gt;
os_t2 = np.arange(-5, t_kryt_lewy, 0.1)&lt;br /&gt;
py.fill_between(os_t2,st.t.pdf(os_t2,N-1)) &lt;br /&gt;
#cieniujemy prawy obszary pod funkcją gęstości prawdopodobieństwa odpowiadający obliczonemu p&lt;br /&gt;
os_t2 = np.arange(t_kryt_prawy, 5,  0.1)&lt;br /&gt;
py.fill_between(os_t2,st.t.pdf(os_t2,N-1)) &lt;br /&gt;
&lt;br /&gt;
# zaznaczamy obliczoną wartość statystyki:&lt;br /&gt;
py.plot((t,), (0,), 'ro')&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Odpowiedź: Wyliczone ''t'' leży poza obszarem akceptacji hipotezy zerowej, zatem odrzucamy hipotezę zerową i akceptujemy alternatywną.&lt;br /&gt;
&lt;br /&gt;
==Zadanie: Agencja nieruchomości==&lt;br /&gt;
Agencja nieruchomości w Japonii podała, że ceny gruntu w centrum Tokio wzrosły o 49% w ciągu ostatniego roku. Inwestor chcąc przetestować te dane, znajduje próbę 18 nieruchomości w centrum Tokio, dla których zna cenę obecna i sprzed roku. Zakłada, że ceny podlegają rozkładowi normalnemu. Dla każdej nieruchomości oblicza procentowy wzrost wartości a następnie znajduje średnią i odchylenie standardowe z próby. Estymatory dla próby wynoszą &amp;lt;math&amp;gt;\bar x = 38&amp;lt;/math&amp;gt;% i &amp;lt;math&amp;gt;s = 14&amp;lt;/math&amp;gt;%. Przeprowadź test na poziomie istotności &amp;lt;math&amp;gt;\alpha = 0,01&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
mu_0=49;&lt;br /&gt;
x=38;&lt;br /&gt;
s=14;&lt;br /&gt;
N=18;&lt;br /&gt;
a=0.01;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# test dotyczy sredniej wiec jej std:&lt;br /&gt;
std_mu=s/np.sqrt(N)&lt;br /&gt;
&lt;br /&gt;
# odchylenie std obliczylismy z proby =&amp;gt; stosujemy test t&lt;br /&gt;
# obliczamy wartość statystyki &lt;br /&gt;
t=(mu_0-x)/std_mu&lt;br /&gt;
# obliczamy wartości krytyczne odpowiadające poziomowi istotności a&lt;br /&gt;
# test jest dwustronny mamy wiec dwie wartosci krytyczne &lt;br /&gt;
# jedna odcina obszar pod funkcja gęstości prawdopodobieństwa na lewo, &lt;br /&gt;
# a druga na prawo od siebie. Pole każdego z tych obszarów wynosi a/2&lt;br /&gt;
  &lt;br /&gt;
t_kryt_lewy = st.t.ppf(a/2,N-1)&lt;br /&gt;
t_kryt_prawy = st.t.ppf( 1-a/2, N-1)&lt;br /&gt;
&lt;br /&gt;
print('obliczona wartość statystyki t: ', t)&lt;br /&gt;
print('wartości krytyczne t: %(tl).2f %(tp).2f '%{'tl':t_kryt_lewy, 'tp':t_kryt_prawy})&lt;br /&gt;
&lt;br /&gt;
# Możemy też obliczyć prawdopodobieństwo zaobserwowania wrtości t takiej jak w naszym zadaniu &lt;br /&gt;
# lub bardziej ekstremalnej:&lt;br /&gt;
p = (1-st.t.cdf(t, N-1)) + (st.t.cdf(-t,N-1)) # sumujemy po obu ogonach  bo test jest dwustronny&lt;br /&gt;
		&lt;br /&gt;
print('Prawdopodobieństwo zaobserwowania bardziej ekstremalnych wrtości t: %(p).3f'%{'p':p})&lt;br /&gt;
# Wyniki te możemy zilustrować&lt;br /&gt;
os_t = np.arange(-5, 5, 0.1)&lt;br /&gt;
py.plot(os_t, st.t.pdf(os_t,N-1)) #rysujemy funkcję gęstości prawdopodobieństwa t o N-1 st. swobody&lt;br /&gt;
&lt;br /&gt;
#cieniujemy lewy obszary pod funkcją gęstości prawdopodobieństwa odpowiadający obliczonemu p&lt;br /&gt;
os_t2 = np.arange(-5, t_kryt_lewy, 0.1)&lt;br /&gt;
py.fill_between(os_t2,st.t.pdf(os_t2,N-1)) &lt;br /&gt;
#cieniujemy prawy obszary pod funkcją gęstości prawdopodobieństwa odpowiadający obliczonemu p&lt;br /&gt;
os_t2 = np.arange(t_kryt_prawy, 5,  0.1)&lt;br /&gt;
py.fill_between(os_t2,st.t.pdf(os_t2,N-1)) &lt;br /&gt;
&lt;br /&gt;
# zaznaczamy obliczoną wartość statystyki:&lt;br /&gt;
py.plot(t, 0, 'ro')&lt;br /&gt;
py.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# 'Odp: Wyliczone t lezy poza obszarem akceptacji hipotezy zerowej,&lt;br /&gt;
# zatej odrzucamy hipoteze zerowa i akceptujemy alternatywna.'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Odp. Odrzucamy &amp;lt;math&amp;gt;H_0:&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\mu_0 = 49&amp;lt;/math&amp;gt;, na poziomie istotności 0,01.&lt;br /&gt;
&lt;br /&gt;
==Zadanie: Zabiegi bio-inżynieryjne==&lt;br /&gt;
Załóżmy, że krowy są bardziej wartościowe od byków. Bio-inżynier twierdzi, że przy pomocy pewnych zabiegów jest w stanie spowodować zwiększenie szansy na urodzenie się krowy powyżej 50%. W jego eksperymencie na 10 urodzonych zwierząt 9 było krowami, a tylko 1 bykiem. Czy powinnniśmy wierzyć temu bio-inżynierowi? Jakia jest szansa na uzyskanie takiego, bądź bardziej ekstremalnego wyniku przy założeniu, że procedura stosowana przez naszego inżyniera nia ma żadnych efektów? W tym problemie dla odmiany założymy, że w normalnych warunkach 100 spośród 206 cieląt to krowy.&lt;br /&gt;
Zadanie rozwiązać metodą parametryczną i przez repróbkowanie. [[WnioskowanieStatystyczne/_Testowanie_hipotez#Przykład:_mutacje_muszek_owocowych|Wskazówka]]&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
def randsample(x, N):&lt;br /&gt;
	'''zwraca wektor z losowo wybranymi elementami wektora x. Losowanie odbywa się z powtórzeniami''' &lt;br /&gt;
	n=len(x)&lt;br /&gt;
	ind = np.random.randint(n, size = N)&lt;br /&gt;
	y = x[ind]&lt;br /&gt;
	return y&lt;br /&gt;
&lt;br /&gt;
# sposób pierwszy:&lt;br /&gt;
# zmienna urodzenie byka/krowy podlega rozkladowi dwumianowemu &lt;br /&gt;
p = 100.0/206&lt;br /&gt;
N = 10&lt;br /&gt;
k = 9&lt;br /&gt;
p_bino = 1-st.binom.cdf(k-1,N,p) #prawdopodobieństwo wylosowania 9 lub 10 krów w 10 probach &lt;br /&gt;
print('Prawdopodobieństwo wylosowania 9 lub 10 krów w 10 probach: %(p).4f'%{'p':p_bino})&lt;br /&gt;
# W jego mwetodzie chyba cos jest&lt;br /&gt;
&lt;br /&gt;
# sposob drugi: repróbkowanie&lt;br /&gt;
# model swiata z ktorego pochodza byki(0)/krowy(1):&lt;br /&gt;
w = np.concatenate((np.ones(100), np.zeros(106)))&lt;br /&gt;
&lt;br /&gt;
N_rep = 100000&lt;br /&gt;
wynik = np.zeros(N_rep)&lt;br /&gt;
for i in range(N_rep):&lt;br /&gt;
	wynik[i] = np.sum(randsample(w,10))&lt;br /&gt;
&lt;br /&gt;
p_rep = float(np.sum(wynik&amp;gt;=k))/N_rep&lt;br /&gt;
print('Prawdopodobieństwo wylosowania 9 lub 10 krów w 10 probach estymowane z symulacji: %(p).4f'%{'p':p_rep})&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''Odp'':  ''p'' = 0,008. Odrzucamy ''H''&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; o braku efektów.&lt;br /&gt;
&lt;br /&gt;
==Zadanie: Porównanie lekarstwa i placebo==&lt;br /&gt;
Badamy skuteczność leku na raka. Mamy grupę 12 chorych: 6 osobom podajemy lek &amp;amp;mdash; poprawa wystąpiła u 5 osób, pozostałym sześciu osobom podajemy placebo &amp;amp;mdash; poprawa wystąpiła u 2 osób. Czy te wyniki upoważniają do stwierdzenia, że lek istotnie zwiększa szansę poprawy? Test przeprowadzić na poziomie istotności 5%.&lt;br /&gt;
&lt;br /&gt;
Wskazówka: jako statystykę przyjąć różnicę w ilości popraw między grupą z lekiem a grupą z placebo. Interesuje nas prawdopodobieństwo zaobserwowania takiej (3) bądź większej różnicy. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
def randsample(x, N):&lt;br /&gt;
	'''zwraca wektor z losowo wybranymi elementami wektora x. Losowanie odbywa się z powtórzeniami''' &lt;br /&gt;
	n=len(x)&lt;br /&gt;
	ind = np.random.randint(n, size = N)&lt;br /&gt;
	y = x[ind]&lt;br /&gt;
	return y&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Formułujemy hipotezy &lt;br /&gt;
# H0: lek nie daje poprawy &lt;br /&gt;
# H1: lek daje poprawę&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# zgodnie z H0 obie próby pochodzą ze świata:&lt;br /&gt;
# pierwszy sposób: repróbkowanie&lt;br /&gt;
w = np.concatenate((np.ones(7), np.zeros(5))) # jedynki -&amp;gt; wystąpiła poprawa&lt;br /&gt;
&lt;br /&gt;
n_l = 5 # ilosc popraw w grupie leku&lt;br /&gt;
n_p = 2 #ilosc popraw w grupie placebo&lt;br /&gt;
# jako statystykę testową przyjmiemy różnicę w ilości popraw miedzy grupami&lt;br /&gt;
# w tym problemie istotne jest zwiększenie ilości popraw wiec stosujemy test&lt;br /&gt;
# jednostronny&lt;br /&gt;
N_rep = 100000&lt;br /&gt;
&lt;br /&gt;
st_0= n_l - n_p&lt;br /&gt;
st_rep=np.zeros(N_rep)&lt;br /&gt;
&lt;br /&gt;
for i in range(N_rep):&lt;br /&gt;
    n_l_rep   = np.sum(randsample(w,6))&lt;br /&gt;
    n_p_rep   = np.sum(randsample(w,6))&lt;br /&gt;
    st_rep[i] = n_l_rep - n_p_rep # wartość statystyki w i-tym repróbkowaniu&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
p_rep = float(np.sum(st_rep &amp;gt;= st_0))/N_rep&lt;br /&gt;
print('''Prawdopodobieństwo wylosowania takiej samej bądź większej różnicy w ilości popraw estymowane z symulacji: %(p).4f'''%{'p':p_rep})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# drugi sposób:&lt;br /&gt;
# zmienna uzyskanie poprawy podlega rozkładowi dwumianowemu &lt;br /&gt;
p = 7.0/12&lt;br /&gt;
N = 6&lt;br /&gt;
k1 = 5&lt;br /&gt;
k2 = 2&lt;br /&gt;
p_param = 0&lt;br /&gt;
for d in range(N-st_0+1):  # w tej pętli sumujemy prawdopodobieństwa zdarzeń  sprzyjających zaobserwowaniu różnicy co najmniej st_0 popraw &lt;br /&gt;
	p_bino1 = 1-st.binom.cdf(st_0 - 1 +d, N, p)  # prawdopodobieństwo uzyskania poprawy w co najmniej st_0 +d próbach&lt;br /&gt;
	p_bino2 = st.binom.pmf(d,N,p)   # prawdopodobieństwo uzyskania poprawy w d próbach&lt;br /&gt;
	p_param += p_bino1 * p_bino2 # prawdopodobieństwo zaobserwowania jednocześnie obu powyższych sytuacji&lt;br /&gt;
&lt;br /&gt;
print('Prawdopodobieństwo estymowane parametrycznie: %(p).4f'%{'p':p_param})&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: Odp: Prawdopodobieństwo wylosowania takiej samej bądź większej różnicy w ilości popraw estymowane z symulacji: 0,0702&lt;br /&gt;
Prawdopodobieństwo estymowane parametrycznie: 0,0699. Wniosek: nie mamy podstaw do odrzucenia hipotezy zerowej.&lt;br /&gt;
&lt;br /&gt;
==Zadanie: Pomiar masy cząstki elementarnej==&lt;br /&gt;
W pomiarach wstępnych zbadano masę spoczynkową pewnej cząstki elementarnej. Otrzymano następujące wyniki [MeV/c²]:&lt;br /&gt;
&lt;br /&gt;
139.20, 139.34, 140.22, 139.56, 139.42, 139.64, 139.22, 139.74, 139.38, 139.54,&lt;br /&gt;
139.38, 139.46, 140.09, 139.77, 139.52, 139.47, 139.89, 138.95, 139.99, 139.64,&lt;br /&gt;
139.37, 139.49, 139.15, 139.77, 140.10, 139.48, 139.84, 139.44, 140.13&lt;br /&gt;
&lt;br /&gt;
Zbadaj na poziomie istotności 1%, czy cząstką tą mógł być naładowany pion.&lt;br /&gt;
&lt;br /&gt;
Zbadaj na poziomie istotności 1%, czy cząstką tą mógł być neutralny pion.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
&lt;br /&gt;
alfa = 0.01 # poziom istotności&lt;br /&gt;
dane = np.array([139.20, 139.34, 140.22, 139.56, 139.42, 139.64, 139.22, 139.74,&lt;br /&gt;
                 139.38, 139.54, 139.38, 139.46, 140.09, 139.77, 139.52, 139.47,&lt;br /&gt;
                 139.89, 138.95, 139.99, 139.64, 139.37, 139.49, 139.15, 139.77,&lt;br /&gt;
                 140.10, 139.48, 139.84, 139.44, 140.13])&lt;br /&gt;
&lt;br /&gt;
Pi_plus_min = 139.57 # masa pionów naładowanych Pi+ i Pi-&lt;br /&gt;
Pi_neutral = 134.98  # masa pionu neutralnego Pi0&lt;br /&gt;
&lt;br /&gt;
# test t hipotezy H0, że dane pochodzą z rozkładu normalnego o wartości oczekiwanej Pi_plus_min&lt;br /&gt;
t1, p1 = st.ttest_1samp(dane,Pi_plus_min)&lt;br /&gt;
print(&amp;quot;Poziom p dla hipotezy, że był do pion naładowany&amp;quot;,p1)&lt;br /&gt;
if p1&amp;gt;=alfa: print(&amp;quot;Nie możemy odrzucić tej hipotezy na poziomie istotności {}%&amp;quot;.format(100*alfa))&lt;br /&gt;
else: print(&amp;quot;Możemy odrzucić tę hipotezę na poziomie istotności {}%&amp;quot;.format(100*alfa))&lt;br /&gt;
&lt;br /&gt;
# test t hipotezy H0, że dane pochodzą z rozkładu normalnego o średniej Pi_neutral&lt;br /&gt;
t2, p2 = st.ttest_1samp(dane,Pi_neutral)&lt;br /&gt;
print(&amp;quot;\nPoziom p dla hipotezy, że był do pion neutralny&amp;quot;,p2)&lt;br /&gt;
if p2&amp;gt;=alfa: print(&amp;quot;Nie możemy odrzucić tej hipotezy na poziomie istotności {}%&amp;quot;.format(100*alfa))&lt;br /&gt;
else: print(&amp;quot;Możemy odrzucić tę hipotezę na poziomie istotności {}%&amp;quot;.format(100*alfa))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Przykład: Średnie grup sparowanych: Lek przeciwdepresyjny==&lt;br /&gt;
Poniższa tabela prezentuje wyniki 9 pacjentów wykonujących pewien test diagnostyczny przed podaniem leku i po podaniu leku. &lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class='wikitable'&lt;br /&gt;
!przed	&lt;br /&gt;
!po&lt;br /&gt;
|-&lt;br /&gt;
|1,83	&lt;br /&gt;
|0,878&lt;br /&gt;
|-&lt;br /&gt;
|0,50	&lt;br /&gt;
|0,647&lt;br /&gt;
|-&lt;br /&gt;
|1,62	&lt;br /&gt;
|0,598&lt;br /&gt;
|-&lt;br /&gt;
|2,48	&lt;br /&gt;
|2,05&lt;br /&gt;
|-&lt;br /&gt;
|1,68	&lt;br /&gt;
|1,06&lt;br /&gt;
|-&lt;br /&gt;
|1,88	&lt;br /&gt;
|1,29&lt;br /&gt;
|-&lt;br /&gt;
|1,55	&lt;br /&gt;
|1,06&lt;br /&gt;
|-&lt;br /&gt;
|3,06	&lt;br /&gt;
|3,14&lt;br /&gt;
|-&lt;br /&gt;
|1,3	&lt;br /&gt;
|1,29&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
PRZED = [1.83, 0.5, 1.62, 2.48, 1.68, 1.88, 1.55, 3.06, 1.3]&lt;br /&gt;
PO = [0.878, 0.647, 0.598, 2.05, 1.06, 1.29, 1.06, 3.14, 1.29]&lt;br /&gt;
&lt;br /&gt;
Skonstruować test, który pozwoli stwierdzić czy lek jest skuteczny. Porównać różne wersje testu:&lt;br /&gt;
* bootstrapową (losowanie z powtórzeniami), &lt;br /&gt;
* permutacyjną, &lt;br /&gt;
* test parametryczny &lt;br /&gt;
* test nieparametryczny. &lt;br /&gt;
&lt;br /&gt;
Jakie założenia przyjmujemy przy każdej z wersji testu?&lt;br /&gt;
&lt;br /&gt;
===Rozwiązanie===&lt;br /&gt;
W tym zadaniu mamy dwie grupy ''przed'' i ''po'' ale oprócz tego istnieje ścisły porządek w parach, bez sensu jest porównywanie ''przed'' od jednego pacjenta z ''po'' drugiego pacjenta. Musimy stosować testy, które biorą ten porządek pod uwagę (testy pairwise).&lt;br /&gt;
&lt;br /&gt;
Jako miarę tego czy lek jest skuteczny przyjmiemy różnicę (''po'' - ''przed'').  Każda z zaobserwowanych różnic to zmienna losowa. Ich średnia to nasza STATYSTYKA. Będziemy wierzyli, że lek działa jeśli ta różnica jest istotnie mniejsza od zera. Mamy stąd hipotezy:&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;math&amp;gt;H_0: \bar r \geq 0&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;math&amp;gt;H_1: \bar r &amp;lt; 0 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Wersja bootstrapowa====&lt;br /&gt;
&lt;br /&gt;
Założenie, które czynimy w wersji bootstrapowej testu jest następujące:&lt;br /&gt;
Zaobserwowana grupa pacjentów jest reprezentatywna, tzn. istnieje duża populacja pacjentów spośród której moglibyśmy pobrać wiele innych grup podobnych pod względem interesujących nas parametrów do grupy zaobserwowanej w tym konkretnym eksperymencie. Konsekwencją tego założenia jest to, że jeśli w naszej grupie mamy już pacjenta z wynikami: [1.83,	0.878], to szansa na wylosowanie kolejnego pacjenta o takich wynikach się nie zmienia i nadal wynosi 1/9. Prowadzi to do implementacji zawierającej losowanie z powtórzeniami.&lt;br /&gt;
&lt;br /&gt;
Losowość występuje tu w dwóch miejscach:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; losujemy pacjentów z powtórzeniami - zakładamy, że badana grupa jest reprezentatywna dla bardzo dużej populacji.&lt;br /&gt;
&amp;lt;li&amp;gt; dla każdego z wybranych pacjentów losujemy jego wynik ''przed'' oraz wynik ''po'' z wyników, które uzyskał w rzeczywistości --- to jest zgodne z hipotezą zerową.&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Dla każdego losowania obliczamy wartość statystyki w tym losowania uśredniając  różnice indywidualne.&lt;br /&gt;
Wartości statystyki otrzymane dla wszystkich losowań tworzą jej empiryczny rozkład, przy założeniu, że hipoteza zerowa jest prawdziwa. Jako estymator prawdopodobieństwa zaobserwowania oryginalnej wartości statystyki ''mr'' (średnia różnica) przy prawdziwej hipotezie zerowej przyjmujemy frakcję rozkładu empirycznego, w której wartości statystyki były nie większe niż ''mr''. Wynik ilustrujemy histogramem rozkładu empirycznego z zaznaczoną ową frakcją.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
def randsample(x, N):&lt;br /&gt;
	'''zwraca wektor z losowo wybranymi elementami wektora x. &lt;br /&gt;
         Losowanie odbywa się z powtórzeniami''' &lt;br /&gt;
&lt;br /&gt;
	n=len(x)&lt;br /&gt;
	ind = np.random.randint(n, size = N)&lt;br /&gt;
	y = x[ind]&lt;br /&gt;
	return y&lt;br /&gt;
&lt;br /&gt;
def hist_z_markerem(x, N_bins, marker):&lt;br /&gt;
	'''Rysuje histogram wartości w tablicy x, używając N_bins binów. &lt;br /&gt;
	Na lewo od wartości wskazanej przez marker dorysowywany jest prostokąt'''&lt;br /&gt;
	&lt;br /&gt;
	r = np.max(x) - np.min(x)&lt;br /&gt;
	szer_binu = r/N_bins&lt;br /&gt;
&lt;br /&gt;
	#konstruujemy biny&lt;br /&gt;
        # robimy biny od markera co szerokość binu aż do x minimalnego&lt;br /&gt;
	biny_na_lewo = np.arange( marker, np.min(x), -szer_binu)&lt;br /&gt;
        # odwracamy kolejność tej sekwencji żeby była rosnąca&lt;br /&gt;
	biny_na_lewo = biny_na_lewo[-1::-1] &lt;br /&gt;
         # robimy biny od markera co szerokość binu aż do x maksymalnego&lt;br /&gt;
	biny_na_prawo = np.arange(marker,np.max(x), szer_binu)&lt;br /&gt;
        # sklejamy oba zakresy binów&lt;br /&gt;
	biny = np.concatenate((biny_na_lewo, biny_na_prawo))&lt;br /&gt;
	(n,xx,patch) = py.hist(x,bins = biny)&lt;br /&gt;
	py.fill([np.min(xx), np.min(xx), marker, marker] , [0, np.max(n), np.max(n), 0] ,'r' ,alpha = 0.2)&lt;br /&gt;
&lt;br /&gt;
A=np.array([[1.83,	0.878],&lt;br /&gt;
[0.50,	0.647],&lt;br /&gt;
[1.62,	0.598],&lt;br /&gt;
[2.48,	2.05],&lt;br /&gt;
[1.68,	1.06],&lt;br /&gt;
[1.88,	1.29],&lt;br /&gt;
[1.55,	1.06],&lt;br /&gt;
[3.06,	3.14],&lt;br /&gt;
[1.30,	1.29]])&lt;br /&gt;
&lt;br /&gt;
r = A[:,1] - A[:,0] # od drugiej kolumny odejmuję pierwszą&lt;br /&gt;
mr = np.mean(r)  # średnia z tych różnic to wartość statystyki zaobserwowana dla oryginalnych danych&lt;br /&gt;
print( 'średnia różnica: %(mr).2f'%{'mr':mr})&lt;br /&gt;
&lt;br /&gt;
N = len(r)&lt;br /&gt;
&lt;br /&gt;
N_rep = 100000&lt;br /&gt;
r_boot = np.zeros(N_rep)&lt;br /&gt;
przed = np.zeros(N)&lt;br /&gt;
po = np.zeros(N)&lt;br /&gt;
&lt;br /&gt;
for i in range(N_rep):&lt;br /&gt;
    ix=randsample(np.arange(0,N,1),N) # wybieramy pacjentów z powtórzeniami&lt;br /&gt;
    B=np.array(A[ix,:])&lt;br /&gt;
    for j in range(N):   # mieszamy losowo przypisując wyniki do grupy przed i po&lt;br /&gt;
                         # zakładając, że pacjent może uzyskać dwukrotnie taki sam wynik&lt;br /&gt;
        s = np.random.rand()&lt;br /&gt;
        if s &amp;gt; 0.5:&lt;br /&gt;
            przed[j]=B[j,0]&lt;br /&gt;
        else:&lt;br /&gt;
            przed[j]=B[j,1]&lt;br /&gt;
        s = np.random.rand()&lt;br /&gt;
        if s &amp;gt; 0.5:&lt;br /&gt;
            po[j]=B[j,1]&lt;br /&gt;
        else:&lt;br /&gt;
            po[j]=B[j,0]&lt;br /&gt;
    rr=po-przed&lt;br /&gt;
    r_boot[i] = np.mean(rr)&lt;br /&gt;
&lt;br /&gt;
hist_z_markerem(r_boot,30,mr)&lt;br /&gt;
p_h0 = np.sum( r_boot &amp;lt;=  mr)/N_rep&lt;br /&gt;
s_boot = u'dla repróbkowanego testu jednostronnego: %(p_h0).5f'%{'p_h0': p_h0}&lt;br /&gt;
print( s_boot)&lt;br /&gt;
py.title(s_boot)&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Wersja permutacyjna====&lt;br /&gt;
&lt;br /&gt;
W tym teście zakładamy, że grupa pacjentów jest unikalna, więc w procedurze wytwarzania empirycznego rozkładu statystyki  korzystamy z danych wszystkich pacjentów w każdej iteracji. &lt;br /&gt;
&lt;br /&gt;
Zgodnie z hipotezą zerową pomiary ''przed'' i ''po'' są równoważne można je zatem zamieniać. Wykonamy wszystkie możliwe zamiany ''przed'' i ''po''. Możliwych zamian jest &amp;lt;math&amp;gt;2^N&amp;lt;/math&amp;gt;.  Skorzystamy z faktu, że bity w reprezentacji binarnej liczb całkowitych od 0 do &amp;lt;math&amp;gt;2^{N-1}&amp;lt;/math&amp;gt; zawierają wszystkie możliwe permutacje ciągów zer i jedynek o długości ''N''. Wartości 1 zamienimy na logiczne True a wartości 0 na False. Zinterpretujemy True jako zamianę  i False jako brak zamiany. &lt;br /&gt;
&lt;br /&gt;
Dla każdej permutacji obliczamy wartość statystyki uśredniając  różnice indywidualne.&lt;br /&gt;
Wartości statystyki otrzymane dla wszystkich permutacji tworzą jej empiryczny rozkład, przy założeniu, że hipoteza zerowa jest prawdziwa. Jako estymator prawdopodobieństwa zaobserwowania oryginalnej wartości statystyki ''mr'' przy prawdziwej hipotezie zerowej przyjmujemy frakcję rozkładu empirycznego, w której wartości statystyki były nie większe niż ''mr''. Wynik ilustrujemy histogramem rozkładu empirycznego z zaznaczoną ową frakcją. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
 &lt;br /&gt;
def dec2bin(n, l):&lt;br /&gt;
    '''konwertuje dziesiętną liczbę całkowitą na tablicę &lt;br /&gt;
    przedstawiającą reprezentację binarną tej liczby&lt;br /&gt;
    n liczba do konwersji&lt;br /&gt;
    l długość reprezentacji binarnej &lt;br /&gt;
    zwracana jest binarna reprezentacja liczby &lt;br /&gt;
    skonwertowana do tablicy logicznej (0-&amp;gt;False, 1-&amp;gt; True)&lt;br /&gt;
    '''&lt;br /&gt;
    b = np.zeros(l, dtype = bool)&lt;br /&gt;
    if n &amp;lt; 0:  raise ValueError(&amp;quot;must be a positive integer&amp;quot;)&lt;br /&gt;
    i = 1&lt;br /&gt;
    while n &amp;gt; 0:&lt;br /&gt;
        b[l-i] = bool( n % 2 ) &lt;br /&gt;
        n = n &amp;gt;&amp;gt; 1&lt;br /&gt;
        i += 1&lt;br /&gt;
    return b&lt;br /&gt;
 &lt;br /&gt;
def hist_z_markerem(x, N_bins, marker):&lt;br /&gt;
	'''Rysuje histogram wartości w tablicy x, używając N_bins binów. &lt;br /&gt;
	Na lewo od wartości wskazanej przez marker dorysowywany jest prostokąt'''&lt;br /&gt;
 &lt;br /&gt;
	r = np.max(x) - np.min(x)	&lt;br /&gt;
	szer_binu = r/N_bins&lt;br /&gt;
 &lt;br /&gt;
	#konstruujemy biny&lt;br /&gt;
        # robimy biny od markera co szerokość binu aż do x minimalnego&lt;br /&gt;
	biny_na_lewo = np.arange( marker, np.min(x), -szer_binu)&lt;br /&gt;
        # odwracamy kolejność tej sekwencji żeby była rosnąca&lt;br /&gt;
	biny_na_lewo = biny_na_lewo[-1::-1] &lt;br /&gt;
         # robimy biny od markera co szerokość binu aż do x maksymalnego&lt;br /&gt;
	biny_na_prawo = np.arange(marker,np.max(x), szer_binu)&lt;br /&gt;
        # sklejamy oba zakresy binów&lt;br /&gt;
	biny = np.concatenate((biny_na_lewo, biny_na_prawo))&lt;br /&gt;
	(n,xx,patch) = py.hist(x,bins = biny )&lt;br /&gt;
	py.fill([np.min(xx), np.min(xx), marker, marker] , [0, np.max(n), np.max(n), 0] ,'r' ,alpha = 0.2)&lt;br /&gt;
 &lt;br /&gt;
A=np.array([[1.83, 0.878], [0.50, 0.647], [1.62, 0.598], [2.48, 2.05], [1.68, 1.06], [1.88, 1.29], [1.55, 1.06], [3.06, 3.14], [1.30, 1.29]])&lt;br /&gt;
 &lt;br /&gt;
r = A[:,1] - A[:,0] # od drugiej kolumny odejmuję pierwszą&lt;br /&gt;
mr = np.mean(r)  # średnia z tych różnic to wartość statystyki zaobserwowana dla oryginalnych danych&lt;br /&gt;
print( 'średnia różnica: %(mr).2f'%{'mr':mr} )&lt;br /&gt;
 &lt;br /&gt;
N = len(r)&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
N_perm = 2**N&lt;br /&gt;
r_perm = np.zeros(N_perm)&lt;br /&gt;
for i in range(2**N):&lt;br /&gt;
	B = np.array(A)   # B zawiera kopię tablicy A&lt;br /&gt;
	zamiana = dec2bin(i,N) # w których wierszach dokonać zamiany?&lt;br /&gt;
	# print( i,': ', zamiana )&lt;br /&gt;
	# wiersze tablicy B wskazane przez True w wektorze indeksów ind zamieniamy wartości  'przed' z wartościami 'po'&lt;br /&gt;
	B[zamiana, 0] = A[zamiana, 1] &lt;br /&gt;
	B[zamiana, 1] = A[zamiana, 0]&lt;br /&gt;
	rr = B[:,1] - B[:,0] # Obliczam wartości zmiennych losowych dla tej zamiany&lt;br /&gt;
	r_perm[i] = np.mean(rr) # Obliczmy wartość statystyki dla tej zamiany&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
p_h0 = np.sum( r_perm &amp;lt;=  mr)/N_perm&lt;br /&gt;
s_perm = u'dla permutacyjnego testu jednostronnego: %(p_h0).3f'%{'p_h0': p_h0}&lt;br /&gt;
print( s_perm)&lt;br /&gt;
hist_z_markerem(r_perm,30,mr)&lt;br /&gt;
py.title(s_perm)&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Wersja parametryczna====&lt;br /&gt;
&lt;br /&gt;
Jeśli badane różnice ''przed'' i ''po'' podlegają rozkładowi normalnemu to do testowania czy średnia wartość różnicy jest równa 0 można zastosować test ''t'' dla prób zależnych &amp;lt;tt&amp;gt;st.ttest_rel()&amp;lt;/tt&amp;gt;. Aby się upewnić, że możemy zastosować ten test badamy normalność różnic przy pomocy &amp;lt;tt&amp;gt;normplot()&amp;lt;/tt&amp;gt; oraz testu Shapiro-Wilka &amp;lt;tt&amp;gt;st.shapiro()&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
 &lt;br /&gt;
def normplot(x):&lt;br /&gt;
	'''normplot: x dane do testowania'''&lt;br /&gt;
 &lt;br /&gt;
	x_ord = sorted(x)&lt;br /&gt;
	N = len(x)&lt;br /&gt;
	y = np.zeros(N)&lt;br /&gt;
	y[0]=st.norm.ppf(1- 0.5**(1.0/N) )&lt;br /&gt;
	y[N-1] = st.norm.ppf(0.5**(1.0/N) )&lt;br /&gt;
	for i in range(1,N-1):&lt;br /&gt;
		arg = (i-0.3175)/(N+0.365)&lt;br /&gt;
		y[i] = st.norm.ppf(arg)&lt;br /&gt;
	py.plot(y,x_ord,'.')&lt;br /&gt;
 &lt;br /&gt;
A=np.array([[1.83, 0.878], [0.50, 0.647], [1.62, 0.598], [2.48, 2.05], [1.68, 1.06], [1.88, 1.29], [1.55, 1.06], [3.06, 3.14], [1.30, 1.29]])&lt;br /&gt;
&lt;br /&gt;
r = A[:,1] - A[:,0] # od drugiej kolumny odejmuję pierwszą&lt;br /&gt;
&lt;br /&gt;
normplot(r)&lt;br /&gt;
py.title(&amp;quot;Wyniki testów na normalność różnic\n Shapiro-Wilka:  W=%.3f, p=%.3f&amp;quot;%st.shapiro(r)&lt;br /&gt;
        +&amp;quot;\nKołmogorowa-Smirnowa: D=%.3f, p=%.3f&amp;quot;%st.kstest(r, 'norm', args=(np.mean(r),np.std(r,ddof=1))))&lt;br /&gt;
t, p = st.ttest_rel(A[:,1],A[:,0])&lt;br /&gt;
p_t = p/2 # aby test był jednostronny&lt;br /&gt;
s_t = u'dla parametrycznego testu jednostronnego: %(p_h0).3f'%{'p_h0': p_t}&lt;br /&gt;
print(s_t)&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Wersja nieparametryczna====&lt;br /&gt;
&lt;br /&gt;
W ogólności, nie zakładając normalności różnic można by przeprowadzić test Wilcoxona. W aktualnej implementacji tego testu w scipy.stats jest on dla naszych danych niedokładny, gdyż mamy małą liczebność grupy, a implementacja stosuje przybliżenia asymptotyczne.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
A=np.array([[1.83, 0.878], [0.50, 0.647], [1.62, 0.598], [2.48, 2.05], [1.68, 1.06], [1.88, 1.29], [1.55, 1.06], [3.06, 3.14], [1.30, 1.29]])&lt;br /&gt;
z, p = st.wilcoxon(A[:,1],A[:,0] )&lt;br /&gt;
p_w = p/2 # aby test był jednostronny&lt;br /&gt;
s_w = u'dla nieparametrycznego testu jednostronnego: %(p_h0).3f'%{'p_h0': p_w}&lt;br /&gt;
print( s_w)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Podsumowanie====&lt;br /&gt;
 średnia różnica: -0.43&lt;br /&gt;
 dla repróbkowanego testu jednostronnego: 0.0013&lt;br /&gt;
 dla permutacyjnego testu jednostronnego: 0.014&lt;br /&gt;
 Wynik testu Shapiro-Wilka na normalność różnic &lt;br /&gt;
 	 statystyka W: 0.921 &lt;br /&gt;
 	 prawdopodobieństwo takiej wartości statystyki dla rozkładu normalnego: 0.404&lt;br /&gt;
 dla parametrycznego testu jednostronnego: 0.008&lt;br /&gt;
 dla nieparametrycznego testu jednostronnego: 0.019&lt;br /&gt;
&lt;br /&gt;
Wszystkie testy wskazują prawdopodobieństwo zaobserwowania odpowiadających im statystyk poniżej przyjętego poziomu istotności &amp;lt;math&amp;gt;\alpha = 0.05&amp;lt;/math&amp;gt;. Zatem hipotezę zerową należy odrzucić i przyjąć hipotezę alternatywną.&lt;br /&gt;
&lt;br /&gt;
==Zadania==&lt;br /&gt;
&lt;br /&gt;
===Zanieczyszczenie środowiska===&lt;br /&gt;
Agencja ochrony środowiska ustaliła limit na koncentrację zanieczyszczeń emitowanych przez fabryki. Załóżmy, że dopuszczalny poziom zanieczyszczeń wynosi 55 cząstek na milion (cz/m) w promieniu dwóch kilometrów od fabryki. Kontrola przeprowadza 100 pomiarów o różnej porze dnia i roku w promieniu dwóch km od pewnej fabryki. Średnia z próby wyniosła 60 cz/m a odchylenie standardowe &amp;lt;math&amp;gt;s = 20&amp;lt;/math&amp;gt; cz/m. Czy dane te są wystarczające by na poziomie istotności &amp;lt;math&amp;gt;\alpha = 0,01&amp;lt;/math&amp;gt; uznać, że fabryka łamie prawo?&lt;br /&gt;
&lt;br /&gt;
Fabryka łamie prawo jeśli emituje zanieczyszczenia na poziomie wyższym niż dopuszczalny więc należy przeprowadzić test jednostronny (w tym przypadku prawostronny). Czy moglibyśmy odrzucić &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; na tym samym poziomie stosując test dwustronny?&lt;br /&gt;
Jest ważne aby w zależności od problemu wybrać odpowiedni test: jedno- lub dwustronny.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import numpy as np&lt;br /&gt;
 &lt;br /&gt;
x_c = 55 #cząstek na milion (cz/m) w promieniu dwóch kilometrów od fabryki. &lt;br /&gt;
#Kontrola przeprowadza &lt;br /&gt;
N = 100 # pomiarów o różnej porze dnia i roku w promieniu dwóch km. od pewnej fabryki. &lt;br /&gt;
#średnia z próby wyniosła &lt;br /&gt;
x_s = 60 # cz/m &lt;br /&gt;
# a odchylenie standardowe &lt;br /&gt;
s = 20 # cz/m. &lt;br /&gt;
# Czy dane te są wystarczające by uznać, że fabryka łamie prawo ?&lt;br /&gt;
alpha = 0.01&lt;br /&gt;
 &lt;br /&gt;
# H0: mu &amp;lt;=x_c&lt;br /&gt;
# H1: mu &amp;gt; x_c&lt;br /&gt;
# wystarczy sprawdzić jakie jest p dla największego dopuszczalnego stężenia &lt;br /&gt;
# mu = x_c zaobserwowania wartości średniej większej bądź równej zaobserwowanej x_s. &lt;br /&gt;
# Odchylenie std. dane jest dla populacji i trzeba je przeliczyć na odchylenie std. średniej.&lt;br /&gt;
p = 1 - st.t.cdf(x_s, df=N-1, loc = x_c, scale = s/np.sqrt(N) )&lt;br /&gt;
print(&amp;quot;poziom p&amp;quot;,p)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
############################&lt;br /&gt;
#inne (tożsame) rozwiązania:&lt;br /&gt;
&lt;br /&gt;
##wykorzystaniem &amp;quot;Survival function&amp;quot; zamiast dystrybuanty&lt;br /&gt;
p = st.t.sf(x_s, df=N-1, loc = x_c, scale = s/np.sqrt(N) )&lt;br /&gt;
print(&amp;quot;poziom p&amp;quot;,p)&lt;br /&gt;
&lt;br /&gt;
##obliczając statystykę t&lt;br /&gt;
t=(x_s-x_c)/(s/N**0.5)&lt;br /&gt;
p = 1-st.t.cdf(t,df=N-1)&lt;br /&gt;
print(&amp;quot;poziom p&amp;quot;,p)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Odp. &amp;lt;math&amp;gt;p=0,007&amp;lt;\alpha&amp;lt;/math&amp;gt;, zatem możemy odrzucić hipotezę &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; (głoszącą, że fabryka nie łamie prawa) na poziomie &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;  = 0,01.&lt;br /&gt;
&lt;br /&gt;
===Wzrost mocy turbin===&lt;br /&gt;
Turbina hydroelektryczna generuje moc średnią 25,2 kW. Po unowocześnieniu maszyny chcemy przetestować czy średnia moc generowana zmieniła się (na + lub &amp;amp;minus;). Przeprowadzono 115 pomiarów, które dały średnią 26,1 kW i odch. std. 3,2 kW. Przeprowadzić test statystyczny na poziomie istotności 1%, zinterpretować wynik. Wnioskowanie przeprowadzić także w oparciu oprzedział ufności.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
#-*- coding:utf-8 -*-&lt;br /&gt;
import numpy as np&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
N=115&lt;br /&gt;
m=25.2	#hipoteza zerowa mówi, że tyle wynosi moc&lt;br /&gt;
sr=26.1	#w pomiarach uzyskaliśmy taką średnią moc&lt;br /&gt;
s=3.2	#przy takim odchyleniu standardowym&lt;br /&gt;
&lt;br /&gt;
alfa=0.01&lt;br /&gt;
&lt;br /&gt;
#obliczenie poziomu p&lt;br /&gt;
t=(m-sr)/(s/N**0.5)&lt;br /&gt;
p = st.t.cdf(t,df=N-1) * 2 #mnozymy przez 2, bo chcemy testu dwustronnego&lt;br /&gt;
print(&amp;quot;poziom p&amp;quot;,p)&lt;br /&gt;
&lt;br /&gt;
#alternatywnie - obliczenie przedziału ufności&lt;br /&gt;
lo,hi = st.t.ppf([alfa/2, 1-alfa/2],df=N-1,loc=sr,scale=s/N**0.5)&lt;br /&gt;
print(&amp;quot;przedzial ufnosci [%.3g,%.3g]&amp;quot;%(lo,hi))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Odp.: &amp;lt;math&amp;gt;p=0,\!003&amp;lt;\alpha=0,\!01&amp;lt;/math&amp;gt;, zatem odrzucamy H0.&lt;br /&gt;
&lt;br /&gt;
Odp. (alt.): &amp;lt;math&amp;gt;\mu = 25,\!2 \not\in[25,\!3; 26,\!9]&amp;lt;/math&amp;gt;, zatem odrzucamy H0.&lt;br /&gt;
&lt;br /&gt;
===Sonda===&lt;br /&gt;
Władze miasta chciałyby wiedzieć, czy przyznać koncesję operatorowi sieci kablowej. W tym celu zleciły nam przeprowadzenie sondy wśród mieszkańców. Zapytaliśmy o zdanie 50 przypadkowo wybranych osób. 30 osób powiedziało &amp;amp;bdquo;tak&amp;amp;rdquo; a 20 &amp;amp;bdquo;nie&amp;amp;rdquo;. Na ile pewnie otrzymane wyniki wskazują, że mieszkańcy chcą tej kablówki?&lt;br /&gt;
&lt;br /&gt;
Celem naszych badań jest uniknięcie błędu polegającego na tym, że powiemy iż większość mieszkańców chce kablówki podczas gdy tak na prawdę to nie chce. &lt;br /&gt;
&lt;br /&gt;
Wskazówka: Granicznym przypadkiem popełnienia tego błędu jest proporcja 1:1 zwolenników i przeciwników kablówki. Jeśli przeciwników kablówki byłoby jeszcze więcej to uzyskanie naszych wyników byłoby jeszcze mniej prawdopodobne.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import numpy.random as rnd&lt;br /&gt;
&lt;br /&gt;
N=50&lt;br /&gt;
odp_na_tak=30&lt;br /&gt;
odp_na_nie=20&lt;br /&gt;
&lt;br /&gt;
#przypadek graniczny, który daje najwyższe prawdopodobieństwo uzyskania fałszywego wyniku na 'tak',&lt;br /&gt;
#to mieszkańcy niezdecydowani, czyli proporcja 1:1&lt;br /&gt;
#(proporcja przechylona w kierunki 'nie', da nam niższe oszacowanie,&lt;br /&gt;
#a proporcja przechylona w kierunku 'tak' nie oznaczałaby fałszywego wyniku sondy)&lt;br /&gt;
#zatem hipoteza zerowa brzmi, że nasz wynik pochodzi z populacji niezdecydowanej:&lt;br /&gt;
P=0.5 #prawdopodobieństwo, że respondent udzieli odpowiedzi na 'tak'&lt;br /&gt;
&lt;br /&gt;
#rozwiązanie parametryczne wymaga użycia rozkładu dwumianowego:&lt;br /&gt;
p = 1 - st.binom.cdf(29,50,P) #od 1 odejmujemy sumaryczne prawdopodobieństwo wszystkich przypadków udzielenia mniej niż 30 odpowiedzi na tak (czyli do 29 włącznie)&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;poziom p (parametrycznie)&amp;quot;,p)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#rozwiązanie przez symulację:&lt;br /&gt;
Nrand=100000&lt;br /&gt;
R=0 #rezultat, czyli liczba przypadków, w których przynajmniej 30 osób odpowiedziało tak&lt;br /&gt;
for i in range(Nrand):&lt;br /&gt;
	odpowiedzi = (rnd.random(N)&amp;lt;P) #losujemy odpowiedzi od N osób&lt;br /&gt;
	if odpowiedzi.sum() &amp;gt;=odp_na_tak: #jeśli zdarzyło się co najmniej 30 odpowiedzi na tak, to dodajemy jeden do liczby takich przypadków&lt;br /&gt;
		R+=1&lt;br /&gt;
	&lt;br /&gt;
print(&amp;quot;poziom p (z symulacji)&amp;quot;,R/Nrand) #na koniec dzielimy przez liczbę wszystkich sond w symulacji&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Wybory prezydenckie===&lt;br /&gt;
W ankiecie uzyskaliśmy 840 głosów popierających kandydaturę A i 660 kandydaturę B. Jaka jest szansa, że tak naprawdę kandydat B ma  poparcie 50% lub większe? Jakie jest prawdopodobieństwo pojawienia sie zaobserwowanej próbki lub próbki wskazującej na jeszcze większe poparcie dla kandydata A, jeśli w rzeczywistości poparcie kandydata A byłoby  50% lub mniej.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import numpy.random as rnd&lt;br /&gt;
&lt;br /&gt;
# rozwiązanie parametryczne&lt;br /&gt;
A = 840&lt;br /&gt;
B = 660&lt;br /&gt;
N = A+B&lt;br /&gt;
&lt;br /&gt;
#przypadek graniczny, który daje najwyższe prawdopodobieństwo uzyskania fałszywego wyniku na 'tak',&lt;br /&gt;
#to mieszkańcy niezdecydowani, czyli propocja 1:1&lt;br /&gt;
#propocja przechylona w kierunki 'nie', da nam niższe oszacowanie&lt;br /&gt;
#a propocja przechylona w kierunku 'tak' nie oznaczałaby fałszywego wyniku sondy&lt;br /&gt;
#zatem hipoteza zerowa brzmi, że nasz wynik pochodzi z populacji niezdecydowanej:&lt;br /&gt;
p_sukces = 0.5&lt;br /&gt;
&lt;br /&gt;
#rozwiązanie parametryczne&lt;br /&gt;
p = 1 - st.binom.cdf(A-1,N,p_sukces)&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;poziom p (parametrycznie)&amp;quot;,p)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#rozwiązanie przez symulację:&lt;br /&gt;
&lt;br /&gt;
#wiemy już, że musimy oszacować bardzo niskie prawdopodobieństwo, zatem symulacja musi być długa&lt;br /&gt;
#(gdybyśmy nie wiedzieli, to łatwo byśmy zauważyli, że krótka symulacja nie daje w ogóle zdarzeń sprzyjających dając wynik p=0)&lt;br /&gt;
#niestety trzeba pokusić się o optymalizację (mimo to kod będzie się wykonywał kilkadziesiąt sekund do kilku minut):&lt;br /&gt;
#chemy mieć przynajmniej 10^7 sond, ale każda sonda to 1500 odpowiedzi, zatem łącznie musimy wylosować 1.5*10^10 liczb&lt;br /&gt;
#losowanie w pętli 10^7 razy kolejnych sond po 1500 odpowiedzi zajmie bardzo bardzo dużo czasu&lt;br /&gt;
#tablica 1.5*10^10 odpowiedzi wygenerowana jednym poleceniem nie zmieści się w pamięci&lt;br /&gt;
#musimy skorzystać z rozwiązania pośredniego&lt;br /&gt;
#będziemy losować 100 razy po 1.5*10^8 odpowiedzi i dodamy wyniki&lt;br /&gt;
&lt;br /&gt;
Nrand_1=100    # 10^2&lt;br /&gt;
Nrand_2=100000 # 10^5&lt;br /&gt;
N = A+B        # 1.5*10^3&lt;br /&gt;
&lt;br /&gt;
Nrand_total = Nrand_1*Nrand_2&lt;br /&gt;
&lt;br /&gt;
R=0 #liczba sond, w których kandydat A uzyskał poparcie 840 lub większe&lt;br /&gt;
#po każdym przebiegu pętli będziemy dodawać liczbę takich przypadków (jeśli wystąpiły w danej iteracji)&lt;br /&gt;
&lt;br /&gt;
for i in range(Nrand_1):&lt;br /&gt;
	#w każdej iteracji losujemy odpowiedzi od N osób w Nrand_2 sondach&lt;br /&gt;
	#iteracji będzie w sumie Nrand_1, co da nam łącznie N osób w Nrand_total sondach&lt;br /&gt;
	#jako, że zakładamy równe prawdopodobieństwo, to może możemy wylosować tablicę zawierającą tylko 0 i 1&lt;br /&gt;
	#gdzie 1 oznacza sukces (głos na kandydata A), a 0 porażkę&lt;br /&gt;
	#korzystając z funksji randint, która zwraca (pseudo)losowe liczby całkowite z zakresu [a,b)&lt;br /&gt;
	a,b = 0,2 &lt;br /&gt;
	odpowiedzi = rnd.randint(a,b,size=(N,Nrand_2)) &lt;br /&gt;
	S = np.sum(odpowiedzi,axis=0)  #wyniki kolejnych sond (sumujemy sukcesy w wierszach)&lt;br /&gt;
&lt;br /&gt;
	R+=np.sum(S&amp;gt;=A) #dodajemy liczbę sond, w których kandydat A uzyskał poparcie 840 lub większe (w danej iteracji pętli)&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;poziom p (z symulacji)&amp;quot;,R/Nrand_total) #na koniec dzielimy przez liczbę wszystkich sond w symulacji&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Czy stosunek do marihuany się zmienił?===&lt;br /&gt;
Rozważmy dwie ankiety przeprowadzone w USA, pytano 1500 respondentów o stosunek do legalizacji marihuany. Pierwszą ankietę przeprowadzono w 1980, wówczas za legalizacją opowiadało się 52% a drugą w 1985 i za legalizacją było 46%. Czy wyniki tych dwóch ankiet są istotnie różne?&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
# rozwiązanie parametryczne&lt;br /&gt;
za1 = int(0.52*1500)&lt;br /&gt;
za2 = int(0.46*1500)&lt;br /&gt;
N = 1500&lt;br /&gt;
&lt;br /&gt;
# H0: stosunek się nie zmienił zatem p_za było w obu anlietach takie samo:&lt;br /&gt;
p_za = (0.52+0.46)/2&lt;br /&gt;
&lt;br /&gt;
# Jakie jest prawdopodobieństwo zaobserwowoania wyników ankiet o takiej bądź większej &lt;br /&gt;
# różnicy głosów za, jeśli obie są zgodne z H0 ?&lt;br /&gt;
D = za1 - za2&lt;br /&gt;
&lt;br /&gt;
#musimy zsumować wszystkie możliwości, w których wystąpiła taka różnica lub większa&lt;br /&gt;
#zrobimy to w pętli&lt;br /&gt;
p_binom = 0.0&lt;br /&gt;
for k in range(N-D+1):&lt;br /&gt;
	p1 = st.binom.pmf(k,N,p_za) # prawdopodobieństwo uzyskania dokładnie k głosów za&lt;br /&gt;
	&lt;br /&gt;
	# sumujemy prawdopodobieństwa uzyskania liczby głosów różnej przynajmniej o D&lt;br /&gt;
	przypadki_o_roznicy_przynajmniej_D = np.arange(k+D,N+1)&lt;br /&gt;
	p2 = np.sum(st.binom.pmf(przypadki_o_roznicy_przynajmniej_D,N,p_za))&lt;br /&gt;
	#co jest równoważne:&lt;br /&gt;
	#p2 = 1-st.binom.cdf(k+D-1,N,p_za)&lt;br /&gt;
	&lt;br /&gt;
	#sumujemy dla kolejnych k&lt;br /&gt;
	p_binom += p1*p2 # mnożymy prawdopodobieństwa ponieważ są wyniki obu sond są niezależne&lt;br /&gt;
	&lt;br /&gt;
p=2*p_binom #mnożymy przez 2, ponieważ robimy test dwustronny (różnica mogła wystąpić również w drugą stronę)&lt;br /&gt;
print(&amp;quot;p =&amp;quot;,p)&lt;br /&gt;
&lt;br /&gt;
# rozwiązanie symulacyjne (tym razem skorzystamy z randsample)&lt;br /&gt;
def randsample(x, N):&lt;br /&gt;
	'''zwraca wektor z losowo wybranymi elementami wektora x. Losowanie odbywa się z powtórzeniami''' &lt;br /&gt;
	n=len(x)&lt;br /&gt;
	ind = np.random.randint(n, size = N)&lt;br /&gt;
	y = x[ind]&lt;br /&gt;
	return y&lt;br /&gt;
&lt;br /&gt;
N_rep = 100000&lt;br /&gt;
# świat zgodny z H0:&lt;br /&gt;
H0 = np.concatenate((np.zeros(N*(1-p_za)), np.ones(N*p_za)))&lt;br /&gt;
&lt;br /&gt;
a = np.zeros(N_rep)&lt;br /&gt;
for i in range(N_rep):&lt;br /&gt;
	w1 = np.sum(randsample(H0,N))&lt;br /&gt;
	w2 = np.sum(randsample(H0,N))&lt;br /&gt;
	a[i] = np.abs(w1-w2)&lt;br /&gt;
p = np.sum(a&amp;gt;=D)/N_rep&lt;br /&gt;
print(p)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zawały serca i cholesterol===&lt;br /&gt;
Badano grupę 605 osób. 135 osób z tej grupy miało wysoki poziom cholesterolu a 470 niski. W grupie z wysokim poziomem cholesterolu odnotowano 10 przypadków zawału serca a w grupie z niskim poziomem 21, w czasie 16 lat obserwacji. Nasze pytanie brzmi: Czy możemy uznać, że wysoki poziom cholesterolu zwiększa ryzyko zawału serca?&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
# rozwiązanie parametryczne&lt;br /&gt;
wysoki = 135&lt;br /&gt;
niski = 470&lt;br /&gt;
N = 605&lt;br /&gt;
wysoki_zawaly = 10&lt;br /&gt;
niski_zawaly = 21&lt;br /&gt;
N_zaw = wysoki_zawaly + niski_zawaly &lt;br /&gt;
&lt;br /&gt;
# H0: proporcja zawałowców w obu grupach taka sama:&lt;br /&gt;
p_zawalu = N_zaw/N&lt;br /&gt;
# H1: proporcja jest różna, test jednostronny (wysoki cholesterol ZWIĘKSZA ryzyko)&lt;br /&gt;
&lt;br /&gt;
# Jakie jest prawdopodobieństwo zaobserwowania wyników badania o takiej bądź większej &lt;br /&gt;
# różnicy proporcji zawałów, jeśli obie są zgodne z H0 ?&lt;br /&gt;
roznica = wysoki_zawaly/wysoki - niski_zawaly/niski&lt;br /&gt;
&lt;br /&gt;
p_binom = 0.0&lt;br /&gt;
for k_wys in range(wysoki+1):&lt;br /&gt;
	p_wys = st.binom.pmf(k_wys,wysoki,p_zawalu) # prawdopodobieństwo uzyskania k_wys zawałów grupie o liczebności wysoki&lt;br /&gt;
	for k_nis in range(niski+1): &lt;br /&gt;
		if k_wys/wysoki - k_nis/niski&amp;gt;=roznica: # czy liczebności k_wys i k_nis dają większą bądź równą różnice proporcji?&lt;br /&gt;
			p_nis = st.binom.pmf(k_nis,niski,p_zawalu) # prawdopodobieństwo uzyskania k_nis zawałów w grupie o niskim cholesterolu&lt;br /&gt;
			p_binom += p_wys*p_nis # zdarzenia są niezależne&lt;br /&gt;
&lt;br /&gt;
print(p_binom)&lt;br /&gt;
&lt;br /&gt;
# rozwiązanie symulacyjne&lt;br /&gt;
def randsample(x, N):&lt;br /&gt;
	'''zwraca wektor z losowo wybranymi elementami wektora x. Losowanie odbywa się z powtórzeniami''' &lt;br /&gt;
	n=len(x)&lt;br /&gt;
	ind = np.random.randint(n, size = N)&lt;br /&gt;
	y = x[ind]&lt;br /&gt;
	return y&lt;br /&gt;
&lt;br /&gt;
N_rep = 100000&lt;br /&gt;
# świat zgodny z H0:&lt;br /&gt;
H0 = np.concatenate((np.zeros(N-N_zaw), np.ones(N_zaw)))&lt;br /&gt;
&lt;br /&gt;
wyn = np.zeros(N_rep)&lt;br /&gt;
for i in range(N_rep):&lt;br /&gt;
	wysoki_zawaly_r = np.sum(randsample(H0,wysoki))&lt;br /&gt;
	niski_zawaly_r = np.sum(randsample(H0,niski))&lt;br /&gt;
	wyn[i] = wysoki_zawaly_r/wysoki - niski_zawaly_r/niski&lt;br /&gt;
p = np.sum(wyn&amp;gt;=roznica)/N_rep&lt;br /&gt;
print(p)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Czy gęstości planet się różnią?===&lt;br /&gt;
Rozważmy pięć planet znanych w antycznym świecie. Chcemy zbadać, czy planety wewnętrzne Merkury (0,68) i Wenus (0,94) mają istotnie większe gęstości niż planety zewnętrzne Mars (0,71) Jowisz (0,24) i Saturn (0,12)?&lt;br /&gt;
&lt;br /&gt;
Wskazówki: &lt;br /&gt;
* Unikalność zestawu planet wskazuje na zastosowanie testu permutacyjnego.&lt;br /&gt;
* Moduł implementujący funkcje kombinatoryczne w pythonie to &amp;lt;tt&amp;gt;itertools &amp;lt;/tt&amp;gt;. Zawiera on funkcję &amp;lt;tt&amp;gt;permutations&amp;lt;/tt&amp;gt;. Wywołanie &amp;lt;tt&amp;gt;itertools.permutations(sekwencja[, r])&amp;lt;/tt&amp;gt; zwraca obiekt permutacji. Obiekt ten zwraca kolejne permutacje o długości r elementów w sekwencji (np. w wektorze). Przykład:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
import itertools&lt;br /&gt;
for kolejny in itertools.permutations(range(3), 2):&lt;br /&gt;
    print(kolejny)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import itertools as itt&lt;br /&gt;
PLANETY = np.array([0.68,0.94,0.71,0.24,0.12])&lt;br /&gt;
N=len(PLANETY)&lt;br /&gt;
&lt;br /&gt;
r=[] #używamy listy, bo nie chcemy obliczać ile będzie przypadków (aczkolwiek można to zrobić)&lt;br /&gt;
&lt;br /&gt;
for planety in itt.permutations(PLANETY):&lt;br /&gt;
	r.append(np.mean(planety[:2])-np.mean(planety[2:]))&lt;br /&gt;
&lt;br /&gt;
R=np.mean(PLANETY[:2])-np.mean(PLANETY[2:]) #prawdziwa różnica&lt;br /&gt;
&lt;br /&gt;
r=np.array(r) #porównanie z liczbą działa tylko dla tablic numpy, a nie dla list&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;p =&amp;quot;,np.sum(r&amp;gt;=R)/len(r))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Elektrownia jądrowa===&lt;br /&gt;
Przed wybudowaniem elektrowni jądrowej przeprowadzono pomiary intensywności promieniowania jonizującego w pobliżu planowanego budynku reaktora. Powtórzono te pomiary po uruchomieniu reaktora. Czy zebrane dane pozwalają stwierdzić, że poziom promieniowania istotnie wzrósł? Dane pomiarowe wczytaj z [[Media:pomiary_skazen.txt| pliku]].&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
&lt;br /&gt;
alfa = 0.01 # poziom istotności&lt;br /&gt;
&lt;br /&gt;
PRZED, PO = np.loadtxt('Pomiary_skazen.txt') #wczytanie danych (dwa zbiory przed uruchomieniem i po)&lt;br /&gt;
&lt;br /&gt;
t, p = st.ttest_ind(PRZED, PO) # wykorzystanie gotowej funkcji wykonującej DWUSTRONNY test t na różnicę średnich&lt;br /&gt;
                            # dla danych NIESPAROWANYCH (niezależnych)&lt;br /&gt;
                            # ttest_ind  - ind od independent &lt;br /&gt;
                            # ttest_rel  - rel od related &lt;br /&gt;
&lt;br /&gt;
p/=2 # dzielimy przez dwa ponieważ chcemy zrobić test jednostronny&lt;br /&gt;
print(&amp;quot;Poziom p&amp;quot;,p)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Odp. &amp;lt;math&amp;gt;p=0,\!39&amp;gt;\alpha=0,\!01&amp;lt;/math&amp;gt;, zatem nie mamy podstaw do odrzucenia hipotezy &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt;, że poziom promieniowania istotnie wzrósł.&lt;/div&gt;</summary>
		<author><name>Maciek</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=WnioskowanieStatystyczne/_Testowanie_hipotez&amp;diff=11252</id>
		<title>WnioskowanieStatystyczne/ Testowanie hipotez</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=WnioskowanieStatystyczne/_Testowanie_hipotez&amp;diff=11252"/>
		<updated>2025-04-07T14:40:02Z</updated>

		<summary type="html">&lt;p&gt;Maciek: /* Histfit: histogram z naniesionym fitem rozkładu normalnego */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Testowanie hipotez dotyczących jednej lub dwóch populacji ==&lt;br /&gt;
===Wstęp===&lt;br /&gt;
Schemat weryfikowania hipotez omówiony jest w wykładzie [[WnioskowanieStatystyczne/Weryfikacja hipotez |Weryfikacja hipotez statystycznych]]. Tu przypomnimy tylko krótko podstawowe pojęcia i decyzje, które trzeba pojąć w procedurze weryfikacji.&lt;br /&gt;
====Hipoteza zerowa i alternatywna====&lt;br /&gt;
Podstawą sukcesu w statystycznym testowaniu hipotez jest prawidłowe ich sformułowanie. &lt;br /&gt;
Hipotezy muszą być rozłączne. Najczęściej jako hipotezę zerową przyjmujemy zdanie, które chcemy odrzucić, &lt;br /&gt;
gdyż błąd takiej decyzji można kontrolować. Logika testowania jest następująca: tworzymy &lt;br /&gt;
funkcję od zmiennych losowych, dla której przy spełnieniu przez owe zmienne hipotezy zerowej potrafimy &lt;br /&gt;
podać prawdopodobieństwa z jakimi przyjmuje ona różne wartości. Ta funkcja nazywana jest ''statystyką''. &lt;br /&gt;
Następnie obliczamy wartość tej funkcji dla badanej próby. Jeśli prawdopodobieństwo osiągnięcia otrzymanej &lt;br /&gt;
bądź jeszcze bardziej ekstremalnej wartości statystyki jest niskie to wątpimy, że nasze dane są zgodne&lt;br /&gt;
z hipotezą zerową i jesteśmy skłonni przyjąć hipotezę alternatywną.&lt;br /&gt;
&lt;br /&gt;
====Wybór statystyki====&lt;br /&gt;
Wybierając statystykę można posłużyć się następującym schematem:&lt;br /&gt;
* Jeżeli znamy rozkład prawdopodobieństwa, z którego pochodzą nasze dane, lub umiemy je przetransformować do znanego rozkładu, to wybierzemy klasyczny test parametryczny np. test ''t'' ([http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.mstats.ttest_rel.html ttest_rel], [http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.ttest_ind.html ttest_ind]), &amp;lt;math&amp;gt;\chi^2&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; itp.&lt;br /&gt;
* Jeżeli nie znamy rozkładu prawdopodobieństwa naszych danych albo nie chcemy nic o nim zakładać to mamy dwie możliwości: &lt;br /&gt;
** korzystamy z klasycznego [[WnioskowanieStatystyczne/Test_Wilcoxona|testu nieparametrycznego]] np.:&lt;br /&gt;
&amp;lt;!--http://mail.scipy.org/pipermail/scipy-user/2009-July/021679.html--&amp;gt;&lt;br /&gt;
**; test Wilcoxona dla obserwacji sparowanych: testuje hipotezę zerową, że dwie próby &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, które ze sobą porównujemy pochodzą z tej samej populacji ciągłej (przekłada się to na równość dystrybuant). Próby &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; '''są''' sparowane. W pythonie mamy ten test zaimplementowany jako: [http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.wilcoxon.html &amp;lt;tt&amp;gt;scipy.stats.wilcoxon(x, y=None)&amp;lt;/tt&amp;gt;]. Ta implementacja stosuje przybliżenie dużych prób i zalecana jest dla &amp;lt;math&amp;gt;n&amp;gt;20&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;!--    Calculate the Wilcoxon signed-rank test&lt;br /&gt;
&lt;br /&gt;
    The Wilcoxon signed-rank test tests the null hypothesis that two related samples come from the same distribution. It is a a non-parametric version of the paired T-test.&lt;br /&gt;
    Parameters:	&lt;br /&gt;
    x : array_like&lt;br /&gt;
        The first set of measurements&lt;br /&gt;
    y : array_like, optional, default None&lt;br /&gt;
        The second set of measurements. If y is not given, then the x array is considered to be the differences between the two sets of measurements.&lt;br /&gt;
    Returns:	&lt;br /&gt;
    z-statistic : float&lt;br /&gt;
        The test statistic under the large-sample approximation that the signed-rank statistic is normally distributed.&lt;br /&gt;
    p-value : float&lt;br /&gt;
        The two-sided p-value for the test&lt;br /&gt;
    Notes&lt;br /&gt;
    Because the normal approximation is used for the calculations, the samples used should be large. A typical rule is to require that n &amp;gt; 20.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
scipy.stats.ranksums(x, y)&lt;br /&gt;
&lt;br /&gt;
    Compute the Wilcoxon rank-sum statistic for two samples.&lt;br /&gt;
&lt;br /&gt;
    The Wilcoxon rank-sum test tests the null hypothesis that two sets of measurements are drawn from the same distribution. The alternative hypothesis is that values in one sample are more likely to be larger than the values in the other sample.&lt;br /&gt;
&lt;br /&gt;
    This test should be used to compare two samples from continuous distributions. It does not handle ties between measurements in x and y. For tie-handling and an optional continuity correction see `stats.mannwhitneyu`_&lt;br /&gt;
    Parameters:	&lt;br /&gt;
&lt;br /&gt;
    x,y : array_like&lt;br /&gt;
&lt;br /&gt;
        The data from the two samples&lt;br /&gt;
&lt;br /&gt;
    Returns:	&lt;br /&gt;
&lt;br /&gt;
    z-statistic : float&lt;br /&gt;
&lt;br /&gt;
        The test statistic under the large-sample approximation that the rank sum statistic is normally distributed&lt;br /&gt;
&lt;br /&gt;
    p-value : float&lt;br /&gt;
&lt;br /&gt;
        The two-sided p-value of the test&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
**; test Manna-Whitney'a : testuje hipotezę zerową, że dwie próby &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, które ze sobą porównujemy pochodzą z tej samej populacji ciągłej. Próby &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; i&amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; '''nie są''' sparowane. Implementacja w pyhtonie: [http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.mannwhitneyu.html &amp;lt;tt&amp;gt;scipy.stats.mannwhitneyu(x, y, use_continuity=True)&amp;lt;/tt&amp;gt;] stosuje przybliżenia i zalecana jest dla &amp;lt;math&amp;gt;n&amp;gt;20&amp;lt;/math&amp;gt; w każdej z prób. Funkcja zwraca wartość ''p'' dla hipotezy jednostronnej. Jeśli testujemy hipotezę dwustronną trzeba otrzymane ''p'' pomnożyć przez 2.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
scipy.stats.mannwhitneyu(x, y, use_continuity=True)¶&lt;br /&gt;
&lt;br /&gt;
    Computes the Mann-Whitney rank test on samples x and y.&lt;br /&gt;
    Parameters:	&lt;br /&gt;
    x, y : array_like&lt;br /&gt;
        Array of samples, should be one-dimensional.&lt;br /&gt;
    use_continuity : bool, optional&lt;br /&gt;
        Whether a continuity correction (1/2.) should be taken into account. Default is True.&lt;br /&gt;
    Returns:	&lt;br /&gt;
    u : float&lt;br /&gt;
        The Mann-Whitney statistics.&lt;br /&gt;
    prob : float&lt;br /&gt;
        One-sided p-value assuming a asymptotic normal distribution.&lt;br /&gt;
    Notes&lt;br /&gt;
    Use only when the number of observation in each sample is &amp;gt; 20 and you have 2 independent samples of ranks. Mann-Whitney U is significant if the u-obtained is LESS THAN or equal to the critical value of U.&lt;br /&gt;
&lt;br /&gt;
    This test corrects for ties and by default uses a continuity correction. The reported p-value is for a one-sided hypothesis, to get the two-sided p-value multiply the returned p-value by 2.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
** wytwarzamy rozkład statystyki na podstawie naszych danych przez repróbkowanie ([[WnioskowanieStatystyczne/Bootstrap|bootstrap]] lub [[WnioskowanieStatystyczne/Testy_permutacyjne| permutacje]]). W podejściu repróbkowania tworzymy statystyczny model badanego procesu '''zgodny z hipotezą zerową''' i następnie badamy w drodze symulacji prawdopodobieństwa generowania przez ten model interesujących nas sytuacji. Największą uwagę musimy tu poświęcić na prawidłowe sformułowanie modelu, a następnie precyzyjne określenie prawdopodobieństwo jakiego zdarzenia nas naprawdę interesuje.&lt;br /&gt;
&lt;br /&gt;
===Poziom istotności &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; i wartość &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;===&lt;br /&gt;
; Błąd pierwszego rodzaju : błąd polegający na odrzuceniu hipotezy zerowej, która w rzeczywistości jest prawdziwa. Oszacowanie prawdopodobieństwa popełnienia błędu pierwszego rodzaju oznaczamy symbolem &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; i nazywamy poziomem istotności testu.&lt;br /&gt;
; Błąd drugiego rodzaju : polegaja na nieodrzuceniu hipotezy zerowej, która jest w rzeczywistości fałszywa. Oszacowanie prawdopodobieństwo popełnienia błędu drugiego rodzaju oznaczamy symbolem &amp;lt;math&amp;gt; \beta&amp;lt;/math&amp;gt;, a jego dopełnienie do jedności nazywane jest '''mocą testu'''.&lt;br /&gt;
&lt;br /&gt;
Wartość &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; jest to wartość prawdopodobieństwa, że wobec posiadanych danych  hipoteza zerowa jest prawdziwa. Jest ono obliczane jako prawdopodobieństwo zaobserwowania wartości ''statystyki'' takiej jak dla badanej próby, lub bardziej ekstremalnej, przy prawdziwej hipotezie zerowej.&lt;br /&gt;
Najczęściej porównujemy ''p'' z wcześniej ustalonym poziomem istotności &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;. Poziom istotności &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; to wartość krytyczna prawdopodobieństwa, taka że jeżeli &amp;lt;math&amp;gt; p&amp;lt; \alpha&amp;lt;/math&amp;gt; to odrzucamy hipotezę zerową.&lt;br /&gt;
&lt;br /&gt;
==Formułowanie hipotez==&lt;br /&gt;
===Przykład: mutacje muszek owocowych===&lt;br /&gt;
Załóżmy, że badamy muszki owocowe. W standardowej populacji proporcja samic do samców jest 1:1. Opracowaliśmy metodę powodującą taką mutację muszek owocowych, że potomstwo ich nie będzie miało jednakowej szansy na bycie samcem lub samiczką. W pierwszych 20 zbadanych przypadkach uzyskujemy 14 samców i 6 samiczek.&lt;br /&gt;
; Pytanie naukowe: Czy wyniki eksperymentu potwierdzają, że nasza metoda zaburza proporcję płci?&lt;br /&gt;
Najpierw musimy przetłumaczyć pytanie naukowe na pytanie statystyczne. &lt;br /&gt;
; Pytanie statystyczne: Jakie jest prawdopodobieństwo uzyskania zaobserwowanej proporcji (14:6), lub bardziej ekstremalnej w próbie 20 osobników,  jeśli rzeczywista proporcja płci jest 1:1?&lt;br /&gt;
&lt;br /&gt;
Z tego pytania wynikają dwie możliwe hipotezy:&lt;br /&gt;
* Hipoteza zerowa: Nowa metoda nie zaburza proporcji płci 1:1. Zaobserwowana próbka pochodzi z populacji, w której proporcja płci ''jest'' 1:1&lt;br /&gt;
* Hipoteza alternatywna: Zaobserwowana próbka pochodzi z populacji, w której proporcja płci ''nie jest'' 1:1.&lt;br /&gt;
; Prawdopodobieństwo, które musimy oszacować: Jakie jest prawdopodobieństwo uzyskania 14 lub więcej jedynek w serii 20 prób, jeśli prawdopodobieństwo jedynki jest &amp;lt;math&amp;gt;1/2&amp;lt;/math&amp;gt;?  &lt;br /&gt;
# Oznaczmy 1: samiec 0: samiczka.&lt;br /&gt;
# Zróbmy wektor 20-elementowy zawierający 10 zer i 10 jedynek.&lt;br /&gt;
# Wylosujmy ze zwracaniem nowy wektor 20-elementowy. (Jest to nasz model uzyskiwania 20 elementowej próbki z populacji o proporcji 1:1.) Zapamiętajmy liczbę jedynek.&lt;br /&gt;
# Powtórzmy poprzedni krok 1000 razy&lt;br /&gt;
# Zróbmy histogram ilości jedynek.&lt;br /&gt;
# Policzmy ile razy zdarzyło sie 14 lub więcej jedynek (to odpowiada 14 lub więcej samców) i dodajmy do tego ilość przypadków gdy mieliśmy 6 lub mniej jedynek (to odpowiada 14 lub więcej samiczek). Wynik podzielmy przez ilość losowań (1000).&lt;br /&gt;
&lt;br /&gt;
Powyższa procedura opisuje test dwustronny. Testu dwustronnego musimy użyć jeśli nie mamy ''istotnych'' powodów, żeby wierzyć, że nowa metoda działa ''jedynie na zwiększenie'' szansy pojawienia się samca.&lt;br /&gt;
&lt;br /&gt;
Jak powyższy problem rozwiązać w sposób parametryczny? &lt;br /&gt;
Próby podlegają rozkładowi dwumianowemu, można więc obliczyć szukane prawdopodobieństwo korzystając z jego dystrybuanty.&lt;br /&gt;
&lt;br /&gt;
==Testowanie hipotez na temat średniej==&lt;br /&gt;
Firma rozwożąca przesyłki po mieście deklaruje średni czas dostarczenia 28 minut. Przeprowadźmy test tej hipotezy na poziomie istotności 5%.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_0: \mu = 28&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;H_1: \mu \ne 28&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wybieramy losową próbę 100 przesyłek, mierzymy czas dostarczenia, liczymy średnią z próby &amp;lt;math&amp;gt;\bar x = 31,5&amp;lt;/math&amp;gt; minut i odchylenie standardowe próby &amp;lt;math&amp;gt;s = 5&amp;lt;/math&amp;gt; minut. &lt;br /&gt;
&lt;br /&gt;
Test ten można przeprowadzić z użyciem przedziałów ufności:&lt;br /&gt;
* Konstruujemy przedziały ufności 95% dla średniej &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.Formalnie, ponieważ wyliczyliśmy odchylenie standardowe z próby powinniśmy zastosować wartości krytyczne z rozkładu t. Rozmiar próby wynosi 100 więc rozkład t ma 99 stopni swobody. Wartość krytyczna w tym rozkladzie to &amp;lt;math&amp;gt;t_{97.5} =  1.984 &amp;lt;/math&amp;gt;. Mamy zatem:&lt;br /&gt;
&amp;lt;math&amp;gt;\bar x \pm 1,984 \frac{s}{\sqrt{n}} = 31,5 \pm 1,984*\frac{5}{\sqrt{100}} = 31,5 \pm 0,992 = [30,51 \quad 32,49]&amp;lt;/math&amp;gt;&lt;br /&gt;
* Wnioskowanie: Możemy więc być na 95% pewni, że nieznana średnia leży pomiędzy 30,51 a 32,49 a więc na 95% nie leży poza tym przedziałem. &lt;br /&gt;
Skoro &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; podaje &amp;lt;math&amp;gt;\mu = 28&amp;lt;/math&amp;gt; (poza przedziałem), możemy odrzucić tę hipotezę.  Jeśli &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; jest prawdziwe, istnieje prawdopodobieństwo 0,05, że skonstruowany przedział nie będzie zawierał &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. Istnieje zatem prawdopodobieństwo 0,05 popełnienia błądu I-go rodzaju. Mówimy, że przeprowadziliśmy test na poziomie istotności 0,05.&lt;br /&gt;
&lt;br /&gt;
Test można też przeprowadzić następująco:&lt;br /&gt;
* Jako statystykę wybieramy &amp;lt;math&amp;gt;t = \frac{\bar x - \mu}{s/\sqrt{n}} &amp;lt;/math&amp;gt;&lt;br /&gt;
* Obliczmy jej wartość dla danych z próby: &amp;lt;math&amp;gt;t = \frac{\bar x - \mu}{s/\sqrt{n}}  = (31,5 -28)/(5/\sqrt{100}) = 7 &amp;lt;/math&amp;gt;&lt;br /&gt;
* Porównujemy otrzymaną wartość z wartością krytyczna dla przyjętego poziomu istotności &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;. Konstuowany przez nas test ma być testem dwustronnym więc musimy wziąć do porównania wartość krytyczna dla &amp;lt;math&amp;gt;\alpha/2&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt; t_{\alpha/2} = t_{0,025}= -1,984&amp;lt;/math&amp;gt;&lt;br /&gt;
* Wnioskowanie: Dla naszej próby otrzymaliśmy wartość statystyki równą 6.96. Dla przyjętego poziomu istotności wartość statystyki wynosi 1,984. Prawdopodobieństwo zaobserwowania statystyki o wartości 7 lub bardziej ekstremalnej (tu: większej) jest mniejsze niż założony poziom istotności więc odrzucamy &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; na poziomie &amp;lt;math&amp;gt;\alpha = 0,05&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Testowanie hipotez na temat wariancji==&lt;br /&gt;
&lt;br /&gt;
Do testowania hipotez na temat wariancji używamy statystyki chi-kwadrat o &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; stopniach swobody:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\chi^2 = \frac{(n-1)s^2}{\sigma_0^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\sigma_0^2&amp;lt;/math&amp;gt; jest wartością wariancji podaną w &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
===Przykład===&lt;br /&gt;
Do produkcji baterii używane są metalowe płytki o średniej średnicy 5 mm. Jeśli wariancja średnicy płytki jest nie większa niż 1 mm&amp;lt;math&amp;gt;^2&amp;lt;/math&amp;gt;, produkcja jest kontynuowana. Jeśli wariancja przekracza 1 mm&amp;lt;math&amp;gt;^2&amp;lt;/math&amp;gt; proces produkcji trzeba przerwać. Kontroler przeprowadza test na poziomie istotności &amp;lt;math&amp;gt;\alpha = 5&amp;lt;/math&amp;gt;%: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_0:&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\sigma^2 \le 1&amp;lt;/math&amp;gt; i &lt;br /&gt;
&amp;lt;math&amp;gt;H_1:&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\sigma^2 &amp;gt; 1&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Wybiera losową próbę 31 płytek i znajduje wariancję próby &amp;lt;math&amp;gt;s^2 = 1,62&amp;lt;/math&amp;gt;. Czy daje to podstawy do przerwania produkcji?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\chi^2 = \frac{(31-1) \cdot 1,62}{1} = 48,6&amp;lt;/math&amp;gt;. Znajdujemy poziom &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; dla tej wartości &amp;lt;math&amp;gt;\chi^2&amp;lt;/math&amp;gt; z 30 stopniami swobody. &lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
p = 1-st.chi2.cdf(48.6,30)&lt;br /&gt;
print(p)&lt;br /&gt;
&lt;br /&gt;
#ilustracja&lt;br /&gt;
x = py.arange(0,60,1)  &lt;br /&gt;
py.plot(x, st.chi2.pdf(x,30)) #rysujemy funkcję gęstości prawdopodobieństwa chi2 o 30 st. swobody&lt;br /&gt;
x2 = py.arange(48.8,60,1)&lt;br /&gt;
py.fill_between(x2,st.chi2.pdf(x2,30)) #cieniujemy obszar pod funkcją geęstości prawdopodobieństwa odpowiadający obliczonemu p&lt;br /&gt;
&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Otrzymaliśmy &amp;lt;math&amp;gt; p = 0,017 &amp;lt;/math&amp;gt;.&lt;br /&gt;
Wniosek:  Odrzucamy &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Błąd drugiego rodzaju. Moc testu.==&lt;br /&gt;
Błąd II-go rodzaju popełniamy wtedy gdy przyjmujemy &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; a prawdziwe jest &amp;lt;math&amp;gt;H_1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Przykład===&lt;br /&gt;
Załóżmy następujący test:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_0: \mu = 60&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_1: \mu = 65&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Niech rozmiar próby wynosi &amp;lt;math&amp;gt;n = 100&amp;lt;/math&amp;gt; a odchylenie standardowe w populacji &amp;lt;math&amp;gt;\sigma = 20&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Powinniśmy tu zastosować test jednostronny (mamy tylko dwie możliwości: &amp;lt;math&amp;gt;\mu = 60&amp;lt;/math&amp;gt; lub &amp;lt;math&amp;gt;65&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
Znajdźmy punkt krytyczny &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; dla poziomu istotności &amp;lt;math&amp;gt;\alpha =  0,05&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;C = \mu_0 + 1,645\frac{\sigma}{\sqrt{n}} = 60 + 1,645(20/10) = 63,29&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Błąd pierwszego rodzaju popełnimy gdy &amp;lt;math&amp;gt;\bar x &amp;gt; C&amp;lt;/math&amp;gt; i prawdziwe będzie &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt;. Prawdopodobieństwo błędu pierwszego rodzaju ustaliliśmy z góry na poziomie &amp;lt;math&amp;gt;\alpha = 0,05&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\alpha = P(\bar x &amp;gt; C| \mu = \mu_0)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Błąd drugiego rodzaju popełnimy gdy &amp;lt;math&amp;gt;\bar x &amp;lt; C&amp;lt;/math&amp;gt; a prawdziwe będzie &amp;lt;math&amp;gt;H_1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Prawdopodobieństwo popełnienia tego błędu wynosi:&lt;br /&gt;
&amp;lt;math&amp;gt;\beta = P(\bar x &amp;lt; C| \mu = \mu_1) = P\left( \frac{\bar x - \mu_1}{\sigma/\sqrt{n}}  &amp;lt; \frac{C - \mu_1}{\sigma/\sqrt{n}}\right)= &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;= P\left( Z &amp;lt; \frac{63,29 - 65}{20/10}\right)  = P(Z &amp;lt; -0,855) = 0,1963&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Moc testu jest dopełnieniem błędu II rodzaju.&lt;br /&gt;
A moc testu czyli prawdopodobieństwo odrzucenia hipotezy zerowej podczas gdy jest ona fałszywa wynosi:&lt;br /&gt;
&amp;lt;math&amp;gt;1 - \beta = 0,8037&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Porównanie dwóch populacji==&lt;br /&gt;
[[WnioskowanieStatystyczne/Test_t#Test_t_.28Studenta.29_r.C3.B3.C5.BCnicy_.C5.9Brednich|Dla przypomnienia]]:&lt;br /&gt;
Jeśli mamy dwie próbki danych:&lt;br /&gt;
:&amp;lt;math&amp;gt;x_1&amp;lt;/math&amp;gt; o liczebności &amp;lt;math&amp;gt;n_1&amp;lt;/math&amp;gt; i estymowanej wariancji &amp;lt;math&amp;gt;s_1^2&amp;lt;/math&amp;gt; i &lt;br /&gt;
:&amp;lt;math&amp;gt;x_2&amp;lt;/math&amp;gt; o liczebności &amp;lt;math&amp;gt;n_2&amp;lt;/math&amp;gt; i estymowanej wariancji &amp;lt;math&amp;gt;s_2^2&amp;lt;/math&amp;gt;  &lt;br /&gt;
:gdzie &amp;lt;math&amp;gt;s_{i}^2= \frac{1}{(n_i-1)}\sum\limits_{j=1}^{n_i} (x_{j}-\overline{x}_{i})^{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
pochodzących z rozkładu normalnego o takiej samej wariancji &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; to:&lt;br /&gt;
*wspólna wariancja może być estymowana jako: &amp;lt;math&amp;gt;s^2=\frac{(n_1-1)s_1^2+(n_2-1)s_2^2}{n_1+n_2-2} &amp;lt;/math&amp;gt;&lt;br /&gt;
*wariancja różnicy średnich może być estymowana jako: &amp;lt;math&amp;gt;s_{\Delta}^2=s_{\bar{x}_1}^2+s_{\bar{x}_2}^2=\frac{1}{n_1}s_1^2+\frac{1}{n_2}s_2^2 = \frac{n_1+n_2}{n_1n_2}s^2&amp;lt;/math&amp;gt;&lt;br /&gt;
Jeśli postawimy hipotezę zerową: &amp;lt;math&amp;gt;H_0:\; \mu_1 = \mu_2&amp;lt;/math&amp;gt; to&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
t= \frac{\bar{x}_1-\bar{x}_2}{s_{\Delta}}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
pochodzi z rozkładu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; o &amp;lt;math&amp;gt;n_1+n_2-2&amp;lt;/math&amp;gt; stopniach swobody.&lt;br /&gt;
&lt;br /&gt;
===Przykład: promocja===&lt;br /&gt;
Producent odtwarzaczy CD chce sprawdzić czy małe obniżenie ceny produktu wpłynie korzystnie na sprzedaż. Losowa próba 15 tygodni sprzedaży przed obniżką dała średni dochód 6598 zł i standardowe odchylenie 844 zł. Losowa próba 12 tygodni sprzedaży w trakcie promocji dała średnią 6870 i odchylenie standardowe 669 zł. Czy dane te wykazują poprawę sprzedaży w trakcie promocji (przyjąć poziom istotności 5%) ?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\bar{x}_1 = 6598&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\bar{x}_2 = 6870&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Treść zadania odpowiada testowi jednostronnemu z poniższymi hipotezami:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_0: \mu_1 = \mu_2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_1: \mu_1 &amp;lt; \mu_2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Różnica średnich wynosi:&lt;br /&gt;
&amp;lt;math&amp;gt;\bar{x}_1-\bar{x}_2 = 6598 - 6870 = -272 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Estymowana wariancja różnicy średnich:&lt;br /&gt;
&amp;lt;math&amp;gt;s_{\Delta}^2 =  \frac{1}{n_1}s_1^2+\frac{1}{n_2}s_2^2 = \frac{844^2}{15} + \frac{669^2}{12} = 84785,82&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
zatem:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;s_{\Delta} = 291,18&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; t = -272/ 291,18 = - 0,934&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ilość stopni swobody: &amp;lt;math&amp;gt;n_1+n_2-2 = 25&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;P(t_{25} \le -0,934) = 0.18 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wniosek: Nie możemy odrzucić &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt;. Nie mamy podstaw by uznać że mała obniżka cen poprawiła sprzedaż.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Do testowania równości wariancji w dwóch populacjach stosuje się test &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;F_{(n1 -1, n2 - 1)} = \frac{s_1^2}{s_2^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
W przykładzie powyżej założyliśmy równość wariancji. Korzystając z testu &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; sprawdzić czy założenie było uzasadnione.&lt;br /&gt;
&lt;br /&gt;
==Badanie założenia o normalności rozkładu==&lt;br /&gt;
We wszystkich wspomnianych powyżej klasycznych testach statystycznych &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\chi^2&amp;lt;/math&amp;gt; istotnym założeniem jest to, że dane wejściowe w próbie mają rozkład normalny. W powyższych zadaniach po prostu to zakładaliśmy, ale w praktyce, kiedy dostajemy próbę do analizy, musimy sami sprawdzić,  czy możemy uznać ją za pochodzącą z rozkładu normalnego. Do weryfikacji takiej hipotezy służą narzędzia graficzne:&lt;br /&gt;
&lt;br /&gt;
=== Histfit: histogram z naniesionym fitem rozkładu normalnego ===&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
def histfit(x,N_bins):  &lt;br /&gt;
''' &lt;br /&gt;
x - dane&lt;br /&gt;
N_bins -ilość binów w histogramie&lt;br /&gt;
&lt;br /&gt;
Funkcja rysuje histogram i na jego tle dorysowuje wykres &lt;br /&gt;
funkcji gęstości prawdopodobieństwa rozkładu normalnego &lt;br /&gt;
o średniej i wariancji estymowanych z x.&lt;br /&gt;
&lt;br /&gt;
Funkcja wymaga zaimportowania modułów pylab as py i scipy.stats as st''' &lt;br /&gt;
 &lt;br /&gt;
	n, bins, patches = py.hist(x, N_bins, density=True, facecolor='green', alpha=0.75)&lt;br /&gt;
	# Rysujemy histogram i w jawny sposób odbieramy zwracane przez p.hist obiekty&lt;br /&gt;
	#   - normujemy histogram do jedności&lt;br /&gt;
	#   - ustalamy kolor prostokątów na zielony&lt;br /&gt;
	#   - ustawiamy przezroczystość prostokątów na 0.75&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	bincenters = 0.5*(bins[1:]+bins[:-1])&lt;br /&gt;
	# wytwarzamy tablicę z centrami binów korzystając z granic binów&lt;br /&gt;
	# zwróconych przez py.hist w macierzy bins&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	y = st.norm.pdf( bincenters, loc = np.mean(x), scale = np.std(x))&lt;br /&gt;
	# obliczamy momenty rozkładu x: średnią i wariancję (tak naprawdę to jej pierwiastek czyli standardowe odchylenie)&lt;br /&gt;
	# obliczamy wartości w normalnym rozkładzie gęstości prawdopodobieństwa&lt;br /&gt;
	# o średniej np.mean(x) i standardowym odchyleniu np.std(x) dla wartości bincenters&lt;br /&gt;
 &lt;br /&gt;
	l = py.plot(bincenters, y, 'r--', linewidth=1)&lt;br /&gt;
	# do histogramu dorysowujemy linię &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Normplot ===&lt;br /&gt;
Jest to wykres wartości w próbie, wzg. prawdopodobieństwa uzyskania takiej wartości w rozkładzie normalnym. Wykres ten jest szczególnym przypadkiem kwantylowego wykresu prawdopodobieństwa [http://en.wikipedia.org/wiki/Q-Q_plot]. Konstruuje się go następująco: &lt;br /&gt;
*Na osi pionowej odkładamy uporządkowane zaobserwowane wartości &amp;lt;math&amp;gt;x_1 \le x_2 \le \dots \le x_n &amp;lt;/math&amp;gt;. Estymują one położenie kwantyli w populacji.&lt;br /&gt;
*Na osi poziomej odkładamy położenia kwantyli w rozkładzie normalnym. Obliczamy je: &amp;lt;math&amp;gt;F^{-1}\left(\frac{i-r_{pop}}{n+n_{pop}} \right)&amp;lt;/math&amp;gt; gdzie &amp;lt;math&amp;gt;F^{-1}&amp;lt;/math&amp;gt; jest funkcją odwrotną do dystrybuanty rozkładu teoretycznego (w tym szczególnym przypadku normalnego) &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; jest numerem obserwacji a &amp;lt;math&amp;gt;r_{pop}, n_{pop}&amp;lt;/math&amp;gt; są czynnikami (&amp;lt;math&amp;gt;\le 0.5 &amp;lt;/math&amp;gt;) zapewniającymi, że argument funkcji odwrotnej do dystrybuanty nie przyjmuje wartości 0 ani 1. &lt;br /&gt;
Jeśli dane ''x'' podlegają rozkładowi normalnemu to ich położenia kwantyli powinny być zgodne z położeniami kwantyli w rozkładzie normalnym, zatem wykres powinien przedstawiać linię prostą. Odstępstwa od prostej świadczą o odstępstwie od rozkładu normalnego.&lt;br /&gt;
W pythonie możemy ten typ wykresu zaimplementować np. tak (współczynniki zaczerpnięte z [http://www.itl.nist.gov/div898/handbook/eda/section3/normprpl.htm]):&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
def normplot(x):&lt;br /&gt;
	'''normplot: x dane do testowania'''&lt;br /&gt;
	x_ord = sorted(x)&lt;br /&gt;
	N = len(x)&lt;br /&gt;
	y = np.zeros(N)&lt;br /&gt;
	y[0]=st.norm.ppf(1- 0.5**(1.0/N) )&lt;br /&gt;
	y[N-1] = st.norm.ppf(0.5**(1.0/N) )&lt;br /&gt;
	for i in range(1,N-1):&lt;br /&gt;
		arg = float(i-0.3175)/(N+0.365)&lt;br /&gt;
		y[i] = st.norm.ppf(arg)&lt;br /&gt;
	py.plot(y,x_ord,'.')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Test Shapiro-Wilka ===&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;W,p = st.shapiro(x)&amp;lt;/source&amp;gt;&lt;br /&gt;
Funkcja ta zwraca wartość statystyki ''W'' i prawdopodobieństwo ''p''  zaobserwowania takiej lub bardziej ekstremalnej wartości statystyki ''W'' dla danych podlegających rozkładowi normalnemu. Jeśli ''p'' ma wysoką wartość (większą niż przyjęta &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;) to nie możemy odrzucić hipotezy, że dane podlegają  rozkładowi normalnemu. Test Shapiro-Wilka nie jest wrażliwy na parametry rozkładu, z którego pochodzą dane (dane mogą pochodzić z rozkładu o dowolnej średniej i dowolnym odchyleniu standardowym).&lt;br /&gt;
&lt;br /&gt;
=== Test Kołmogorowa-Smirnowa ===&lt;br /&gt;
Jest on oparty  na badaniu maksymalnej różnicy pomiędzy dystrybuantą empiryczną (z próby) a teoretyczną dystrybuantą rozkładu. Dla testowania normalności próby powinniśmy wywołać &lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
D , p = st.kstest(x, 'norm', args=(np.mean(x),np.std(x,ddof=1)) #sposób zalecany&lt;br /&gt;
#lub &lt;br /&gt;
D , p = st.kstest((x-np.mean(x))/np.std(x,ddof=1), 'norm') #sposób niezalecany, ale również prawidłowy&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Funkcja zwraca wartość statystyki ''D'' i prawdopodobieństwo zaobserwowania takiej bądź bardziej ekstremalnej wartości statystyki jeśli testowane dane pochodzą z tego samego rozkładu. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;'''UWAGA!''' Test Kołmogorowa-Smirnowa '''jest wrażliwy na parametry rozkładu''', z którego pochodzą dane. Wywołanie poniższego kodu jest błędem:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
D , p = st.kstest(x, 'norm') #BŁĘDNE użycie testu Kołmogorowa-Smirnowa&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Test dla innych postaci rozkładu====&lt;br /&gt;
Za pomocą testu Kołmogorowa-Smirnowa możemy zbadać również założenie o pochodzeniu danych z populacji podlegającej dowolnemu innemu rozkładowi ciągłemu. W tym celu należy podać zamiast 'norm' odpowiednią nazwę rozkładu z modułu scipy.stats oraz parametry tegoż rozkładu w odpowiedniej kolejności (należy w tym celu zajrzeć do dokumentacji). Przykład jak to należy zrobić dla rozkładu wykładniczego:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
D , p = st.kstest(x, 'expon', args=(0, 1/np.mean(x)) #test, czy dane podlegają rozkładowi wykładniczemu&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Przykład===&lt;br /&gt;
Proszę wygenerować 1000 liczb z rozkładu normalnego. Liczby te obejrzyjmy na wykresach &amp;lt;tt&amp;gt;histfit&amp;lt;/tt&amp;gt; oraz &amp;lt;tt&amp;gt;normplot&amp;lt;/tt&amp;gt; i zbadamy ich normalność testem  Shapiro-Wilka i Kołmogorova-Smirnova. &lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
 &lt;br /&gt;
def normplot(x):&lt;br /&gt;
	'''normplot: x dane do testowania'''&lt;br /&gt;
	x_ord = sorted(x)&lt;br /&gt;
	N = len(x)&lt;br /&gt;
	y = np.zeros(N)&lt;br /&gt;
	y[0]=st.norm.ppf(1- 0.5**(1.0/N) )&lt;br /&gt;
	y[N-1] = st.norm.ppf(0.5**(1.0/N) )&lt;br /&gt;
	for i in range(1,N-1):&lt;br /&gt;
		arg = float(i-0.3175)/(N+0.365)&lt;br /&gt;
		y[i] = st.norm.ppf(arg)&lt;br /&gt;
	py.plot(y,x_ord,'.')&lt;br /&gt;
 &lt;br /&gt;
def histfit(x,N_bins):  &lt;br /&gt;
	''' funkcja rysuje histogram i na jego tle dorysowuje wykres &lt;br /&gt;
	funkcji gęstości prawdopodobieństwa rozkładu normalnego &lt;br /&gt;
	o średniej i wariancji estymowanych z x &lt;br /&gt;
	Funkcja wymaga zaimportowania modułów pylab as py i scipy.stats as st'''  &lt;br /&gt;
	n, bins, patches = py.hist(x, N_bins, normed=True, facecolor='green', alpha=0.75)&lt;br /&gt;
	bincenters = 0.5*(bins[1:]+bins[:-1]) &lt;br /&gt;
	y = st.norm.pdf( bincenters, loc = np.mean(x), scale = np.std(x,ddof=1)) &lt;br /&gt;
	l = py.plot(bincenters, y, 'r--', linewidth=1)&lt;br /&gt;
def porownania(x):&lt;br /&gt;
	py.subplot(2,2,1)&lt;br /&gt;
	normplot(x)&lt;br /&gt;
	py.subplot(2,2,2)&lt;br /&gt;
	histfit(x,15)&lt;br /&gt;
	W,p_sw = st.shapiro(x)&lt;br /&gt;
	D,p_ks = st.kstest(x, 'norm', args=(np.mean(x),np.std(x,ddof=1)))&lt;br /&gt;
	title = 'SW: %(sw).2f KS: %(ks).2f'%{'sw':p_sw, 'ks':p_ks}&lt;br /&gt;
	&lt;br /&gt;
	py.title(title)&lt;br /&gt;
	# wybieramy pierwsze dziesięć punktów  &lt;br /&gt;
	y=x[0:10]&lt;br /&gt;
	py.subplot(2,2,3)&lt;br /&gt;
	normplot(y)&lt;br /&gt;
	py.subplot(2,2,4)&lt;br /&gt;
	histfit(y,15)&lt;br /&gt;
	W,p_sw = st.shapiro(y)&lt;br /&gt;
	D,p_ks = st.kstest(y, 'norm', args=(np.mean(x),np.std(x,ddof=1)))&lt;br /&gt;
	title = 'SW: %(sw).2f KS: %(ks).2f'%{'sw':p_sw, 'ks':p_ks}&lt;br /&gt;
	py.title(title)&lt;br /&gt;
 &lt;br /&gt;
x = st.norm.rvs(size=1000, loc=0, scale=10)&lt;br /&gt;
py.figure(1)&lt;br /&gt;
porownania(x)&lt;br /&gt;
# A teraz zbadajmy dane z rozkładów innych niż normalny:&lt;br /&gt;
 &lt;br /&gt;
x = st.t.rvs(df = 2, size=1000, loc=0, scale=1)&lt;br /&gt;
py.figure(2)&lt;br /&gt;
porownania(x)&lt;br /&gt;
 &lt;br /&gt;
x = st.expon.rvs(size=1000,loc=0,scale=1)&lt;br /&gt;
py.figure(3)&lt;br /&gt;
porownania(x)&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Proszę zapuścić skrypt kilka razy i zwrócić uwagę na to, jak trudno jest ocenić normalność danych przy małych próbach.&lt;br /&gt;
&lt;br /&gt;
===Przykład: transformacja Boxa-Coxa===&lt;br /&gt;
Często normalność danych można poprawić przez zastosowanie odpowiedniej transformacji. Ogólną rodzinę transformacji, które często prowadzą do normalizacji danych można zapisać tak (trasformacja Box-Cox'a [http://www.jstor.org/stable/2984418]):&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y^{(\lambda)}=\left\{\begin{matrix} \frac{y^\lambda-1} {\lambda} &amp;amp; \mbox{dla }\lambda \ne 0 \\ \ln(y) &amp;amp; \mbox{dla }\lambda = 0\end{matrix}\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W module scipy.stats mamy tę transformację zaimplementowaną jako &amp;lt;tt&amp;gt;boxcox()&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Zobaczmy jej działanie na następującym przykładzie:&lt;br /&gt;
&lt;br /&gt;
Proszę pobrać i zapisać w pliku tekstowym następujące &lt;br /&gt;
[[Media:Samochody.txt| dane]]. Zawierają one 8 kolumn charakterystyk samochodów:&lt;br /&gt;
*zużycie paliwa&lt;br /&gt;
*cylindry&lt;br /&gt;
*pojemność skokowa&lt;br /&gt;
*moc w koniach mechanicznych&lt;br /&gt;
*masa&lt;br /&gt;
*przyspieszenie&lt;br /&gt;
*rocznik&lt;br /&gt;
*pochodzenie&lt;br /&gt;
&lt;br /&gt;
Proszę narysować histfit i normplot  oraz policzyć testy Shapiro-Wilka i Kolmogorowa-Smirnowa dla masy pojazdów, a następnie zastosować do niej transformację Boxa-Coxa i zbadać normalność przetransformowanych danych.&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
def normplot(x):&lt;br /&gt;
	'''normplot: x dane do testowania'''&lt;br /&gt;
	x_ord = sorted(list(x))&lt;br /&gt;
	N = len(x)&lt;br /&gt;
	y = np.zeros(N)&lt;br /&gt;
	y[0]=st.norm.ppf(1- 0.5**(1.0/N) )&lt;br /&gt;
	y[N-1] = st.norm.ppf(0.5**(1.0/N) )&lt;br /&gt;
	for i in range(1,N-1):&lt;br /&gt;
		arg = float(i-0.3175)/(N+0.365)&lt;br /&gt;
		y[i] = st.norm.ppf(arg)&lt;br /&gt;
	py.plot(y,x_ord,'.')&lt;br /&gt;
	&lt;br /&gt;
def histfit(x,N_bins):  &lt;br /&gt;
	''' funkcja rysuje histogram i na jego tle dorysowuje wykres &lt;br /&gt;
	funkcji gęstości prawdopodobieństwa rozkładu normalnego &lt;br /&gt;
	o średniej i wariancji estymowanych z x &lt;br /&gt;
	Funkcja wymaga zaimportowania modułów pylab as py i scipy.stats as st'''  &lt;br /&gt;
	n, bins, patches = py.hist(x, N_bins, normed=True, facecolor='green', alpha=0.75)&lt;br /&gt;
	bincenters = 0.5*(bins[1:]+bins[:-1]) &lt;br /&gt;
	y = st.norm.pdf( bincenters, loc = np.mean(x), scale = np.std(x)) &lt;br /&gt;
	l = py.plot(bincenters, y, 'r--', linewidth=1)&lt;br /&gt;
def porownania(x):&lt;br /&gt;
	py.subplot(2,1,1)&lt;br /&gt;
	normplot(x);&lt;br /&gt;
	py.subplot(2,1,2)&lt;br /&gt;
	histfit(x,15)&lt;br /&gt;
	W,p_sw = st.shapiro(x);&lt;br /&gt;
	D,p_ks = st.kstest(x,'norm',args=(np.mean(x),np.std(x) ))&lt;br /&gt;
	title = 'SW: %(sw).2f KS: %(ks).2f'%{'sw':p_sw, 'ks':p_ks}&lt;br /&gt;
	py.title(title)&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
dane = np.loadtxt('Samochody.txt')&lt;br /&gt;
# Badamy przyspieszenia&lt;br /&gt;
w = dane[:,5]&lt;br /&gt;
py.figure(1)&lt;br /&gt;
porownania(w)&lt;br /&gt;
# A teraz stosujemy transformację Box-Coxa&lt;br /&gt;
wt,lam = st.boxcox(w)&lt;br /&gt;
py.figure(2)&lt;br /&gt;
porownania(wt)&lt;br /&gt;
&lt;br /&gt;
# badamy masy&lt;br /&gt;
w = dane[:,4]&lt;br /&gt;
py.figure(3)&lt;br /&gt;
porownania(w)&lt;br /&gt;
# A teraz stosujemy transformację Box-Coxa&lt;br /&gt;
wt,lam = st.boxcox(w)&lt;br /&gt;
py.figure(4)&lt;br /&gt;
porownania(wt)&lt;br /&gt;
&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W pierwszym przypadku - asymetrię rozkładu przyspieszeń udało się transformacją B-C poprawić, ale w drugim przypadku, masa, asymetrię dało się skorygować (widać to na histfit) ale nie da się poprawić ''ciężkich ogonów'' - widać to zarówno na normplocie jak i na wynikach testów.&lt;br /&gt;
Ogólnie: zanim zaczniemy analizować dane dobrze jest je pooglądać na różnych wykresach i chwilę ''pomyśleć''.&lt;br /&gt;
&lt;br /&gt;
==Przykład (zastosowanie różnych testów do tych samych danych): karma==&lt;br /&gt;
Badamy dwie nowe karmy A i B. Mamy dwie grupy po 12 zwierząt. Uzyskane przyrosty masy są następujące:&lt;br /&gt;
&lt;br /&gt;
A: 31 34 29 26 32 35 38 34 31 29 32 31&lt;br /&gt;
&lt;br /&gt;
B: 26 24 28 29 30 29 31 29 32 26 28 32&lt;br /&gt;
&lt;br /&gt;
Pytanie:&lt;br /&gt;
Czy któraś z karm daje istotnie większe przyrosty masy?&lt;br /&gt;
&lt;br /&gt;
Poniżej rozwiążemy to zadanie stopniowo różnymi metodami. Kolejne kawałki kodu można dopisywać do tego samego pliku.&lt;br /&gt;
&lt;br /&gt;
ROZWIĄZANIE:&lt;br /&gt;
Przyjmujemy poziom istotności, na którym przeprowadzamy testy &amp;lt;math&amp;gt;\alpha = 0.05&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Badamy rozkłady danych:===&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
A=[ 31, 34, 29, 26, 32, 35, 38, 34, 31, 29, 32, 31];&lt;br /&gt;
B=[ 26, 24, 28, 29, 30, 29, 31, 29, 32, 26, 28, 32];&lt;br /&gt;
W, p_A = st.shapiro(A)&lt;br /&gt;
print('Dla grupy A:', p_A)&lt;br /&gt;
W, p_B = st.shapiro(B)&lt;br /&gt;
print('Dla grupy B:', p_B)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dla obu grup test Shapiro-Wilka nie daje nam podstaw do odrzucenia założenia o normalności rozkładów.&lt;br /&gt;
&lt;br /&gt;
===Test parametryczny===&lt;br /&gt;
Nie odrzuciliśmy hipotezy o normalnym rozkładzie danych zatem możemy zastosować  [[WnioskowanieStatystyczne/Test_t | test ''t'' ]] dla różnicy średnich.&lt;br /&gt;
&lt;br /&gt;
Formułujemy hipotezy:&lt;br /&gt;
* &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt;: średni przyrost masy w grupie A &amp;lt;math&amp;gt;=&amp;lt;/math&amp;gt; średni przyrost masy w grupie B&lt;br /&gt;
* &amp;lt;math&amp;gt;H_1&amp;lt;/math&amp;gt;: średni przyrost masy w grupie A &amp;lt;math&amp;gt;\ne&amp;lt;/math&amp;gt; średni przyrost masy w grupie B&lt;br /&gt;
Przeprowadzamy test:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
t, p = st.ttest_ind(A,B)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Otrzymujemy ''p'' = 0.01.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;p &amp;lt; \alpha &amp;lt;/math&amp;gt;,  zatem na przyjętym poziomie istotności odrzucamy hipotezę zerową i stwierdzamy, że grupa A ma inną średnią niż grupa B.&lt;br /&gt;
&lt;br /&gt;
===Test nieparametryczny ===&lt;br /&gt;
Nie zakładajac postaci  rozkładu danych mozemy zastosować test [[WnioskowanieStatystyczne/Test_Wilcoxona| ze statystykami opartymi na rangach]]. &lt;br /&gt;
Formułujemy hipotezy:&lt;br /&gt;
* &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt;: mediana przyrostu masy w grupie A &amp;lt;math&amp;gt;=&amp;lt;/math&amp;gt; mediana przyrostu masy w grupie B&lt;br /&gt;
* &amp;lt;math&amp;gt;H_1&amp;lt;/math&amp;gt;: mediana przyrostu masy w grupie A&amp;lt;math&amp;gt;\ne&amp;lt;/math&amp;gt; mediana przyrostu masy w grupie B&lt;br /&gt;
Przeprowadzamy test:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
U, p = st.mannwhitneyu(A, B)&lt;br /&gt;
p_dwustronne = 2*p&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
W pythonie zaimplementowana jest wersja jednostronna tego testu. Aby otrzymać prawdopodobieństwo ''p'' dla testu dwustronnego musimy pomnożyć je przez 2.&lt;br /&gt;
&lt;br /&gt;
===Testy bootstrapowe===&lt;br /&gt;
Teraz to samo sprawdzimy za pomocą testu repróbkowanego.&lt;br /&gt;
Przyda nam się tu funkcja do pobierania losowej próbki z powtórzeniami z danych:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
def randsample(x, N):&lt;br /&gt;
	'''zwraca wektor o dłougości N z losowo wybranymi elementami wektora x. Losowanie odbywa się z powtórzeniami''' &lt;br /&gt;
	n=len(x)&lt;br /&gt;
	ind = np.random.randint(n, size = N)&lt;br /&gt;
	y = x[ind]&lt;br /&gt;
	return y&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W testech repróbkowanych statystykę możemy wybrać dość dowolnie, ale jak pokażemy poniżej nie każda jest równie dobra.&lt;br /&gt;
Zgodnie z hipotezą zerową próbka A i  B pochodza z tej samej populacji.&lt;br /&gt;
Nasza najlepsza wiedza o owej populacji to połączone próbki A i B:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
POP=np.concatenate((A, B))&lt;br /&gt;
&lt;br /&gt;
N=len(POP)&lt;br /&gt;
NA=len(A)&lt;br /&gt;
NB=len(B)&lt;br /&gt;
# Zasymulujemy N_rep razy wyciagniecie z POP prob o rozmiarach NA i NB i&lt;br /&gt;
# zobaczymy jak czesto zdarzają się wartości statystyki  sie roznica srednich taka jak w oryginalnym&lt;br /&gt;
# pomiarze lub jeszcze wieksza. &lt;br /&gt;
N_rep=10000&lt;br /&gt;
# oryginalna roznica srednich i median:&lt;br /&gt;
mi_0 = np.abs(np.mean(A) - np.mean(B))&lt;br /&gt;
T_0  = np.abs(np.mean(A) - np.mean(B))/np.std(POP)&lt;br /&gt;
me_0 = np.abs(np.median(A) - np.median(B))&lt;br /&gt;
&lt;br /&gt;
mi = np.zeros(N_rep)&lt;br /&gt;
T  = np.zeros(N_rep)&lt;br /&gt;
me = np.zeros(N_rep)&lt;br /&gt;
&lt;br /&gt;
for i in range(N_rep):&lt;br /&gt;
	AA = randsample(POP,NA)&lt;br /&gt;
	BB = randsample(POP,NB)&lt;br /&gt;
	R_POP = np.concatenate((AA,BB))&lt;br /&gt;
	mi[i] = np.abs(np.mean(AA)-np.mean(BB)) # abs bo test dwustronny&lt;br /&gt;
	T[i]  = np.abs(np.mean(AA)-np.mean(BB))/np.std(R_POP)&lt;br /&gt;
	me[i] = np.abs(np.median(AA)-np.median(BB))&lt;br /&gt;
&lt;br /&gt;
p_mi = np.sum(mi&amp;gt;=mi_0)/N_rep&lt;br /&gt;
p_T  = np.sum( T&amp;gt;=T_0 )/N_rep&lt;br /&gt;
p_me = np.sum(me&amp;gt;=me_0)/N_rep&lt;br /&gt;
&lt;br /&gt;
print('testy repróbkowane: ')&lt;br /&gt;
print('rożnica średnich: ', p_mi)&lt;br /&gt;
print('pseudo T: ', p_T)&lt;br /&gt;
print('różnica median: ', p_me)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Widzimy, że dla testu ze statystyką różnicy średnich i  pseudo T dostajemy podobne wyniki, z tym, że pseudo T jest nieco silniejszy. Test ze statystyką różnicy średnich jest na tyle słaby, że nie pozwala na odrzucenie hipotezy zerowej.&lt;br /&gt;
&lt;br /&gt;
===Wnioskowanie w oparciu o przedziały ufności ===&lt;br /&gt;
Wnioskowanie o równości średnich dwóch grup można też przerowadzić w oparciu o przedziały ufności. W naszym przykładzie przedziały można skonstruować zarówno parametrycznie jak i nieparametrycznie.&lt;br /&gt;
==== Wersja parametryczna ====&lt;br /&gt;
Konstruujemy 95% przedział ufności wokół oryginalnej różnicy średnich.&lt;br /&gt;
Dla dwóch grup wariancję różnicy średnich znajdujemy sumując wariancje śrenich estymowane dla każdej z grup:&lt;br /&gt;
:&amp;lt;math&amp;gt; &lt;br /&gt;
\mathrm{var}_{\Delta} = \frac{1}{N_1}\mathrm{var}(x_1) + \frac{1}{N_2} \mathrm{var}(x_2)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
ilość stopni swobody:&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
 df = N_1+N_2-2&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
co prowadzi do estymatora&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
s^2_\Delta = \frac{N_1s_1^2 + N_2s_2^2}{N_1+N_2-2} \cdot \frac{N_1+N_2}{N_1N_2}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
roznica_oryginalna = np.mean(A) - np.mean(B)&lt;br /&gt;
f = NA+NB-2;&lt;br /&gt;
v_A = np.var(A)&lt;br /&gt;
v_B = np.var(B)&lt;br /&gt;
sig = np.sqrt( ((NA*v_A +NB*v_B))/f * (NA + NB)/(NA*NB) )&lt;br /&gt;
t_2_5 = st.t.ppf(0.025,f);&lt;br /&gt;
t_97_5 = st.t.ppf(0.975,f);&lt;br /&gt;
print('przedział ufności dla różnicy średnich przy założeniu normalności %(d).2f %(g).2f'%{'d':sig*t_2_5+ roznica_oryginalna,'g':sig*t_97_5+roznica_oryginalna})&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Otrzymujemy w wyniku &amp;lt;tt&amp;gt;przedział ufności dla różnicy średnich przy założeniu normalności 0.77 5.56&amp;lt;/tt&amp;gt;. Oznacza to, że w 95% analogicznych badań powinniśmy otrzymać różnicę średnich zawartą w tym przedziale. Przedził ten nie zawiera wartości 0, zatem na przyjętym poziomie istotności średnie grupy A i B są różne.&lt;br /&gt;
&lt;br /&gt;
====Wersja nieparametryczna ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# POP zawiera świat zgodny z H0&lt;br /&gt;
roznica_oryginalna = np.mean(A) - np.mean(B)&lt;br /&gt;
alfa = 0.05&lt;br /&gt;
N_rep = 10000&lt;br /&gt;
r = np.zeros(N_rep)&lt;br /&gt;
for i in range(N_rep):&lt;br /&gt;
	gA = randsample(POP, NA)&lt;br /&gt;
	gB = randsample(POP, NB)&lt;br /&gt;
	r[i] = np.mean(gA) - np.mean(gB)&lt;br /&gt;
ci_d = st.scoreatpercentile(r, per = alfa/2*100)&lt;br /&gt;
ci_g = st.scoreatpercentile(r, per = (1-alfa/2)*100)&lt;br /&gt;
# print('przedział ufności: %(d).2f %(g).2f'%{'m':np.mean(r),'d':ci_d+roznica_oryginalna, 'g':ci_g+roznica_oryginalna})&lt;br /&gt;
print('przedział ufności: %(d).2f %(g).2f'%{'m':np.mean(r),'d':ci_d, 'g':ci_g})&lt;br /&gt;
print('oryginalna różnica średnich: %(ro).2f'%{'ro':roznica_oryginalna})&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Wynik:&lt;br /&gt;
&amp;lt;tt&amp;gt;przedział ufności: -2.50 2.50&lt;br /&gt;
oryginalna różnica średnich: 3.17&amp;lt;/tt&amp;gt;.&lt;br /&gt;
Przedział ufności 95% na różnicę skonstruowany zgodnie z &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; nie zawiera oryginalnej różnicy średnich, &lt;br /&gt;
zatem różnica 3.17 w świecie zgodnym z &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; zdarza się nie częściej niż w 5% przypadków. Wniosek: średnie grup A i B są różne  na przyjętym poziomie ufności.&lt;br /&gt;
&lt;br /&gt;
== Zadanie: Przeżywalność myszy ==&lt;br /&gt;
Mamy 7 myszy, którym podano środek, który miał poprawić ich przeżywalność po operacji oraz 9 myszy kontrolnych, którym owego środka nie podano. Myszy traktowane specjalnie przeżyły &amp;lt;br&amp;gt;&lt;br /&gt;
94, 38, 23, 197, 99, 16, 141 dni&amp;lt;br&amp;gt;&lt;br /&gt;
a myszy traktowane standardowo:&amp;lt;br&amp;gt;&lt;br /&gt;
52, 10, 40, 104, 51, 27, 146, 30, 46 dni&amp;lt;br&amp;gt;&lt;br /&gt;
Średnia różnica wynosi 30,63 dni dłużej dla myszy traktowanych po nowemu.&lt;br /&gt;
Pytanie, na które chcielibyśmy znać odpowiedź to: Czy nowy środek faktycznie poprawia przeżywalność.&lt;br /&gt;
Zadanie proszę rozwiązać wszystkimi możliwymi sposobami, analogicznie do powyższego przykładu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Odp'': &lt;br /&gt;
:przedział ufności: [&amp;amp;minus;51,64 52,89]&lt;br /&gt;
:oryginalna różnica średnich: 30,63&lt;br /&gt;
:przedział ufności dla różnicy średnich przy założeniu normalności [&amp;amp;minus;27,99  89,26]&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
'''Przedział ufności dla różnicy dwóch średnich&lt;br /&gt;
&lt;br /&gt;
Mamy 7 myszy, którym podano środek, który miał poprawić ich przeżywalność &lt;br /&gt;
po operacji oraz 9 myszy kontrolnych, którym owego środka nie podano. &lt;br /&gt;
Myszy traktowane specjalnie przeżyły&lt;br /&gt;
94 38 23 197 99 16 141 dni&lt;br /&gt;
a myszy traktowane standardowo:&lt;br /&gt;
52 10 40 104 51 27 146 30 46 dni&lt;br /&gt;
Średnia różnica wynosi 30.63 dni dłużej dla myszy traktowanych po nowemu. &lt;br /&gt;
Pytanie, na które chcielibyśmy znać odpowiedź to: Czy nowy środek faktycznie &lt;br /&gt;
poprawia przeżywalność.&lt;br /&gt;
&lt;br /&gt;
Skonstruujmy przedział ufności 95% dla średniej różnicy w przeżywalności.&lt;br /&gt;
&lt;br /&gt;
Uwaga: przy tym problemie każdą z grup traktujemy jako reprezentantów bardzo &lt;br /&gt;
dużych populacji. '''&lt;br /&gt;
def randsample(x,ile):&lt;br /&gt;
	ind = st.randint.rvs(0,len(x),size = ile)&lt;br /&gt;
	y = x[ind]&lt;br /&gt;
	return y&lt;br /&gt;
&lt;br /&gt;
m_sp = np.array([94, 38, 23, 197, 99, 16, 141])&lt;br /&gt;
N_sp = len(m_sp)&lt;br /&gt;
m_st = np.array([52, 10, 40, 104, 51, 27, 146, 30, 46])&lt;br /&gt;
N_st = len(m_st)&lt;br /&gt;
alfa = 0.05&lt;br /&gt;
# zgodnie z hipotezą zerową (H0) nie ma różnicy między grupami&lt;br /&gt;
&lt;br /&gt;
# symulacja&lt;br /&gt;
# tworzymy świat zgodny z H0&lt;br /&gt;
m = np.concatenate((m_sp,m_st))&lt;br /&gt;
&lt;br /&gt;
roznica_oryginalna = np.mean(m_sp) - np.mean(m_st)&lt;br /&gt;
&lt;br /&gt;
N_rep = 10000&lt;br /&gt;
r = np.zeros(N_rep)&lt;br /&gt;
for i in range(N_rep):&lt;br /&gt;
	g1 = randsample(m, N_sp)&lt;br /&gt;
	g2 = randsample(m, N_st)&lt;br /&gt;
	r[i] = np.mean(g1) - np.mean(g2)&lt;br /&gt;
ci_d = st.scoreatpercentile(r, per = alfa/2*100)&lt;br /&gt;
ci_g = st.scoreatpercentile(r, per = (1-alfa/2)*100)&lt;br /&gt;
print('przedział ufności: %(d).2f %(g).2f'%{'m':np.mean(r),'d':ci_d, 'g':ci_g})&lt;br /&gt;
print('oryginalna różnica średnich: %(ro).2f'%{'ro':roznica_oryginalna})&lt;br /&gt;
# przedział ufności na różnicę skonstruowany zgodnie z H0 zawiera oryginalną różnicę średnich, &lt;br /&gt;
# zatem różnica taka jest na przyjętym poziomie ufności możliwa &lt;br /&gt;
# do zaobserwowania w przypadku braku różnicy między grupami&lt;br /&gt;
&lt;br /&gt;
# zakładając normalność&lt;br /&gt;
f = N_sp+N_st-2;&lt;br /&gt;
v_1 = np.var(m_sp)&lt;br /&gt;
v_2 = np.var(m_st)&lt;br /&gt;
sig = np.sqrt( ((N_sp*v_1 +N_st*v_2))/f * (N_sp + N_st)/float(N_sp*N_st) )&lt;br /&gt;
t_2_5 = st.t.ppf(0.025,f);&lt;br /&gt;
t_97_5 = st.t.ppf(0.975,f);&lt;br /&gt;
print('przedział ufności dla różnicy średnich przy założeniu normalności %(d).2f %(g).2f'%{'d':sig*t_2_5+ roznica_oryginalna,'g':sig*t_97_5+roznica_oryginalna})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
print('przedział ufności dla różnicy średnich przy założeniu normalności %(d).2f %(g).2f'%{'d':s_delta*t_2_5+ roznica_oryginalna,'g':s_delta*t_97_5+roznica_oryginalna})&lt;br /&gt;
# skonstruowany wokoł oryginalnej różnicy średnich przedział ufności zawiera 0, zatem nie możemy odrzucić możliwości,&lt;br /&gt;
# że nie ma różnicy między grupami&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zadanie: Linie lotnicze==&lt;br /&gt;
Linie lotnicze, projektując nowy samolot chcą sprawdzić czy średnia waga bagażu ręcznego zabieranego przez pasażerów nie zmieniła się od czasu poprzednich badań i wynosi wciąż 12 kg. Analiza ma być przeprowadzona na poziomie istotności &amp;lt;math&amp;gt;\alpha = 0,05&amp;lt;/math&amp;gt;. Analityk pobrał próbę bagażu ręcznego 144 pasażerów i obliczył wartość średnią z próby &amp;lt;math&amp;gt;\bar x = 14,6&amp;lt;/math&amp;gt; kg i odchylenie standardowe z próby &amp;lt;math&amp;gt;s = 7,8&amp;lt;/math&amp;gt;. Przeprowadź test hipotezy, że &amp;lt;math&amp;gt;\mu = 12&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
Standardowe importy modułów&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zmienne występujące w treści przykładu&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
mu_0=12&lt;br /&gt;
a=0.05&lt;br /&gt;
N=144&lt;br /&gt;
x=14.6&lt;br /&gt;
s=7.8&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Test dotyczy średniej wiec obliczamy odchylenie standardowe średniej:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
std_mu=s/np.sqrt(N)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wyjaśnienie |title= Obliczamy wartość statystyki:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt; &lt;br /&gt;
t=(mu_0-x)/std_mu&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Odchylenie standardowe estymowaliśmy z próby. Wartości powyższej statystyki podlegają zatem rozkładowi  t. Obliczamy wartości krytyczne odpowiadające poziomowi istotności a. Test jest dwustronny mamy wiec dwie wartości krytyczne: jedna odcina obszar pod funkcja gęstości prawdopodobieństwa na lewo,  a druga na prawo od siebie. Pole każdego z tych obszarów wynosi a/2:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt; &lt;br /&gt;
  &lt;br /&gt;
t_kryt_lewy = st.t.ppf(a/2,N-1)&lt;br /&gt;
t_kryt_prawy = st.t.ppf( 1-a/2, N-1)&lt;br /&gt;
&lt;br /&gt;
print('obliczona wartość statystyki t: ', t)&lt;br /&gt;
print('wartości krytyczne t: %(tl).2f %(tp).2f '%{'tl':t_kryt_lewy, 'tp':t_kryt_prawy})&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Możemy też obliczyć prawdopodobieństwo zaobserwowania wartości ''t'' takiej jak w naszym zadaniu lub bardziej ekstremalnej:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt; &lt;br /&gt;
p =  (st.t.cdf(-np.abs(t),N-1)) + (1-st.t.cdf(np.abs(t), N-1))  # sumujemy po obu ogonach  bo test jest dwustronny&lt;br /&gt;
print('Prawdopodobieństwo zaobserwowania bardziej ekstremalnych wartości t: %(p).4f'%{'p':p})&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wyniki te możemy zilustrować:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt; &lt;br /&gt;
os_t = np.arange(-5, 5, 0.1)&lt;br /&gt;
py.plot(os_t, st.t.pdf(os_t,N-1)) #rysujemy funkcję gęstości prawdopodobieństwa t o N-1 st. swobody&lt;br /&gt;
&lt;br /&gt;
#cieniujemy lewy obszary pod funkcją gęstości prawdopodobieństwa odpowiadający obliczonemu p&lt;br /&gt;
os_t2 = np.arange(-5, t_kryt_lewy, 0.1)&lt;br /&gt;
py.fill_between(os_t2,st.t.pdf(os_t2,N-1)) &lt;br /&gt;
#cieniujemy prawy obszary pod funkcją gęstości prawdopodobieństwa odpowiadający obliczonemu p&lt;br /&gt;
os_t2 = np.arange(t_kryt_prawy, 5,  0.1)&lt;br /&gt;
py.fill_between(os_t2,st.t.pdf(os_t2,N-1)) &lt;br /&gt;
&lt;br /&gt;
# zaznaczamy obliczoną wartość statystyki:&lt;br /&gt;
py.plot((t,), (0,), 'ro')&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Odpowiedź: Wyliczone ''t'' leży poza obszarem akceptacji hipotezy zerowej, zatem odrzucamy hipotezę zerową i akceptujemy alternatywną.&lt;br /&gt;
&lt;br /&gt;
==Zadanie: Agencja nieruchomości==&lt;br /&gt;
Agencja nieruchomości w Japonii podała, że ceny gruntu w centrum Tokio wzrosły o 49% w ciągu ostatniego roku. Inwestor chcąc przetestować te dane, znajduje próbę 18 nieruchomości w centrum Tokio, dla których zna cenę obecna i sprzed roku. Zakłada, że ceny podlegają rozkładowi normalnemu. Dla każdej nieruchomości oblicza procentowy wzrost wartości a następnie znajduje średnią i odchylenie standardowe z próby. Estymatory dla próby wynoszą &amp;lt;math&amp;gt;\bar x = 38&amp;lt;/math&amp;gt;% i &amp;lt;math&amp;gt;s = 14&amp;lt;/math&amp;gt;%. Przeprowadź test na poziomie istotności &amp;lt;math&amp;gt;\alpha = 0,01&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
mu_0=49;&lt;br /&gt;
x=38;&lt;br /&gt;
s=14;&lt;br /&gt;
N=18;&lt;br /&gt;
a=0.01;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# test dotyczy sredniej wiec jej std:&lt;br /&gt;
std_mu=s/np.sqrt(N)&lt;br /&gt;
&lt;br /&gt;
# odchylenie std obliczylismy z proby =&amp;gt; stosujemy test t&lt;br /&gt;
# obliczamy wartość statystyki &lt;br /&gt;
t=(mu_0-x)/std_mu&lt;br /&gt;
# obliczamy wartości krytyczne odpowiadające poziomowi istotności a&lt;br /&gt;
# test jest dwustronny mamy wiec dwie wartosci krytyczne &lt;br /&gt;
# jedna odcina obszar pod funkcja gęstości prawdopodobieństwa na lewo, &lt;br /&gt;
# a druga na prawo od siebie. Pole każdego z tych obszarów wynosi a/2&lt;br /&gt;
  &lt;br /&gt;
t_kryt_lewy = st.t.ppf(a/2,N-1)&lt;br /&gt;
t_kryt_prawy = st.t.ppf( 1-a/2, N-1)&lt;br /&gt;
&lt;br /&gt;
print('obliczona wartość statystyki t: ', t)&lt;br /&gt;
print('wartości krytyczne t: %(tl).2f %(tp).2f '%{'tl':t_kryt_lewy, 'tp':t_kryt_prawy})&lt;br /&gt;
&lt;br /&gt;
# Możemy też obliczyć prawdopodobieństwo zaobserwowania wrtości t takiej jak w naszym zadaniu &lt;br /&gt;
# lub bardziej ekstremalnej:&lt;br /&gt;
p = (1-st.t.cdf(t, N-1)) + (st.t.cdf(-t,N-1)) # sumujemy po obu ogonach  bo test jest dwustronny&lt;br /&gt;
		&lt;br /&gt;
print('Prawdopodobieństwo zaobserwowania bardziej ekstremalnych wrtości t: %(p).3f'%{'p':p})&lt;br /&gt;
# Wyniki te możemy zilustrować&lt;br /&gt;
os_t = np.arange(-5, 5, 0.1)&lt;br /&gt;
py.plot(os_t, st.t.pdf(os_t,N-1)) #rysujemy funkcję gęstości prawdopodobieństwa t o N-1 st. swobody&lt;br /&gt;
&lt;br /&gt;
#cieniujemy lewy obszary pod funkcją gęstości prawdopodobieństwa odpowiadający obliczonemu p&lt;br /&gt;
os_t2 = np.arange(-5, t_kryt_lewy, 0.1)&lt;br /&gt;
py.fill_between(os_t2,st.t.pdf(os_t2,N-1)) &lt;br /&gt;
#cieniujemy prawy obszary pod funkcją gęstości prawdopodobieństwa odpowiadający obliczonemu p&lt;br /&gt;
os_t2 = np.arange(t_kryt_prawy, 5,  0.1)&lt;br /&gt;
py.fill_between(os_t2,st.t.pdf(os_t2,N-1)) &lt;br /&gt;
&lt;br /&gt;
# zaznaczamy obliczoną wartość statystyki:&lt;br /&gt;
py.plot(t, 0, 'ro')&lt;br /&gt;
py.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# 'Odp: Wyliczone t lezy poza obszarem akceptacji hipotezy zerowej,&lt;br /&gt;
# zatej odrzucamy hipoteze zerowa i akceptujemy alternatywna.'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Odp. Odrzucamy &amp;lt;math&amp;gt;H_0:&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\mu_0 = 49&amp;lt;/math&amp;gt;, na poziomie istotności 0,01.&lt;br /&gt;
&lt;br /&gt;
==Zadanie: Zabiegi bio-inżynieryjne==&lt;br /&gt;
Załóżmy, że krowy są bardziej wartościowe od byków. Bio-inżynier twierdzi, że przy pomocy pewnych zabiegów jest w stanie spowodować zwiększenie szansy na urodzenie się krowy powyżej 50%. W jego eksperymencie na 10 urodzonych zwierząt 9 było krowami, a tylko 1 bykiem. Czy powinnniśmy wierzyć temu bio-inżynierowi? Jakia jest szansa na uzyskanie takiego, bądź bardziej ekstremalnego wyniku przy założeniu, że procedura stosowana przez naszego inżyniera nia ma żadnych efektów? W tym problemie dla odmiany założymy, że w normalnych warunkach 100 spośród 206 cieląt to krowy.&lt;br /&gt;
Zadanie rozwiązać metodą parametryczną i przez repróbkowanie. [[WnioskowanieStatystyczne/_Testowanie_hipotez#Przykład:_mutacje_muszek_owocowych|Wskazówka]]&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
def randsample(x, N):&lt;br /&gt;
	'''zwraca wektor z losowo wybranymi elementami wektora x. Losowanie odbywa się z powtórzeniami''' &lt;br /&gt;
	n=len(x)&lt;br /&gt;
	ind = np.random.randint(n, size = N)&lt;br /&gt;
	y = x[ind]&lt;br /&gt;
	return y&lt;br /&gt;
&lt;br /&gt;
# sposób pierwszy:&lt;br /&gt;
# zmienna urodzenie byka/krowy podlega rozkladowi dwumianowemu &lt;br /&gt;
p = 100.0/206&lt;br /&gt;
N = 10&lt;br /&gt;
k = 9&lt;br /&gt;
p_bino = 1-st.binom.cdf(k-1,N,p) #prawdopodobieństwo wylosowania 9 lub 10 krów w 10 probach &lt;br /&gt;
print('Prawdopodobieństwo wylosowania 9 lub 10 krów w 10 probach: %(p).4f'%{'p':p_bino})&lt;br /&gt;
# W jego mwetodzie chyba cos jest&lt;br /&gt;
&lt;br /&gt;
# sposob drugi: repróbkowanie&lt;br /&gt;
# model swiata z ktorego pochodza byki(0)/krowy(1):&lt;br /&gt;
w = np.concatenate((np.ones(100), np.zeros(106)))&lt;br /&gt;
&lt;br /&gt;
N_rep = 100000&lt;br /&gt;
wynik = np.zeros(N_rep)&lt;br /&gt;
for i in range(N_rep):&lt;br /&gt;
	wynik[i] = np.sum(randsample(w,10))&lt;br /&gt;
&lt;br /&gt;
p_rep = float(np.sum(wynik&amp;gt;=k))/N_rep&lt;br /&gt;
print('Prawdopodobieństwo wylosowania 9 lub 10 krów w 10 probach estymowane z symulacji: %(p).4f'%{'p':p_rep})&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''Odp'':  ''p'' = 0,008. Odrzucamy ''H''&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; o braku efektów.&lt;br /&gt;
&lt;br /&gt;
==Zadanie: Porównanie lekarstwa i placebo==&lt;br /&gt;
Badamy skuteczność leku na raka. Mamy grupę 12 chorych: 6 osobom podajemy lek &amp;amp;mdash; poprawa wystąpiła u 5 osób, pozostałym sześciu osobom podajemy placebo &amp;amp;mdash; poprawa wystąpiła u 2 osób. Czy te wyniki upoważniają do stwierdzenia, że lek istotnie zwiększa szansę poprawy? Test przeprowadzić na poziomie istotności 5%.&lt;br /&gt;
&lt;br /&gt;
Wskazówka: jako statystykę przyjąć różnicę w ilości popraw między grupą z lekiem a grupą z placebo. Interesuje nas prawdopodobieństwo zaobserwowania takiej (3) bądź większej różnicy. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
def randsample(x, N):&lt;br /&gt;
	'''zwraca wektor z losowo wybranymi elementami wektora x. Losowanie odbywa się z powtórzeniami''' &lt;br /&gt;
	n=len(x)&lt;br /&gt;
	ind = np.random.randint(n, size = N)&lt;br /&gt;
	y = x[ind]&lt;br /&gt;
	return y&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Formułujemy hipotezy &lt;br /&gt;
# H0: lek nie daje poprawy &lt;br /&gt;
# H1: lek daje poprawę&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# zgodnie z H0 obie próby pochodzą ze świata:&lt;br /&gt;
# pierwszy sposób: repróbkowanie&lt;br /&gt;
w = np.concatenate((np.ones(7), np.zeros(5))) # jedynki -&amp;gt; wystąpiła poprawa&lt;br /&gt;
&lt;br /&gt;
n_l = 5 # ilosc popraw w grupie leku&lt;br /&gt;
n_p = 2 #ilosc popraw w grupie placebo&lt;br /&gt;
# jako statystykę testową przyjmiemy różnicę w ilości popraw miedzy grupami&lt;br /&gt;
# w tym problemie istotne jest zwiększenie ilości popraw wiec stosujemy test&lt;br /&gt;
# jednostronny&lt;br /&gt;
N_rep = 100000&lt;br /&gt;
&lt;br /&gt;
st_0= n_l - n_p&lt;br /&gt;
st_rep=np.zeros(N_rep)&lt;br /&gt;
&lt;br /&gt;
for i in range(N_rep):&lt;br /&gt;
    n_l_rep   = np.sum(randsample(w,6))&lt;br /&gt;
    n_p_rep   = np.sum(randsample(w,6))&lt;br /&gt;
    st_rep[i] = n_l_rep - n_p_rep # wartość statystyki w i-tym repróbkowaniu&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
p_rep = float(np.sum(st_rep &amp;gt;= st_0))/N_rep&lt;br /&gt;
print('''Prawdopodobieństwo wylosowania takiej samej bądź większej różnicy w ilości popraw estymowane z symulacji: %(p).4f'''%{'p':p_rep})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# drugi sposób:&lt;br /&gt;
# zmienna uzyskanie poprawy podlega rozkładowi dwumianowemu &lt;br /&gt;
p = 7.0/12&lt;br /&gt;
N = 6&lt;br /&gt;
k1 = 5&lt;br /&gt;
k2 = 2&lt;br /&gt;
p_param = 0&lt;br /&gt;
for d in range(N-st_0+1):  # w tej pętli sumujemy prawdopodobieństwa zdarzeń  sprzyjających zaobserwowaniu różnicy co najmniej st_0 popraw &lt;br /&gt;
	p_bino1 = 1-st.binom.cdf(st_0 - 1 +d, N, p)  # prawdopodobieństwo uzyskania poprawy w co najmniej st_0 +d próbach&lt;br /&gt;
	p_bino2 = st.binom.pmf(d,N,p)   # prawdopodobieństwo uzyskania poprawy w d próbach&lt;br /&gt;
	p_param += p_bino1 * p_bino2 # prawdopodobieństwo zaobserwowania jednocześnie obu powyższych sytuacji&lt;br /&gt;
&lt;br /&gt;
print('Prawdopodobieństwo estymowane parametrycznie: %(p).4f'%{'p':p_param})&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: Odp: Prawdopodobieństwo wylosowania takiej samej bądź większej różnicy w ilości popraw estymowane z symulacji: 0,0702&lt;br /&gt;
Prawdopodobieństwo estymowane parametrycznie: 0,0699. Wniosek: nie mamy podstaw do odrzucenia hipotezy zerowej.&lt;br /&gt;
&lt;br /&gt;
==Zadanie: Pomiar masy cząstki elementarnej==&lt;br /&gt;
W pomiarach wstępnych zbadano masę spoczynkową pewnej cząstki elementarnej. Otrzymano następujące wyniki [MeV/c²]:&lt;br /&gt;
&lt;br /&gt;
139.20, 139.34, 140.22, 139.56, 139.42, 139.64, 139.22, 139.74, 139.38, 139.54,&lt;br /&gt;
139.38, 139.46, 140.09, 139.77, 139.52, 139.47, 139.89, 138.95, 139.99, 139.64,&lt;br /&gt;
139.37, 139.49, 139.15, 139.77, 140.10, 139.48, 139.84, 139.44, 140.13&lt;br /&gt;
&lt;br /&gt;
Zbadaj na poziomie istotności 1%, czy cząstką tą mógł być naładowany pion.&lt;br /&gt;
&lt;br /&gt;
Zbadaj na poziomie istotności 1%, czy cząstką tą mógł być neutralny pion.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
&lt;br /&gt;
alfa = 0.01 # poziom istotności&lt;br /&gt;
dane = np.array([139.20, 139.34, 140.22, 139.56, 139.42, 139.64, 139.22, 139.74,&lt;br /&gt;
                 139.38, 139.54, 139.38, 139.46, 140.09, 139.77, 139.52, 139.47,&lt;br /&gt;
                 139.89, 138.95, 139.99, 139.64, 139.37, 139.49, 139.15, 139.77,&lt;br /&gt;
                 140.10, 139.48, 139.84, 139.44, 140.13])&lt;br /&gt;
&lt;br /&gt;
Pi_plus_min = 139.57 # masa pionów naładowanych Pi+ i Pi-&lt;br /&gt;
Pi_neutral = 134.98  # masa pionu neutralnego Pi0&lt;br /&gt;
&lt;br /&gt;
# test t hipotezy H0, że dane pochodzą z rozkładu normalnego o wartości oczekiwanej Pi_plus_min&lt;br /&gt;
t1, p1 = st.ttest_1samp(dane,Pi_plus_min)&lt;br /&gt;
print(&amp;quot;Poziom p dla hipotezy, że był do pion naładowany&amp;quot;,p1)&lt;br /&gt;
if p1&amp;gt;=alfa: print(&amp;quot;Nie możemy odrzucić tej hipotezy na poziomie istotności {}%&amp;quot;.format(100*alfa))&lt;br /&gt;
else: print(&amp;quot;Możemy odrzucić tę hipotezę na poziomie istotności {}%&amp;quot;.format(100*alfa))&lt;br /&gt;
&lt;br /&gt;
# test t hipotezy H0, że dane pochodzą z rozkładu normalnego o średniej Pi_neutral&lt;br /&gt;
t2, p2 = st.ttest_1samp(dane,Pi_neutral)&lt;br /&gt;
print(&amp;quot;\nPoziom p dla hipotezy, że był do pion neutralny&amp;quot;,p2)&lt;br /&gt;
if p2&amp;gt;=alfa: print(&amp;quot;Nie możemy odrzucić tej hipotezy na poziomie istotności {}%&amp;quot;.format(100*alfa))&lt;br /&gt;
else: print(&amp;quot;Możemy odrzucić tę hipotezę na poziomie istotności {}%&amp;quot;.format(100*alfa))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Przykład: Średnie grup sparowanych: Lek przeciwdepresyjny==&lt;br /&gt;
Poniższa tabela prezentuje wyniki 9 pacjentów wykonujących pewien test diagnostyczny przed podaniem leku i po podaniu leku. &lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class='wikitable'&lt;br /&gt;
!przed	&lt;br /&gt;
!po&lt;br /&gt;
|-&lt;br /&gt;
|1,83	&lt;br /&gt;
|0,878&lt;br /&gt;
|-&lt;br /&gt;
|0,50	&lt;br /&gt;
|0,647&lt;br /&gt;
|-&lt;br /&gt;
|1,62	&lt;br /&gt;
|0,598&lt;br /&gt;
|-&lt;br /&gt;
|2,48	&lt;br /&gt;
|2,05&lt;br /&gt;
|-&lt;br /&gt;
|1,68	&lt;br /&gt;
|1,06&lt;br /&gt;
|-&lt;br /&gt;
|1,88	&lt;br /&gt;
|1,29&lt;br /&gt;
|-&lt;br /&gt;
|1,55	&lt;br /&gt;
|1,06&lt;br /&gt;
|-&lt;br /&gt;
|3,06	&lt;br /&gt;
|3,14&lt;br /&gt;
|-&lt;br /&gt;
|1,3	&lt;br /&gt;
|1,29&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
PRZED = [1.83, 0.5, 1.62, 2.48, 1.68, 1.88, 1.55, 3.06, 1.3]&lt;br /&gt;
PO = [0.878, 0.647, 0.598, 2.05, 1.06, 1.29, 1.06, 3.14, 1.29]&lt;br /&gt;
&lt;br /&gt;
Skonstruować test, który pozwoli stwierdzić czy lek jest skuteczny. Porównać różne wersje testu:&lt;br /&gt;
* bootstrapową (losowanie z powtórzeniami), &lt;br /&gt;
* permutacyjną, &lt;br /&gt;
* test parametryczny &lt;br /&gt;
* test nieparametryczny. &lt;br /&gt;
&lt;br /&gt;
Jakie założenia przyjmujemy przy każdej z wersji testu?&lt;br /&gt;
&lt;br /&gt;
===Rozwiązanie===&lt;br /&gt;
W tym zadaniu mamy dwie grupy ''przed'' i ''po'' ale oprócz tego istnieje ścisły porządek w parach, bez sensu jest porównywanie ''przed'' od jednego pacjenta z ''po'' drugiego pacjenta. Musimy stosować testy, które biorą ten porządek pod uwagę (testy pairwise).&lt;br /&gt;
&lt;br /&gt;
Jako miarę tego czy lek jest skuteczny przyjmiemy różnicę (''po'' - ''przed'').  Każda z zaobserwowanych różnic to zmienna losowa. Ich średnia to nasza STATYSTYKA. Będziemy wierzyli, że lek działa jeśli ta różnica jest istotnie mniejsza od zera. Mamy stąd hipotezy:&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;math&amp;gt;H_0: \bar r \geq 0&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;math&amp;gt;H_1: \bar r &amp;lt; 0 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Wersja bootstrapowa====&lt;br /&gt;
&lt;br /&gt;
Założenie, które czynimy w wersji bootstrapowej testu jest następujące:&lt;br /&gt;
Zaobserwowana grupa pacjentów jest reprezentatywna, tzn. istnieje duża populacja pacjentów spośród której moglibyśmy pobrać wiele innych grup podobnych pod względem interesujących nas parametrów do grupy zaobserwowanej w tym konkretnym eksperymencie. Konsekwencją tego założenia jest to, że jeśli w naszej grupie mamy już pacjenta z wynikami: [1.83,	0.878], to szansa na wylosowanie kolejnego pacjenta o takich wynikach się nie zmienia i nadal wynosi 1/9. Prowadzi to do implementacji zawierającej losowanie z powtórzeniami.&lt;br /&gt;
&lt;br /&gt;
Losowość występuje tu w dwóch miejscach:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; losujemy pacjentów z powtórzeniami - zakładamy, że badana grupa jest reprezentatywna dla bardzo dużej populacji.&lt;br /&gt;
&amp;lt;li&amp;gt; dla każdego z wybranych pacjentów losujemy jego wynik ''przed'' oraz wynik ''po'' z wyników, które uzyskał w rzeczywistości --- to jest zgodne z hipotezą zerową.&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Dla każdego losowania obliczamy wartość statystyki w tym losowania uśredniając  różnice indywidualne.&lt;br /&gt;
Wartości statystyki otrzymane dla wszystkich losowań tworzą jej empiryczny rozkład, przy założeniu, że hipoteza zerowa jest prawdziwa. Jako estymator prawdopodobieństwa zaobserwowania oryginalnej wartości statystyki ''mr'' (średnia różnica) przy prawdziwej hipotezie zerowej przyjmujemy frakcję rozkładu empirycznego, w której wartości statystyki były nie większe niż ''mr''. Wynik ilustrujemy histogramem rozkładu empirycznego z zaznaczoną ową frakcją.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
def randsample(x, N):&lt;br /&gt;
	'''zwraca wektor z losowo wybranymi elementami wektora x. &lt;br /&gt;
         Losowanie odbywa się z powtórzeniami''' &lt;br /&gt;
&lt;br /&gt;
	n=len(x)&lt;br /&gt;
	ind = np.random.randint(n, size = N)&lt;br /&gt;
	y = x[ind]&lt;br /&gt;
	return y&lt;br /&gt;
&lt;br /&gt;
def hist_z_markerem(x, N_bins, marker):&lt;br /&gt;
	'''Rysuje histogram wartości w tablicy x, używając N_bins binów. &lt;br /&gt;
	Na lewo od wartości wskazanej przez marker dorysowywany jest prostokąt'''&lt;br /&gt;
	&lt;br /&gt;
	r = np.max(x) - np.min(x)&lt;br /&gt;
	szer_binu = r/N_bins&lt;br /&gt;
&lt;br /&gt;
	#konstruujemy biny&lt;br /&gt;
        # robimy biny od markera co szerokość binu aż do x minimalnego&lt;br /&gt;
	biny_na_lewo = np.arange( marker, np.min(x), -szer_binu)&lt;br /&gt;
        # odwracamy kolejność tej sekwencji żeby była rosnąca&lt;br /&gt;
	biny_na_lewo = biny_na_lewo[-1::-1] &lt;br /&gt;
         # robimy biny od markera co szerokość binu aż do x maksymalnego&lt;br /&gt;
	biny_na_prawo = np.arange(marker,np.max(x), szer_binu)&lt;br /&gt;
        # sklejamy oba zakresy binów&lt;br /&gt;
	biny = np.concatenate((biny_na_lewo, biny_na_prawo))&lt;br /&gt;
	(n,xx,patch) = py.hist(x,bins = biny)&lt;br /&gt;
	py.fill([np.min(xx), np.min(xx), marker, marker] , [0, np.max(n), np.max(n), 0] ,'r' ,alpha = 0.2)&lt;br /&gt;
&lt;br /&gt;
A=np.array([[1.83,	0.878],&lt;br /&gt;
[0.50,	0.647],&lt;br /&gt;
[1.62,	0.598],&lt;br /&gt;
[2.48,	2.05],&lt;br /&gt;
[1.68,	1.06],&lt;br /&gt;
[1.88,	1.29],&lt;br /&gt;
[1.55,	1.06],&lt;br /&gt;
[3.06,	3.14],&lt;br /&gt;
[1.30,	1.29]])&lt;br /&gt;
&lt;br /&gt;
r = A[:,1] - A[:,0] # od drugiej kolumny odejmuję pierwszą&lt;br /&gt;
mr = np.mean(r)  # średnia z tych różnic to wartość statystyki zaobserwowana dla oryginalnych danych&lt;br /&gt;
print( 'średnia różnica: %(mr).2f'%{'mr':mr})&lt;br /&gt;
&lt;br /&gt;
N = len(r)&lt;br /&gt;
&lt;br /&gt;
N_rep = 100000&lt;br /&gt;
r_boot = np.zeros(N_rep)&lt;br /&gt;
przed = np.zeros(N)&lt;br /&gt;
po = np.zeros(N)&lt;br /&gt;
&lt;br /&gt;
for i in range(N_rep):&lt;br /&gt;
    ix=randsample(np.arange(0,N,1),N) # wybieramy pacjentów z powtórzeniami&lt;br /&gt;
    B=np.array(A[ix,:])&lt;br /&gt;
    for j in range(N):   # mieszamy losowo przypisując wyniki do grupy przed i po&lt;br /&gt;
                         # zakładając, że pacjent może uzyskać dwukrotnie taki sam wynik&lt;br /&gt;
        s = np.random.rand()&lt;br /&gt;
        if s &amp;gt; 0.5:&lt;br /&gt;
            przed[j]=B[j,0]&lt;br /&gt;
        else:&lt;br /&gt;
            przed[j]=B[j,1]&lt;br /&gt;
        s = np.random.rand()&lt;br /&gt;
        if s &amp;gt; 0.5:&lt;br /&gt;
            po[j]=B[j,1]&lt;br /&gt;
        else:&lt;br /&gt;
            po[j]=B[j,0]&lt;br /&gt;
    rr=po-przed&lt;br /&gt;
    r_boot[i] = np.mean(rr)&lt;br /&gt;
&lt;br /&gt;
hist_z_markerem(r_boot,30,mr)&lt;br /&gt;
p_h0 = np.sum( r_boot &amp;lt;=  mr)/N_rep&lt;br /&gt;
s_boot = u'dla repróbkowanego testu jednostronnego: %(p_h0).5f'%{'p_h0': p_h0}&lt;br /&gt;
print( s_boot)&lt;br /&gt;
py.title(s_boot)&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Wersja permutacyjna====&lt;br /&gt;
&lt;br /&gt;
W tym teście zakładamy, że grupa pacjentów jest unikalna, więc w procedurze wytwarzania empirycznego rozkładu statystyki  korzystamy z danych wszystkich pacjentów w każdej iteracji. &lt;br /&gt;
&lt;br /&gt;
Zgodnie z hipotezą zerową pomiary ''przed'' i ''po'' są równoważne można je zatem zamieniać. Wykonamy wszystkie możliwe zamiany ''przed'' i ''po''. Możliwych zamian jest &amp;lt;math&amp;gt;2^N&amp;lt;/math&amp;gt;.  Skorzystamy z faktu, że bity w reprezentacji binarnej liczb całkowitych od 0 do &amp;lt;math&amp;gt;2^{N-1}&amp;lt;/math&amp;gt; zawierają wszystkie możliwe permutacje ciągów zer i jedynek o długości ''N''. Wartości 1 zamienimy na logiczne True a wartości 0 na False. Zinterpretujemy True jako zamianę  i False jako brak zamiany. &lt;br /&gt;
&lt;br /&gt;
Dla każdej permutacji obliczamy wartość statystyki uśredniając  różnice indywidualne.&lt;br /&gt;
Wartości statystyki otrzymane dla wszystkich permutacji tworzą jej empiryczny rozkład, przy założeniu, że hipoteza zerowa jest prawdziwa. Jako estymator prawdopodobieństwa zaobserwowania oryginalnej wartości statystyki ''mr'' przy prawdziwej hipotezie zerowej przyjmujemy frakcję rozkładu empirycznego, w której wartości statystyki były nie większe niż ''mr''. Wynik ilustrujemy histogramem rozkładu empirycznego z zaznaczoną ową frakcją. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
 &lt;br /&gt;
def dec2bin(n, l):&lt;br /&gt;
    '''konwertuje dziesiętną liczbę całkowitą na tablicę &lt;br /&gt;
    przedstawiającą reprezentację binarną tej liczby&lt;br /&gt;
    n liczba do konwersji&lt;br /&gt;
    l długość reprezentacji binarnej &lt;br /&gt;
    zwracana jest binarna reprezentacja liczby &lt;br /&gt;
    skonwertowana do tablicy logicznej (0-&amp;gt;False, 1-&amp;gt; True)&lt;br /&gt;
    '''&lt;br /&gt;
    b = np.zeros(l, dtype = bool)&lt;br /&gt;
    if n &amp;lt; 0:  raise ValueError(&amp;quot;must be a positive integer&amp;quot;)&lt;br /&gt;
    i = 1&lt;br /&gt;
    while n &amp;gt; 0:&lt;br /&gt;
        b[l-i] = bool( n % 2 ) &lt;br /&gt;
        n = n &amp;gt;&amp;gt; 1&lt;br /&gt;
        i += 1&lt;br /&gt;
    return b&lt;br /&gt;
 &lt;br /&gt;
def hist_z_markerem(x, N_bins, marker):&lt;br /&gt;
	'''Rysuje histogram wartości w tablicy x, używając N_bins binów. &lt;br /&gt;
	Na lewo od wartości wskazanej przez marker dorysowywany jest prostokąt'''&lt;br /&gt;
 &lt;br /&gt;
	r = np.max(x) - np.min(x)	&lt;br /&gt;
	szer_binu = r/N_bins&lt;br /&gt;
 &lt;br /&gt;
	#konstruujemy biny&lt;br /&gt;
        # robimy biny od markera co szerokość binu aż do x minimalnego&lt;br /&gt;
	biny_na_lewo = np.arange( marker, np.min(x), -szer_binu)&lt;br /&gt;
        # odwracamy kolejność tej sekwencji żeby była rosnąca&lt;br /&gt;
	biny_na_lewo = biny_na_lewo[-1::-1] &lt;br /&gt;
         # robimy biny od markera co szerokość binu aż do x maksymalnego&lt;br /&gt;
	biny_na_prawo = np.arange(marker,np.max(x), szer_binu)&lt;br /&gt;
        # sklejamy oba zakresy binów&lt;br /&gt;
	biny = np.concatenate((biny_na_lewo, biny_na_prawo))&lt;br /&gt;
	(n,xx,patch) = py.hist(x,bins = biny )&lt;br /&gt;
	py.fill([np.min(xx), np.min(xx), marker, marker] , [0, np.max(n), np.max(n), 0] ,'r' ,alpha = 0.2)&lt;br /&gt;
 &lt;br /&gt;
A=np.array([[1.83, 0.878], [0.50, 0.647], [1.62, 0.598], [2.48, 2.05], [1.68, 1.06], [1.88, 1.29], [1.55, 1.06], [3.06, 3.14], [1.30, 1.29]])&lt;br /&gt;
 &lt;br /&gt;
r = A[:,1] - A[:,0] # od drugiej kolumny odejmuję pierwszą&lt;br /&gt;
mr = np.mean(r)  # średnia z tych różnic to wartość statystyki zaobserwowana dla oryginalnych danych&lt;br /&gt;
print( 'średnia różnica: %(mr).2f'%{'mr':mr} )&lt;br /&gt;
 &lt;br /&gt;
N = len(r)&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
N_perm = 2**N&lt;br /&gt;
r_perm = np.zeros(N_perm)&lt;br /&gt;
for i in range(2**N):&lt;br /&gt;
	B = np.array(A)   # B zawiera kopię tablicy A&lt;br /&gt;
	zamiana = dec2bin(i,N) # w których wierszach dokonać zamiany?&lt;br /&gt;
	# print( i,': ', zamiana )&lt;br /&gt;
	# wiersze tablicy B wskazane przez True w wektorze indeksów ind zamieniamy wartości  'przed' z wartościami 'po'&lt;br /&gt;
	B[zamiana, 0] = A[zamiana, 1] &lt;br /&gt;
	B[zamiana, 1] = A[zamiana, 0]&lt;br /&gt;
	rr = B[:,1] - B[:,0] # Obliczam wartości zmiennych losowych dla tej zamiany&lt;br /&gt;
	r_perm[i] = np.mean(rr) # Obliczmy wartość statystyki dla tej zamiany&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
p_h0 = np.sum( r_perm &amp;lt;=  mr)/N_perm&lt;br /&gt;
s_perm = u'dla permutacyjnego testu jednostronnego: %(p_h0).3f'%{'p_h0': p_h0}&lt;br /&gt;
print( s_perm)&lt;br /&gt;
hist_z_markerem(r_perm,30,mr)&lt;br /&gt;
py.title(s_perm)&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Wersja parametryczna====&lt;br /&gt;
&lt;br /&gt;
Jeśli badane różnice ''przed'' i ''po'' podlegają rozkładowi normalnemu to do testowania czy średnia wartość różnicy jest równa 0 można zastosować test ''t'' dla prób zależnych &amp;lt;tt&amp;gt;st.ttest_rel()&amp;lt;/tt&amp;gt;. Aby się upewnić, że możemy zastosować ten test badamy normalność różnic przy pomocy &amp;lt;tt&amp;gt;normplot()&amp;lt;/tt&amp;gt; oraz testu Shapiro-Wilka &amp;lt;tt&amp;gt;st.shapiro()&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
 &lt;br /&gt;
def normplot(x):&lt;br /&gt;
	'''normplot: x dane do testowania'''&lt;br /&gt;
 &lt;br /&gt;
	x_ord = sorted(x)&lt;br /&gt;
	N = len(x)&lt;br /&gt;
	y = np.zeros(N)&lt;br /&gt;
	y[0]=st.norm.ppf(1- 0.5**(1.0/N) )&lt;br /&gt;
	y[N-1] = st.norm.ppf(0.5**(1.0/N) )&lt;br /&gt;
	for i in range(1,N-1):&lt;br /&gt;
		arg = (i-0.3175)/(N+0.365)&lt;br /&gt;
		y[i] = st.norm.ppf(arg)&lt;br /&gt;
	py.plot(y,x_ord,'.')&lt;br /&gt;
 &lt;br /&gt;
A=np.array([[1.83, 0.878], [0.50, 0.647], [1.62, 0.598], [2.48, 2.05], [1.68, 1.06], [1.88, 1.29], [1.55, 1.06], [3.06, 3.14], [1.30, 1.29]])&lt;br /&gt;
&lt;br /&gt;
r = A[:,1] - A[:,0] # od drugiej kolumny odejmuję pierwszą&lt;br /&gt;
&lt;br /&gt;
normplot(r)&lt;br /&gt;
py.title(&amp;quot;Wyniki testów na normalność różnic\n Shapiro-Wilka:  W=%.3f, p=%.3f&amp;quot;%st.shapiro(r)&lt;br /&gt;
        +&amp;quot;\nKołmogorowa-Smirnowa: D=%.3f, p=%.3f&amp;quot;%st.kstest(r, 'norm', args=(np.mean(r),np.std(r,ddof=1))))&lt;br /&gt;
t, p = st.ttest_rel(A[:,1],A[:,0])&lt;br /&gt;
p_t = p/2 # aby test był jednostronny&lt;br /&gt;
s_t = u'dla parametrycznego testu jednostronnego: %(p_h0).3f'%{'p_h0': p_t}&lt;br /&gt;
print(s_t)&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Wersja nieparametryczna====&lt;br /&gt;
&lt;br /&gt;
W ogólności, nie zakładając normalności różnic można by przeprowadzić test Wilcoxona. W aktualnej implementacji tego testu w scipy.stats jest on dla naszych danych niedokładny, gdyż mamy małą liczebność grupy, a implementacja stosuje przybliżenia asymptotyczne.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
A=np.array([[1.83, 0.878], [0.50, 0.647], [1.62, 0.598], [2.48, 2.05], [1.68, 1.06], [1.88, 1.29], [1.55, 1.06], [3.06, 3.14], [1.30, 1.29]])&lt;br /&gt;
z, p = st.wilcoxon(A[:,1],A[:,0] )&lt;br /&gt;
p_w = p/2 # aby test był jednostronny&lt;br /&gt;
s_w = u'dla nieparametrycznego testu jednostronnego: %(p_h0).3f'%{'p_h0': p_w}&lt;br /&gt;
print( s_w)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Podsumowanie====&lt;br /&gt;
 średnia różnica: -0.43&lt;br /&gt;
 dla repróbkowanego testu jednostronnego: 0.0013&lt;br /&gt;
 dla permutacyjnego testu jednostronnego: 0.014&lt;br /&gt;
 Wynik testu Shapiro-Wilka na normalność różnic &lt;br /&gt;
 	 statystyka W: 0.921 &lt;br /&gt;
 	 prawdopodobieństwo takiej wartości statystyki dla rozkładu normalnego: 0.404&lt;br /&gt;
 dla parametrycznego testu jednostronnego: 0.008&lt;br /&gt;
 dla nieparametrycznego testu jednostronnego: 0.019&lt;br /&gt;
&lt;br /&gt;
Wszystkie testy wskazują prawdopodobieństwo zaobserwowania odpowiadających im statystyk poniżej przyjętego poziomu istotności &amp;lt;math&amp;gt;\alpha = 0.05&amp;lt;/math&amp;gt;. Zatem hipotezę zerową należy odrzucić i przyjąć hipotezę alternatywną.&lt;br /&gt;
&lt;br /&gt;
==Zadania==&lt;br /&gt;
&lt;br /&gt;
===Zanieczyszczenie środowiska===&lt;br /&gt;
Agencja ochrony środowiska ustaliła limit na koncentrację zanieczyszczeń emitowanych przez fabryki. Załóżmy, że dopuszczalny poziom zanieczyszczeń wynosi 55 cząstek na milion (cz/m) w promieniu dwóch kilometrów od fabryki. Kontrola przeprowadza 100 pomiarów o różnej porze dnia i roku w promieniu dwóch km od pewnej fabryki. Średnia z próby wyniosła 60 cz/m a odchylenie standardowe &amp;lt;math&amp;gt;s = 20&amp;lt;/math&amp;gt; cz/m. Czy dane te są wystarczające by na poziomie istotności &amp;lt;math&amp;gt;\alpha = 0,01&amp;lt;/math&amp;gt; uznać, że fabryka łamie prawo?&lt;br /&gt;
&lt;br /&gt;
Fabryka łamie prawo jeśli emituje zanieczyszczenia na poziomie wyższym niż dopuszczalny więc należy przeprowadzić test jednostronny (w tym przypadku prawostronny). Czy moglibyśmy odrzucić &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; na tym samym poziomie stosując test dwustronny?&lt;br /&gt;
Jest ważne aby w zależności od problemu wybrać odpowiedni test: jedno- lub dwustronny.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import numpy as np&lt;br /&gt;
 &lt;br /&gt;
x_c = 55 #cząstek na milion (cz/m) w promieniu dwóch kilometrów od fabryki. &lt;br /&gt;
#Kontrola przeprowadza &lt;br /&gt;
N = 100 # pomiarów o różnej porze dnia i roku w promieniu dwóch km. od pewnej fabryki. &lt;br /&gt;
#średnia z próby wyniosła &lt;br /&gt;
x_s = 60 # cz/m &lt;br /&gt;
# a odchylenie standardowe &lt;br /&gt;
s = 20 # cz/m. &lt;br /&gt;
# Czy dane te są wystarczające by uznać, że fabryka łamie prawo ?&lt;br /&gt;
alpha = 0.01&lt;br /&gt;
 &lt;br /&gt;
# H0: mu &amp;lt;=x_c&lt;br /&gt;
# H1: mu &amp;gt; x_c&lt;br /&gt;
# wystarczy sprawdzić jakie jest p dla największego dopuszczalnego stężenia &lt;br /&gt;
# mu = x_c zaobserwowania wartości średniej większej bądź równej zaobserwowanej x_s. &lt;br /&gt;
# Odchylenie std. dane jest dla populacji i trzeba je przeliczyć na odchylenie std. średniej.&lt;br /&gt;
p = 1 - st.t.cdf(x_s, df=N-1, loc = x_c, scale = s/np.sqrt(N) )&lt;br /&gt;
print(&amp;quot;poziom p&amp;quot;,p)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
############################&lt;br /&gt;
#inne (tożsame) rozwiązania:&lt;br /&gt;
&lt;br /&gt;
##wykorzystaniem &amp;quot;Survival function&amp;quot; zamiast dystrybuanty&lt;br /&gt;
p = st.t.sf(x_s, df=N-1, loc = x_c, scale = s/np.sqrt(N) )&lt;br /&gt;
print(&amp;quot;poziom p&amp;quot;,p)&lt;br /&gt;
&lt;br /&gt;
##obliczając statystykę t&lt;br /&gt;
t=(x_s-x_c)/(s/N**0.5)&lt;br /&gt;
p = 1-st.t.cdf(t,df=N-1)&lt;br /&gt;
print(&amp;quot;poziom p&amp;quot;,p)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Odp. &amp;lt;math&amp;gt;p=0,007&amp;lt;\alpha&amp;lt;/math&amp;gt;, zatem możemy odrzucić hipotezę &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; (głoszącą, że fabryka nie łamie prawa) na poziomie &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;  = 0,01.&lt;br /&gt;
&lt;br /&gt;
===Wzrost mocy turbin===&lt;br /&gt;
Turbina hydroelektryczna generuje moc średnią 25,2 kW. Po unowocześnieniu maszyny chcemy przetestować czy średnia moc generowana zmieniła się (na + lub &amp;amp;minus;). Przeprowadzono 115 pomiarów, które dały średnią 26,1 kW i odch. std. 3,2 kW. Przeprowadzić test statystyczny na poziomie istotności 1%, zinterpretować wynik. Wnioskowanie przeprowadzić także w oparciu oprzedział ufności.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
#-*- coding:utf-8 -*-&lt;br /&gt;
import numpy as np&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
N=115&lt;br /&gt;
m=25.2	#hipoteza zerowa mówi, że tyle wynosi moc&lt;br /&gt;
sr=26.1	#w pomiarach uzyskaliśmy taką średnią moc&lt;br /&gt;
s=3.2	#przy takim odchyleniu standardowym&lt;br /&gt;
&lt;br /&gt;
alfa=0.01&lt;br /&gt;
&lt;br /&gt;
#obliczenie poziomu p&lt;br /&gt;
t=(m-sr)/(s/N**0.5)&lt;br /&gt;
p = st.t.cdf(t,df=N-1) * 2 #mnozymy przez 2, bo chcemy testu dwustronnego&lt;br /&gt;
print(&amp;quot;poziom p&amp;quot;,p)&lt;br /&gt;
&lt;br /&gt;
#alternatywnie - obliczenie przedziału ufności&lt;br /&gt;
lo,hi = st.t.ppf([alfa/2, 1-alfa/2],df=N-1,loc=sr,scale=s/N**0.5)&lt;br /&gt;
print(&amp;quot;przedzial ufnosci [%.3g,%.3g]&amp;quot;%(lo,hi))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Odp.: &amp;lt;math&amp;gt;p=0,\!003&amp;lt;\alpha=0,\!01&amp;lt;/math&amp;gt;, zatem odrzucamy H0.&lt;br /&gt;
&lt;br /&gt;
Odp. (alt.): &amp;lt;math&amp;gt;\mu = 25,\!2 \not\in[25,\!3; 26,\!9]&amp;lt;/math&amp;gt;, zatem odrzucamy H0.&lt;br /&gt;
&lt;br /&gt;
===Sonda===&lt;br /&gt;
Władze miasta chciałyby wiedzieć, czy przyznać koncesję operatorowi sieci kablowej. W tym celu zleciły nam przeprowadzenie sondy wśród mieszkańców. Zapytaliśmy o zdanie 50 przypadkowo wybranych osób. 30 osób powiedziało &amp;amp;bdquo;tak&amp;amp;rdquo; a 20 &amp;amp;bdquo;nie&amp;amp;rdquo;. Na ile pewnie otrzymane wyniki wskazują, że mieszkańcy chcą tej kablówki?&lt;br /&gt;
&lt;br /&gt;
Celem naszych badań jest uniknięcie błędu polegającego na tym, że powiemy iż większość mieszkańców chce kablówki podczas gdy tak na prawdę to nie chce. &lt;br /&gt;
&lt;br /&gt;
Wskazówka: Granicznym przypadkiem popełnienia tego błędu jest proporcja 1:1 zwolenników i przeciwników kablówki. Jeśli przeciwników kablówki byłoby jeszcze więcej to uzyskanie naszych wyników byłoby jeszcze mniej prawdopodobne.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import numpy.random as rnd&lt;br /&gt;
&lt;br /&gt;
N=50&lt;br /&gt;
odp_na_tak=30&lt;br /&gt;
odp_na_nie=20&lt;br /&gt;
&lt;br /&gt;
#przypadek graniczny, który daje najwyższe prawdopodobieństwo uzyskania fałszywego wyniku na 'tak',&lt;br /&gt;
#to mieszkańcy niezdecydowani, czyli propocja 1:1&lt;br /&gt;
#(propocja przechylona w kierunki 'nie', da nam niższe oszacowanie&lt;br /&gt;
#a propocja przechylona w kierunku 'tak' nie oznaczałaby fałszywego wyniku sondy)&lt;br /&gt;
#zatem hipoteza zerowa brzmi, że nasz wynik pochodzi z populacji niezdecydowanej:&lt;br /&gt;
P=0.5 #prawdopodobieństwo, że respondent udzieli odpowiedzi na 'tak'&lt;br /&gt;
&lt;br /&gt;
#rozwiązanie parametryczne wymaga użycia rozkładu dwumianowego:&lt;br /&gt;
p = 1 - st.binom.cdf(29,50,P) #od 1 odejmujemy sumaryczne prawdopodobieństwo wszystkich przypadków udzielenia mniej niż 30 odpowiedzi na tak (czyli do 29 włącznie)&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;poziom p (parametrycznie)&amp;quot;,p)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#rozwiązanie przez symulację:&lt;br /&gt;
Nrand=100000&lt;br /&gt;
R=0 #rezultat, czyli liczba przypadków, w których przynajmniej 30 osób odpowiedziało tak&lt;br /&gt;
for i in range(Nrand):&lt;br /&gt;
	odpowiedzi = (rnd.random(N)&amp;lt;P) #losujemy odpowiedzi od N osób&lt;br /&gt;
	if odpowiedzi.sum() &amp;gt;=odp_na_tak: #jeśli zdażyło się co najmniej 30 odpowiedzi na tak, to dodajemy jeden do liczby takich przypadków&lt;br /&gt;
		R+=1&lt;br /&gt;
	&lt;br /&gt;
print(&amp;quot;poziom p (z symulacji)&amp;quot;,R/Nrand) #na koniec dzielimy przez liczbę wszystkich sond w symulacji&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Wybory prezydenckie===&lt;br /&gt;
W ankiecie uzyskaliśmy 840 głosów popierających kandydaturę A i 660 kandydaturę B. Jaka jest szansa, że tak naprawdę kandydat B ma  poparcie 50% lub większe? Jakie jest prawdopodobieństwo pojawienia sie zaobserwowanej próbki lub próbki wskazującej na jeszcze większe poparcie dla kandydata A, jeśli w rzeczywistości poparcie kandydata A byłoby  50% lub mniej.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import numpy.random as rnd&lt;br /&gt;
&lt;br /&gt;
# rozwiązanie parametryczne&lt;br /&gt;
A = 840&lt;br /&gt;
B = 660&lt;br /&gt;
N = A+B&lt;br /&gt;
&lt;br /&gt;
#przypadek graniczny, który daje najwyższe prawdopodobieństwo uzyskania fałszywego wyniku na 'tak',&lt;br /&gt;
#to mieszkańcy niezdecydowani, czyli propocja 1:1&lt;br /&gt;
#propocja przechylona w kierunki 'nie', da nam niższe oszacowanie&lt;br /&gt;
#a propocja przechylona w kierunku 'tak' nie oznaczałaby fałszywego wyniku sondy&lt;br /&gt;
#zatem hipoteza zerowa brzmi, że nasz wynik pochodzi z populacji niezdecydowanej:&lt;br /&gt;
p_sukces = 0.5&lt;br /&gt;
&lt;br /&gt;
#rozwiązanie parametryczne&lt;br /&gt;
p = 1 - st.binom.cdf(A-1,N,p_sukces)&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;poziom p (parametrycznie)&amp;quot;,p)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#rozwiązanie przez symulację:&lt;br /&gt;
&lt;br /&gt;
#wiemy już, że musimy oszacować bardzo niskie prawdopodobieństwo, zatem symulacja musi być długa&lt;br /&gt;
#(gdybyśmy nie wiedzieli, to łatwo byśmy zauważyli, że krótka symulacja nie daje w ogóle zdarzeń sprzyjających dając wynik p=0)&lt;br /&gt;
#niestety trzeba pokusić się o optymalizację (mimo to kod będzie się wykonywał kilkadziesiąt sekund do kilku minut):&lt;br /&gt;
#chemy mieć przynajmniej 10^7 sond, ale każda sonda to 1500 odpowiedzi, zatem łącznie musimy wylosować 1.5*10^10 liczb&lt;br /&gt;
#losowanie w pętli 10^7 razy kolejnych sond po 1500 odpowiedzi zajmie bardzo bardzo dużo czasu&lt;br /&gt;
#tablica 1.5*10^10 odpowiedzi wygenerowana jednym poleceniem nie zmieści się w pamięci&lt;br /&gt;
#musimy skorzystać z rozwiązania pośredniego&lt;br /&gt;
#będziemy losować 100 razy po 1.5*10^8 odpowiedzi i dodamy wyniki&lt;br /&gt;
&lt;br /&gt;
Nrand_1=100    # 10^2&lt;br /&gt;
Nrand_2=100000 # 10^5&lt;br /&gt;
N = A+B        # 1.5*10^3&lt;br /&gt;
&lt;br /&gt;
Nrand_total = Nrand_1*Nrand_2&lt;br /&gt;
&lt;br /&gt;
R=0 #liczba sond, w których kandydat A uzyskał poparcie 840 lub większe&lt;br /&gt;
#po każdym przebiegu pętli będziemy dodawać liczbę takich przypadków (jeśli wystąpiły w danej iteracji)&lt;br /&gt;
&lt;br /&gt;
for i in range(Nrand_1):&lt;br /&gt;
	#w każdej iteracji losujemy odpowiedzi od N osób w Nrand_2 sondach&lt;br /&gt;
	#iteracji będzie w sumie Nrand_1, co da nam łącznie N osób w Nrand_total sondach&lt;br /&gt;
	#jako, że zakładamy równe prawdopodobieństwo, to może możemy wylosować tablicę zawierającą tylko 0 i 1&lt;br /&gt;
	#gdzie 1 oznacza sukces (głos na kandydata A), a 0 porażkę&lt;br /&gt;
	#korzystając z funksji randint, która zwraca (pseudo)losowe liczby całkowite z zakresu [a,b)&lt;br /&gt;
	a,b = 0,2 &lt;br /&gt;
	odpowiedzi = rnd.randint(a,b,size=(N,Nrand_2)) &lt;br /&gt;
	S = np.sum(odpowiedzi,axis=0)  #wyniki kolejnych sond (sumujemy sukcesy w wierszach)&lt;br /&gt;
&lt;br /&gt;
	R+=np.sum(S&amp;gt;=A) #dodajemy liczbę sond, w których kandydat A uzyskał poparcie 840 lub większe (w danej iteracji pętli)&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;poziom p (z symulacji)&amp;quot;,R/Nrand_total) #na koniec dzielimy przez liczbę wszystkich sond w symulacji&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Czy stosunek do marihuany się zmienił?===&lt;br /&gt;
Rozważmy dwie ankiety przeprowadzone w USA, pytano 1500 respondentów o stosunek do legalizacji marihuany. Pierwszą ankietę przeprowadzono w 1980, wówczas za legalizacją opowiadało się 52% a drugą w 1985 i za legalizacją było 46%. Czy wyniki tych dwóch ankiet są istotnie różne?&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
# rozwiązanie parametryczne&lt;br /&gt;
za1 = int(0.52*1500)&lt;br /&gt;
za2 = int(0.46*1500)&lt;br /&gt;
N = 1500&lt;br /&gt;
&lt;br /&gt;
# H0: stosunek się nie zmienił zatem p_za było w obu anlietach takie samo:&lt;br /&gt;
p_za = (0.52+0.46)/2&lt;br /&gt;
&lt;br /&gt;
# Jakie jest prawdopodobieństwo zaobserwowoania wyników ankiet o takiej bądź większej &lt;br /&gt;
# różnicy głosów za, jeśli obie są zgodne z H0 ?&lt;br /&gt;
D = za1 - za2&lt;br /&gt;
&lt;br /&gt;
#musimy zsumować wszystkie możliwości, w których wystąpiła taka różnica lub większa&lt;br /&gt;
#zrobimy to w pętli&lt;br /&gt;
p_binom = 0.0&lt;br /&gt;
for k in range(N-D+1):&lt;br /&gt;
	p1 = st.binom.pmf(k,N,p_za) # prawdopodobieństwo uzyskania dokładnie k głosów za&lt;br /&gt;
	&lt;br /&gt;
	# sumujemy prawdopodobieństwa uzyskania liczby głosów różnej przynajmniej o D&lt;br /&gt;
	przypadki_o_roznicy_przynajmniej_D = np.arange(k+D,N+1)&lt;br /&gt;
	p2 = np.sum(st.binom.pmf(przypadki_o_roznicy_przynajmniej_D,N,p_za))&lt;br /&gt;
	#co jest równoważne:&lt;br /&gt;
	#p2 = 1-st.binom.cdf(k+D-1,N,p_za)&lt;br /&gt;
	&lt;br /&gt;
	#sumujemy dla kolejnych k&lt;br /&gt;
	p_binom += p1*p2 # mnożymy prawdopodobieństwa ponieważ są wyniki obu sond są niezależne&lt;br /&gt;
	&lt;br /&gt;
p=2*p_binom #mnożymy przez 2, ponieważ robimy test dwustronny (różnica mogła wystąpić również w drugą stronę)&lt;br /&gt;
print(&amp;quot;p =&amp;quot;,p)&lt;br /&gt;
&lt;br /&gt;
# rozwiązanie symulacyjne (tym razem skorzystamy z randsample)&lt;br /&gt;
def randsample(x, N):&lt;br /&gt;
	'''zwraca wektor z losowo wybranymi elementami wektora x. Losowanie odbywa się z powtórzeniami''' &lt;br /&gt;
	n=len(x)&lt;br /&gt;
	ind = np.random.randint(n, size = N)&lt;br /&gt;
	y = x[ind]&lt;br /&gt;
	return y&lt;br /&gt;
&lt;br /&gt;
N_rep = 100000&lt;br /&gt;
# świat zgodny z H0:&lt;br /&gt;
H0 = np.concatenate((np.zeros(N*(1-p_za)), np.ones(N*p_za)))&lt;br /&gt;
&lt;br /&gt;
a = np.zeros(N_rep)&lt;br /&gt;
for i in range(N_rep):&lt;br /&gt;
	w1 = np.sum(randsample(H0,N))&lt;br /&gt;
	w2 = np.sum(randsample(H0,N))&lt;br /&gt;
	a[i] = np.abs(w1-w2)&lt;br /&gt;
p = np.sum(a&amp;gt;=D)/N_rep&lt;br /&gt;
print(p)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zawały serca i cholesterol===&lt;br /&gt;
Badano grupę 605 osób. 135 osób z tej grupy miało wysoki poziom cholesterolu a 470 niski. W grupie z wysokim poziomem cholesterolu odnotowano 10 przypadków zawału serca a w grupie z niskim poziomem 21, w czasie 16 lat obserwacji. Nasze pytanie brzmi: Czy możemy uznać, że wysoki poziom cholesterolu zwiększa ryzyko zawału serca?&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
# rozwiązanie parametryczne&lt;br /&gt;
wysoki = 135&lt;br /&gt;
niski = 470&lt;br /&gt;
N = 605&lt;br /&gt;
wysoki_zawaly = 10&lt;br /&gt;
niski_zawaly = 21&lt;br /&gt;
N_zaw = wysoki_zawaly + niski_zawaly &lt;br /&gt;
&lt;br /&gt;
# H0: proporcja zawałowców w obu grupach taka sama:&lt;br /&gt;
p_zawalu = N_zaw/N&lt;br /&gt;
# H1: proporcja jest różna, test jednostronny (wysoki cholesterol ZWIĘKSZA ryzyko)&lt;br /&gt;
&lt;br /&gt;
# Jakie jest prawdopodobieństwo zaobserwowania wyników badania o takiej bądź większej &lt;br /&gt;
# różnicy proporcji zawałów, jeśli obie są zgodne z H0 ?&lt;br /&gt;
roznica = wysoki_zawaly/wysoki - niski_zawaly/niski&lt;br /&gt;
&lt;br /&gt;
p_binom = 0.0&lt;br /&gt;
for k_wys in range(wysoki+1):&lt;br /&gt;
	p_wys = st.binom.pmf(k_wys,wysoki,p_zawalu) # prawdopodobieństwo uzyskania k_wys zawałów grupie o liczebności wysoki&lt;br /&gt;
	for k_nis in range(niski+1): &lt;br /&gt;
		if k_wys/wysoki - k_nis/niski&amp;gt;=roznica: # czy liczebności k_wys i k_nis dają większą bądź równą różnice proporcji?&lt;br /&gt;
			p_nis = st.binom.pmf(k_nis,niski,p_zawalu) # prawdopodobieństwo uzyskania k_nis zawałów w grupie o niskim cholesterolu&lt;br /&gt;
			p_binom += p_wys*p_nis # zdarzenia są niezależne&lt;br /&gt;
&lt;br /&gt;
print(p_binom)&lt;br /&gt;
&lt;br /&gt;
# rozwiązanie symulacyjne&lt;br /&gt;
def randsample(x, N):&lt;br /&gt;
	'''zwraca wektor z losowo wybranymi elementami wektora x. Losowanie odbywa się z powtórzeniami''' &lt;br /&gt;
	n=len(x)&lt;br /&gt;
	ind = np.random.randint(n, size = N)&lt;br /&gt;
	y = x[ind]&lt;br /&gt;
	return y&lt;br /&gt;
&lt;br /&gt;
N_rep = 100000&lt;br /&gt;
# świat zgodny z H0:&lt;br /&gt;
H0 = np.concatenate((np.zeros(N-N_zaw), np.ones(N_zaw)))&lt;br /&gt;
&lt;br /&gt;
wyn = np.zeros(N_rep)&lt;br /&gt;
for i in range(N_rep):&lt;br /&gt;
	wysoki_zawaly_r = np.sum(randsample(H0,wysoki))&lt;br /&gt;
	niski_zawaly_r = np.sum(randsample(H0,niski))&lt;br /&gt;
	wyn[i] = wysoki_zawaly_r/wysoki - niski_zawaly_r/niski&lt;br /&gt;
p = np.sum(wyn&amp;gt;=roznica)/N_rep&lt;br /&gt;
print(p)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Czy gęstości planet się różnią?===&lt;br /&gt;
Rozważmy pięć planet znanych w antycznym świecie. Chcemy zbadać, czy planety wewnętrzne Merkury (0,68) i Wenus (0,94) mają istotnie większe gęstości niż planety zewnętrzne Mars (0,71) Jowisz (0,24) i Saturn (0,12)?&lt;br /&gt;
&lt;br /&gt;
Wskazówki: &lt;br /&gt;
* Unikalność zestawu planet wskazuje na zastosowanie testu permutacyjnego.&lt;br /&gt;
* Moduł implementujący funkcje kombinatoryczne w pythonie to &amp;lt;tt&amp;gt;itertools &amp;lt;/tt&amp;gt;. Zawiera on funkcję &amp;lt;tt&amp;gt;permutations&amp;lt;/tt&amp;gt;. Wywołanie &amp;lt;tt&amp;gt;itertools.permutations(sekwencja[, r])&amp;lt;/tt&amp;gt; zwraca obiekt permutacji. Obiekt ten zwraca kolejne permutacje o długości r elementów w sekwencji (np. w wektorze). Przykład:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
import itertools&lt;br /&gt;
for kolejny in itertools.permutations(range(3), 2):&lt;br /&gt;
    print(kolejny)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import itertools as itt&lt;br /&gt;
PLANETY = np.array([0.68,0.94,0.71,0.24,0.12])&lt;br /&gt;
N=len(PLANETY)&lt;br /&gt;
&lt;br /&gt;
r=[] #używamy listy, bo nie chcemy obliczać ile będzie przypadków (aczkolwiek można to zrobić)&lt;br /&gt;
&lt;br /&gt;
for planety in itt.permutations(PLANETY):&lt;br /&gt;
	r.append(np.mean(planety[:2])-np.mean(planety[2:]))&lt;br /&gt;
&lt;br /&gt;
R=np.mean(PLANETY[:2])-np.mean(PLANETY[2:]) #prawdziwa różnica&lt;br /&gt;
&lt;br /&gt;
r=np.array(r) #porównanie z liczbą działa tylko dla tablic numpy, a nie dla list&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;p =&amp;quot;,np.sum(r&amp;gt;=R)/len(r))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Elektrownia jądrowa===&lt;br /&gt;
Przed wybudowaniem elektrowni jądrowej przeprowadzono pomiary intensywności promieniowania jonizującego w pobliżu planowanego budynku reaktora. Powtórzono te pomiary po uruchomieniu reaktora. Czy zebrane dane pozwalają stwierdzić, że poziom promieniowania istotnie wzrósł? Dane pomiarowe wczytaj z [[Media:pomiary_skazen.txt| pliku]].&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
&lt;br /&gt;
alfa = 0.01 # poziom istotności&lt;br /&gt;
&lt;br /&gt;
PRZED, PO = np.loadtxt('Pomiary_skazen.txt') #wczytanie danych (dwa zbiory przed uruchomieniem i po)&lt;br /&gt;
&lt;br /&gt;
t, p = st.ttest_ind(PRZED, PO) # wykorzystanie gotowej funkcji wykonującej DWUSTRONNY test t na różnicę średnich&lt;br /&gt;
                            # dla danych NIESPAROWANYCH (niezależnych)&lt;br /&gt;
                            # ttest_ind  - ind od independent &lt;br /&gt;
                            # ttest_rel  - rel od related &lt;br /&gt;
&lt;br /&gt;
p/=2 # dzielimy przez dwa ponieważ chcemy zrobić test jednostronny&lt;br /&gt;
print(&amp;quot;Poziom p&amp;quot;,p)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Odp. &amp;lt;math&amp;gt;p=0,\!39&amp;gt;\alpha=0,\!01&amp;lt;/math&amp;gt;, zatem nie mamy podstaw do odrzucenia hipotezy &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt;, że poziom promieniowania istotnie wzrósł.&lt;/div&gt;</summary>
		<author><name>Maciek</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=WnioskowanieStatystyczne/_Przedzia%C5%82y_ufno%C5%9Bci&amp;diff=11251</id>
		<title>WnioskowanieStatystyczne/ Przedziały ufności</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=WnioskowanieStatystyczne/_Przedzia%C5%82y_ufno%C5%9Bci&amp;diff=11251"/>
		<updated>2025-04-07T13:46:28Z</updated>

		<summary type="html">&lt;p&gt;Maciek: /* Przykład z bootstrapem */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
==Wstęp ==&lt;br /&gt;
Średnia (lub inny parametr) estymowany na podstawie próby pobranej z populacji nie jest równa rzeczywistej wartości tego parametru w populacji. &lt;br /&gt;
* Wylosuj 10 razy 100 liczb z rozkładu normalnego &amp;lt;math&amp;gt;N(0,1)&amp;lt;/math&amp;gt; i oblicz średnią. Czy udało ci się zaobserwować wartość 0?&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import numpy as np&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
&lt;br /&gt;
for i in range(10):&lt;br /&gt;
	x=st.norm.rvs(size=100)&lt;br /&gt;
	print(np.mean(x))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Rozbieżność między uzyskanym wynikiem a rzeczywistą średnią populacji zależy od wielkości badanej grupy oraz zmienności badanej cechy w jej obrębie. Jeśli badana grupa jest niewielka i ma dużą zmienność analizowanej cechy wówczas rozbieżność między średnią uzyskaną, a rzeczywistą może być znaczna. Natomiast, jeśli badana grupa jest duża z niewielką zmiennością danych, wówczas uzyskana średnia będzie prawdopodobnie bardzo bliska średniej populacyjnej. Przedział ufności ({{ang|confidence interval &amp;amp;mdash;  CI}}) odzwierciedla zarówno wielkość badanej grupy jak i zmienność analizowanej cechy wewnątrz tej grupy. &lt;br /&gt;
Przedział ufności jest określany z różnym procentem &amp;amp;bdquo;zaufania&amp;amp;rdquo;, np. 90 czy też 95%. Najczęściej używa się 95% przedziału ufności. Oznacza to, że jeśli grupa badana była zgromadzona w sposób losowy to rzeczywisty parametr populacji z 95% pewnością znajduje się w tym przedziale. Innymi słowy, możemy sobie wyobrazić, że mamy dostępne wyniki dowolnie wielu badań analogicznych do analizowanego. Oczekujemy, że w 95% przypadków badana cecha znajduje się wewnątrz wyznaczonego przez nas przedziału ufności. &lt;br /&gt;
&lt;br /&gt;
Pewnych problemów koncepcyjnych nastręcza konstrukcja przedziałów ufności.  Dla danej znanej populacji możemy obliczyć średnią populacji oraz prawdopodobieństwo uzyskania konkretnej wartości średniej przy losowaniu próby o zadanej liczebności z tejże populacji, możemy więc określić prawdopodobieństwo &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, że odległość średniej z próby i średniej z populacji jest &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;. Mając do dyspozycji tylko próbę możemy albo założyć, że pochodzi ona z jakiegoś znanego rozkładu i wyliczyć z niego wartości krytyczne albo zakładając, że jest ona reprezentatywna możemy metodą bootstrapu &amp;amp;bdquo;wytworzyć&amp;amp;rdquo; wiele innych prób z badanej populacji i oszacować jakie są granice, w które wpada żądana frakcja średnich (np.:90%, 95%).  &lt;br /&gt;
&lt;br /&gt;
''Bootstrap'' jest związany z pobieraniem próby. Najkorzystniejszą sytuacją jest ta, w której dla oszacowania różnych parametrów statystycznych populacji mamy możliwość pobierania z tej populacji wielu prób. Jeśli jest to niemożliwe możemy posłużyć się pobieraniem wielokrotnie prób z tej próby, którą posiadamy. Postępowanie takie jest sensowne pod warunkiem, że próba, która służy nam do generowania innych możliwych pobrań próby jest ''reprezentatywna''. '''W bootstrapie losujemy ze zwracaniem''' (dlaczego?). &amp;lt;!-- Zakładamy, że pobranie elementu o danej wartości nie zmienia prawdopodobieństwa wylosowania ponownie elementu o tej wartości --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Przedział ufności dla średniej ==&lt;br /&gt;
===  Przypadek 1: znana wariancja rozkładu ===&lt;br /&gt;
Rozważamy zmienną losową podlegającą rozkładowi &amp;lt;math&amp;gt;N(\mu,\sigma^2)&amp;lt;/math&amp;gt; czyli rozkładowi normalnemu o średniej &amp;lt;math&amp;gt; \mu&amp;lt;/math&amp;gt; i znanym odchyleniu standardowym  &amp;lt;math&amp;gt; \sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
Pobieramy próby tych zmiennych losowych o rozmiarze &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Przypomnijmy, że średnia z takiej próby też może być traktowana jako zmienna losowa.  [http://brain.fuw.edu.pl/edu/STAT:Statystyki_i_estymatory#Estymator_warto.C5.9Bci_oczekiwanej Podlega ona rozkładowi] normalnemu o średniej  &amp;lt;math&amp;gt; \mu&amp;lt;/math&amp;gt; i standardowym odchyleniu &amp;lt;math&amp;gt;\frac{\sigma}{\sqrt{n}}&amp;lt;/math&amp;gt; czyli &amp;lt;math&amp;gt;N\left( \mu,\frac{\sigma^2}{n} \right)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Oznacza to, że zmienna &amp;lt;math&amp;gt;\frac{\bar x - \mu}{\sigma/\sqrt{n}}  &amp;lt;/math&amp;gt; podlega rozkładowi &amp;lt;math&amp;gt; N(0,1)&amp;lt;/math&amp;gt; czyli &amp;lt;math&amp;gt; Z&amp;lt;/math&amp;gt;.  Konstrukcja przedziału ufności dla średniej polega zatem na znalezieniu takich wartości &amp;lt;math&amp;gt;z_{\alpha/2}&amp;lt;/math&amp;gt;, że:&lt;br /&gt;
: &amp;lt;math&amp;gt; P \left(  \left|\frac{\bar x - \mu}{\sigma/\sqrt{n}} \right| \le z_{\alpha/2}\right) = 1-\alpha &amp;lt;/math&amp;gt; &lt;br /&gt;
Zatem przedział ufności &amp;lt;math&amp;gt; (1-\alpha)*100&amp;lt;/math&amp;gt;% :&lt;br /&gt;
: &amp;lt;math&amp;gt; \left[ \bar x - z_{\alpha/2}\frac{\sigma}{\sqrt n} ,\;\;\; \bar x+ z_{\alpha/2}\frac{\sigma}{\sqrt n} \right] &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Przykład ====&lt;br /&gt;
Wyciągamy losową próbę &amp;lt;math&amp;gt; (n = 25)&amp;lt;/math&amp;gt;  z populacji o rozkładzie normalnym. Dostajemy średnią z próby &amp;lt;math&amp;gt; \bar x = 122&amp;lt;/math&amp;gt;. Załóżmy, że znamy standardowe odchylenie populacji &amp;lt;math&amp;gt; \sigma = 20&amp;lt;/math&amp;gt;. &lt;br /&gt;
* Oblicz przedział ufności 95% dla średniej populacji &amp;lt;math&amp;gt; \mu&amp;lt;/math&amp;gt;. &lt;br /&gt;
* Co zrobić aby zmniejszyć obliczony przedział 10-krotnie?&lt;br /&gt;
&lt;br /&gt;
Korzystając z tablic znajdujemy &amp;lt;math&amp;gt; z_{\alpha/2} = z_{2,5\%} = -1,96&amp;lt;/math&amp;gt;.  &lt;br /&gt;
&lt;br /&gt;
: Wartość tą możemy uzyskać wołając w pythonie: &lt;br /&gt;
: &amp;lt;source lang =python&amp;gt;st.norm.ppf(0.025)&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; &lt;br /&gt;
\bar x \pm 1,96 \frac{\sigma}{\sqrt{n}} = 122 \pm 1,96\cdot\frac{20}{\sqrt{25}} = 122 \pm 7,84 = [\mathrm{114,16} \;\;\; 129,84]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Możemy być pewni na 95%, że nieznana średnia populacji &amp;lt;math&amp;gt; \mu&amp;lt;/math&amp;gt;  znajduje się pomiędzy 114,16 a 129,84. Jeśli chcemy zmniejszyć przedział ufności 10-krotnie, musimy pobrać 100 razy większą próbę tj. ''n'' = 2500.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
: Pracując z modułem scipy.stats mamy do dyspozycji rozkłady normalne &amp;lt;math&amp;gt;N(\mu,\sigma)&amp;lt;/math&amp;gt;  o dowolnych parametrach &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;. &lt;br /&gt;
: Możemy więc uzyskać interesujący nas przedział ufności przy pomocy pojedynczego wywołania:&lt;br /&gt;
: &amp;lt;source lang =python&amp;gt;st.norm.ppf([0.025, 0.975],loc = 122, scale = 20.0/25**0.5)&amp;lt;/source&amp;gt;  gdzie  &amp;lt;tt&amp;gt;loc = &amp;lt;/tt&amp;gt; &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; oraz &amp;lt;tt&amp;gt;scale = &amp;lt;/tt&amp;gt;&amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Zadanie ====&lt;br /&gt;
Importer win musi zbadać średnią zawartość alkoholu w nowej partii win francuskich. Z doświadczenia z poprzednimi gatunkami wina, przyjmuje on, że standardowe odchylenie w populacji wynosi 1,2%. Importer wybrał losową próbę 60 butelek nowego wina i otrzymał średnią z próby 9,3%. Znaleźć przedział ufności 90% dla średniej zawartości alkoholu w nowej partii win.&lt;br /&gt;
&lt;br /&gt;
''Odp.'': [9,0452 9,5548].&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
&lt;br /&gt;
sigma=1.2&lt;br /&gt;
N=60&lt;br /&gt;
x_sr=9.3&lt;br /&gt;
sigma_sr=sigma/N**0.5&lt;br /&gt;
alfa=0.1&lt;br /&gt;
&lt;br /&gt;
#korzystając ze wzoru&lt;br /&gt;
print(st.norm.ppf([alfa/2,1-alfa/2]) * sigma_sr + x_sr)&lt;br /&gt;
#lub korzystając z rozkładu o zadanych parametrach&lt;br /&gt;
print(st.norm.ppf([alfa/2,1-alfa/2], loc=x_sr, scale=sigma_sr) )&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Przypadek 2: nieznana wariancja rozkładu ===&lt;br /&gt;
Sytuacja zmienia się jeśli zakładamy, że  próba pochodzi z rozkładu normalnego o śreniej &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; i nieznanej wariancji.&lt;br /&gt;
Musimy wówczas zamiast wariancji posłużyć się jej estymatorem &amp;lt;math&amp;gt;s^2 = \frac{1}{n-1} \sum_{i=1}^n {\left(x_i-\mu\right)^2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Zmienna losowa &amp;lt;math&amp;gt;\frac{\bar x  - \mu}{s/\sqrt{n}} &amp;lt;/math&amp;gt; podlega rozkładowi &amp;lt;math&amp;gt;t_{n-1}&amp;lt;/math&amp;gt; (czytaj: rozkładowi ''t'' o ''n''&amp;amp;minus;1 stopniach swobody). Konstrukcja przedziału ufności dla średniej polega zatem na znalezieniu takich wartości &amp;lt;math&amp;gt;t_{\alpha/2}&amp;lt;/math&amp;gt; w rozkładzie ''t'' o ''n''&amp;amp;minus;1 stopniach swobody, że:&lt;br /&gt;
: &amp;lt;math&amp;gt; P \left(  \left|\frac{\bar x - \mu}{s/\sqrt{n}} \right| \le t_{\alpha/2}\right) = 1-\alpha &amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Zatem przedział ufności &amp;lt;math&amp;gt; (1-\alpha)\cdot 100&amp;lt;/math&amp;gt;% dla średniej &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;, gdy nie znamy odchylenia standardowego &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;, a jedynie jego estymatę:&lt;br /&gt;
:: &amp;lt;math&amp;gt; &lt;br /&gt;
\left[ &lt;br /&gt;
\bar x- t_{\frac{\alpha}{2}} \frac{s}{\sqrt{n}}, \,\,\,\,\, \bar x+ t_{\frac{\alpha}{2}} \frac{s}{\sqrt{n}}\right] &lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
:gdzie &amp;lt;math&amp;gt; t_{\alpha/2}&amp;lt;/math&amp;gt;  jest wartością, która odcina obszar &amp;amp;alpha;/2 z rozkładu &amp;lt;math&amp;gt; t&amp;lt;/math&amp;gt; z ''n''&amp;amp;minus;1 stopniami swobody.&lt;br /&gt;
&lt;br /&gt;
;Uwaga: w Pythonie możemy skorzystać z funkcji modułu &amp;lt;tt&amp;gt;numpy&amp;lt;/tt&amp;gt; do obliczania wartości estymatorów:&lt;br /&gt;
:* ''s''  &amp;lt;tt&amp;gt;numpy.std&amp;lt;/tt&amp;gt; &lt;br /&gt;
:*  &amp;lt;math&amp;gt;\bar x&amp;lt;/math&amp;gt; &amp;lt;tt&amp;gt;numpy.mean&amp;lt;/tt&amp;gt;&lt;br /&gt;
==== Przykład ====&lt;br /&gt;
Lekarz chce zbadać średni czas trwania kuracji tj. od podania leku do ustąpienia objawów w pewnej chorobie. Losowa próba 15 pacjentów dała średni czas &amp;lt;math&amp;gt;\bar x = 10,37&amp;lt;/math&amp;gt;  dnia i odchylenie standardowe &amp;lt;math&amp;gt;s = 3,5&amp;lt;/math&amp;gt;  dnia. Zakładając normalny rozkład w populacji czasów trwania kuracji znaleźć 95% przedział ufności dla średniego czasu trwania kuracji.&lt;br /&gt;
&lt;br /&gt;
Znajdujemy wartość z rozkładu &amp;lt;math&amp;gt; t&amp;lt;/math&amp;gt;  o ''n''&amp;amp;minus;1 (=14) stopniach swobody, która odcina obszar &amp;lt;math&amp;gt; \alpha/2 = 0,025&amp;lt;/math&amp;gt;. &amp;lt;math&amp;gt; t_{0,025} = 2,145&amp;lt;/math&amp;gt;.&lt;br /&gt;
: w pythonie: &amp;lt;source lang =python&amp;gt;st.t.ppf(0.025,14)&amp;lt;/source&amp;gt;&lt;br /&gt;
Dostajemy więc &amp;lt;math&amp;gt; \bar x \pm t_{\alpha/2}\frac{s}{\sqrt{n}} = 10,37 \pm 2,145\cdot\frac{3,5}{\sqrt{15}} = [8,\!43\ 12,\!31]&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: Podobnie jak w poprzednim przykładzie możemy też skorzystać z tego, że w scipy.stats definiowane są rozkłady &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; o dowolnych parametrach i wykonać całe obliczenia jednym wywołaniem funkcji:&lt;br /&gt;
: &amp;lt;source lang =python&amp;gt;st.t.ppf([0.025, 0.975], 14, loc = 10.37, scale = 3.5/15**0.5)&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lekarz może być pewny, że w 95% przypadków od podania leku do ustąpienia objawów upłynie czas pomiędzy 8,43 a 12,31 dnia.&lt;br /&gt;
&lt;br /&gt;
==== Zadanie ====&lt;br /&gt;
Producent opon rowerowych chce oszacować średni dystans jaki można przejechać na oponie pewnego rodzaju zanim opona się zużyje. Pobrano losową próbę 32 opon, opona jest używana aż do przetarcia i odległość przejechana na każdej oponie jest rejestrowana. Dane (w tysiącach kilometrów) są następujące:&lt;br /&gt;
&lt;br /&gt;
32, 33, 28, 37, 29, 30, 25, 27, 39, 40, 26, 26, 27, 30, 25, 30, 31, 29, 24, 36, 25, 37, 37, 20, 22, 35, 23, 28, 30, 36, 40, 41&lt;br /&gt;
&lt;br /&gt;
Znaleźć 99% przedział ufności dla średniego przebiegu opon tego rodzaju. Zadanie rozwiązać analogicznie jak powyższy przykład.&lt;br /&gt;
&lt;br /&gt;
''Odp'': [ 27,76  33,36].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
X=np.array([32, 33, 28, 37, 29, 30, 25, 27, 39, 40, 26, 26, 27, 30, 25, 30, 31, 29, 24, 36, 25, 37, 37, 20, 22, 35, 23, 28, 30, 36, 40, 41])&lt;br /&gt;
alfa=0.01&lt;br /&gt;
&lt;br /&gt;
N=len(X)&lt;br /&gt;
x_sr = X.mean()&lt;br /&gt;
s=X.std(ddof=1)&lt;br /&gt;
s_sr=s/N**0.5&lt;br /&gt;
&lt;br /&gt;
print(st.t.ppf([alfa/2,1-alfa/2],df=N-1,loc=x_sr,scale=s_sr))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zadanie to można rozwiązać także w oparciu o bootstrap, wykorzystując funkcję zwracającą wartość zadanego [http://brain.fuw.edu.pl/edu/WnioskowanieStatystyczne/Zmienne_losowe_i_generatory_liczb_pseudolosowych#Kwantyle kwantyla] dla danego rozkładu. Rozkład jest tu zadany empirycznie w postaci zbioru.&lt;br /&gt;
: &amp;lt;source lang = python&amp;gt; st.scoreatpercentile(zbiór, kwantyl) &amp;lt;/source&amp;gt;&lt;br /&gt;
Proszę zwrócić uwagę na rozbieżności w wynikach. Z czego one wynikają?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import numpy as np&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
# rozwiązanie przez bootstrap&lt;br /&gt;
 &lt;br /&gt;
def randsample(x):&lt;br /&gt;
	'''zwraca wektor z losowo wybranymi elementami wektora x. Losowanie odbywa się z powtórzeniami''' &lt;br /&gt;
	n=len(x)&lt;br /&gt;
	ind = np.random.randint(n, size = n)&lt;br /&gt;
	y = x[ind]&lt;br /&gt;
	return y&lt;br /&gt;
 &lt;br /&gt;
N_rep = 100000&lt;br /&gt;
x = np.array([32, 33, 28, 37, 29, 30, 25, 27, 39, 40, 26, 26, 27, 30, 25, 30, 31, 29, 24, 36, &lt;br /&gt;
25, 37, 37, 20, 22, 35, 23, 28, 30, 36, 40, 41])&lt;br /&gt;
 &lt;br /&gt;
r = np.zeros((N_rep,1))&lt;br /&gt;
for i in range(N_rep):&lt;br /&gt;
	x_boot = randsample(x)&lt;br /&gt;
	r[i] = np.mean(x_boot)&lt;br /&gt;
ci_d = st.scoreatpercentile(r, 0.5) #uwaga: ta funkcja jako arg. bierze procenty a nie ułamki dziesiętne!&lt;br /&gt;
ci_g = st.scoreatpercentile(r, 99.5)&lt;br /&gt;
print('Z bootstrapu: ', ci_d, '-', ci_g)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Przedział ufności dla wariancji ==&lt;br /&gt;
Zauważmy, że:&lt;br /&gt;
:&amp;lt;math&amp;gt; \frac{\sum_{i=1}^N\left(x_i-\bar{x}\right)^2}{\sigma^2}&amp;lt;/math&amp;gt; &lt;br /&gt;
podlega rozkładowi &amp;lt;math&amp;gt; \chi^2_{N-1}&amp;lt;/math&amp;gt;  o ''N''&amp;amp;minus;1 stopniach swobody, zaś nieobciążony estymator wariancji to&lt;br /&gt;
:&amp;lt;math&amp;gt;  s^2=\frac{1}{N-1}\sum_{i=1}^N \left(x_i-\bar{x}\right)^2 &amp;lt;/math&amp;gt; &lt;br /&gt;
Zatem zmienna losowa &lt;br /&gt;
:&amp;lt;math&amp;gt;  \frac{s^2(N-1)}{\sigma^2}&amp;lt;/math&amp;gt; &lt;br /&gt;
także podlega rozkładowi &amp;lt;math&amp;gt; \chi^2_{N-1}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Aby znaleźć &amp;lt;math&amp;gt;(1-\alpha) &amp;lt;/math&amp;gt;100% przedział ufności dla wariancji, musimy wyznaczyć &lt;br /&gt;
takie wartości krytyczne &amp;lt;math&amp;gt; \chi^2_{N-1,\alpha/2}&amp;lt;/math&amp;gt; &lt;br /&gt;
oraz  &amp;lt;math&amp;gt; \chi^2_{N-1,1-\alpha/2}&amp;lt;/math&amp;gt; aby:&lt;br /&gt;
:&amp;lt;math&amp;gt;P\left( \chi^2_{N-1,\alpha/2} &amp;lt; \frac{s^2(N-1)}{\sigma^2}&amp;lt; \chi^2_{N-1,1-\alpha/2} \right) = 1-\alpha&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\chi^2_{N-1,\alpha/2}&amp;lt;/math&amp;gt; jest wartością, która odcina na lewo obszar &amp;amp;alpha;/2 z rozkładu chi-kwadrat z ''n''&amp;amp;minus;1 stopniami swobody. &amp;lt;math&amp;gt;\chi^2_{N-1,1-\alpha/2}&amp;lt;/math&amp;gt;  jest wartością, która odcina na prawo obszar &amp;amp;alpha;/2 z rozkładu chi-kwadrat z ''n''&amp;amp;minus;1 stopniami swobody (lub równoważnie: odcina na lewo obszar 1&amp;amp;minus;&amp;amp;alpha;/2).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Powyższe wyrażenie jest równoważne:&lt;br /&gt;
:&amp;lt;math&amp;gt;P\left( \frac{(N-1)s^2}{\chi^2_{N-1,1-\alpha/2}} &amp;lt; \sigma^2&amp;lt; \frac{(N-1)s^2}{\chi^2_{n-1,\alpha/2}} \right) = 1-\alpha&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zatem przedział ufności &amp;lt;math&amp;gt;(1-\alpha)*100&amp;lt;/math&amp;gt; % dla wariancji populacji &amp;lt;math&amp;gt; \sigma^2&amp;lt;/math&amp;gt;, gdy rozkład populacji jest normalny:&lt;br /&gt;
:&amp;lt;math&amp;gt; &lt;br /&gt;
\left[\frac{(n-1)s^2}{\chi^2_{N-1,1-\alpha/2}}, \;\; \frac{(n-1)s^2}{\chi^2_{N-1,\alpha/2}} \right]&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Zadanie ===&lt;br /&gt;
Automat do kawy nalewa kawę do kubków. Jeśli średnia porcja kawy w kubku odbiega od normy, maszynę można wyregulować. Jeśli jednak wariancja porcji kawy jest zbyt duża, maszyna wymaga reperacji. Od czasu do czasu przeprowadzana jest kontrola wariancji porcji kawy. Odbywa się to poprzez wybór losowej próby napełnionych kubków i policzenie wariancji próby. Losowa próba 30 kubków dała wariancję próby &amp;lt;math&amp;gt; s^2 = 18,54&amp;lt;/math&amp;gt;. Obliczyć 95% przedział ufności dla wariancji populacji &amp;lt;math&amp;gt; \sigma^2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
''Wskazówka: rozkład'' &amp;lt;math&amp;gt;\chi^2&amp;lt;/math&amp;gt; ''dostępny jest w module scipy.stats jako '' &amp;lt;tt&amp;gt;chi2&amp;lt;/tt&amp;gt; &lt;br /&gt;
&lt;br /&gt;
''Odp'': [11,759 33,505].&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import numpy as np&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
&lt;br /&gt;
n = 30&lt;br /&gt;
s2 = 18.54&lt;br /&gt;
alfa = 0.05&lt;br /&gt;
&lt;br /&gt;
chi_kryt_d = st.chi2.ppf(1-alfa/2, df=n-1)&lt;br /&gt;
chi_kryt_g = st.chi2.ppf(alfa/2, df=n-1)&lt;br /&gt;
&lt;br /&gt;
ci_d = (n-1)*s2/chi_kryt_d&lt;br /&gt;
ci_g = (n-1)*s2/chi_kryt_g&lt;br /&gt;
print('przedział ufności: %(d).3f %(g).3f'%{'d':ci_d, 'g':ci_g})&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rozmiar próby ==&lt;br /&gt;
&lt;br /&gt;
Gdy pobieramy próbę, często chcielibyśmy znać minimalny rozmiar próby, który zapewni nam żądaną precyzję wyniku.&lt;br /&gt;
&lt;br /&gt;
Musimy odpowiedzieć sobie na trzy pytania:&lt;br /&gt;
* Jak nasze oszacowanie nieznanego parametru ma być bliskie prawdziwej wartości? Odpowiedź oznaczmy &amp;lt;math&amp;gt; D&amp;lt;/math&amp;gt;  (dystans).&lt;br /&gt;
* Jaki chcemy mieć poziom ufności, że nasze oszacowanie i prawdziwa wartość parametru są od siebie oddalone o nie więcej niż ''D''?&lt;br /&gt;
* Jakie jest oszacowanie wariancji w populacji?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jeśli nie znamy odpowiedzi na pkt. 3 przeprowadzamy tzw. ''pilot study'' i szacujemy &amp;lt;math&amp;gt; \sigma&amp;lt;/math&amp;gt; na podstawie odchylenia std. próby. &lt;br /&gt;
&lt;br /&gt;
Średnia &amp;lt;math&amp;gt;\bar x&amp;lt;/math&amp;gt; podlega rozkładowi normalnemu &amp;lt;math&amp;gt;N(\mu,\sigma^2/\sqrt{n})&amp;lt;/math&amp;gt;.&lt;br /&gt;
Wymagana odległość pomiędzy &amp;lt;math&amp;gt;\bar x -\mu =D&amp;lt;/math&amp;gt;. Korzystając z transformacji do rozkładu standardowego ''Z'' możemy zapisać &amp;lt;math&amp;gt;\bar x = \mu +z \sigma/\sqrt{n}&amp;lt;/math&amp;gt;. Podstawiając do poprzedniego wyrażenia otrzymujemy &lt;br /&gt;
minimalny rozmiar próby potrzebny do oszacowania średniej populacji &amp;lt;math&amp;gt; \mu&amp;lt;/math&amp;gt;, który wynosi:&lt;br /&gt;
:&amp;lt;math&amp;gt; &lt;br /&gt;
n=\frac{z_{\alpha/2}^2\sigma^2}{D^2}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
W przypadku nieznajomości &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; korzystamy z jej [http://brain.fuw.edu.pl/edu/index.php/WnioskowanieStatystyczne/Statystyki_i_estymatory nieobciążonego estymatora] &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Zadanie ===&lt;br /&gt;
Biuro podróży chce oszacować średnią ilość pieniędzy wydaną na wakacje przez osoby korzystające z jego usług. Ludzie przeprowadzający analizę chcieliby móc oszacować średni koszt wakacji z dokładnością do 200 zł na poziomie ufności 95%. Z poprzednich doświadczeń tego biura podróży wynika, że odchylenie standardowe w populacji wynosi &amp;lt;math&amp;gt; \sigma = 400&amp;lt;/math&amp;gt; zł. Jaka będzie minimalna wielkość próby?&lt;br /&gt;
&lt;br /&gt;
''Odp'': &amp;lt;math&amp;gt; n = 15,366&amp;lt;/math&amp;gt; więc wielkość próby wynosi 16 (zaokrąglamy w górę).&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
 &lt;br /&gt;
def randsample(x,ile):&lt;br /&gt;
	ind = st.randint.rvs(0,len(x),size = ile)&lt;br /&gt;
	y = x[ind]&lt;br /&gt;
	return y&lt;br /&gt;
 &lt;br /&gt;
alfa = 0.05&lt;br /&gt;
x=np.ones(100)&lt;br /&gt;
x[56:]=0&lt;br /&gt;
Nboot=100000&lt;br /&gt;
A=np.zeros(Nboot)&lt;br /&gt;
for i in range(Nboot):&lt;br /&gt;
    ankieta=randsample(x,1500)&lt;br /&gt;
    A[i]=np.sum(ankieta)/1500.0&lt;br /&gt;
lo = st.scoreatpercentile(A, per = alfa/2*100)&lt;br /&gt;
hi = st.scoreatpercentile(A, per = (1-alfa/2)*100)&lt;br /&gt;
print('przedzial ufnosci: %(lo).3f - %(hi).3f\n'%{'lo':lo,'hi':hi})&lt;br /&gt;
szer_binu = (hi-lo)/10&lt;br /&gt;
biny = np.arange(lo-10*szer_binu, hi+10*szer_binu, szer_binu)&lt;br /&gt;
(n,x,patch) = py.hist(A,bins = biny )&lt;br /&gt;
py.plot([lo, lo] , [0, np.max(n)] ,'r' )&lt;br /&gt;
py.plot([hi,hi],[0, np.max(n)],'r')&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Przykład z bootstrapem ==&lt;br /&gt;
Rozważmy sondę przedwyborczą, mamy dwóch kandydatów na prezydenta. Ankietowano 1500 osób. 840 osób deklarowało poparcie dla kandydata A zaś 660 dla kandydata B. Na ile pewny może być kandydat A swojego zwycięstwa?&lt;br /&gt;
* Jak dokładnie brzmi pytanie? W terminologii przedziałów ufności możemy je sformułować następująco: Jaki jest 95% przedział ufności dla poparcia kandydata A w całej populacji? Czy też innymi słowami: W jakim przedziale na 95% znajduje się proporcja glosujących popierających kandydata A.&lt;br /&gt;
* Nasze najlepsze mniemanie o własnościach &amp;amp;bdquo;świata&amp;amp;rdquo; z którego pochodzą dane otrzymujemy ze zwykłej proporcji. Wynika z niej, że kandydat A ma poparcie 56% zaś kandydat B poparcie 44%  wyborców.&lt;br /&gt;
* Przypiszmy do kandydata A &amp;amp;bdquo;1&amp;amp;rdquo; zaś do B &amp;amp;bdquo;0&amp;amp;rdquo; (w ten sposób tworzymy zmienną losową: oddany głos).&lt;br /&gt;
* Pobranie ankiety modelujemy przez pobranie losowo 1500 próbek z modelu naszego &amp;amp;bdquo;świata&amp;amp;rdquo; czyli wektora złożonego z 56 jedynek i 44 zer. Wynikiem jednej ankiety jest proporcja popierających kandydata A (lub B)&lt;br /&gt;
* Zbieramy rozkład proporcji - musimy w tym celu &amp;amp;bdquo;przeprowadzić&amp;amp;rdquo; wielokrotnie ankietę. Narysujmy histogram. &lt;br /&gt;
* Chcemy znaleźć 95% przedział ufności musimy znaleźć kwantyl 2,5 oraz 97,5.&lt;br /&gt;
Liczby te stanowią poszukiwany przedział ufności. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import numpy as np&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
&lt;br /&gt;
def randsample(x,ile):&lt;br /&gt;
	ind = st.randint.rvs(0,len(x),size = ile)&lt;br /&gt;
	y = x[ind]&lt;br /&gt;
	return y&lt;br /&gt;
&lt;br /&gt;
alfa = 0.05&lt;br /&gt;
x=np.ones(100)&lt;br /&gt;
x[56:]=0&lt;br /&gt;
Nboot=10000&lt;br /&gt;
A=np.zeros(Nboot)&lt;br /&gt;
for i in range(Nboot):&lt;br /&gt;
    ankieta=randsample(x,1500)&lt;br /&gt;
    A[i]=np.sum(ankieta)/1500.0&lt;br /&gt;
lo = st.scoreatpercentile(A, per = alfa/2*100)&lt;br /&gt;
hi = st.scoreatpercentile(A, per = (1-alfa/2)*100)&lt;br /&gt;
print('przedzial ufnosci: %(lo).3f - %(hi).3f\n'%{'lo':lo,'hi':hi})&lt;br /&gt;
szer_binu = (hi-lo)/10&lt;br /&gt;
biny = np.arange(lo-10*szer_binu, hi+11*szer_binu, szer_binu)&lt;br /&gt;
(hn,hx,patch) = py.hist(A,bins = biny )&lt;br /&gt;
py.plot([lo, lo] , [0, np.max(hn)] ,'r' )&lt;br /&gt;
py.plot([hi,hi],[0, np.max(hn)],'r')&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Zadania ==&lt;br /&gt;
=== Przyrost masy w nowej diecie ===&lt;br /&gt;
Producent karmy dla zwierząt chciał przetestować nowy rodzaj karmy. Próbki podawał 12 zwierzakom przez 4 tygodnie. Po tym czasie zanotował następujące przyrosty masy:&lt;br /&gt;
&lt;br /&gt;
15.43, 16.92, 14.43, 12.94, 15.92, 17.42, 18.91, 16.92, 14.93, 14.49, 15.92, 15.43 kg&lt;br /&gt;
&lt;br /&gt;
średni przyrost wynosi 15.80 kg. Producent widzi jednak, że w próbie jest dość znaczny rozrzut pomiędzy poszczególnymi zwierzętami 12,94-18,91 i nie jest pewien czy można reklamować nowy produkt podając średni przyrost 15,8 kg. Podejrzewa, że inna grupa zwierząt może mieć zupełnie inną średnią. &lt;br /&gt;
* Używając powyższych danych znajdź 95% przedział ufności na średni przyrost masy.&lt;br /&gt;
* Wynik zilustruj przy pomocy histogramu.&lt;br /&gt;
* Jaki byłby wynik przy założeniu, że masy zwierząt pochodzą z rozkładu normalnego?&lt;br /&gt;
&lt;br /&gt;
''Odp:''&lt;br /&gt;
: zakładając, że ''x'' pochodzi z rozkładu normalnego:&lt;br /&gt;
: [14,80  16,81];&lt;br /&gt;
: bootstrap: 14,94-16,67.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
&lt;br /&gt;
def randsample(x,ile):&lt;br /&gt;
	ind = st.randint.rvs(0,len(x),size = ile)&lt;br /&gt;
	y = x[ind]&lt;br /&gt;
	return y&lt;br /&gt;
&lt;br /&gt;
X=np.array([15.43, 16.92, 14.43, 12.94, 15.92, 17.42, 18.91, 16.92, 14.93, 14.49, 15.92, 15.43])&lt;br /&gt;
&lt;br /&gt;
alfa = 0.05&lt;br /&gt;
Nboot=int(1e5)&lt;br /&gt;
&lt;br /&gt;
Xsr=X.mean()&lt;br /&gt;
s=X.std(ddof=1)&lt;br /&gt;
N=len(X)&lt;br /&gt;
print(&amp;quot;średnia&amp;quot;,Xsr)&lt;br /&gt;
&lt;br /&gt;
M=np.zeros(Nboot)&lt;br /&gt;
for i in range(Nboot):&lt;br /&gt;
	xb=randsample(X,N)&lt;br /&gt;
	M[i]=xb.mean()&lt;br /&gt;
&lt;br /&gt;
lo,hi = st.t.ppf([alfa/2,1-alfa/2],df=N-1,loc=Xsr,scale=s/N**0.5)&lt;br /&gt;
print('przedzial ufnosci z założenia o normalności: %(lo).3f - %(hi).3f\n'%{'lo':lo,'hi':hi})&lt;br /&gt;
&lt;br /&gt;
lo = st.scoreatpercentile(M, per = alfa/2*100)&lt;br /&gt;
hi = st.scoreatpercentile(M, per = (1-alfa/2)*100)&lt;br /&gt;
print('przedzial ufnosci z bootstrapu: %(lo).3f - %(hi).3f\n'%{'lo':lo,'hi':hi})&lt;br /&gt;
&lt;br /&gt;
szer_binu = (hi-lo)/10&lt;br /&gt;
biny = np.arange(lo-10*szer_binu, hi+10*szer_binu, szer_binu)&lt;br /&gt;
(n,x,patch)=py.hist(M,bins=biny)&lt;br /&gt;
py.plot([lo, lo] , [0, np.max(n)] ,'r' )&lt;br /&gt;
py.plot([hi,hi],[0, np.max(n)],'r')&lt;br /&gt;
&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
=== Zawartość aluminium w Tebańskich naczyniach. ===&lt;br /&gt;
Zawartość procentowa aluminium w 18 antycznych naczyniach z Teb była następująca:&amp;lt;br/&amp;gt;&lt;br /&gt;
11.4, 13.4, 13.5, 13.8, 13.9, 14.4, 14.5, 15, 15.1, 15.8, 16, 16.3, 16.5, 16.9, 17, 17.2, 17.5, 19.0&amp;lt;br/&amp;gt;&lt;br /&gt;
Jaka jest mediana procentowej zawartości aluminium i jaki jest 95% przedział ufności?&lt;br /&gt;
&lt;br /&gt;
''Odp'':&lt;br /&gt;
:mediana 15,45 i przedział ufności: 14,20 16,70.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
&lt;br /&gt;
def randsample(x,ile):&lt;br /&gt;
	ind = st.randint.rvs(0,len(x),size = ile)&lt;br /&gt;
	y = x[ind]&lt;br /&gt;
	return y&lt;br /&gt;
&lt;br /&gt;
X=np.array([11.4, 13.4, 13.5, 13.8, 13.9, 14.4, 14.5, 15, 15.1, 15.8, 16, 16.3, 16.5, 16.9, 17, 17.2, 17.5, 19.0])&lt;br /&gt;
&lt;br /&gt;
alfa = 0.05&lt;br /&gt;
Nboot=int(1e5)&lt;br /&gt;
&lt;br /&gt;
Xmed=np.median(X)&lt;br /&gt;
N=len(X)&lt;br /&gt;
print(&amp;quot;mediana probki&amp;quot;,Xmed)&lt;br /&gt;
&lt;br /&gt;
M=np.empty(Nboot)&lt;br /&gt;
for i in range(Nboot):&lt;br /&gt;
	xb=randsample(X,N)&lt;br /&gt;
	M[i]=np.median(xb)&lt;br /&gt;
&lt;br /&gt;
lo = st.scoreatpercentile(M, per = alfa/2*100)&lt;br /&gt;
hi = st.scoreatpercentile(M, per = (1-alfa/2)*100)&lt;br /&gt;
print('przedzial ufnosci dla mediany (z bootstrapu): %(lo).3f - %(hi).3f\n'%{'lo':lo,'hi':hi})&lt;br /&gt;
(n,x,patch)=py.hist(M,bins=10)&lt;br /&gt;
py.plot([lo, lo] , [0, np.max(n)] ,'r' )&lt;br /&gt;
py.plot([hi,hi],[0, np.max(n)],'r')&lt;br /&gt;
py.show()&lt;br /&gt;
	&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
=== Średnica drzew ===&lt;br /&gt;
Ogrodnik eksperymentuje z nowym gatunkiem drzew. Posadził 20 sztuk i po dwóch latach zmierzył następujące średnice pni (w cm):&lt;br /&gt;
8.5, 7.6, 9.3, 5.5, 11.4, 6.9, 6.5, 12.9, 8.7, 4.8, 4.2, 8.1, 6.5, 5.8, 6.7, 2.4, 11.1, 7.1, 8.8, 7.2&lt;br /&gt;
* Proszę znaleźć średnią średnicę i 90% przedział ufności dla średniej.&lt;br /&gt;
* Proszę znaleźć medianę i 90% przedział ufności dla mediany.&lt;br /&gt;
* Obydwa wyniki zilustrować przy pomocy histogramów.&lt;br /&gt;
''Odp:''&lt;br /&gt;
: średnia: 7,50 i przedzial ufnosci dla średniej: [6,61  8,41];&lt;br /&gt;
: mediana 7,15 i przedzial ufnosci dla mediany: [6,50  8,50].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;source  lang = python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
&lt;br /&gt;
def randsample(x,ile):&lt;br /&gt;
	ind = st.randint.rvs(0,len(x),size = ile)&lt;br /&gt;
	y = x[ind]&lt;br /&gt;
	return y&lt;br /&gt;
&lt;br /&gt;
def hist_z_przedzialem(x,hi,lo):&lt;br /&gt;
	szer_binu = (hi-lo)/10	&lt;br /&gt;
	biny = np.arange(lo-10*szer_binu, hi+10*szer_binu, szer_binu)&lt;br /&gt;
	(n,bin_x,patch) = py.hist(x,bins = biny );&lt;br /&gt;
	py.plot([lo, lo] , [0, np.max(n)] ,'r' )&lt;br /&gt;
	py.plot([hi,hi],[0, np.max(n)],'r')&lt;br /&gt;
&lt;br /&gt;
X=np.array([8.5, 7.6, 9.3, 5.5, 11.4, 6.9, 6.5, 12.9, 8.7, 4.8, 4.2, 8.1, 6.5, 5.8, 6.7, 2.4, 11.1, 7.1, 8.8, 7.2])&lt;br /&gt;
&lt;br /&gt;
alfa = 0.1&lt;br /&gt;
Nboot=int(1e5)&lt;br /&gt;
&lt;br /&gt;
N=len(X)&lt;br /&gt;
print(&amp;quot;Średnia próbki&amp;quot;,np.mean(X))&lt;br /&gt;
print(&amp;quot;Mediana próbki&amp;quot;,np.median(X))&lt;br /&gt;
print(&amp;quot;Liczebność próbki&amp;quot;,N)&lt;br /&gt;
&lt;br /&gt;
Sr=np.empty(Nboot)&lt;br /&gt;
Med=np.empty(Nboot)&lt;br /&gt;
for i in range(Nboot):&lt;br /&gt;
	xb=randsample(X,N)&lt;br /&gt;
	Med[i]=np.median(xb)&lt;br /&gt;
	Sr[i]=np.mean(xb)&lt;br /&gt;
&lt;br /&gt;
lo = st.scoreatpercentile(Sr, per = alfa/2*100)&lt;br /&gt;
hi = st.scoreatpercentile(Sr, per = (1-alfa/2)*100)&lt;br /&gt;
print('przedzial ufnosci dla średniej: %(lo).3f - %(hi).3f'%{'lo':lo,'hi':hi})&lt;br /&gt;
py.subplot(2,1,1)&lt;br /&gt;
hist_z_przedzialem(Sr,hi,lo)&lt;br /&gt;
&lt;br /&gt;
lo = st.scoreatpercentile(Med, per = alfa/2*100)&lt;br /&gt;
hi = st.scoreatpercentile(Med, per = (1-alfa/2)*100)&lt;br /&gt;
print('przedzial ufnosci dla mediany: %(lo).3f - %(hi).3f'%{'lo':lo,'hi':hi})&lt;br /&gt;
py.subplot(2,1,2)&lt;br /&gt;
hist_z_przedzialem(Med,hi,lo)&lt;br /&gt;
&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
=== Przedział ufności dla proporcji ===&lt;br /&gt;
W badaniach nad cholesterolem u ludzi stwierdzono, że w grupie 135 badanych z wysokim poziomem cholesterolu 10 osób przeszło zawał serca. &lt;br /&gt;
&lt;br /&gt;
''Pytanie'': Jaki jest 95% przedział ufności dla proporcji 10/135?  &lt;br /&gt;
&lt;br /&gt;
* Proszę wykorzystać metodę bootstrapu.&lt;br /&gt;
* Proszę wykorzystać rozkład dwumianowy.&lt;br /&gt;
&lt;br /&gt;
''Odp'': proporcja 10/135 = 0,07 i jej 95% przedział ufności [0,03 0,12].&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;source lang =python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
&lt;br /&gt;
def randsample(x,ile):&lt;br /&gt;
	ind = st.randint.rvs(0,len(x),size = ile)&lt;br /&gt;
	y = x[ind]&lt;br /&gt;
	return y&lt;br /&gt;
&lt;br /&gt;
X=np.zeros(135)&lt;br /&gt;
X[:10]=1&lt;br /&gt;
&lt;br /&gt;
alfa = 0.05&lt;br /&gt;
Nboot=int(1e5)&lt;br /&gt;
&lt;br /&gt;
N=len(X)&lt;br /&gt;
&lt;br /&gt;
Proporcja=np.empty(Nboot)&lt;br /&gt;
for i in range(Nboot):&lt;br /&gt;
	xb=randsample(X,N)&lt;br /&gt;
	Proporcja[i]=np.sum(xb)/N&lt;br /&gt;
&lt;br /&gt;
lo = st.scoreatpercentile(Proporcja, per = alfa/2*100)&lt;br /&gt;
hi = st.scoreatpercentile(Proporcja, per = (1-alfa/2)*100)&lt;br /&gt;
print('przedzial ufnosci z bootstrapu: %(lo).3f - %(hi).3f\n'%{'lo':lo,'hi':hi})&lt;br /&gt;
(n,x,patch)=py.hist(Proporcja,bins=np.arange(0,1,1/135)-1/270)&lt;br /&gt;
py.plot([lo, lo] , [0, np.max(n)] ,'r' )&lt;br /&gt;
py.plot([hi,hi],[0, np.max(n)],'r')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
p=10/135&lt;br /&gt;
lo,hi = st.binom.ppf([alfa/2,1-alfa/2],N,p)/N&lt;br /&gt;
print('przedzial ufnosci z rozkładu dwumianowego: %(lo).3f - %(hi).3f\n'%{'lo':lo,'hi':hi})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
=== Bezrobotni ===&lt;br /&gt;
W próbce 200 osób 7 procent jest bezrobotnych. Określić 95% przedział ufności dla odsetka bezrobotnych w populacji.&lt;br /&gt;
&lt;br /&gt;
''Odp'': Średnia 7% i jej 95% przedział ufności [3,50 10,50].&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;source lang =python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
&lt;br /&gt;
def randsample(x,ile):&lt;br /&gt;
	ind = st.randint.rvs(0,len(x),size = ile)&lt;br /&gt;
	y = x[ind]&lt;br /&gt;
	return y&lt;br /&gt;
&lt;br /&gt;
X=np.zeros(100)&lt;br /&gt;
X[:7]=1&lt;br /&gt;
&lt;br /&gt;
alfa = 0.05&lt;br /&gt;
Nboot=int(1e5)&lt;br /&gt;
&lt;br /&gt;
N=200&lt;br /&gt;
&lt;br /&gt;
Proporcja=np.empty(Nboot)&lt;br /&gt;
for i in range(Nboot):&lt;br /&gt;
	xb=randsample(X,N)&lt;br /&gt;
	Proporcja[i]=np.sum(xb)/N*100 #chcemy procenty i dlatego mnożymy przez 100&lt;br /&gt;
&lt;br /&gt;
lo = st.scoreatpercentile(Proporcja, per = alfa/2*100)&lt;br /&gt;
hi = st.scoreatpercentile(Proporcja, per = (1-alfa/2)*100)&lt;br /&gt;
print('przedzial ufnosci z bootstrapu: %(lo).3f - %(hi).3f\n'%{'lo':lo,'hi':hi})&lt;br /&gt;
(n,x,patch)=py.hist(Proporcja,bins=30)&lt;br /&gt;
py.plot([lo, lo] , [0, np.max(n)] ,'r' )&lt;br /&gt;
py.plot([hi,hi],[0, np.max(n)],'r')&lt;br /&gt;
&lt;br /&gt;
p=7/100&lt;br /&gt;
lo,hi = st.binom.ppf([alfa/2,1-alfa/2],N,p)/N*100&lt;br /&gt;
print('przedzial ufnosci z rozkładu dwumianowego: %(lo).3f - %(hi).3f\n'%{'lo':lo,'hi':hi})&lt;br /&gt;
&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
=== Żywotność baterii ===&lt;br /&gt;
W próbce 20 testowanych baterii stwierdzono średni czas życia 28,85 miesiąca. Określić 95% przedział ufności dla średniej. Wartości dla badanej próbki były następujące:&amp;lt;br&amp;gt;&lt;br /&gt;
30, 32, 31, 28, 31, 29, 29, 24, 30, 31, 28, 28, 32, 31, 24, 23, 31, 27, 27, 31 miesięcy&amp;lt;br&amp;gt;&lt;br /&gt;
Obejrzeć rozkład przy pomocy &amp;lt;tt&amp;gt;histfit&amp;lt;/tt&amp;gt; i zbadać jaki wpływ na przedział ufności ma przyjęcie założenia o normalności rozkładu czasów życia.&lt;br /&gt;
&lt;br /&gt;
''Odp'': Średnia 28,85 i jej 95% przedział ufności [27,65 29,95].&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;source lang =python&amp;gt;&lt;br /&gt;
def histfit(x,N_bins):  &lt;br /&gt;
''' funkcja rysuje histogram i na jego tle dorysowuje wykres &lt;br /&gt;
funkcji gęstości prawdopodobieństwa rozkładu normalnego &lt;br /&gt;
o średniej i wariancji estymowanych z x &lt;br /&gt;
Funkcja wymaga zaimportowania modułów pylab as py i scipy.stats as st'''  &lt;br /&gt;
	n, bins, patches = py.hist(x, N_bins, density=True, facecolor='green', alpha=0.75)&lt;br /&gt;
	# Tu w jawny sposób odbieramy zwracane przez p.hist obiekty&lt;br /&gt;
	#   - normujemy histogram do jedności&lt;br /&gt;
	#   - ustalamy kolor prostokątów na zielony&lt;br /&gt;
	#   - ustawiamy przezroczystość prostokątów na 0.75&lt;br /&gt;
&lt;br /&gt;
	bincenters = 0.5*(bins[:-1]+bins[1:])&lt;br /&gt;
	# wytwarzamy array z centrami binów korzystając z granic słupków&lt;br /&gt;
	# zwróconych przez py.hist w macierzy bins&lt;br /&gt;
 &lt;br /&gt;
	y = st.norm.pdf( bincenters, loc = np.mean(x), scale = np.std(x))&lt;br /&gt;
	# obliczamy wartości w normalnym rozkładzie gęstości prawdopodobieństwa&lt;br /&gt;
	# o średniej mi i wariancji sigma**2 dla wartości bincenters&lt;br /&gt;
 &lt;br /&gt;
	l = py.plot(bincenters, y, 'r--', linewidth=1)&lt;br /&gt;
	# do histogramu dorysowujemy linię &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;source lang =python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
&lt;br /&gt;
def randsample(x,ile):&lt;br /&gt;
	ind = st.randint.rvs(0,len(x),size = ile)&lt;br /&gt;
	y = x[ind]&lt;br /&gt;
	return y&lt;br /&gt;
&lt;br /&gt;
def hist_z_przedzialem(x,hi,lo):&lt;br /&gt;
	szer_binu = (hi-lo)/10	&lt;br /&gt;
	biny = np.arange(lo-10*szer_binu, hi+10*szer_binu, szer_binu)&lt;br /&gt;
	(n,bin_x,patch) = py.hist(x,bins = biny );&lt;br /&gt;
	py.plot([lo, lo] , [0, np.max(n)] ,'r' )&lt;br /&gt;
	py.plot([hi,hi],[0, np.max(n)],'r')&lt;br /&gt;
&lt;br /&gt;
def histfit(x,N_bins):  &lt;br /&gt;
	''' funkcja rysuje histogram i na jego tle dorysowuje wykres &lt;br /&gt;
funkcji gęstości prawdopodobieństwa rozkładu normalnego &lt;br /&gt;
o średniej i wariancji estymowanych z x &lt;br /&gt;
Funkcja wymaga zaimportowania modułów pylab as py i scipy.stats as st'''  &lt;br /&gt;
	n, bins, patches = py.hist(x, N_bins, density=True, facecolor='green', alpha=0.75)&lt;br /&gt;
	# Tu w jawny sposób odbieramy zwracane przez p.hist obiekty&lt;br /&gt;
	#   - normujemy histogram do jedności&lt;br /&gt;
	#   - ustalamy kolor prostokątów na zielony&lt;br /&gt;
	#   - ustawiamy przezroczystość prostokątów na 0.75&lt;br /&gt;
 &lt;br /&gt;
	bincenters = 0.5*(bins[:-1]+bins[1:])&lt;br /&gt;
	# wytwarzamy array z centrami binów korzystając z granic słupków&lt;br /&gt;
	# zwróconych przez py.hist w macierzy bins&lt;br /&gt;
 &lt;br /&gt;
	y = st.norm.pdf( bincenters, loc = np.mean(x), scale = np.std(x))&lt;br /&gt;
	# obliczamy wartości w normalnym rozkładzie gęstości prawdopodobieństwa&lt;br /&gt;
	# o średniej mi i wariancji sigma**2 dla wartości bincenters&lt;br /&gt;
 &lt;br /&gt;
	l = py.plot(bincenters, y, 'r--', linewidth=1)&lt;br /&gt;
	# do histogramu dorysowujemy linię&lt;br /&gt;
&lt;br /&gt;
X=np.array([30, 32, 31, 28, 31, 29, 29, 24, 30, 31, 28, 28, 32, 31, 24, 23, 31, 27, 27, 31])&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Średnia próbki&amp;quot;,np.mean(X))&lt;br /&gt;
&lt;br /&gt;
alfa = 0.05&lt;br /&gt;
Nboot=int(1e5)&lt;br /&gt;
&lt;br /&gt;
Xsr=X.mean()&lt;br /&gt;
s=X.std(ddof=1)&lt;br /&gt;
N=len(X)&lt;br /&gt;
&lt;br /&gt;
M=np.empty(Nboot)&lt;br /&gt;
for i in range(Nboot):&lt;br /&gt;
	xb=randsample(X,N)&lt;br /&gt;
	M[i]=xb.mean()&lt;br /&gt;
&lt;br /&gt;
lo,hi = st.t.ppf([alfa/2,1-alfa/2],df=N-1,loc=Xsr,scale=s/N**0.5)&lt;br /&gt;
print('przedzial ufnosci z założenia o normalności: %(lo).3f - %(hi).3f\n'%{'lo':lo,'hi':hi})&lt;br /&gt;
&lt;br /&gt;
lo = st.scoreatpercentile(M, per = alfa/2*100)&lt;br /&gt;
hi = st.scoreatpercentile(M, per = (1-alfa/2)*100)&lt;br /&gt;
print('przedzial ufnosci z bootstrapu: %(lo).3f - %(hi).3f\n'%{'lo':lo,'hi':hi})&lt;br /&gt;
hist_z_przedzialem(M,hi,lo)&lt;br /&gt;
&lt;br /&gt;
py.figure()&lt;br /&gt;
histfit(M,20)&lt;br /&gt;
&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
=== Pomiary ===&lt;br /&gt;
Mamy 10 pomiarów pewnej wielkości:&amp;lt;br&amp;gt;&lt;br /&gt;
0.02, 0.026, 0.023, 0.017, 0.022, 0.019, 0.018, 0.018, 0.017, 0.022&amp;lt;br&amp;gt;&lt;br /&gt;
Proszę znaleźć średnią i 95% przedział ufności.&lt;br /&gt;
&lt;br /&gt;
''Odp'':Średnia 0,020 i jej 95% przedział ufności [0,0185 0,0220].&lt;br /&gt;
&lt;br /&gt;
Czy pomiarów jest wystarczająco dużo aby sensownie wyznaczyć średnią i przedział ufności?&lt;br /&gt;
&lt;br /&gt;
''Wskazówka'': Obliczyć średnie dla 1 000 000 powtórzeń i obejrzeć histogramy dla 10, 20, 30, 100, i 200 przedziałów.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def randsample(x):&lt;br /&gt;
	'''zwraca wektor z losowo wybranymi elementami wektora x. Losowanie odbywa się z powtórzeniami''' &lt;br /&gt;
	n=len(x)&lt;br /&gt;
	ind = np.random.randint(n, size = n)&lt;br /&gt;
	y = x[ind]&lt;br /&gt;
	return y&lt;br /&gt;
&lt;br /&gt;
dane = np.array([0.02, 0.026, 0.023, 0.017, 0.022, 0.019, 0.018, 0.018, 0.017, 0.022]);&lt;br /&gt;
&lt;br /&gt;
N_rep = 1000000&lt;br /&gt;
srednie = np.zeros(N_rep)&lt;br /&gt;
&lt;br /&gt;
for i in range(N_rep):&lt;br /&gt;
	proba = randsample(dane)&lt;br /&gt;
	srednie[i] = np.mean(proba)&lt;br /&gt;
&lt;br /&gt;
ci_d = st.scoreatpercentile(srednie, 2.5)&lt;br /&gt;
ci_g = st.scoreatpercentile(srednie, 97.5)&lt;br /&gt;
print('Średnia %(prop).4f i jej 95proc. przedział ufności [%(d).4f %(g).4f]'%{'prop':np.mean(dane),'d':ci_d, 'g': ci_g})&lt;br /&gt;
py.subplot(5,1,1)&lt;br /&gt;
py.hist(srednie,10)&lt;br /&gt;
py.subplot(5,1,2)&lt;br /&gt;
py.hist(srednie,20)&lt;br /&gt;
py.subplot(5,1,3)&lt;br /&gt;
py.hist(srednie,30)&lt;br /&gt;
py.subplot(5,1,4)&lt;br /&gt;
py.hist(srednie,100)&lt;br /&gt;
py.subplot(5,1,5)&lt;br /&gt;
py.hist(srednie,200)&lt;br /&gt;
&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Maciek</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=WnioskowanieStatystyczne/_Testowanie_hipotez&amp;diff=11250</id>
		<title>WnioskowanieStatystyczne/ Testowanie hipotez</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=WnioskowanieStatystyczne/_Testowanie_hipotez&amp;diff=11250"/>
		<updated>2025-04-07T11:25:12Z</updated>

		<summary type="html">&lt;p&gt;Maciek: /* Testowanie hipotez na temat wariancji */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Testowanie hipotez dotyczących jednej lub dwóch populacji ==&lt;br /&gt;
===Wstęp===&lt;br /&gt;
Schemat weryfikowania hipotez omówiony jest w wykładzie [[WnioskowanieStatystyczne/Weryfikacja hipotez |Weryfikacja hipotez statystycznych]]. Tu przypomnimy tylko krótko podstawowe pojęcia i decyzje, które trzeba pojąć w procedurze weryfikacji.&lt;br /&gt;
====Hipoteza zerowa i alternatywna====&lt;br /&gt;
Podstawą sukcesu w statystycznym testowaniu hipotez jest prawidłowe ich sformułowanie. &lt;br /&gt;
Hipotezy muszą być rozłączne. Najczęściej jako hipotezę zerową przyjmujemy zdanie, które chcemy odrzucić, &lt;br /&gt;
gdyż błąd takiej decyzji można kontrolować. Logika testowania jest następująca: tworzymy &lt;br /&gt;
funkcję od zmiennych losowych, dla której przy spełnieniu przez owe zmienne hipotezy zerowej potrafimy &lt;br /&gt;
podać prawdopodobieństwa z jakimi przyjmuje ona różne wartości. Ta funkcja nazywana jest ''statystyką''. &lt;br /&gt;
Następnie obliczamy wartość tej funkcji dla badanej próby. Jeśli prawdopodobieństwo osiągnięcia otrzymanej &lt;br /&gt;
bądź jeszcze bardziej ekstremalnej wartości statystyki jest niskie to wątpimy, że nasze dane są zgodne&lt;br /&gt;
z hipotezą zerową i jesteśmy skłonni przyjąć hipotezę alternatywną.&lt;br /&gt;
&lt;br /&gt;
====Wybór statystyki====&lt;br /&gt;
Wybierając statystykę można posłużyć się następującym schematem:&lt;br /&gt;
* Jeżeli znamy rozkład prawdopodobieństwa, z którego pochodzą nasze dane, lub umiemy je przetransformować do znanego rozkładu, to wybierzemy klasyczny test parametryczny np. test ''t'' ([http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.mstats.ttest_rel.html ttest_rel], [http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.ttest_ind.html ttest_ind]), &amp;lt;math&amp;gt;\chi^2&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; itp.&lt;br /&gt;
* Jeżeli nie znamy rozkładu prawdopodobieństwa naszych danych albo nie chcemy nic o nim zakładać to mamy dwie możliwości: &lt;br /&gt;
** korzystamy z klasycznego [[WnioskowanieStatystyczne/Test_Wilcoxona|testu nieparametrycznego]] np.:&lt;br /&gt;
&amp;lt;!--http://mail.scipy.org/pipermail/scipy-user/2009-July/021679.html--&amp;gt;&lt;br /&gt;
**; test Wilcoxona dla obserwacji sparowanych: testuje hipotezę zerową, że dwie próby &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, które ze sobą porównujemy pochodzą z tej samej populacji ciągłej (przekłada się to na równość dystrybuant). Próby &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; '''są''' sparowane. W pythonie mamy ten test zaimplementowany jako: [http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.wilcoxon.html &amp;lt;tt&amp;gt;scipy.stats.wilcoxon(x, y=None)&amp;lt;/tt&amp;gt;]. Ta implementacja stosuje przybliżenie dużych prób i zalecana jest dla &amp;lt;math&amp;gt;n&amp;gt;20&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;!--    Calculate the Wilcoxon signed-rank test&lt;br /&gt;
&lt;br /&gt;
    The Wilcoxon signed-rank test tests the null hypothesis that two related samples come from the same distribution. It is a a non-parametric version of the paired T-test.&lt;br /&gt;
    Parameters:	&lt;br /&gt;
    x : array_like&lt;br /&gt;
        The first set of measurements&lt;br /&gt;
    y : array_like, optional, default None&lt;br /&gt;
        The second set of measurements. If y is not given, then the x array is considered to be the differences between the two sets of measurements.&lt;br /&gt;
    Returns:	&lt;br /&gt;
    z-statistic : float&lt;br /&gt;
        The test statistic under the large-sample approximation that the signed-rank statistic is normally distributed.&lt;br /&gt;
    p-value : float&lt;br /&gt;
        The two-sided p-value for the test&lt;br /&gt;
    Notes&lt;br /&gt;
    Because the normal approximation is used for the calculations, the samples used should be large. A typical rule is to require that n &amp;gt; 20.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
scipy.stats.ranksums(x, y)&lt;br /&gt;
&lt;br /&gt;
    Compute the Wilcoxon rank-sum statistic for two samples.&lt;br /&gt;
&lt;br /&gt;
    The Wilcoxon rank-sum test tests the null hypothesis that two sets of measurements are drawn from the same distribution. The alternative hypothesis is that values in one sample are more likely to be larger than the values in the other sample.&lt;br /&gt;
&lt;br /&gt;
    This test should be used to compare two samples from continuous distributions. It does not handle ties between measurements in x and y. For tie-handling and an optional continuity correction see `stats.mannwhitneyu`_&lt;br /&gt;
    Parameters:	&lt;br /&gt;
&lt;br /&gt;
    x,y : array_like&lt;br /&gt;
&lt;br /&gt;
        The data from the two samples&lt;br /&gt;
&lt;br /&gt;
    Returns:	&lt;br /&gt;
&lt;br /&gt;
    z-statistic : float&lt;br /&gt;
&lt;br /&gt;
        The test statistic under the large-sample approximation that the rank sum statistic is normally distributed&lt;br /&gt;
&lt;br /&gt;
    p-value : float&lt;br /&gt;
&lt;br /&gt;
        The two-sided p-value of the test&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
**; test Manna-Whitney'a : testuje hipotezę zerową, że dwie próby &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, które ze sobą porównujemy pochodzą z tej samej populacji ciągłej. Próby &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; i&amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; '''nie są''' sparowane. Implementacja w pyhtonie: [http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.mannwhitneyu.html &amp;lt;tt&amp;gt;scipy.stats.mannwhitneyu(x, y, use_continuity=True)&amp;lt;/tt&amp;gt;] stosuje przybliżenia i zalecana jest dla &amp;lt;math&amp;gt;n&amp;gt;20&amp;lt;/math&amp;gt; w każdej z prób. Funkcja zwraca wartość ''p'' dla hipotezy jednostronnej. Jeśli testujemy hipotezę dwustronną trzeba otrzymane ''p'' pomnożyć przez 2.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
scipy.stats.mannwhitneyu(x, y, use_continuity=True)¶&lt;br /&gt;
&lt;br /&gt;
    Computes the Mann-Whitney rank test on samples x and y.&lt;br /&gt;
    Parameters:	&lt;br /&gt;
    x, y : array_like&lt;br /&gt;
        Array of samples, should be one-dimensional.&lt;br /&gt;
    use_continuity : bool, optional&lt;br /&gt;
        Whether a continuity correction (1/2.) should be taken into account. Default is True.&lt;br /&gt;
    Returns:	&lt;br /&gt;
    u : float&lt;br /&gt;
        The Mann-Whitney statistics.&lt;br /&gt;
    prob : float&lt;br /&gt;
        One-sided p-value assuming a asymptotic normal distribution.&lt;br /&gt;
    Notes&lt;br /&gt;
    Use only when the number of observation in each sample is &amp;gt; 20 and you have 2 independent samples of ranks. Mann-Whitney U is significant if the u-obtained is LESS THAN or equal to the critical value of U.&lt;br /&gt;
&lt;br /&gt;
    This test corrects for ties and by default uses a continuity correction. The reported p-value is for a one-sided hypothesis, to get the two-sided p-value multiply the returned p-value by 2.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
** wytwarzamy rozkład statystyki na podstawie naszych danych przez repróbkowanie ([[WnioskowanieStatystyczne/Bootstrap|bootstrap]] lub [[WnioskowanieStatystyczne/Testy_permutacyjne| permutacje]]). W podejściu repróbkowania tworzymy statystyczny model badanego procesu '''zgodny z hipotezą zerową''' i następnie badamy w drodze symulacji prawdopodobieństwa generowania przez ten model interesujących nas sytuacji. Największą uwagę musimy tu poświęcić na prawidłowe sformułowanie modelu, a następnie precyzyjne określenie prawdopodobieństwo jakiego zdarzenia nas naprawdę interesuje.&lt;br /&gt;
&lt;br /&gt;
===Poziom istotności &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; i wartość &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;===&lt;br /&gt;
; Błąd pierwszego rodzaju : błąd polegający na odrzuceniu hipotezy zerowej, która w rzeczywistości jest prawdziwa. Oszacowanie prawdopodobieństwa popełnienia błędu pierwszego rodzaju oznaczamy symbolem &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; i nazywamy poziomem istotności testu.&lt;br /&gt;
; Błąd drugiego rodzaju : polegaja na nieodrzuceniu hipotezy zerowej, która jest w rzeczywistości fałszywa. Oszacowanie prawdopodobieństwo popełnienia błędu drugiego rodzaju oznaczamy symbolem &amp;lt;math&amp;gt; \beta&amp;lt;/math&amp;gt;, a jego dopełnienie do jedności nazywane jest '''mocą testu'''.&lt;br /&gt;
&lt;br /&gt;
Wartość &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; jest to wartość prawdopodobieństwa, że wobec posiadanych danych  hipoteza zerowa jest prawdziwa. Jest ono obliczane jako prawdopodobieństwo zaobserwowania wartości ''statystyki'' takiej jak dla badanej próby, lub bardziej ekstremalnej, przy prawdziwej hipotezie zerowej.&lt;br /&gt;
Najczęściej porównujemy ''p'' z wcześniej ustalonym poziomem istotności &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;. Poziom istotności &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; to wartość krytyczna prawdopodobieństwa, taka że jeżeli &amp;lt;math&amp;gt; p&amp;lt; \alpha&amp;lt;/math&amp;gt; to odrzucamy hipotezę zerową.&lt;br /&gt;
&lt;br /&gt;
==Formułowanie hipotez==&lt;br /&gt;
===Przykład: mutacje muszek owocowych===&lt;br /&gt;
Załóżmy, że badamy muszki owocowe. W standardowej populacji proporcja samic do samców jest 1:1. Opracowaliśmy metodę powodującą taką mutację muszek owocowych, że potomstwo ich nie będzie miało jednakowej szansy na bycie samcem lub samiczką. W pierwszych 20 zbadanych przypadkach uzyskujemy 14 samców i 6 samiczek.&lt;br /&gt;
; Pytanie naukowe: Czy wyniki eksperymentu potwierdzają, że nasza metoda zaburza proporcję płci?&lt;br /&gt;
Najpierw musimy przetłumaczyć pytanie naukowe na pytanie statystyczne. &lt;br /&gt;
; Pytanie statystyczne: Jakie jest prawdopodobieństwo uzyskania zaobserwowanej proporcji (14:6), lub bardziej ekstremalnej w próbie 20 osobników,  jeśli rzeczywista proporcja płci jest 1:1?&lt;br /&gt;
&lt;br /&gt;
Z tego pytania wynikają dwie możliwe hipotezy:&lt;br /&gt;
* Hipoteza zerowa: Nowa metoda nie zaburza proporcji płci 1:1. Zaobserwowana próbka pochodzi z populacji, w której proporcja płci ''jest'' 1:1&lt;br /&gt;
* Hipoteza alternatywna: Zaobserwowana próbka pochodzi z populacji, w której proporcja płci ''nie jest'' 1:1.&lt;br /&gt;
; Prawdopodobieństwo, które musimy oszacować: Jakie jest prawdopodobieństwo uzyskania 14 lub więcej jedynek w serii 20 prób, jeśli prawdopodobieństwo jedynki jest &amp;lt;math&amp;gt;1/2&amp;lt;/math&amp;gt;?  &lt;br /&gt;
# Oznaczmy 1: samiec 0: samiczka.&lt;br /&gt;
# Zróbmy wektor 20-elementowy zawierający 10 zer i 10 jedynek.&lt;br /&gt;
# Wylosujmy ze zwracaniem nowy wektor 20-elementowy. (Jest to nasz model uzyskiwania 20 elementowej próbki z populacji o proporcji 1:1.) Zapamiętajmy liczbę jedynek.&lt;br /&gt;
# Powtórzmy poprzedni krok 1000 razy&lt;br /&gt;
# Zróbmy histogram ilości jedynek.&lt;br /&gt;
# Policzmy ile razy zdarzyło sie 14 lub więcej jedynek (to odpowiada 14 lub więcej samców) i dodajmy do tego ilość przypadków gdy mieliśmy 6 lub mniej jedynek (to odpowiada 14 lub więcej samiczek). Wynik podzielmy przez ilość losowań (1000).&lt;br /&gt;
&lt;br /&gt;
Powyższa procedura opisuje test dwustronny. Testu dwustronnego musimy użyć jeśli nie mamy ''istotnych'' powodów, żeby wierzyć, że nowa metoda działa ''jedynie na zwiększenie'' szansy pojawienia się samca.&lt;br /&gt;
&lt;br /&gt;
Jak powyższy problem rozwiązać w sposób parametryczny? &lt;br /&gt;
Próby podlegają rozkładowi dwumianowemu, można więc obliczyć szukane prawdopodobieństwo korzystając z jego dystrybuanty.&lt;br /&gt;
&lt;br /&gt;
==Testowanie hipotez na temat średniej==&lt;br /&gt;
Firma rozwożąca przesyłki po mieście deklaruje średni czas dostarczenia 28 minut. Przeprowadźmy test tej hipotezy na poziomie istotności 5%.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_0: \mu = 28&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;H_1: \mu \ne 28&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wybieramy losową próbę 100 przesyłek, mierzymy czas dostarczenia, liczymy średnią z próby &amp;lt;math&amp;gt;\bar x = 31,5&amp;lt;/math&amp;gt; minut i odchylenie standardowe próby &amp;lt;math&amp;gt;s = 5&amp;lt;/math&amp;gt; minut. &lt;br /&gt;
&lt;br /&gt;
Test ten można przeprowadzić z użyciem przedziałów ufności:&lt;br /&gt;
* Konstruujemy przedziały ufności 95% dla średniej &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.Formalnie, ponieważ wyliczyliśmy odchylenie standardowe z próby powinniśmy zastosować wartości krytyczne z rozkładu t. Rozmiar próby wynosi 100 więc rozkład t ma 99 stopni swobody. Wartość krytyczna w tym rozkladzie to &amp;lt;math&amp;gt;t_{97.5} =  1.984 &amp;lt;/math&amp;gt;. Mamy zatem:&lt;br /&gt;
&amp;lt;math&amp;gt;\bar x \pm 1,984 \frac{s}{\sqrt{n}} = 31,5 \pm 1,984*\frac{5}{\sqrt{100}} = 31,5 \pm 0,992 = [30,51 \quad 32,49]&amp;lt;/math&amp;gt;&lt;br /&gt;
* Wnioskowanie: Możemy więc być na 95% pewni, że nieznana średnia leży pomiędzy 30,51 a 32,49 a więc na 95% nie leży poza tym przedziałem. &lt;br /&gt;
Skoro &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; podaje &amp;lt;math&amp;gt;\mu = 28&amp;lt;/math&amp;gt; (poza przedziałem), możemy odrzucić tę hipotezę.  Jeśli &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; jest prawdziwe, istnieje prawdopodobieństwo 0,05, że skonstruowany przedział nie będzie zawierał &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;. Istnieje zatem prawdopodobieństwo 0,05 popełnienia błądu I-go rodzaju. Mówimy, że przeprowadziliśmy test na poziomie istotności 0,05.&lt;br /&gt;
&lt;br /&gt;
Test można też przeprowadzić następująco:&lt;br /&gt;
* Jako statystykę wybieramy &amp;lt;math&amp;gt;t = \frac{\bar x - \mu}{s/\sqrt{n}} &amp;lt;/math&amp;gt;&lt;br /&gt;
* Obliczmy jej wartość dla danych z próby: &amp;lt;math&amp;gt;t = \frac{\bar x - \mu}{s/\sqrt{n}}  = (31,5 -28)/(5/\sqrt{100}) = 7 &amp;lt;/math&amp;gt;&lt;br /&gt;
* Porównujemy otrzymaną wartość z wartością krytyczna dla przyjętego poziomu istotności &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;. Konstuowany przez nas test ma być testem dwustronnym więc musimy wziąć do porównania wartość krytyczna dla &amp;lt;math&amp;gt;\alpha/2&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt; t_{\alpha/2} = t_{0,025}= -1,984&amp;lt;/math&amp;gt;&lt;br /&gt;
* Wnioskowanie: Dla naszej próby otrzymaliśmy wartość statystyki równą 6.96. Dla przyjętego poziomu istotności wartość statystyki wynosi 1,984. Prawdopodobieństwo zaobserwowania statystyki o wartości 7 lub bardziej ekstremalnej (tu: większej) jest mniejsze niż założony poziom istotności więc odrzucamy &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; na poziomie &amp;lt;math&amp;gt;\alpha = 0,05&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Testowanie hipotez na temat wariancji==&lt;br /&gt;
&lt;br /&gt;
Do testowania hipotez na temat wariancji używamy statystyki chi-kwadrat o &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; stopniach swobody:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\chi^2 = \frac{(n-1)s^2}{\sigma_0^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\sigma_0^2&amp;lt;/math&amp;gt; jest wartością wariancji podaną w &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
===Przykład===&lt;br /&gt;
Do produkcji baterii używane są metalowe płytki o średniej średnicy 5 mm. Jeśli wariancja średnicy płytki jest nie większa niż 1 mm&amp;lt;math&amp;gt;^2&amp;lt;/math&amp;gt;, produkcja jest kontynuowana. Jeśli wariancja przekracza 1 mm&amp;lt;math&amp;gt;^2&amp;lt;/math&amp;gt; proces produkcji trzeba przerwać. Kontroler przeprowadza test na poziomie istotności &amp;lt;math&amp;gt;\alpha = 5&amp;lt;/math&amp;gt;%: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_0:&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\sigma^2 \le 1&amp;lt;/math&amp;gt; i &lt;br /&gt;
&amp;lt;math&amp;gt;H_1:&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\sigma^2 &amp;gt; 1&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Wybiera losową próbę 31 płytek i znajduje wariancję próby &amp;lt;math&amp;gt;s^2 = 1,62&amp;lt;/math&amp;gt;. Czy daje to podstawy do przerwania produkcji?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\chi^2 = \frac{(31-1) \cdot 1,62}{1} = 48,6&amp;lt;/math&amp;gt;. Znajdujemy poziom &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; dla tej wartości &amp;lt;math&amp;gt;\chi^2&amp;lt;/math&amp;gt; z 30 stopniami swobody. &lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
p = 1-st.chi2.cdf(48.6,30)&lt;br /&gt;
print(p)&lt;br /&gt;
&lt;br /&gt;
#ilustracja&lt;br /&gt;
x = py.arange(0,60,1)  &lt;br /&gt;
py.plot(x, st.chi2.pdf(x,30)) #rysujemy funkcję gęstości prawdopodobieństwa chi2 o 30 st. swobody&lt;br /&gt;
x2 = py.arange(48.8,60,1)&lt;br /&gt;
py.fill_between(x2,st.chi2.pdf(x2,30)) #cieniujemy obszar pod funkcją geęstości prawdopodobieństwa odpowiadający obliczonemu p&lt;br /&gt;
&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Otrzymaliśmy &amp;lt;math&amp;gt; p = 0,017 &amp;lt;/math&amp;gt;.&lt;br /&gt;
Wniosek:  Odrzucamy &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Błąd drugiego rodzaju. Moc testu.==&lt;br /&gt;
Błąd II-go rodzaju popełniamy wtedy gdy przyjmujemy &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; a prawdziwe jest &amp;lt;math&amp;gt;H_1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Przykład===&lt;br /&gt;
Załóżmy następujący test:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_0: \mu = 60&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_1: \mu = 65&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Niech rozmiar próby wynosi &amp;lt;math&amp;gt;n = 100&amp;lt;/math&amp;gt; a odchylenie standardowe w populacji &amp;lt;math&amp;gt;\sigma = 20&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Powinniśmy tu zastosować test jednostronny (mamy tylko dwie możliwości: &amp;lt;math&amp;gt;\mu = 60&amp;lt;/math&amp;gt; lub &amp;lt;math&amp;gt;65&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
Znajdźmy punkt krytyczny &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; dla poziomu istotności &amp;lt;math&amp;gt;\alpha =  0,05&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;C = \mu_0 + 1,645\frac{\sigma}{\sqrt{n}} = 60 + 1,645(20/10) = 63,29&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Błąd pierwszego rodzaju popełnimy gdy &amp;lt;math&amp;gt;\bar x &amp;gt; C&amp;lt;/math&amp;gt; i prawdziwe będzie &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt;. Prawdopodobieństwo błędu pierwszego rodzaju ustaliliśmy z góry na poziomie &amp;lt;math&amp;gt;\alpha = 0,05&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\alpha = P(\bar x &amp;gt; C| \mu = \mu_0)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Błąd drugiego rodzaju popełnimy gdy &amp;lt;math&amp;gt;\bar x &amp;lt; C&amp;lt;/math&amp;gt; a prawdziwe będzie &amp;lt;math&amp;gt;H_1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Prawdopodobieństwo popełnienia tego błędu wynosi:&lt;br /&gt;
&amp;lt;math&amp;gt;\beta = P(\bar x &amp;lt; C| \mu = \mu_1) = P\left( \frac{\bar x - \mu_1}{\sigma/\sqrt{n}}  &amp;lt; \frac{C - \mu_1}{\sigma/\sqrt{n}}\right)= &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;= P\left( Z &amp;lt; \frac{63,29 - 65}{20/10}\right)  = P(Z &amp;lt; -0,855) = 0,1963&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Moc testu jest dopełnieniem błędu II rodzaju.&lt;br /&gt;
A moc testu czyli prawdopodobieństwo odrzucenia hipotezy zerowej podczas gdy jest ona fałszywa wynosi:&lt;br /&gt;
&amp;lt;math&amp;gt;1 - \beta = 0,8037&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Porównanie dwóch populacji==&lt;br /&gt;
[[WnioskowanieStatystyczne/Test_t#Test_t_.28Studenta.29_r.C3.B3.C5.BCnicy_.C5.9Brednich|Dla przypomnienia]]:&lt;br /&gt;
Jeśli mamy dwie próbki danych:&lt;br /&gt;
:&amp;lt;math&amp;gt;x_1&amp;lt;/math&amp;gt; o liczebności &amp;lt;math&amp;gt;n_1&amp;lt;/math&amp;gt; i estymowanej wariancji &amp;lt;math&amp;gt;s_1^2&amp;lt;/math&amp;gt; i &lt;br /&gt;
:&amp;lt;math&amp;gt;x_2&amp;lt;/math&amp;gt; o liczebności &amp;lt;math&amp;gt;n_2&amp;lt;/math&amp;gt; i estymowanej wariancji &amp;lt;math&amp;gt;s_2^2&amp;lt;/math&amp;gt;  &lt;br /&gt;
:gdzie &amp;lt;math&amp;gt;s_{i}^2= \frac{1}{(n_i-1)}\sum\limits_{j=1}^{n_i} (x_{j}-\overline{x}_{i})^{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
pochodzących z rozkładu normalnego o takiej samej wariancji &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; to:&lt;br /&gt;
*wspólna wariancja może być estymowana jako: &amp;lt;math&amp;gt;s^2=\frac{(n_1-1)s_1^2+(n_2-1)s_2^2}{n_1+n_2-2} &amp;lt;/math&amp;gt;&lt;br /&gt;
*wariancja różnicy średnich może być estymowana jako: &amp;lt;math&amp;gt;s_{\Delta}^2=s_{\bar{x}_1}^2+s_{\bar{x}_2}^2=\frac{1}{n_1}s_1^2+\frac{1}{n_2}s_2^2 = \frac{n_1+n_2}{n_1n_2}s^2&amp;lt;/math&amp;gt;&lt;br /&gt;
Jeśli postawimy hipotezę zerową: &amp;lt;math&amp;gt;H_0:\; \mu_1 = \mu_2&amp;lt;/math&amp;gt; to&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
t= \frac{\bar{x}_1-\bar{x}_2}{s_{\Delta}}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
pochodzi z rozkładu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; o &amp;lt;math&amp;gt;n_1+n_2-2&amp;lt;/math&amp;gt; stopniach swobody.&lt;br /&gt;
&lt;br /&gt;
===Przykład: promocja===&lt;br /&gt;
Producent odtwarzaczy CD chce sprawdzić czy małe obniżenie ceny produktu wpłynie korzystnie na sprzedaż. Losowa próba 15 tygodni sprzedaży przed obniżką dała średni dochód 6598 zł i standardowe odchylenie 844 zł. Losowa próba 12 tygodni sprzedaży w trakcie promocji dała średnią 6870 i odchylenie standardowe 669 zł. Czy dane te wykazują poprawę sprzedaży w trakcie promocji (przyjąć poziom istotności 5%) ?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\bar{x}_1 = 6598&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\bar{x}_2 = 6870&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Treść zadania odpowiada testowi jednostronnemu z poniższymi hipotezami:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_0: \mu_1 = \mu_2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_1: \mu_1 &amp;lt; \mu_2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Różnica średnich wynosi:&lt;br /&gt;
&amp;lt;math&amp;gt;\bar{x}_1-\bar{x}_2 = 6598 - 6870 = -272 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Estymowana wariancja różnicy średnich:&lt;br /&gt;
&amp;lt;math&amp;gt;s_{\Delta}^2 =  \frac{1}{n_1}s_1^2+\frac{1}{n_2}s_2^2 = \frac{844^2}{15} + \frac{669^2}{12} = 84785,82&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
zatem:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;s_{\Delta} = 291,18&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; t = -272/ 291,18 = - 0,934&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ilość stopni swobody: &amp;lt;math&amp;gt;n_1+n_2-2 = 25&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;P(t_{25} \le -0,934) = 0.18 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wniosek: Nie możemy odrzucić &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt;. Nie mamy podstaw by uznać że mała obniżka cen poprawiła sprzedaż.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Do testowania równości wariancji w dwóch populacjach stosuje się test &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;F_{(n1 -1, n2 - 1)} = \frac{s_1^2}{s_2^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
W przykładzie powyżej założyliśmy równość wariancji. Korzystając z testu &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; sprawdzić czy założenie było uzasadnione.&lt;br /&gt;
&lt;br /&gt;
==Badanie założenia o normalności rozkładu==&lt;br /&gt;
We wszystkich wspomnianych powyżej klasycznych testach statystycznych &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\chi^2&amp;lt;/math&amp;gt; istotnym założeniem jest to, że dane wejściowe w próbie mają rozkład normalny. W powyższych zadaniach po prostu to zakładaliśmy, ale w praktyce, kiedy dostajemy próbę do analizy, musimy sami sprawdzić,  czy możemy uznać ją za pochodzącą z rozkładu normalnego. Do weryfikacji takiej hipotezy służą narzędzia graficzne:&lt;br /&gt;
&lt;br /&gt;
=== Histfit: histogram z naniesionym fitem rozkładu normalnego ===&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
def histfit(x,N_bins):  &lt;br /&gt;
''' &lt;br /&gt;
x - dane&lt;br /&gt;
N_bins -ilość binów w histogramie&lt;br /&gt;
&lt;br /&gt;
Funkcja rysuje histogram i na jego tle dorysowuje wykres &lt;br /&gt;
funkcji gęstości prawdopodobieństwa rozkładu normalnego &lt;br /&gt;
o średniej i wariancji estymowanych z x.&lt;br /&gt;
&lt;br /&gt;
Funkcja wymaga zaimportowania modułów pylab as py i scipy.stats as st''' &lt;br /&gt;
 &lt;br /&gt;
	n, bins, patches = py.hist(x, N_bins, normed=True, facecolor='green', alpha=0.75)&lt;br /&gt;
	# Rysujemy histogram i w jawny sposób odbieramy zwracane przez p.hist obiekty&lt;br /&gt;
	#   - normujemy histogram do jedności&lt;br /&gt;
	#   - ustalamy kolor prostokątów na zielony&lt;br /&gt;
	#   - ustawiamy przezroczystość prostokątów na 0.75&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	bincenters = 0.5*(bins[1:]+bins[:-1])&lt;br /&gt;
	# wytwarzamy tablicę z centrami binów korzystając z granic binów&lt;br /&gt;
	# zwróconych przez py.hist w macierzy bins&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	y = st.norm.pdf( bincenters, loc = np.mean(x), scale = np.std(x))&lt;br /&gt;
	# obliczamy momenty rozkładu x: średnią i wariancję (tak naprawdę to jej pierwiastek czyli standardowe odchylenie)&lt;br /&gt;
	# obliczamy wartości w normalnym rozkładzie gęstości prawdopodobieństwa&lt;br /&gt;
	# o średniej np.mean(x) i standardowym odchyleniu np.std(x) dla wartości bincenters&lt;br /&gt;
 &lt;br /&gt;
	l = py.plot(bincenters, y, 'r--', linewidth=1)&lt;br /&gt;
	# do histogramu dorysowujemy linię &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Normplot ===&lt;br /&gt;
Jest to wykres wartości w próbie, wzg. prawdopodobieństwa uzyskania takiej wartości w rozkładzie normalnym. Wykres ten jest szczególnym przypadkiem kwantylowego wykresu prawdopodobieństwa [http://en.wikipedia.org/wiki/Q-Q_plot]. Konstruuje się go następująco: &lt;br /&gt;
*Na osi pionowej odkładamy uporządkowane zaobserwowane wartości &amp;lt;math&amp;gt;x_1 \le x_2 \le \dots \le x_n &amp;lt;/math&amp;gt;. Estymują one położenie kwantyli w populacji.&lt;br /&gt;
*Na osi poziomej odkładamy położenia kwantyli w rozkładzie normalnym. Obliczamy je: &amp;lt;math&amp;gt;F^{-1}\left(\frac{i-r_{pop}}{n+n_{pop}} \right)&amp;lt;/math&amp;gt; gdzie &amp;lt;math&amp;gt;F^{-1}&amp;lt;/math&amp;gt; jest funkcją odwrotną do dystrybuanty rozkładu teoretycznego (w tym szczególnym przypadku normalnego) &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; jest numerem obserwacji a &amp;lt;math&amp;gt;r_{pop}, n_{pop}&amp;lt;/math&amp;gt; są czynnikami (&amp;lt;math&amp;gt;\le 0.5 &amp;lt;/math&amp;gt;) zapewniającymi, że argument funkcji odwrotnej do dystrybuanty nie przyjmuje wartości 0 ani 1. &lt;br /&gt;
Jeśli dane ''x'' podlegają rozkładowi normalnemu to ich położenia kwantyli powinny być zgodne z położeniami kwantyli w rozkładzie normalnym, zatem wykres powinien przedstawiać linię prostą. Odstępstwa od prostej świadczą o odstępstwie od rozkładu normalnego.&lt;br /&gt;
W pythonie możemy ten typ wykresu zaimplementować np. tak (współczynniki zaczerpnięte z [http://www.itl.nist.gov/div898/handbook/eda/section3/normprpl.htm]):&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
def normplot(x):&lt;br /&gt;
	'''normplot: x dane do testowania'''&lt;br /&gt;
	x_ord = sorted(x)&lt;br /&gt;
	N = len(x)&lt;br /&gt;
	y = np.zeros(N)&lt;br /&gt;
	y[0]=st.norm.ppf(1- 0.5**(1.0/N) )&lt;br /&gt;
	y[N-1] = st.norm.ppf(0.5**(1.0/N) )&lt;br /&gt;
	for i in range(1,N-1):&lt;br /&gt;
		arg = float(i-0.3175)/(N+0.365)&lt;br /&gt;
		y[i] = st.norm.ppf(arg)&lt;br /&gt;
	py.plot(y,x_ord,'.')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Test Shapiro-Wilka ===&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;W,p = st.shapiro(x)&amp;lt;/source&amp;gt;&lt;br /&gt;
Funkcja ta zwraca wartość statystyki ''W'' i prawdopodobieństwo ''p''  zaobserwowania takiej lub bardziej ekstremalnej wartości statystyki ''W'' dla danych podlegających rozkładowi normalnemu. Jeśli ''p'' ma wysoką wartość (większą niż przyjęta &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;) to nie możemy odrzucić hipotezy, że dane podlegają  rozkładowi normalnemu. Test Shapiro-Wilka nie jest wrażliwy na parametry rozkładu, z którego pochodzą dane (dane mogą pochodzić z rozkładu o dowolnej średniej i dowolnym odchyleniu standardowym).&lt;br /&gt;
&lt;br /&gt;
=== Test Kołmogorowa-Smirnowa ===&lt;br /&gt;
Jest on oparty  na badaniu maksymalnej różnicy pomiędzy dystrybuantą empiryczną (z próby) a teoretyczną dystrybuantą rozkładu. Dla testowania normalności próby powinniśmy wywołać &lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
D , p = st.kstest(x, 'norm', args=(np.mean(x),np.std(x,ddof=1)) #sposób zalecany&lt;br /&gt;
#lub &lt;br /&gt;
D , p = st.kstest((x-np.mean(x))/np.std(x,ddof=1), 'norm') #sposób niezalecany, ale również prawidłowy&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Funkcja zwraca wartość statystyki ''D'' i prawdopodobieństwo zaobserwowania takiej bądź bardziej ekstremalnej wartości statystyki jeśli testowane dane pochodzą z tego samego rozkładu. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;'''UWAGA!''' Test Kołmogorowa-Smirnowa '''jest wrażliwy na parametry rozkładu''', z którego pochodzą dane. Wywołanie poniższego kodu jest błędem:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
D , p = st.kstest(x, 'norm') #BŁĘDNE użycie testu Kołmogorowa-Smirnowa&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Test dla innych postaci rozkładu====&lt;br /&gt;
Za pomocą testu Kołmogorowa-Smirnowa możemy zbadać również założenie o pochodzeniu danych z populacji podlegającej dowolnemu innemu rozkładowi ciągłemu. W tym celu należy podać zamiast 'norm' odpowiednią nazwę rozkładu z modułu scipy.stats oraz parametry tegoż rozkładu w odpowiedniej kolejności (należy w tym celu zajrzeć do dokumentacji). Przykład jak to należy zrobić dla rozkładu wykładniczego:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
D , p = st.kstest(x, 'expon', args=(0, 1/np.mean(x)) #test, czy dane podlegają rozkładowi wykładniczemu&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Przykład===&lt;br /&gt;
Proszę wygenerować 1000 liczb z rozkładu normalnego. Liczby te obejrzyjmy na wykresach &amp;lt;tt&amp;gt;histfit&amp;lt;/tt&amp;gt; oraz &amp;lt;tt&amp;gt;normplot&amp;lt;/tt&amp;gt; i zbadamy ich normalność testem  Shapiro-Wilka i Kołmogorova-Smirnova. &lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
 &lt;br /&gt;
def normplot(x):&lt;br /&gt;
	'''normplot: x dane do testowania'''&lt;br /&gt;
	x_ord = sorted(x)&lt;br /&gt;
	N = len(x)&lt;br /&gt;
	y = np.zeros(N)&lt;br /&gt;
	y[0]=st.norm.ppf(1- 0.5**(1.0/N) )&lt;br /&gt;
	y[N-1] = st.norm.ppf(0.5**(1.0/N) )&lt;br /&gt;
	for i in range(1,N-1):&lt;br /&gt;
		arg = float(i-0.3175)/(N+0.365)&lt;br /&gt;
		y[i] = st.norm.ppf(arg)&lt;br /&gt;
	py.plot(y,x_ord,'.')&lt;br /&gt;
 &lt;br /&gt;
def histfit(x,N_bins):  &lt;br /&gt;
	''' funkcja rysuje histogram i na jego tle dorysowuje wykres &lt;br /&gt;
	funkcji gęstości prawdopodobieństwa rozkładu normalnego &lt;br /&gt;
	o średniej i wariancji estymowanych z x &lt;br /&gt;
	Funkcja wymaga zaimportowania modułów pylab as py i scipy.stats as st'''  &lt;br /&gt;
	n, bins, patches = py.hist(x, N_bins, normed=True, facecolor='green', alpha=0.75)&lt;br /&gt;
	bincenters = 0.5*(bins[1:]+bins[:-1]) &lt;br /&gt;
	y = st.norm.pdf( bincenters, loc = np.mean(x), scale = np.std(x,ddof=1)) &lt;br /&gt;
	l = py.plot(bincenters, y, 'r--', linewidth=1)&lt;br /&gt;
def porownania(x):&lt;br /&gt;
	py.subplot(2,2,1)&lt;br /&gt;
	normplot(x)&lt;br /&gt;
	py.subplot(2,2,2)&lt;br /&gt;
	histfit(x,15)&lt;br /&gt;
	W,p_sw = st.shapiro(x)&lt;br /&gt;
	D,p_ks = st.kstest(x, 'norm', args=(np.mean(x),np.std(x,ddof=1)))&lt;br /&gt;
	title = 'SW: %(sw).2f KS: %(ks).2f'%{'sw':p_sw, 'ks':p_ks}&lt;br /&gt;
	&lt;br /&gt;
	py.title(title)&lt;br /&gt;
	# wybieramy pierwsze dziesięć punktów  &lt;br /&gt;
	y=x[0:10]&lt;br /&gt;
	py.subplot(2,2,3)&lt;br /&gt;
	normplot(y)&lt;br /&gt;
	py.subplot(2,2,4)&lt;br /&gt;
	histfit(y,15)&lt;br /&gt;
	W,p_sw = st.shapiro(y)&lt;br /&gt;
	D,p_ks = st.kstest(y, 'norm', args=(np.mean(x),np.std(x,ddof=1)))&lt;br /&gt;
	title = 'SW: %(sw).2f KS: %(ks).2f'%{'sw':p_sw, 'ks':p_ks}&lt;br /&gt;
	py.title(title)&lt;br /&gt;
 &lt;br /&gt;
x = st.norm.rvs(size=1000, loc=0, scale=10)&lt;br /&gt;
py.figure(1)&lt;br /&gt;
porownania(x)&lt;br /&gt;
# A teraz zbadajmy dane z rozkładów innych niż normalny:&lt;br /&gt;
 &lt;br /&gt;
x = st.t.rvs(df = 2, size=1000, loc=0, scale=1)&lt;br /&gt;
py.figure(2)&lt;br /&gt;
porownania(x)&lt;br /&gt;
 &lt;br /&gt;
x = st.expon.rvs(size=1000,loc=0,scale=1)&lt;br /&gt;
py.figure(3)&lt;br /&gt;
porownania(x)&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Proszę zapuścić skrypt kilka razy i zwrócić uwagę na to, jak trudno jest ocenić normalność danych przy małych próbach.&lt;br /&gt;
&lt;br /&gt;
===Przykład: transformacja Boxa-Coxa===&lt;br /&gt;
Często normalność danych można poprawić przez zastosowanie odpowiedniej transformacji. Ogólną rodzinę transformacji, które często prowadzą do normalizacji danych można zapisać tak (trasformacja Box-Cox'a [http://www.jstor.org/stable/2984418]):&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
y^{(\lambda)}=\left\{\begin{matrix} \frac{y^\lambda-1} {\lambda} &amp;amp; \mbox{dla }\lambda \ne 0 \\ \ln(y) &amp;amp; \mbox{dla }\lambda = 0\end{matrix}\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W module scipy.stats mamy tę transformację zaimplementowaną jako &amp;lt;tt&amp;gt;boxcox()&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Zobaczmy jej działanie na następującym przykładzie:&lt;br /&gt;
&lt;br /&gt;
Proszę pobrać i zapisać w pliku tekstowym następujące &lt;br /&gt;
[[Media:Samochody.txt| dane]]. Zawierają one 8 kolumn charakterystyk samochodów:&lt;br /&gt;
*zużycie paliwa&lt;br /&gt;
*cylindry&lt;br /&gt;
*pojemność skokowa&lt;br /&gt;
*moc w koniach mechanicznych&lt;br /&gt;
*masa&lt;br /&gt;
*przyspieszenie&lt;br /&gt;
*rocznik&lt;br /&gt;
*pochodzenie&lt;br /&gt;
&lt;br /&gt;
Proszę narysować histfit i normplot  oraz policzyć testy Shapiro-Wilka i Kolmogorowa-Smirnowa dla masy pojazdów, a następnie zastosować do niej transformację Boxa-Coxa i zbadać normalność przetransformowanych danych.&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
def normplot(x):&lt;br /&gt;
	'''normplot: x dane do testowania'''&lt;br /&gt;
	x_ord = sorted(list(x))&lt;br /&gt;
	N = len(x)&lt;br /&gt;
	y = np.zeros(N)&lt;br /&gt;
	y[0]=st.norm.ppf(1- 0.5**(1.0/N) )&lt;br /&gt;
	y[N-1] = st.norm.ppf(0.5**(1.0/N) )&lt;br /&gt;
	for i in range(1,N-1):&lt;br /&gt;
		arg = float(i-0.3175)/(N+0.365)&lt;br /&gt;
		y[i] = st.norm.ppf(arg)&lt;br /&gt;
	py.plot(y,x_ord,'.')&lt;br /&gt;
	&lt;br /&gt;
def histfit(x,N_bins):  &lt;br /&gt;
	''' funkcja rysuje histogram i na jego tle dorysowuje wykres &lt;br /&gt;
	funkcji gęstości prawdopodobieństwa rozkładu normalnego &lt;br /&gt;
	o średniej i wariancji estymowanych z x &lt;br /&gt;
	Funkcja wymaga zaimportowania modułów pylab as py i scipy.stats as st'''  &lt;br /&gt;
	n, bins, patches = py.hist(x, N_bins, normed=True, facecolor='green', alpha=0.75)&lt;br /&gt;
	bincenters = 0.5*(bins[1:]+bins[:-1]) &lt;br /&gt;
	y = st.norm.pdf( bincenters, loc = np.mean(x), scale = np.std(x)) &lt;br /&gt;
	l = py.plot(bincenters, y, 'r--', linewidth=1)&lt;br /&gt;
def porownania(x):&lt;br /&gt;
	py.subplot(2,1,1)&lt;br /&gt;
	normplot(x);&lt;br /&gt;
	py.subplot(2,1,2)&lt;br /&gt;
	histfit(x,15)&lt;br /&gt;
	W,p_sw = st.shapiro(x);&lt;br /&gt;
	D,p_ks = st.kstest(x,'norm',args=(np.mean(x),np.std(x) ))&lt;br /&gt;
	title = 'SW: %(sw).2f KS: %(ks).2f'%{'sw':p_sw, 'ks':p_ks}&lt;br /&gt;
	py.title(title)&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
dane = np.loadtxt('Samochody.txt')&lt;br /&gt;
# Badamy przyspieszenia&lt;br /&gt;
w = dane[:,5]&lt;br /&gt;
py.figure(1)&lt;br /&gt;
porownania(w)&lt;br /&gt;
# A teraz stosujemy transformację Box-Coxa&lt;br /&gt;
wt,lam = st.boxcox(w)&lt;br /&gt;
py.figure(2)&lt;br /&gt;
porownania(wt)&lt;br /&gt;
&lt;br /&gt;
# badamy masy&lt;br /&gt;
w = dane[:,4]&lt;br /&gt;
py.figure(3)&lt;br /&gt;
porownania(w)&lt;br /&gt;
# A teraz stosujemy transformację Box-Coxa&lt;br /&gt;
wt,lam = st.boxcox(w)&lt;br /&gt;
py.figure(4)&lt;br /&gt;
porownania(wt)&lt;br /&gt;
&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W pierwszym przypadku - asymetrię rozkładu przyspieszeń udało się transformacją B-C poprawić, ale w drugim przypadku, masa, asymetrię dało się skorygować (widać to na histfit) ale nie da się poprawić ''ciężkich ogonów'' - widać to zarówno na normplocie jak i na wynikach testów.&lt;br /&gt;
Ogólnie: zanim zaczniemy analizować dane dobrze jest je pooglądać na różnych wykresach i chwilę ''pomyśleć''.&lt;br /&gt;
&lt;br /&gt;
==Przykład (zastosowanie różnych testów do tych samych danych): karma==&lt;br /&gt;
Badamy dwie nowe karmy A i B. Mamy dwie grupy po 12 zwierząt. Uzyskane przyrosty masy są następujące:&lt;br /&gt;
&lt;br /&gt;
A: 31 34 29 26 32 35 38 34 31 29 32 31&lt;br /&gt;
&lt;br /&gt;
B: 26 24 28 29 30 29 31 29 32 26 28 32&lt;br /&gt;
&lt;br /&gt;
Pytanie:&lt;br /&gt;
Czy któraś z karm daje istotnie większe przyrosty masy?&lt;br /&gt;
&lt;br /&gt;
Poniżej rozwiążemy to zadanie stopniowo różnymi metodami. Kolejne kawałki kodu można dopisywać do tego samego pliku.&lt;br /&gt;
&lt;br /&gt;
ROZWIĄZANIE:&lt;br /&gt;
Przyjmujemy poziom istotności, na którym przeprowadzamy testy &amp;lt;math&amp;gt;\alpha = 0.05&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Badamy rozkłady danych:===&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
A=[ 31, 34, 29, 26, 32, 35, 38, 34, 31, 29, 32, 31];&lt;br /&gt;
B=[ 26, 24, 28, 29, 30, 29, 31, 29, 32, 26, 28, 32];&lt;br /&gt;
W, p_A = st.shapiro(A)&lt;br /&gt;
print('Dla grupy A:', p_A)&lt;br /&gt;
W, p_B = st.shapiro(B)&lt;br /&gt;
print('Dla grupy B:', p_B)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dla obu grup test Shapiro-Wilka nie daje nam podstaw do odrzucenia założenia o normalności rozkładów.&lt;br /&gt;
&lt;br /&gt;
===Test parametryczny===&lt;br /&gt;
Nie odrzuciliśmy hipotezy o normalnym rozkładzie danych zatem możemy zastosować  [[WnioskowanieStatystyczne/Test_t | test ''t'' ]] dla różnicy średnich.&lt;br /&gt;
&lt;br /&gt;
Formułujemy hipotezy:&lt;br /&gt;
* &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt;: średni przyrost masy w grupie A &amp;lt;math&amp;gt;=&amp;lt;/math&amp;gt; średni przyrost masy w grupie B&lt;br /&gt;
* &amp;lt;math&amp;gt;H_1&amp;lt;/math&amp;gt;: średni przyrost masy w grupie A &amp;lt;math&amp;gt;\ne&amp;lt;/math&amp;gt; średni przyrost masy w grupie B&lt;br /&gt;
Przeprowadzamy test:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
t, p = st.ttest_ind(A,B)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Otrzymujemy ''p'' = 0.01.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;p &amp;lt; \alpha &amp;lt;/math&amp;gt;,  zatem na przyjętym poziomie istotności odrzucamy hipotezę zerową i stwierdzamy, że grupa A ma inną średnią niż grupa B.&lt;br /&gt;
&lt;br /&gt;
===Test nieparametryczny ===&lt;br /&gt;
Nie zakładajac postaci  rozkładu danych mozemy zastosować test [[WnioskowanieStatystyczne/Test_Wilcoxona| ze statystykami opartymi na rangach]]. &lt;br /&gt;
Formułujemy hipotezy:&lt;br /&gt;
* &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt;: mediana przyrostu masy w grupie A &amp;lt;math&amp;gt;=&amp;lt;/math&amp;gt; mediana przyrostu masy w grupie B&lt;br /&gt;
* &amp;lt;math&amp;gt;H_1&amp;lt;/math&amp;gt;: mediana przyrostu masy w grupie A&amp;lt;math&amp;gt;\ne&amp;lt;/math&amp;gt; mediana przyrostu masy w grupie B&lt;br /&gt;
Przeprowadzamy test:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
U, p = st.mannwhitneyu(A, B)&lt;br /&gt;
p_dwustronne = 2*p&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
W pythonie zaimplementowana jest wersja jednostronna tego testu. Aby otrzymać prawdopodobieństwo ''p'' dla testu dwustronnego musimy pomnożyć je przez 2.&lt;br /&gt;
&lt;br /&gt;
===Testy bootstrapowe===&lt;br /&gt;
Teraz to samo sprawdzimy za pomocą testu repróbkowanego.&lt;br /&gt;
Przyda nam się tu funkcja do pobierania losowej próbki z powtórzeniami z danych:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
def randsample(x, N):&lt;br /&gt;
	'''zwraca wektor o dłougości N z losowo wybranymi elementami wektora x. Losowanie odbywa się z powtórzeniami''' &lt;br /&gt;
	n=len(x)&lt;br /&gt;
	ind = np.random.randint(n, size = N)&lt;br /&gt;
	y = x[ind]&lt;br /&gt;
	return y&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W testech repróbkowanych statystykę możemy wybrać dość dowolnie, ale jak pokażemy poniżej nie każda jest równie dobra.&lt;br /&gt;
Zgodnie z hipotezą zerową próbka A i  B pochodza z tej samej populacji.&lt;br /&gt;
Nasza najlepsza wiedza o owej populacji to połączone próbki A i B:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
POP=np.concatenate((A, B))&lt;br /&gt;
&lt;br /&gt;
N=len(POP)&lt;br /&gt;
NA=len(A)&lt;br /&gt;
NB=len(B)&lt;br /&gt;
# Zasymulujemy N_rep razy wyciagniecie z POP prob o rozmiarach NA i NB i&lt;br /&gt;
# zobaczymy jak czesto zdarzają się wartości statystyki  sie roznica srednich taka jak w oryginalnym&lt;br /&gt;
# pomiarze lub jeszcze wieksza. &lt;br /&gt;
N_rep=10000&lt;br /&gt;
# oryginalna roznica srednich i median:&lt;br /&gt;
mi_0 = np.abs(np.mean(A) - np.mean(B))&lt;br /&gt;
T_0  = np.abs(np.mean(A) - np.mean(B))/np.std(POP)&lt;br /&gt;
me_0 = np.abs(np.median(A) - np.median(B))&lt;br /&gt;
&lt;br /&gt;
mi = np.zeros(N_rep)&lt;br /&gt;
T  = np.zeros(N_rep)&lt;br /&gt;
me = np.zeros(N_rep)&lt;br /&gt;
&lt;br /&gt;
for i in range(N_rep):&lt;br /&gt;
	AA = randsample(POP,NA)&lt;br /&gt;
	BB = randsample(POP,NB)&lt;br /&gt;
	R_POP = np.concatenate((AA,BB))&lt;br /&gt;
	mi[i] = np.abs(np.mean(AA)-np.mean(BB)) # abs bo test dwustronny&lt;br /&gt;
	T[i]  = np.abs(np.mean(AA)-np.mean(BB))/np.std(R_POP)&lt;br /&gt;
	me[i] = np.abs(np.median(AA)-np.median(BB))&lt;br /&gt;
&lt;br /&gt;
p_mi = np.sum(mi&amp;gt;=mi_0)/N_rep&lt;br /&gt;
p_T  = np.sum( T&amp;gt;=T_0 )/N_rep&lt;br /&gt;
p_me = np.sum(me&amp;gt;=me_0)/N_rep&lt;br /&gt;
&lt;br /&gt;
print('testy repróbkowane: ')&lt;br /&gt;
print('rożnica średnich: ', p_mi)&lt;br /&gt;
print('pseudo T: ', p_T)&lt;br /&gt;
print('różnica median: ', p_me)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Widzimy, że dla testu ze statystyką różnicy średnich i  pseudo T dostajemy podobne wyniki, z tym, że pseudo T jest nieco silniejszy. Test ze statystyką różnicy średnich jest na tyle słaby, że nie pozwala na odrzucenie hipotezy zerowej.&lt;br /&gt;
&lt;br /&gt;
===Wnioskowanie w oparciu o przedziały ufności ===&lt;br /&gt;
Wnioskowanie o równości średnich dwóch grup można też przerowadzić w oparciu o przedziały ufności. W naszym przykładzie przedziały można skonstruować zarówno parametrycznie jak i nieparametrycznie.&lt;br /&gt;
==== Wersja parametryczna ====&lt;br /&gt;
Konstruujemy 95% przedział ufności wokół oryginalnej różnicy średnich.&lt;br /&gt;
Dla dwóch grup wariancję różnicy średnich znajdujemy sumując wariancje śrenich estymowane dla każdej z grup:&lt;br /&gt;
:&amp;lt;math&amp;gt; &lt;br /&gt;
\mathrm{var}_{\Delta} = \frac{1}{N_1}\mathrm{var}(x_1) + \frac{1}{N_2} \mathrm{var}(x_2)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
ilość stopni swobody:&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
 df = N_1+N_2-2&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
co prowadzi do estymatora&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
s^2_\Delta = \frac{N_1s_1^2 + N_2s_2^2}{N_1+N_2-2} \cdot \frac{N_1+N_2}{N_1N_2}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
roznica_oryginalna = np.mean(A) - np.mean(B)&lt;br /&gt;
f = NA+NB-2;&lt;br /&gt;
v_A = np.var(A)&lt;br /&gt;
v_B = np.var(B)&lt;br /&gt;
sig = np.sqrt( ((NA*v_A +NB*v_B))/f * (NA + NB)/(NA*NB) )&lt;br /&gt;
t_2_5 = st.t.ppf(0.025,f);&lt;br /&gt;
t_97_5 = st.t.ppf(0.975,f);&lt;br /&gt;
print('przedział ufności dla różnicy średnich przy założeniu normalności %(d).2f %(g).2f'%{'d':sig*t_2_5+ roznica_oryginalna,'g':sig*t_97_5+roznica_oryginalna})&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Otrzymujemy w wyniku &amp;lt;tt&amp;gt;przedział ufności dla różnicy średnich przy założeniu normalności 0.77 5.56&amp;lt;/tt&amp;gt;. Oznacza to, że w 95% analogicznych badań powinniśmy otrzymać różnicę średnich zawartą w tym przedziale. Przedził ten nie zawiera wartości 0, zatem na przyjętym poziomie istotności średnie grupy A i B są różne.&lt;br /&gt;
&lt;br /&gt;
====Wersja nieparametryczna ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# POP zawiera świat zgodny z H0&lt;br /&gt;
roznica_oryginalna = np.mean(A) - np.mean(B)&lt;br /&gt;
alfa = 0.05&lt;br /&gt;
N_rep = 10000&lt;br /&gt;
r = np.zeros(N_rep)&lt;br /&gt;
for i in range(N_rep):&lt;br /&gt;
	gA = randsample(POP, NA)&lt;br /&gt;
	gB = randsample(POP, NB)&lt;br /&gt;
	r[i] = np.mean(gA) - np.mean(gB)&lt;br /&gt;
ci_d = st.scoreatpercentile(r, per = alfa/2*100)&lt;br /&gt;
ci_g = st.scoreatpercentile(r, per = (1-alfa/2)*100)&lt;br /&gt;
# print('przedział ufności: %(d).2f %(g).2f'%{'m':np.mean(r),'d':ci_d+roznica_oryginalna, 'g':ci_g+roznica_oryginalna})&lt;br /&gt;
print('przedział ufności: %(d).2f %(g).2f'%{'m':np.mean(r),'d':ci_d, 'g':ci_g})&lt;br /&gt;
print('oryginalna różnica średnich: %(ro).2f'%{'ro':roznica_oryginalna})&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Wynik:&lt;br /&gt;
&amp;lt;tt&amp;gt;przedział ufności: -2.50 2.50&lt;br /&gt;
oryginalna różnica średnich: 3.17&amp;lt;/tt&amp;gt;.&lt;br /&gt;
Przedział ufności 95% na różnicę skonstruowany zgodnie z &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; nie zawiera oryginalnej różnicy średnich, &lt;br /&gt;
zatem różnica 3.17 w świecie zgodnym z &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; zdarza się nie częściej niż w 5% przypadków. Wniosek: średnie grup A i B są różne  na przyjętym poziomie ufności.&lt;br /&gt;
&lt;br /&gt;
== Zadanie: Przeżywalność myszy ==&lt;br /&gt;
Mamy 7 myszy, którym podano środek, który miał poprawić ich przeżywalność po operacji oraz 9 myszy kontrolnych, którym owego środka nie podano. Myszy traktowane specjalnie przeżyły &amp;lt;br&amp;gt;&lt;br /&gt;
94, 38, 23, 197, 99, 16, 141 dni&amp;lt;br&amp;gt;&lt;br /&gt;
a myszy traktowane standardowo:&amp;lt;br&amp;gt;&lt;br /&gt;
52, 10, 40, 104, 51, 27, 146, 30, 46 dni&amp;lt;br&amp;gt;&lt;br /&gt;
Średnia różnica wynosi 30,63 dni dłużej dla myszy traktowanych po nowemu.&lt;br /&gt;
Pytanie, na które chcielibyśmy znać odpowiedź to: Czy nowy środek faktycznie poprawia przeżywalność.&lt;br /&gt;
Zadanie proszę rozwiązać wszystkimi możliwymi sposobami, analogicznie do powyższego przykładu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Odp'': &lt;br /&gt;
:przedział ufności: [&amp;amp;minus;51,64 52,89]&lt;br /&gt;
:oryginalna różnica średnich: 30,63&lt;br /&gt;
:przedział ufności dla różnicy średnich przy założeniu normalności [&amp;amp;minus;27,99  89,26]&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
'''Przedział ufności dla różnicy dwóch średnich&lt;br /&gt;
&lt;br /&gt;
Mamy 7 myszy, którym podano środek, który miał poprawić ich przeżywalność &lt;br /&gt;
po operacji oraz 9 myszy kontrolnych, którym owego środka nie podano. &lt;br /&gt;
Myszy traktowane specjalnie przeżyły&lt;br /&gt;
94 38 23 197 99 16 141 dni&lt;br /&gt;
a myszy traktowane standardowo:&lt;br /&gt;
52 10 40 104 51 27 146 30 46 dni&lt;br /&gt;
Średnia różnica wynosi 30.63 dni dłużej dla myszy traktowanych po nowemu. &lt;br /&gt;
Pytanie, na które chcielibyśmy znać odpowiedź to: Czy nowy środek faktycznie &lt;br /&gt;
poprawia przeżywalność.&lt;br /&gt;
&lt;br /&gt;
Skonstruujmy przedział ufności 95% dla średniej różnicy w przeżywalności.&lt;br /&gt;
&lt;br /&gt;
Uwaga: przy tym problemie każdą z grup traktujemy jako reprezentantów bardzo &lt;br /&gt;
dużych populacji. '''&lt;br /&gt;
def randsample(x,ile):&lt;br /&gt;
	ind = st.randint.rvs(0,len(x),size = ile)&lt;br /&gt;
	y = x[ind]&lt;br /&gt;
	return y&lt;br /&gt;
&lt;br /&gt;
m_sp = np.array([94, 38, 23, 197, 99, 16, 141])&lt;br /&gt;
N_sp = len(m_sp)&lt;br /&gt;
m_st = np.array([52, 10, 40, 104, 51, 27, 146, 30, 46])&lt;br /&gt;
N_st = len(m_st)&lt;br /&gt;
alfa = 0.05&lt;br /&gt;
# zgodnie z hipotezą zerową (H0) nie ma różnicy między grupami&lt;br /&gt;
&lt;br /&gt;
# symulacja&lt;br /&gt;
# tworzymy świat zgodny z H0&lt;br /&gt;
m = np.concatenate((m_sp,m_st))&lt;br /&gt;
&lt;br /&gt;
roznica_oryginalna = np.mean(m_sp) - np.mean(m_st)&lt;br /&gt;
&lt;br /&gt;
N_rep = 10000&lt;br /&gt;
r = np.zeros(N_rep)&lt;br /&gt;
for i in range(N_rep):&lt;br /&gt;
	g1 = randsample(m, N_sp)&lt;br /&gt;
	g2 = randsample(m, N_st)&lt;br /&gt;
	r[i] = np.mean(g1) - np.mean(g2)&lt;br /&gt;
ci_d = st.scoreatpercentile(r, per = alfa/2*100)&lt;br /&gt;
ci_g = st.scoreatpercentile(r, per = (1-alfa/2)*100)&lt;br /&gt;
print('przedział ufności: %(d).2f %(g).2f'%{'m':np.mean(r),'d':ci_d, 'g':ci_g})&lt;br /&gt;
print('oryginalna różnica średnich: %(ro).2f'%{'ro':roznica_oryginalna})&lt;br /&gt;
# przedział ufności na różnicę skonstruowany zgodnie z H0 zawiera oryginalną różnicę średnich, &lt;br /&gt;
# zatem różnica taka jest na przyjętym poziomie ufności możliwa &lt;br /&gt;
# do zaobserwowania w przypadku braku różnicy między grupami&lt;br /&gt;
&lt;br /&gt;
# zakładając normalność&lt;br /&gt;
f = N_sp+N_st-2;&lt;br /&gt;
v_1 = np.var(m_sp)&lt;br /&gt;
v_2 = np.var(m_st)&lt;br /&gt;
sig = np.sqrt( ((N_sp*v_1 +N_st*v_2))/f * (N_sp + N_st)/float(N_sp*N_st) )&lt;br /&gt;
t_2_5 = st.t.ppf(0.025,f);&lt;br /&gt;
t_97_5 = st.t.ppf(0.975,f);&lt;br /&gt;
print('przedział ufności dla różnicy średnich przy założeniu normalności %(d).2f %(g).2f'%{'d':sig*t_2_5+ roznica_oryginalna,'g':sig*t_97_5+roznica_oryginalna})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
print('przedział ufności dla różnicy średnich przy założeniu normalności %(d).2f %(g).2f'%{'d':s_delta*t_2_5+ roznica_oryginalna,'g':s_delta*t_97_5+roznica_oryginalna})&lt;br /&gt;
# skonstruowany wokoł oryginalnej różnicy średnich przedział ufności zawiera 0, zatem nie możemy odrzucić możliwości,&lt;br /&gt;
# że nie ma różnicy między grupami&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zadanie: Linie lotnicze==&lt;br /&gt;
Linie lotnicze, projektując nowy samolot chcą sprawdzić czy średnia waga bagażu ręcznego zabieranego przez pasażerów nie zmieniła się od czasu poprzednich badań i wynosi wciąż 12 kg. Analiza ma być przeprowadzona na poziomie istotności &amp;lt;math&amp;gt;\alpha = 0,05&amp;lt;/math&amp;gt;. Analityk pobrał próbę bagażu ręcznego 144 pasażerów i obliczył wartość średnią z próby &amp;lt;math&amp;gt;\bar x = 14,6&amp;lt;/math&amp;gt; kg i odchylenie standardowe z próby &amp;lt;math&amp;gt;s = 7,8&amp;lt;/math&amp;gt;. Przeprowadź test hipotezy, że &amp;lt;math&amp;gt;\mu = 12&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
Standardowe importy modułów&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zmienne występujące w treści przykładu&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
mu_0=12&lt;br /&gt;
a=0.05&lt;br /&gt;
N=144&lt;br /&gt;
x=14.6&lt;br /&gt;
s=7.8&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Test dotyczy średniej wiec obliczamy odchylenie standardowe średniej:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
std_mu=s/np.sqrt(N)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wyjaśnienie |title= Obliczamy wartość statystyki:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt; &lt;br /&gt;
t=(mu_0-x)/std_mu&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Odchylenie standardowe estymowaliśmy z próby. Wartości powyższej statystyki podlegają zatem rozkładowi  t. Obliczamy wartości krytyczne odpowiadające poziomowi istotności a. Test jest dwustronny mamy wiec dwie wartości krytyczne: jedna odcina obszar pod funkcja gęstości prawdopodobieństwa na lewo,  a druga na prawo od siebie. Pole każdego z tych obszarów wynosi a/2:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt; &lt;br /&gt;
  &lt;br /&gt;
t_kryt_lewy = st.t.ppf(a/2,N-1)&lt;br /&gt;
t_kryt_prawy = st.t.ppf( 1-a/2, N-1)&lt;br /&gt;
&lt;br /&gt;
print('obliczona wartość statystyki t: ', t)&lt;br /&gt;
print('wartości krytyczne t: %(tl).2f %(tp).2f '%{'tl':t_kryt_lewy, 'tp':t_kryt_prawy})&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Możemy też obliczyć prawdopodobieństwo zaobserwowania wartości ''t'' takiej jak w naszym zadaniu lub bardziej ekstremalnej:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt; &lt;br /&gt;
p =  (st.t.cdf(-np.abs(t),N-1)) + (1-st.t.cdf(np.abs(t), N-1))  # sumujemy po obu ogonach  bo test jest dwustronny&lt;br /&gt;
print('Prawdopodobieństwo zaobserwowania bardziej ekstremalnych wartości t: %(p).4f'%{'p':p})&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wyniki te możemy zilustrować:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt; &lt;br /&gt;
os_t = np.arange(-5, 5, 0.1)&lt;br /&gt;
py.plot(os_t, st.t.pdf(os_t,N-1)) #rysujemy funkcję gęstości prawdopodobieństwa t o N-1 st. swobody&lt;br /&gt;
&lt;br /&gt;
#cieniujemy lewy obszary pod funkcją gęstości prawdopodobieństwa odpowiadający obliczonemu p&lt;br /&gt;
os_t2 = np.arange(-5, t_kryt_lewy, 0.1)&lt;br /&gt;
py.fill_between(os_t2,st.t.pdf(os_t2,N-1)) &lt;br /&gt;
#cieniujemy prawy obszary pod funkcją gęstości prawdopodobieństwa odpowiadający obliczonemu p&lt;br /&gt;
os_t2 = np.arange(t_kryt_prawy, 5,  0.1)&lt;br /&gt;
py.fill_between(os_t2,st.t.pdf(os_t2,N-1)) &lt;br /&gt;
&lt;br /&gt;
# zaznaczamy obliczoną wartość statystyki:&lt;br /&gt;
py.plot((t,), (0,), 'ro')&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Odpowiedź: Wyliczone ''t'' leży poza obszarem akceptacji hipotezy zerowej, zatem odrzucamy hipotezę zerową i akceptujemy alternatywną.&lt;br /&gt;
&lt;br /&gt;
==Zadanie: Agencja nieruchomości==&lt;br /&gt;
Agencja nieruchomości w Japonii podała, że ceny gruntu w centrum Tokio wzrosły o 49% w ciągu ostatniego roku. Inwestor chcąc przetestować te dane, znajduje próbę 18 nieruchomości w centrum Tokio, dla których zna cenę obecna i sprzed roku. Zakłada, że ceny podlegają rozkładowi normalnemu. Dla każdej nieruchomości oblicza procentowy wzrost wartości a następnie znajduje średnią i odchylenie standardowe z próby. Estymatory dla próby wynoszą &amp;lt;math&amp;gt;\bar x = 38&amp;lt;/math&amp;gt;% i &amp;lt;math&amp;gt;s = 14&amp;lt;/math&amp;gt;%. Przeprowadź test na poziomie istotności &amp;lt;math&amp;gt;\alpha = 0,01&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
mu_0=49;&lt;br /&gt;
x=38;&lt;br /&gt;
s=14;&lt;br /&gt;
N=18;&lt;br /&gt;
a=0.01;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# test dotyczy sredniej wiec jej std:&lt;br /&gt;
std_mu=s/np.sqrt(N)&lt;br /&gt;
&lt;br /&gt;
# odchylenie std obliczylismy z proby =&amp;gt; stosujemy test t&lt;br /&gt;
# obliczamy wartość statystyki &lt;br /&gt;
t=(mu_0-x)/std_mu&lt;br /&gt;
# obliczamy wartości krytyczne odpowiadające poziomowi istotności a&lt;br /&gt;
# test jest dwustronny mamy wiec dwie wartosci krytyczne &lt;br /&gt;
# jedna odcina obszar pod funkcja gęstości prawdopodobieństwa na lewo, &lt;br /&gt;
# a druga na prawo od siebie. Pole każdego z tych obszarów wynosi a/2&lt;br /&gt;
  &lt;br /&gt;
t_kryt_lewy = st.t.ppf(a/2,N-1)&lt;br /&gt;
t_kryt_prawy = st.t.ppf( 1-a/2, N-1)&lt;br /&gt;
&lt;br /&gt;
print('obliczona wartość statystyki t: ', t)&lt;br /&gt;
print('wartości krytyczne t: %(tl).2f %(tp).2f '%{'tl':t_kryt_lewy, 'tp':t_kryt_prawy})&lt;br /&gt;
&lt;br /&gt;
# Możemy też obliczyć prawdopodobieństwo zaobserwowania wrtości t takiej jak w naszym zadaniu &lt;br /&gt;
# lub bardziej ekstremalnej:&lt;br /&gt;
p = (1-st.t.cdf(t, N-1)) + (st.t.cdf(-t,N-1)) # sumujemy po obu ogonach  bo test jest dwustronny&lt;br /&gt;
		&lt;br /&gt;
print('Prawdopodobieństwo zaobserwowania bardziej ekstremalnych wrtości t: %(p).3f'%{'p':p})&lt;br /&gt;
# Wyniki te możemy zilustrować&lt;br /&gt;
os_t = np.arange(-5, 5, 0.1)&lt;br /&gt;
py.plot(os_t, st.t.pdf(os_t,N-1)) #rysujemy funkcję gęstości prawdopodobieństwa t o N-1 st. swobody&lt;br /&gt;
&lt;br /&gt;
#cieniujemy lewy obszary pod funkcją gęstości prawdopodobieństwa odpowiadający obliczonemu p&lt;br /&gt;
os_t2 = np.arange(-5, t_kryt_lewy, 0.1)&lt;br /&gt;
py.fill_between(os_t2,st.t.pdf(os_t2,N-1)) &lt;br /&gt;
#cieniujemy prawy obszary pod funkcją gęstości prawdopodobieństwa odpowiadający obliczonemu p&lt;br /&gt;
os_t2 = np.arange(t_kryt_prawy, 5,  0.1)&lt;br /&gt;
py.fill_between(os_t2,st.t.pdf(os_t2,N-1)) &lt;br /&gt;
&lt;br /&gt;
# zaznaczamy obliczoną wartość statystyki:&lt;br /&gt;
py.plot(t, 0, 'ro')&lt;br /&gt;
py.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# 'Odp: Wyliczone t lezy poza obszarem akceptacji hipotezy zerowej,&lt;br /&gt;
# zatej odrzucamy hipoteze zerowa i akceptujemy alternatywna.'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Odp. Odrzucamy &amp;lt;math&amp;gt;H_0:&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\mu_0 = 49&amp;lt;/math&amp;gt;, na poziomie istotności 0,01.&lt;br /&gt;
&lt;br /&gt;
==Zadanie: Zabiegi bio-inżynieryjne==&lt;br /&gt;
Załóżmy, że krowy są bardziej wartościowe od byków. Bio-inżynier twierdzi, że przy pomocy pewnych zabiegów jest w stanie spowodować zwiększenie szansy na urodzenie się krowy powyżej 50%. W jego eksperymencie na 10 urodzonych zwierząt 9 było krowami, a tylko 1 bykiem. Czy powinnniśmy wierzyć temu bio-inżynierowi? Jakia jest szansa na uzyskanie takiego, bądź bardziej ekstremalnego wyniku przy założeniu, że procedura stosowana przez naszego inżyniera nia ma żadnych efektów? W tym problemie dla odmiany założymy, że w normalnych warunkach 100 spośród 206 cieląt to krowy.&lt;br /&gt;
Zadanie rozwiązać metodą parametryczną i przez repróbkowanie. [[WnioskowanieStatystyczne/_Testowanie_hipotez#Przykład:_mutacje_muszek_owocowych|Wskazówka]]&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
def randsample(x, N):&lt;br /&gt;
	'''zwraca wektor z losowo wybranymi elementami wektora x. Losowanie odbywa się z powtórzeniami''' &lt;br /&gt;
	n=len(x)&lt;br /&gt;
	ind = np.random.randint(n, size = N)&lt;br /&gt;
	y = x[ind]&lt;br /&gt;
	return y&lt;br /&gt;
&lt;br /&gt;
# sposób pierwszy:&lt;br /&gt;
# zmienna urodzenie byka/krowy podlega rozkladowi dwumianowemu &lt;br /&gt;
p = 100.0/206&lt;br /&gt;
N = 10&lt;br /&gt;
k = 9&lt;br /&gt;
p_bino = 1-st.binom.cdf(k-1,N,p) #prawdopodobieństwo wylosowania 9 lub 10 krów w 10 probach &lt;br /&gt;
print('Prawdopodobieństwo wylosowania 9 lub 10 krów w 10 probach: %(p).4f'%{'p':p_bino})&lt;br /&gt;
# W jego mwetodzie chyba cos jest&lt;br /&gt;
&lt;br /&gt;
# sposob drugi: repróbkowanie&lt;br /&gt;
# model swiata z ktorego pochodza byki(0)/krowy(1):&lt;br /&gt;
w = np.concatenate((np.ones(100), np.zeros(106)))&lt;br /&gt;
&lt;br /&gt;
N_rep = 100000&lt;br /&gt;
wynik = np.zeros(N_rep)&lt;br /&gt;
for i in range(N_rep):&lt;br /&gt;
	wynik[i] = np.sum(randsample(w,10))&lt;br /&gt;
&lt;br /&gt;
p_rep = float(np.sum(wynik&amp;gt;=k))/N_rep&lt;br /&gt;
print('Prawdopodobieństwo wylosowania 9 lub 10 krów w 10 probach estymowane z symulacji: %(p).4f'%{'p':p_rep})&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''Odp'':  ''p'' = 0,008. Odrzucamy ''H''&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; o braku efektów.&lt;br /&gt;
&lt;br /&gt;
==Zadanie: Porównanie lekarstwa i placebo==&lt;br /&gt;
Badamy skuteczność leku na raka. Mamy grupę 12 chorych: 6 osobom podajemy lek &amp;amp;mdash; poprawa wystąpiła u 5 osób, pozostałym sześciu osobom podajemy placebo &amp;amp;mdash; poprawa wystąpiła u 2 osób. Czy te wyniki upoważniają do stwierdzenia, że lek istotnie zwiększa szansę poprawy? Test przeprowadzić na poziomie istotności 5%.&lt;br /&gt;
&lt;br /&gt;
Wskazówka: jako statystykę przyjąć różnicę w ilości popraw między grupą z lekiem a grupą z placebo. Interesuje nas prawdopodobieństwo zaobserwowania takiej (3) bądź większej różnicy. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
def randsample(x, N):&lt;br /&gt;
	'''zwraca wektor z losowo wybranymi elementami wektora x. Losowanie odbywa się z powtórzeniami''' &lt;br /&gt;
	n=len(x)&lt;br /&gt;
	ind = np.random.randint(n, size = N)&lt;br /&gt;
	y = x[ind]&lt;br /&gt;
	return y&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Formułujemy hipotezy &lt;br /&gt;
# H0: lek nie daje poprawy &lt;br /&gt;
# H1: lek daje poprawę&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# zgodnie z H0 obie próby pochodzą ze świata:&lt;br /&gt;
# pierwszy sposób: repróbkowanie&lt;br /&gt;
w = np.concatenate((np.ones(7), np.zeros(5))) # jedynki -&amp;gt; wystąpiła poprawa&lt;br /&gt;
&lt;br /&gt;
n_l = 5 # ilosc popraw w grupie leku&lt;br /&gt;
n_p = 2 #ilosc popraw w grupie placebo&lt;br /&gt;
# jako statystykę testową przyjmiemy różnicę w ilości popraw miedzy grupami&lt;br /&gt;
# w tym problemie istotne jest zwiększenie ilości popraw wiec stosujemy test&lt;br /&gt;
# jednostronny&lt;br /&gt;
N_rep = 100000&lt;br /&gt;
&lt;br /&gt;
st_0= n_l - n_p&lt;br /&gt;
st_rep=np.zeros(N_rep)&lt;br /&gt;
&lt;br /&gt;
for i in range(N_rep):&lt;br /&gt;
    n_l_rep   = np.sum(randsample(w,6))&lt;br /&gt;
    n_p_rep   = np.sum(randsample(w,6))&lt;br /&gt;
    st_rep[i] = n_l_rep - n_p_rep # wartość statystyki w i-tym repróbkowaniu&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
p_rep = float(np.sum(st_rep &amp;gt;= st_0))/N_rep&lt;br /&gt;
print('''Prawdopodobieństwo wylosowania takiej samej bądź większej różnicy w ilości popraw estymowane z symulacji: %(p).4f'''%{'p':p_rep})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# drugi sposób:&lt;br /&gt;
# zmienna uzyskanie poprawy podlega rozkładowi dwumianowemu &lt;br /&gt;
p = 7.0/12&lt;br /&gt;
N = 6&lt;br /&gt;
k1 = 5&lt;br /&gt;
k2 = 2&lt;br /&gt;
p_param = 0&lt;br /&gt;
for d in range(N-st_0+1):  # w tej pętli sumujemy prawdopodobieństwa zdarzeń  sprzyjających zaobserwowaniu różnicy co najmniej st_0 popraw &lt;br /&gt;
	p_bino1 = 1-st.binom.cdf(st_0 - 1 +d, N, p)  # prawdopodobieństwo uzyskania poprawy w co najmniej st_0 +d próbach&lt;br /&gt;
	p_bino2 = st.binom.pmf(d,N,p)   # prawdopodobieństwo uzyskania poprawy w d próbach&lt;br /&gt;
	p_param += p_bino1 * p_bino2 # prawdopodobieństwo zaobserwowania jednocześnie obu powyższych sytuacji&lt;br /&gt;
&lt;br /&gt;
print('Prawdopodobieństwo estymowane parametrycznie: %(p).4f'%{'p':p_param})&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: Odp: Prawdopodobieństwo wylosowania takiej samej bądź większej różnicy w ilości popraw estymowane z symulacji: 0,0702&lt;br /&gt;
Prawdopodobieństwo estymowane parametrycznie: 0,0699. Wniosek: nie mamy podstaw do odrzucenia hipotezy zerowej.&lt;br /&gt;
&lt;br /&gt;
==Zadanie: Pomiar masy cząstki elementarnej==&lt;br /&gt;
W pomiarach wstępnych zbadano masę spoczynkową pewnej cząstki elementarnej. Otrzymano następujące wyniki [MeV/c²]:&lt;br /&gt;
&lt;br /&gt;
139.20, 139.34, 140.22, 139.56, 139.42, 139.64, 139.22, 139.74, 139.38, 139.54,&lt;br /&gt;
139.38, 139.46, 140.09, 139.77, 139.52, 139.47, 139.89, 138.95, 139.99, 139.64,&lt;br /&gt;
139.37, 139.49, 139.15, 139.77, 140.10, 139.48, 139.84, 139.44, 140.13&lt;br /&gt;
&lt;br /&gt;
Zbadaj na poziomie istotności 1%, czy cząstką tą mógł być naładowany pion.&lt;br /&gt;
&lt;br /&gt;
Zbadaj na poziomie istotności 1%, czy cząstką tą mógł być neutralny pion.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
&lt;br /&gt;
alfa = 0.01 # poziom istotności&lt;br /&gt;
dane = np.array([139.20, 139.34, 140.22, 139.56, 139.42, 139.64, 139.22, 139.74,&lt;br /&gt;
                 139.38, 139.54, 139.38, 139.46, 140.09, 139.77, 139.52, 139.47,&lt;br /&gt;
                 139.89, 138.95, 139.99, 139.64, 139.37, 139.49, 139.15, 139.77,&lt;br /&gt;
                 140.10, 139.48, 139.84, 139.44, 140.13])&lt;br /&gt;
&lt;br /&gt;
Pi_plus_min = 139.57 # masa pionów naładowanych Pi+ i Pi-&lt;br /&gt;
Pi_neutral = 134.98  # masa pionu neutralnego Pi0&lt;br /&gt;
&lt;br /&gt;
# test t hipotezy H0, że dane pochodzą z rozkładu normalnego o wartości oczekiwanej Pi_plus_min&lt;br /&gt;
t1, p1 = st.ttest_1samp(dane,Pi_plus_min)&lt;br /&gt;
print(&amp;quot;Poziom p dla hipotezy, że był do pion naładowany&amp;quot;,p1)&lt;br /&gt;
if p1&amp;gt;=alfa: print(&amp;quot;Nie możemy odrzucić tej hipotezy na poziomie istotności {}%&amp;quot;.format(100*alfa))&lt;br /&gt;
else: print(&amp;quot;Możemy odrzucić tę hipotezę na poziomie istotności {}%&amp;quot;.format(100*alfa))&lt;br /&gt;
&lt;br /&gt;
# test t hipotezy H0, że dane pochodzą z rozkładu normalnego o średniej Pi_neutral&lt;br /&gt;
t2, p2 = st.ttest_1samp(dane,Pi_neutral)&lt;br /&gt;
print(&amp;quot;\nPoziom p dla hipotezy, że był do pion neutralny&amp;quot;,p2)&lt;br /&gt;
if p2&amp;gt;=alfa: print(&amp;quot;Nie możemy odrzucić tej hipotezy na poziomie istotności {}%&amp;quot;.format(100*alfa))&lt;br /&gt;
else: print(&amp;quot;Możemy odrzucić tę hipotezę na poziomie istotności {}%&amp;quot;.format(100*alfa))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Przykład: Średnie grup sparowanych: Lek przeciwdepresyjny==&lt;br /&gt;
Poniższa tabela prezentuje wyniki 9 pacjentów wykonujących pewien test diagnostyczny przed podaniem leku i po podaniu leku. &lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class='wikitable'&lt;br /&gt;
!przed	&lt;br /&gt;
!po&lt;br /&gt;
|-&lt;br /&gt;
|1,83	&lt;br /&gt;
|0,878&lt;br /&gt;
|-&lt;br /&gt;
|0,50	&lt;br /&gt;
|0,647&lt;br /&gt;
|-&lt;br /&gt;
|1,62	&lt;br /&gt;
|0,598&lt;br /&gt;
|-&lt;br /&gt;
|2,48	&lt;br /&gt;
|2,05&lt;br /&gt;
|-&lt;br /&gt;
|1,68	&lt;br /&gt;
|1,06&lt;br /&gt;
|-&lt;br /&gt;
|1,88	&lt;br /&gt;
|1,29&lt;br /&gt;
|-&lt;br /&gt;
|1,55	&lt;br /&gt;
|1,06&lt;br /&gt;
|-&lt;br /&gt;
|3,06	&lt;br /&gt;
|3,14&lt;br /&gt;
|-&lt;br /&gt;
|1,3	&lt;br /&gt;
|1,29&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
PRZED = [1.83, 0.5, 1.62, 2.48, 1.68, 1.88, 1.55, 3.06, 1.3]&lt;br /&gt;
PO = [0.878, 0.647, 0.598, 2.05, 1.06, 1.29, 1.06, 3.14, 1.29]&lt;br /&gt;
&lt;br /&gt;
Skonstruować test, który pozwoli stwierdzić czy lek jest skuteczny. Porównać różne wersje testu:&lt;br /&gt;
* bootstrapową (losowanie z powtórzeniami), &lt;br /&gt;
* permutacyjną, &lt;br /&gt;
* test parametryczny &lt;br /&gt;
* test nieparametryczny. &lt;br /&gt;
&lt;br /&gt;
Jakie założenia przyjmujemy przy każdej z wersji testu?&lt;br /&gt;
&lt;br /&gt;
===Rozwiązanie===&lt;br /&gt;
W tym zadaniu mamy dwie grupy ''przed'' i ''po'' ale oprócz tego istnieje ścisły porządek w parach, bez sensu jest porównywanie ''przed'' od jednego pacjenta z ''po'' drugiego pacjenta. Musimy stosować testy, które biorą ten porządek pod uwagę (testy pairwise).&lt;br /&gt;
&lt;br /&gt;
Jako miarę tego czy lek jest skuteczny przyjmiemy różnicę (''po'' - ''przed'').  Każda z zaobserwowanych różnic to zmienna losowa. Ich średnia to nasza STATYSTYKA. Będziemy wierzyli, że lek działa jeśli ta różnica jest istotnie mniejsza od zera. Mamy stąd hipotezy:&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;math&amp;gt;H_0: \bar r \geq 0&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;math&amp;gt;H_1: \bar r &amp;lt; 0 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Wersja bootstrapowa====&lt;br /&gt;
&lt;br /&gt;
Założenie, które czynimy w wersji bootstrapowej testu jest następujące:&lt;br /&gt;
Zaobserwowana grupa pacjentów jest reprezentatywna, tzn. istnieje duża populacja pacjentów spośród której moglibyśmy pobrać wiele innych grup podobnych pod względem interesujących nas parametrów do grupy zaobserwowanej w tym konkretnym eksperymencie. Konsekwencją tego założenia jest to, że jeśli w naszej grupie mamy już pacjenta z wynikami: [1.83,	0.878], to szansa na wylosowanie kolejnego pacjenta o takich wynikach się nie zmienia i nadal wynosi 1/9. Prowadzi to do implementacji zawierającej losowanie z powtórzeniami.&lt;br /&gt;
&lt;br /&gt;
Losowość występuje tu w dwóch miejscach:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; losujemy pacjentów z powtórzeniami - zakładamy, że badana grupa jest reprezentatywna dla bardzo dużej populacji.&lt;br /&gt;
&amp;lt;li&amp;gt; dla każdego z wybranych pacjentów losujemy jego wynik ''przed'' oraz wynik ''po'' z wyników, które uzyskał w rzeczywistości --- to jest zgodne z hipotezą zerową.&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Dla każdego losowania obliczamy wartość statystyki w tym losowania uśredniając  różnice indywidualne.&lt;br /&gt;
Wartości statystyki otrzymane dla wszystkich losowań tworzą jej empiryczny rozkład, przy założeniu, że hipoteza zerowa jest prawdziwa. Jako estymator prawdopodobieństwa zaobserwowania oryginalnej wartości statystyki ''mr'' (średnia różnica) przy prawdziwej hipotezie zerowej przyjmujemy frakcję rozkładu empirycznego, w której wartości statystyki były nie większe niż ''mr''. Wynik ilustrujemy histogramem rozkładu empirycznego z zaznaczoną ową frakcją.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
def randsample(x, N):&lt;br /&gt;
	'''zwraca wektor z losowo wybranymi elementami wektora x. &lt;br /&gt;
         Losowanie odbywa się z powtórzeniami''' &lt;br /&gt;
&lt;br /&gt;
	n=len(x)&lt;br /&gt;
	ind = np.random.randint(n, size = N)&lt;br /&gt;
	y = x[ind]&lt;br /&gt;
	return y&lt;br /&gt;
&lt;br /&gt;
def hist_z_markerem(x, N_bins, marker):&lt;br /&gt;
	'''Rysuje histogram wartości w tablicy x, używając N_bins binów. &lt;br /&gt;
	Na lewo od wartości wskazanej przez marker dorysowywany jest prostokąt'''&lt;br /&gt;
	&lt;br /&gt;
	r = np.max(x) - np.min(x)&lt;br /&gt;
	szer_binu = r/N_bins&lt;br /&gt;
&lt;br /&gt;
	#konstruujemy biny&lt;br /&gt;
        # robimy biny od markera co szerokość binu aż do x minimalnego&lt;br /&gt;
	biny_na_lewo = np.arange( marker, np.min(x), -szer_binu)&lt;br /&gt;
        # odwracamy kolejność tej sekwencji żeby była rosnąca&lt;br /&gt;
	biny_na_lewo = biny_na_lewo[-1::-1] &lt;br /&gt;
         # robimy biny od markera co szerokość binu aż do x maksymalnego&lt;br /&gt;
	biny_na_prawo = np.arange(marker,np.max(x), szer_binu)&lt;br /&gt;
        # sklejamy oba zakresy binów&lt;br /&gt;
	biny = np.concatenate((biny_na_lewo, biny_na_prawo))&lt;br /&gt;
	(n,xx,patch) = py.hist(x,bins = biny)&lt;br /&gt;
	py.fill([np.min(xx), np.min(xx), marker, marker] , [0, np.max(n), np.max(n), 0] ,'r' ,alpha = 0.2)&lt;br /&gt;
&lt;br /&gt;
A=np.array([[1.83,	0.878],&lt;br /&gt;
[0.50,	0.647],&lt;br /&gt;
[1.62,	0.598],&lt;br /&gt;
[2.48,	2.05],&lt;br /&gt;
[1.68,	1.06],&lt;br /&gt;
[1.88,	1.29],&lt;br /&gt;
[1.55,	1.06],&lt;br /&gt;
[3.06,	3.14],&lt;br /&gt;
[1.30,	1.29]])&lt;br /&gt;
&lt;br /&gt;
r = A[:,1] - A[:,0] # od drugiej kolumny odejmuję pierwszą&lt;br /&gt;
mr = np.mean(r)  # średnia z tych różnic to wartość statystyki zaobserwowana dla oryginalnych danych&lt;br /&gt;
print( 'średnia różnica: %(mr).2f'%{'mr':mr})&lt;br /&gt;
&lt;br /&gt;
N = len(r)&lt;br /&gt;
&lt;br /&gt;
N_rep = 100000&lt;br /&gt;
r_boot = np.zeros(N_rep)&lt;br /&gt;
przed = np.zeros(N)&lt;br /&gt;
po = np.zeros(N)&lt;br /&gt;
&lt;br /&gt;
for i in range(N_rep):&lt;br /&gt;
    ix=randsample(np.arange(0,N,1),N) # wybieramy pacjentów z powtórzeniami&lt;br /&gt;
    B=np.array(A[ix,:])&lt;br /&gt;
    for j in range(N):   # mieszamy losowo przypisując wyniki do grupy przed i po&lt;br /&gt;
                         # zakładając, że pacjent może uzyskać dwukrotnie taki sam wynik&lt;br /&gt;
        s = np.random.rand()&lt;br /&gt;
        if s &amp;gt; 0.5:&lt;br /&gt;
            przed[j]=B[j,0]&lt;br /&gt;
        else:&lt;br /&gt;
            przed[j]=B[j,1]&lt;br /&gt;
        s = np.random.rand()&lt;br /&gt;
        if s &amp;gt; 0.5:&lt;br /&gt;
            po[j]=B[j,1]&lt;br /&gt;
        else:&lt;br /&gt;
            po[j]=B[j,0]&lt;br /&gt;
    rr=po-przed&lt;br /&gt;
    r_boot[i] = np.mean(rr)&lt;br /&gt;
&lt;br /&gt;
hist_z_markerem(r_boot,30,mr)&lt;br /&gt;
p_h0 = np.sum( r_boot &amp;lt;=  mr)/N_rep&lt;br /&gt;
s_boot = u'dla repróbkowanego testu jednostronnego: %(p_h0).5f'%{'p_h0': p_h0}&lt;br /&gt;
print( s_boot)&lt;br /&gt;
py.title(s_boot)&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Wersja permutacyjna====&lt;br /&gt;
&lt;br /&gt;
W tym teście zakładamy, że grupa pacjentów jest unikalna, więc w procedurze wytwarzania empirycznego rozkładu statystyki  korzystamy z danych wszystkich pacjentów w każdej iteracji. &lt;br /&gt;
&lt;br /&gt;
Zgodnie z hipotezą zerową pomiary ''przed'' i ''po'' są równoważne można je zatem zamieniać. Wykonamy wszystkie możliwe zamiany ''przed'' i ''po''. Możliwych zamian jest &amp;lt;math&amp;gt;2^N&amp;lt;/math&amp;gt;.  Skorzystamy z faktu, że bity w reprezentacji binarnej liczb całkowitych od 0 do &amp;lt;math&amp;gt;2^{N-1}&amp;lt;/math&amp;gt; zawierają wszystkie możliwe permutacje ciągów zer i jedynek o długości ''N''. Wartości 1 zamienimy na logiczne True a wartości 0 na False. Zinterpretujemy True jako zamianę  i False jako brak zamiany. &lt;br /&gt;
&lt;br /&gt;
Dla każdej permutacji obliczamy wartość statystyki uśredniając  różnice indywidualne.&lt;br /&gt;
Wartości statystyki otrzymane dla wszystkich permutacji tworzą jej empiryczny rozkład, przy założeniu, że hipoteza zerowa jest prawdziwa. Jako estymator prawdopodobieństwa zaobserwowania oryginalnej wartości statystyki ''mr'' przy prawdziwej hipotezie zerowej przyjmujemy frakcję rozkładu empirycznego, w której wartości statystyki były nie większe niż ''mr''. Wynik ilustrujemy histogramem rozkładu empirycznego z zaznaczoną ową frakcją. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
 &lt;br /&gt;
def dec2bin(n, l):&lt;br /&gt;
    '''konwertuje dziesiętną liczbę całkowitą na tablicę &lt;br /&gt;
    przedstawiającą reprezentację binarną tej liczby&lt;br /&gt;
    n liczba do konwersji&lt;br /&gt;
    l długość reprezentacji binarnej &lt;br /&gt;
    zwracana jest binarna reprezentacja liczby &lt;br /&gt;
    skonwertowana do tablicy logicznej (0-&amp;gt;False, 1-&amp;gt; True)&lt;br /&gt;
    '''&lt;br /&gt;
    b = np.zeros(l, dtype = bool)&lt;br /&gt;
    if n &amp;lt; 0:  raise ValueError(&amp;quot;must be a positive integer&amp;quot;)&lt;br /&gt;
    i = 1&lt;br /&gt;
    while n &amp;gt; 0:&lt;br /&gt;
        b[l-i] = bool( n % 2 ) &lt;br /&gt;
        n = n &amp;gt;&amp;gt; 1&lt;br /&gt;
        i += 1&lt;br /&gt;
    return b&lt;br /&gt;
 &lt;br /&gt;
def hist_z_markerem(x, N_bins, marker):&lt;br /&gt;
	'''Rysuje histogram wartości w tablicy x, używając N_bins binów. &lt;br /&gt;
	Na lewo od wartości wskazanej przez marker dorysowywany jest prostokąt'''&lt;br /&gt;
 &lt;br /&gt;
	r = np.max(x) - np.min(x)	&lt;br /&gt;
	szer_binu = r/N_bins&lt;br /&gt;
 &lt;br /&gt;
	#konstruujemy biny&lt;br /&gt;
        # robimy biny od markera co szerokość binu aż do x minimalnego&lt;br /&gt;
	biny_na_lewo = np.arange( marker, np.min(x), -szer_binu)&lt;br /&gt;
        # odwracamy kolejność tej sekwencji żeby była rosnąca&lt;br /&gt;
	biny_na_lewo = biny_na_lewo[-1::-1] &lt;br /&gt;
         # robimy biny od markera co szerokość binu aż do x maksymalnego&lt;br /&gt;
	biny_na_prawo = np.arange(marker,np.max(x), szer_binu)&lt;br /&gt;
        # sklejamy oba zakresy binów&lt;br /&gt;
	biny = np.concatenate((biny_na_lewo, biny_na_prawo))&lt;br /&gt;
	(n,xx,patch) = py.hist(x,bins = biny )&lt;br /&gt;
	py.fill([np.min(xx), np.min(xx), marker, marker] , [0, np.max(n), np.max(n), 0] ,'r' ,alpha = 0.2)&lt;br /&gt;
 &lt;br /&gt;
A=np.array([[1.83, 0.878], [0.50, 0.647], [1.62, 0.598], [2.48, 2.05], [1.68, 1.06], [1.88, 1.29], [1.55, 1.06], [3.06, 3.14], [1.30, 1.29]])&lt;br /&gt;
 &lt;br /&gt;
r = A[:,1] - A[:,0] # od drugiej kolumny odejmuję pierwszą&lt;br /&gt;
mr = np.mean(r)  # średnia z tych różnic to wartość statystyki zaobserwowana dla oryginalnych danych&lt;br /&gt;
print( 'średnia różnica: %(mr).2f'%{'mr':mr} )&lt;br /&gt;
 &lt;br /&gt;
N = len(r)&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
N_perm = 2**N&lt;br /&gt;
r_perm = np.zeros(N_perm)&lt;br /&gt;
for i in range(2**N):&lt;br /&gt;
	B = np.array(A)   # B zawiera kopię tablicy A&lt;br /&gt;
	zamiana = dec2bin(i,N) # w których wierszach dokonać zamiany?&lt;br /&gt;
	# print( i,': ', zamiana )&lt;br /&gt;
	# wiersze tablicy B wskazane przez True w wektorze indeksów ind zamieniamy wartości  'przed' z wartościami 'po'&lt;br /&gt;
	B[zamiana, 0] = A[zamiana, 1] &lt;br /&gt;
	B[zamiana, 1] = A[zamiana, 0]&lt;br /&gt;
	rr = B[:,1] - B[:,0] # Obliczam wartości zmiennych losowych dla tej zamiany&lt;br /&gt;
	r_perm[i] = np.mean(rr) # Obliczmy wartość statystyki dla tej zamiany&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
p_h0 = np.sum( r_perm &amp;lt;=  mr)/N_perm&lt;br /&gt;
s_perm = u'dla permutacyjnego testu jednostronnego: %(p_h0).3f'%{'p_h0': p_h0}&lt;br /&gt;
print( s_perm)&lt;br /&gt;
hist_z_markerem(r_perm,30,mr)&lt;br /&gt;
py.title(s_perm)&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Wersja parametryczna====&lt;br /&gt;
&lt;br /&gt;
Jeśli badane różnice ''przed'' i ''po'' podlegają rozkładowi normalnemu to do testowania czy średnia wartość różnicy jest równa 0 można zastosować test ''t'' dla prób zależnych &amp;lt;tt&amp;gt;st.ttest_rel()&amp;lt;/tt&amp;gt;. Aby się upewnić, że możemy zastosować ten test badamy normalność różnic przy pomocy &amp;lt;tt&amp;gt;normplot()&amp;lt;/tt&amp;gt; oraz testu Shapiro-Wilka &amp;lt;tt&amp;gt;st.shapiro()&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
 &lt;br /&gt;
def normplot(x):&lt;br /&gt;
	'''normplot: x dane do testowania'''&lt;br /&gt;
 &lt;br /&gt;
	x_ord = sorted(x)&lt;br /&gt;
	N = len(x)&lt;br /&gt;
	y = np.zeros(N)&lt;br /&gt;
	y[0]=st.norm.ppf(1- 0.5**(1.0/N) )&lt;br /&gt;
	y[N-1] = st.norm.ppf(0.5**(1.0/N) )&lt;br /&gt;
	for i in range(1,N-1):&lt;br /&gt;
		arg = (i-0.3175)/(N+0.365)&lt;br /&gt;
		y[i] = st.norm.ppf(arg)&lt;br /&gt;
	py.plot(y,x_ord,'.')&lt;br /&gt;
 &lt;br /&gt;
A=np.array([[1.83, 0.878], [0.50, 0.647], [1.62, 0.598], [2.48, 2.05], [1.68, 1.06], [1.88, 1.29], [1.55, 1.06], [3.06, 3.14], [1.30, 1.29]])&lt;br /&gt;
&lt;br /&gt;
r = A[:,1] - A[:,0] # od drugiej kolumny odejmuję pierwszą&lt;br /&gt;
&lt;br /&gt;
normplot(r)&lt;br /&gt;
py.title(&amp;quot;Wyniki testów na normalność różnic\n Shapiro-Wilka:  W=%.3f, p=%.3f&amp;quot;%st.shapiro(r)&lt;br /&gt;
        +&amp;quot;\nKołmogorowa-Smirnowa: D=%.3f, p=%.3f&amp;quot;%st.kstest(r, 'norm', args=(np.mean(r),np.std(r,ddof=1))))&lt;br /&gt;
t, p = st.ttest_rel(A[:,1],A[:,0])&lt;br /&gt;
p_t = p/2 # aby test był jednostronny&lt;br /&gt;
s_t = u'dla parametrycznego testu jednostronnego: %(p_h0).3f'%{'p_h0': p_t}&lt;br /&gt;
print(s_t)&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Wersja nieparametryczna====&lt;br /&gt;
&lt;br /&gt;
W ogólności, nie zakładając normalności różnic można by przeprowadzić test Wilcoxona. W aktualnej implementacji tego testu w scipy.stats jest on dla naszych danych niedokładny, gdyż mamy małą liczebność grupy, a implementacja stosuje przybliżenia asymptotyczne.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
A=np.array([[1.83, 0.878], [0.50, 0.647], [1.62, 0.598], [2.48, 2.05], [1.68, 1.06], [1.88, 1.29], [1.55, 1.06], [3.06, 3.14], [1.30, 1.29]])&lt;br /&gt;
z, p = st.wilcoxon(A[:,1],A[:,0] )&lt;br /&gt;
p_w = p/2 # aby test był jednostronny&lt;br /&gt;
s_w = u'dla nieparametrycznego testu jednostronnego: %(p_h0).3f'%{'p_h0': p_w}&lt;br /&gt;
print( s_w)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Podsumowanie====&lt;br /&gt;
 średnia różnica: -0.43&lt;br /&gt;
 dla repróbkowanego testu jednostronnego: 0.0013&lt;br /&gt;
 dla permutacyjnego testu jednostronnego: 0.014&lt;br /&gt;
 Wynik testu Shapiro-Wilka na normalność różnic &lt;br /&gt;
 	 statystyka W: 0.921 &lt;br /&gt;
 	 prawdopodobieństwo takiej wartości statystyki dla rozkładu normalnego: 0.404&lt;br /&gt;
 dla parametrycznego testu jednostronnego: 0.008&lt;br /&gt;
 dla nieparametrycznego testu jednostronnego: 0.019&lt;br /&gt;
&lt;br /&gt;
Wszystkie testy wskazują prawdopodobieństwo zaobserwowania odpowiadających im statystyk poniżej przyjętego poziomu istotności &amp;lt;math&amp;gt;\alpha = 0.05&amp;lt;/math&amp;gt;. Zatem hipotezę zerową należy odrzucić i przyjąć hipotezę alternatywną.&lt;br /&gt;
&lt;br /&gt;
==Zadania==&lt;br /&gt;
&lt;br /&gt;
===Zanieczyszczenie środowiska===&lt;br /&gt;
Agencja ochrony środowiska ustaliła limit na koncentrację zanieczyszczeń emitowanych przez fabryki. Załóżmy, że dopuszczalny poziom zanieczyszczeń wynosi 55 cząstek na milion (cz/m) w promieniu dwóch kilometrów od fabryki. Kontrola przeprowadza 100 pomiarów o różnej porze dnia i roku w promieniu dwóch km od pewnej fabryki. Średnia z próby wyniosła 60 cz/m a odchylenie standardowe &amp;lt;math&amp;gt;s = 20&amp;lt;/math&amp;gt; cz/m. Czy dane te są wystarczające by na poziomie istotności &amp;lt;math&amp;gt;\alpha = 0,01&amp;lt;/math&amp;gt; uznać, że fabryka łamie prawo?&lt;br /&gt;
&lt;br /&gt;
Fabryka łamie prawo jeśli emituje zanieczyszczenia na poziomie wyższym niż dopuszczalny więc należy przeprowadzić test jednostronny (w tym przypadku prawostronny). Czy moglibyśmy odrzucić &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; na tym samym poziomie stosując test dwustronny?&lt;br /&gt;
Jest ważne aby w zależności od problemu wybrać odpowiedni test: jedno- lub dwustronny.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import numpy as np&lt;br /&gt;
 &lt;br /&gt;
x_c = 55 #cząstek na milion (cz/m) w promieniu dwóch kilometrów od fabryki. &lt;br /&gt;
#Kontrola przeprowadza &lt;br /&gt;
N = 100 # pomiarów o różnej porze dnia i roku w promieniu dwóch km. od pewnej fabryki. &lt;br /&gt;
#średnia z próby wyniosła &lt;br /&gt;
x_s = 60 # cz/m &lt;br /&gt;
# a odchylenie standardowe &lt;br /&gt;
s = 20 # cz/m. &lt;br /&gt;
# Czy dane te są wystarczające by uznać, że fabryka łamie prawo ?&lt;br /&gt;
alpha = 0.01&lt;br /&gt;
 &lt;br /&gt;
# H0: mu &amp;lt;=x_c&lt;br /&gt;
# H1: mu &amp;gt; x_c&lt;br /&gt;
# wystarczy sprawdzić jakie jest p dla największego dopuszczalnego stężenia &lt;br /&gt;
# mu = x_c zaobserwowania wartości średniej większej bądź równej zaobserwowanej x_s. &lt;br /&gt;
# Odchylenie std. dane jest dla populacji i trzeba je przeliczyć na odchylenie std. średniej.&lt;br /&gt;
p = 1 - st.t.cdf(x_s, df=N-1, loc = x_c, scale = s/np.sqrt(N) )&lt;br /&gt;
print(&amp;quot;poziom p&amp;quot;,p)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
############################&lt;br /&gt;
#inne (tożsame) rozwiązania:&lt;br /&gt;
&lt;br /&gt;
##wykorzystaniem &amp;quot;Survival function&amp;quot; zamiast dystrybuanty&lt;br /&gt;
p = st.t.sf(x_s, df=N-1, loc = x_c, scale = s/np.sqrt(N) )&lt;br /&gt;
print(&amp;quot;poziom p&amp;quot;,p)&lt;br /&gt;
&lt;br /&gt;
##obliczając statystykę t&lt;br /&gt;
t=(x_s-x_c)/(s/N**0.5)&lt;br /&gt;
p = 1-st.t.cdf(t,df=N-1)&lt;br /&gt;
print(&amp;quot;poziom p&amp;quot;,p)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Odp. &amp;lt;math&amp;gt;p=0,007&amp;lt;\alpha&amp;lt;/math&amp;gt;, zatem możemy odrzucić hipotezę &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; (głoszącą, że fabryka nie łamie prawa) na poziomie &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;  = 0,01.&lt;br /&gt;
&lt;br /&gt;
===Wzrost mocy turbin===&lt;br /&gt;
Turbina hydroelektryczna generuje moc średnią 25,2 kW. Po unowocześnieniu maszyny chcemy przetestować czy średnia moc generowana zmieniła się (na + lub &amp;amp;minus;). Przeprowadzono 115 pomiarów, które dały średnią 26,1 kW i odch. std. 3,2 kW. Przeprowadzić test statystyczny na poziomie istotności 1%, zinterpretować wynik. Wnioskowanie przeprowadzić także w oparciu oprzedział ufności.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
#-*- coding:utf-8 -*-&lt;br /&gt;
import numpy as np&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
N=115&lt;br /&gt;
m=25.2	#hipoteza zerowa mówi, że tyle wynosi moc&lt;br /&gt;
sr=26.1	#w pomiarach uzyskaliśmy taką średnią moc&lt;br /&gt;
s=3.2	#przy takim odchyleniu standardowym&lt;br /&gt;
&lt;br /&gt;
alfa=0.01&lt;br /&gt;
&lt;br /&gt;
#obliczenie poziomu p&lt;br /&gt;
t=(m-sr)/(s/N**0.5)&lt;br /&gt;
p = st.t.cdf(t,df=N-1) * 2 #mnozymy przez 2, bo chcemy testu dwustronnego&lt;br /&gt;
print(&amp;quot;poziom p&amp;quot;,p)&lt;br /&gt;
&lt;br /&gt;
#alternatywnie - obliczenie przedziału ufności&lt;br /&gt;
lo,hi = st.t.ppf([alfa/2, 1-alfa/2],df=N-1,loc=sr,scale=s/N**0.5)&lt;br /&gt;
print(&amp;quot;przedzial ufnosci [%.3g,%.3g]&amp;quot;%(lo,hi))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Odp.: &amp;lt;math&amp;gt;p=0,\!003&amp;lt;\alpha=0,\!01&amp;lt;/math&amp;gt;, zatem odrzucamy H0.&lt;br /&gt;
&lt;br /&gt;
Odp. (alt.): &amp;lt;math&amp;gt;\mu = 25,\!2 \not\in[25,\!3; 26,\!9]&amp;lt;/math&amp;gt;, zatem odrzucamy H0.&lt;br /&gt;
&lt;br /&gt;
===Sonda===&lt;br /&gt;
Władze miasta chciałyby wiedzieć, czy przyznać koncesję operatorowi sieci kablowej. W tym celu zleciły nam przeprowadzenie sondy wśród mieszkańców. Zapytaliśmy o zdanie 50 przypadkowo wybranych osób. 30 osób powiedziało &amp;amp;bdquo;tak&amp;amp;rdquo; a 20 &amp;amp;bdquo;nie&amp;amp;rdquo;. Na ile pewnie otrzymane wyniki wskazują, że mieszkańcy chcą tej kablówki?&lt;br /&gt;
&lt;br /&gt;
Celem naszych badań jest uniknięcie błędu polegającego na tym, że powiemy iż większość mieszkańców chce kablówki podczas gdy tak na prawdę to nie chce. &lt;br /&gt;
&lt;br /&gt;
Wskazówka: Granicznym przypadkiem popełnienia tego błędu jest proporcja 1:1 zwolenników i przeciwników kablówki. Jeśli przeciwników kablówki byłoby jeszcze więcej to uzyskanie naszych wyników byłoby jeszcze mniej prawdopodobne.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import numpy.random as rnd&lt;br /&gt;
&lt;br /&gt;
N=50&lt;br /&gt;
odp_na_tak=30&lt;br /&gt;
odp_na_nie=20&lt;br /&gt;
&lt;br /&gt;
#przypadek graniczny, który daje najwyższe prawdopodobieństwo uzyskania fałszywego wyniku na 'tak',&lt;br /&gt;
#to mieszkańcy niezdecydowani, czyli propocja 1:1&lt;br /&gt;
#(propocja przechylona w kierunki 'nie', da nam niższe oszacowanie&lt;br /&gt;
#a propocja przechylona w kierunku 'tak' nie oznaczałaby fałszywego wyniku sondy)&lt;br /&gt;
#zatem hipoteza zerowa brzmi, że nasz wynik pochodzi z populacji niezdecydowanej:&lt;br /&gt;
P=0.5 #prawdopodobieństwo, że respondent udzieli odpowiedzi na 'tak'&lt;br /&gt;
&lt;br /&gt;
#rozwiązanie parametryczne wymaga użycia rozkładu dwumianowego:&lt;br /&gt;
p = 1 - st.binom.cdf(29,50,P) #od 1 odejmujemy sumaryczne prawdopodobieństwo wszystkich przypadków udzielenia mniej niż 30 odpowiedzi na tak (czyli do 29 włącznie)&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;poziom p (parametrycznie)&amp;quot;,p)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#rozwiązanie przez symulację:&lt;br /&gt;
Nrand=100000&lt;br /&gt;
R=0 #rezultat, czyli liczba przypadków, w których przynajmniej 30 osób odpowiedziało tak&lt;br /&gt;
for i in range(Nrand):&lt;br /&gt;
	odpowiedzi = (rnd.random(N)&amp;lt;P) #losujemy odpowiedzi od N osób&lt;br /&gt;
	if odpowiedzi.sum() &amp;gt;=odp_na_tak: #jeśli zdażyło się co najmniej 30 odpowiedzi na tak, to dodajemy jeden do liczby takich przypadków&lt;br /&gt;
		R+=1&lt;br /&gt;
	&lt;br /&gt;
print(&amp;quot;poziom p (z symulacji)&amp;quot;,R/Nrand) #na koniec dzielimy przez liczbę wszystkich sond w symulacji&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Wybory prezydenckie===&lt;br /&gt;
W ankiecie uzyskaliśmy 840 głosów popierających kandydaturę A i 660 kandydaturę B. Jaka jest szansa, że tak naprawdę kandydat B ma  poparcie 50% lub większe? Jakie jest prawdopodobieństwo pojawienia sie zaobserwowanej próbki lub próbki wskazującej na jeszcze większe poparcie dla kandydata A, jeśli w rzeczywistości poparcie kandydata A byłoby  50% lub mniej.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import numpy.random as rnd&lt;br /&gt;
&lt;br /&gt;
# rozwiązanie parametryczne&lt;br /&gt;
A = 840&lt;br /&gt;
B = 660&lt;br /&gt;
N = A+B&lt;br /&gt;
&lt;br /&gt;
#przypadek graniczny, który daje najwyższe prawdopodobieństwo uzyskania fałszywego wyniku na 'tak',&lt;br /&gt;
#to mieszkańcy niezdecydowani, czyli propocja 1:1&lt;br /&gt;
#propocja przechylona w kierunki 'nie', da nam niższe oszacowanie&lt;br /&gt;
#a propocja przechylona w kierunku 'tak' nie oznaczałaby fałszywego wyniku sondy&lt;br /&gt;
#zatem hipoteza zerowa brzmi, że nasz wynik pochodzi z populacji niezdecydowanej:&lt;br /&gt;
p_sukces = 0.5&lt;br /&gt;
&lt;br /&gt;
#rozwiązanie parametryczne&lt;br /&gt;
p = 1 - st.binom.cdf(A-1,N,p_sukces)&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;poziom p (parametrycznie)&amp;quot;,p)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#rozwiązanie przez symulację:&lt;br /&gt;
&lt;br /&gt;
#wiemy już, że musimy oszacować bardzo niskie prawdopodobieństwo, zatem symulacja musi być długa&lt;br /&gt;
#(gdybyśmy nie wiedzieli, to łatwo byśmy zauważyli, że krótka symulacja nie daje w ogóle zdarzeń sprzyjających dając wynik p=0)&lt;br /&gt;
#niestety trzeba pokusić się o optymalizację (mimo to kod będzie się wykonywał kilkadziesiąt sekund do kilku minut):&lt;br /&gt;
#chemy mieć przynajmniej 10^7 sond, ale każda sonda to 1500 odpowiedzi, zatem łącznie musimy wylosować 1.5*10^10 liczb&lt;br /&gt;
#losowanie w pętli 10^7 razy kolejnych sond po 1500 odpowiedzi zajmie bardzo bardzo dużo czasu&lt;br /&gt;
#tablica 1.5*10^10 odpowiedzi wygenerowana jednym poleceniem nie zmieści się w pamięci&lt;br /&gt;
#musimy skorzystać z rozwiązania pośredniego&lt;br /&gt;
#będziemy losować 100 razy po 1.5*10^8 odpowiedzi i dodamy wyniki&lt;br /&gt;
&lt;br /&gt;
Nrand_1=100    # 10^2&lt;br /&gt;
Nrand_2=100000 # 10^5&lt;br /&gt;
N = A+B        # 1.5*10^3&lt;br /&gt;
&lt;br /&gt;
Nrand_total = Nrand_1*Nrand_2&lt;br /&gt;
&lt;br /&gt;
R=0 #liczba sond, w których kandydat A uzyskał poparcie 840 lub większe&lt;br /&gt;
#po każdym przebiegu pętli będziemy dodawać liczbę takich przypadków (jeśli wystąpiły w danej iteracji)&lt;br /&gt;
&lt;br /&gt;
for i in range(Nrand_1):&lt;br /&gt;
	#w każdej iteracji losujemy odpowiedzi od N osób w Nrand_2 sondach&lt;br /&gt;
	#iteracji będzie w sumie Nrand_1, co da nam łącznie N osób w Nrand_total sondach&lt;br /&gt;
	#jako, że zakładamy równe prawdopodobieństwo, to może możemy wylosować tablicę zawierającą tylko 0 i 1&lt;br /&gt;
	#gdzie 1 oznacza sukces (głos na kandydata A), a 0 porażkę&lt;br /&gt;
	#korzystając z funksji randint, która zwraca (pseudo)losowe liczby całkowite z zakresu [a,b)&lt;br /&gt;
	a,b = 0,2 &lt;br /&gt;
	odpowiedzi = rnd.randint(a,b,size=(N,Nrand_2)) &lt;br /&gt;
	S = np.sum(odpowiedzi,axis=0)  #wyniki kolejnych sond (sumujemy sukcesy w wierszach)&lt;br /&gt;
&lt;br /&gt;
	R+=np.sum(S&amp;gt;=A) #dodajemy liczbę sond, w których kandydat A uzyskał poparcie 840 lub większe (w danej iteracji pętli)&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;poziom p (z symulacji)&amp;quot;,R/Nrand_total) #na koniec dzielimy przez liczbę wszystkich sond w symulacji&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Czy stosunek do marihuany się zmienił?===&lt;br /&gt;
Rozważmy dwie ankiety przeprowadzone w USA, pytano 1500 respondentów o stosunek do legalizacji marihuany. Pierwszą ankietę przeprowadzono w 1980, wówczas za legalizacją opowiadało się 52% a drugą w 1985 i za legalizacją było 46%. Czy wyniki tych dwóch ankiet są istotnie różne?&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
# rozwiązanie parametryczne&lt;br /&gt;
za1 = int(0.52*1500)&lt;br /&gt;
za2 = int(0.46*1500)&lt;br /&gt;
N = 1500&lt;br /&gt;
&lt;br /&gt;
# H0: stosunek się nie zmienił zatem p_za było w obu anlietach takie samo:&lt;br /&gt;
p_za = (0.52+0.46)/2&lt;br /&gt;
&lt;br /&gt;
# Jakie jest prawdopodobieństwo zaobserwowoania wyników ankiet o takiej bądź większej &lt;br /&gt;
# różnicy głosów za, jeśli obie są zgodne z H0 ?&lt;br /&gt;
D = za1 - za2&lt;br /&gt;
&lt;br /&gt;
#musimy zsumować wszystkie możliwości, w których wystąpiła taka różnica lub większa&lt;br /&gt;
#zrobimy to w pętli&lt;br /&gt;
p_binom = 0.0&lt;br /&gt;
for k in range(N-D+1):&lt;br /&gt;
	p1 = st.binom.pmf(k,N,p_za) # prawdopodobieństwo uzyskania dokładnie k głosów za&lt;br /&gt;
	&lt;br /&gt;
	# sumujemy prawdopodobieństwa uzyskania liczby głosów różnej przynajmniej o D&lt;br /&gt;
	przypadki_o_roznicy_przynajmniej_D = np.arange(k+D,N+1)&lt;br /&gt;
	p2 = np.sum(st.binom.pmf(przypadki_o_roznicy_przynajmniej_D,N,p_za))&lt;br /&gt;
	#co jest równoważne:&lt;br /&gt;
	#p2 = 1-st.binom.cdf(k+D-1,N,p_za)&lt;br /&gt;
	&lt;br /&gt;
	#sumujemy dla kolejnych k&lt;br /&gt;
	p_binom += p1*p2 # mnożymy prawdopodobieństwa ponieważ są wyniki obu sond są niezależne&lt;br /&gt;
	&lt;br /&gt;
p=2*p_binom #mnożymy przez 2, ponieważ robimy test dwustronny (różnica mogła wystąpić również w drugą stronę)&lt;br /&gt;
print(&amp;quot;p =&amp;quot;,p)&lt;br /&gt;
&lt;br /&gt;
# rozwiązanie symulacyjne (tym razem skorzystamy z randsample)&lt;br /&gt;
def randsample(x, N):&lt;br /&gt;
	'''zwraca wektor z losowo wybranymi elementami wektora x. Losowanie odbywa się z powtórzeniami''' &lt;br /&gt;
	n=len(x)&lt;br /&gt;
	ind = np.random.randint(n, size = N)&lt;br /&gt;
	y = x[ind]&lt;br /&gt;
	return y&lt;br /&gt;
&lt;br /&gt;
N_rep = 100000&lt;br /&gt;
# świat zgodny z H0:&lt;br /&gt;
H0 = np.concatenate((np.zeros(N*(1-p_za)), np.ones(N*p_za)))&lt;br /&gt;
&lt;br /&gt;
a = np.zeros(N_rep)&lt;br /&gt;
for i in range(N_rep):&lt;br /&gt;
	w1 = np.sum(randsample(H0,N))&lt;br /&gt;
	w2 = np.sum(randsample(H0,N))&lt;br /&gt;
	a[i] = np.abs(w1-w2)&lt;br /&gt;
p = np.sum(a&amp;gt;=D)/N_rep&lt;br /&gt;
print(p)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zawały serca i cholesterol===&lt;br /&gt;
Badano grupę 605 osób. 135 osób z tej grupy miało wysoki poziom cholesterolu a 470 niski. W grupie z wysokim poziomem cholesterolu odnotowano 10 przypadków zawału serca a w grupie z niskim poziomem 21, w czasie 16 lat obserwacji. Nasze pytanie brzmi: Czy możemy uznać, że wysoki poziom cholesterolu zwiększa ryzyko zawału serca?&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
# rozwiązanie parametryczne&lt;br /&gt;
wysoki = 135&lt;br /&gt;
niski = 470&lt;br /&gt;
N = 605&lt;br /&gt;
wysoki_zawaly = 10&lt;br /&gt;
niski_zawaly = 21&lt;br /&gt;
N_zaw = wysoki_zawaly + niski_zawaly &lt;br /&gt;
&lt;br /&gt;
# H0: proporcja zawałowców w obu grupach taka sama:&lt;br /&gt;
p_zawalu = N_zaw/N&lt;br /&gt;
# H1: proporcja jest różna, test jednostronny (wysoki cholesterol ZWIĘKSZA ryzyko)&lt;br /&gt;
&lt;br /&gt;
# Jakie jest prawdopodobieństwo zaobserwowania wyników badania o takiej bądź większej &lt;br /&gt;
# różnicy proporcji zawałów, jeśli obie są zgodne z H0 ?&lt;br /&gt;
roznica = wysoki_zawaly/wysoki - niski_zawaly/niski&lt;br /&gt;
&lt;br /&gt;
p_binom = 0.0&lt;br /&gt;
for k_wys in range(wysoki+1):&lt;br /&gt;
	p_wys = st.binom.pmf(k_wys,wysoki,p_zawalu) # prawdopodobieństwo uzyskania k_wys zawałów grupie o liczebności wysoki&lt;br /&gt;
	for k_nis in range(niski+1): &lt;br /&gt;
		if k_wys/wysoki - k_nis/niski&amp;gt;=roznica: # czy liczebności k_wys i k_nis dają większą bądź równą różnice proporcji?&lt;br /&gt;
			p_nis = st.binom.pmf(k_nis,niski,p_zawalu) # prawdopodobieństwo uzyskania k_nis zawałów w grupie o niskim cholesterolu&lt;br /&gt;
			p_binom += p_wys*p_nis # zdarzenia są niezależne&lt;br /&gt;
&lt;br /&gt;
print(p_binom)&lt;br /&gt;
&lt;br /&gt;
# rozwiązanie symulacyjne&lt;br /&gt;
def randsample(x, N):&lt;br /&gt;
	'''zwraca wektor z losowo wybranymi elementami wektora x. Losowanie odbywa się z powtórzeniami''' &lt;br /&gt;
	n=len(x)&lt;br /&gt;
	ind = np.random.randint(n, size = N)&lt;br /&gt;
	y = x[ind]&lt;br /&gt;
	return y&lt;br /&gt;
&lt;br /&gt;
N_rep = 100000&lt;br /&gt;
# świat zgodny z H0:&lt;br /&gt;
H0 = np.concatenate((np.zeros(N-N_zaw), np.ones(N_zaw)))&lt;br /&gt;
&lt;br /&gt;
wyn = np.zeros(N_rep)&lt;br /&gt;
for i in range(N_rep):&lt;br /&gt;
	wysoki_zawaly_r = np.sum(randsample(H0,wysoki))&lt;br /&gt;
	niski_zawaly_r = np.sum(randsample(H0,niski))&lt;br /&gt;
	wyn[i] = wysoki_zawaly_r/wysoki - niski_zawaly_r/niski&lt;br /&gt;
p = np.sum(wyn&amp;gt;=roznica)/N_rep&lt;br /&gt;
print(p)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Czy gęstości planet się różnią?===&lt;br /&gt;
Rozważmy pięć planet znanych w antycznym świecie. Chcemy zbadać, czy planety wewnętrzne Merkury (0,68) i Wenus (0,94) mają istotnie większe gęstości niż planety zewnętrzne Mars (0,71) Jowisz (0,24) i Saturn (0,12)?&lt;br /&gt;
&lt;br /&gt;
Wskazówki: &lt;br /&gt;
* Unikalność zestawu planet wskazuje na zastosowanie testu permutacyjnego.&lt;br /&gt;
* Moduł implementujący funkcje kombinatoryczne w pythonie to &amp;lt;tt&amp;gt;itertools &amp;lt;/tt&amp;gt;. Zawiera on funkcję &amp;lt;tt&amp;gt;permutations&amp;lt;/tt&amp;gt;. Wywołanie &amp;lt;tt&amp;gt;itertools.permutations(sekwencja[, r])&amp;lt;/tt&amp;gt; zwraca obiekt permutacji. Obiekt ten zwraca kolejne permutacje o długości r elementów w sekwencji (np. w wektorze). Przykład:&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
import itertools&lt;br /&gt;
for kolejny in itertools.permutations(range(3), 2):&lt;br /&gt;
    print(kolejny)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import itertools as itt&lt;br /&gt;
PLANETY = np.array([0.68,0.94,0.71,0.24,0.12])&lt;br /&gt;
N=len(PLANETY)&lt;br /&gt;
&lt;br /&gt;
r=[] #używamy listy, bo nie chcemy obliczać ile będzie przypadków (aczkolwiek można to zrobić)&lt;br /&gt;
&lt;br /&gt;
for planety in itt.permutations(PLANETY):&lt;br /&gt;
	r.append(np.mean(planety[:2])-np.mean(planety[2:]))&lt;br /&gt;
&lt;br /&gt;
R=np.mean(PLANETY[:2])-np.mean(PLANETY[2:]) #prawdziwa różnica&lt;br /&gt;
&lt;br /&gt;
r=np.array(r) #porównanie z liczbą działa tylko dla tablic numpy, a nie dla list&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;p =&amp;quot;,np.sum(r&amp;gt;=R)/len(r))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Elektrownia jądrowa===&lt;br /&gt;
Przed wybudowaniem elektrowni jądrowej przeprowadzono pomiary intensywności promieniowania jonizującego w pobliżu planowanego budynku reaktora. Powtórzono te pomiary po uruchomieniu reaktora. Czy zebrane dane pozwalają stwierdzić, że poziom promieniowania istotnie wzrósł? Dane pomiarowe wczytaj z [[Media:pomiary_skazen.txt| pliku]].&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Rozwiązanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
&lt;br /&gt;
alfa = 0.01 # poziom istotności&lt;br /&gt;
&lt;br /&gt;
PRZED, PO = np.loadtxt('Pomiary_skazen.txt') #wczytanie danych (dwa zbiory przed uruchomieniem i po)&lt;br /&gt;
&lt;br /&gt;
t, p = st.ttest_ind(PRZED, PO) # wykorzystanie gotowej funkcji wykonującej DWUSTRONNY test t na różnicę średnich&lt;br /&gt;
                            # dla danych NIESPAROWANYCH (niezależnych)&lt;br /&gt;
                            # ttest_ind  - ind od independent &lt;br /&gt;
                            # ttest_rel  - rel od related &lt;br /&gt;
&lt;br /&gt;
p/=2 # dzielimy przez dwa ponieważ chcemy zrobić test jednostronny&lt;br /&gt;
print(&amp;quot;Poziom p&amp;quot;,p)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Odp. &amp;lt;math&amp;gt;p=0,\!39&amp;gt;\alpha=0,\!01&amp;lt;/math&amp;gt;, zatem nie mamy podstaw do odrzucenia hipotezy &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt;, że poziom promieniowania istotnie wzrósł.&lt;/div&gt;</summary>
		<author><name>Maciek</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG&amp;diff=11232</id>
		<title>Laboratorium EEG</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG&amp;diff=11232"/>
		<updated>2025-02-25T10:23:08Z</updated>

		<summary type="html">&lt;p&gt;Maciek: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Pracownie specjalistyczne]]&lt;br /&gt;
__NOTOC__&lt;br /&gt;
==Informacje bieżące==&lt;br /&gt;
&amp;lt;!--:[[Laboratorium_EEG/Info_1| Grupa 1: MK+JR]]&lt;br /&gt;
:[[Laboratorium_EEG/Info_2| Grupa 2: JZ+AG]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zajęcia są prowadzone przez Macieja Kamińskiego i Jarosława Żygierewicza&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zajęcia odbywają się w sali 4.59:&lt;br /&gt;
* we wtorki w godzinach 11:15 - 13:30&lt;br /&gt;
* w środy w godzinach 10:45 - 13:00&lt;br /&gt;
&lt;br /&gt;
== Warunki zaliczenia ==&lt;br /&gt;
Ćwiczenia zostaną zaliczone osobom, które spełnią dwa niezwykle proste warunki:&lt;br /&gt;
* Posiadanie maksymalnie dwóch nieusprawiedliwionych nieobecności na ćwiczeniach,&lt;br /&gt;
* Posiadanie przynajmniej połowy sumy punktów ze wszystkich prezentacji,&lt;br /&gt;
* ... ''(do ustalenia).''&lt;br /&gt;
&lt;br /&gt;
=== Elementy oceniane w prezentacji:===&lt;br /&gt;
* poprawność zastosowanego algorytmu -&amp;gt; należy przygotować opis ideowy algorytmu w punktach/na schemacie &lt;br /&gt;
* prezentacja wykonanych testów pokazujacych, że algorytm działa poprawnie &lt;br /&gt;
* jakość kodu (czytelność, komentarze, struktura, czy ktoś komu mielibyśmy przekazać ten kod ma sznsę go zrozumieć)&lt;br /&gt;
* wykazanie się zrozumieniem otrzymanych wyników.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--* Posiadanie przynajmniej połowy sumy punktów ze wszystkich kartkówek&lt;br /&gt;
* Osobom spełniającym powyższe warunki zaproponowana zostanie pozytywna ocena końcowa z Laboratorium.&lt;br /&gt;
* Osoby nie mające tego szczęścia, otrzymają ocenę negatywną.&lt;br /&gt;
&lt;br /&gt;
* Możliwe będzie poprawienie zaproponowanej oceny na wyższą poprzez zrealizowanie dodatkowego projektu. Jego cel zostanie ustalony indywidualnie.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Materiały dydaktyczne==&lt;br /&gt;
Zestaw przykładowych materiałów dotyczących analizy danych w Matlabie towarzyszący książce autorstwa Katarzyny J. Blinowskiej i Jarosława Żygierewicza zatytułowanej &amp;quot;Practical Biomedical Signal Analysis Using MATLAB® Second Edition]&amp;quot; ([https://books.google.pl/books?id=hSpHEAAAQBAJ&amp;amp;pg=PA1&amp;amp;hl=pl&amp;amp;source=gbs_toc_r&amp;amp;cad=3#v=onepage&amp;amp;q&amp;amp;f=false spis treści]):&lt;br /&gt;
 &lt;br /&gt;
https://static.routledge.com/9781138364417/matlab.zip&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Wprowadzenie do przetwarzania sygnałów online===&lt;br /&gt;
* [[Laboratorium_EEG/Wprowadzenie_do_syg_online|ONLINE]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 10.03.2021 Pomiar EEG spoczynkowe, artefakty i alfa +P300 ===&lt;br /&gt;
Proszę powtórzyć informacje z : &lt;br /&gt;
* [[Pracownia_Sygnałów_Biologicznych/Zajecia_9]]. W szczególności proszę zwrócić uwagę na:&lt;br /&gt;
** porcedurę zakładania czepka&lt;br /&gt;
** przygotowanie skóry do pomiaru&lt;br /&gt;
** kolejność mocowania elektrod w czepku&lt;br /&gt;
* [[Pracownia_EEG/EEG_spoczynkowe]]&lt;br /&gt;
** Jakie wyróżniamy rytmy i na jakiej podstawie?&lt;br /&gt;
** Jakie są główne źródła artefaktów?&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* [[Pracownia_EEG/Potencjały_wywołane#Zadanie_3:_rejestracja_i_analiza_potencja.C5.82u_P3]]&lt;br /&gt;
** Co to jest potencjał P300&lt;br /&gt;
Lektura uzupełniająca o P300:&lt;br /&gt;
Linden, D. E. J. (2005). The P300: Where in the Brain Is It Produced and What Does It Tell Us? The Neuroscientist, 11(6), 563–576. https://doi.org/10.1177/1073858405280524&lt;br /&gt;
(Z IP wydziałowego można pobrać ten art. w pdf)&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Wprowadzenie do Matlaba===&lt;br /&gt;
* [[Laboratorium_EEG/Wprowadzenie_do_Matlaba|Wprowadzenie do Matlaba]]&amp;lt;br&amp;gt;&lt;br /&gt;
* [[Laboratorium_EEG/Konwerter_plików_Svarog–Matlab|Wczytywanie do Matlaba plików binarnych z programu Svarog]]&lt;br /&gt;
* [[Laboratorium_EEG/EEGLAB|Pakiet EEGLAB]]&lt;br /&gt;
&lt;br /&gt;
===Filtry przestrzenne===&lt;br /&gt;
* [[Laboratorium_EEG/CSP|Filtry przestrzenne]]:  metody ślepej separacji źródeł&lt;br /&gt;
&lt;br /&gt;
===Zależności przyczynowe===&lt;br /&gt;
* [[Laboratorium_EEG/AR_1|Wielokanałowa analiza parametryczna/Zależności przyczynowe]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Słuchowe potencjały stanu ustalonego: zmiany mocy pasmowej i metody ślepej separacji źródeł===&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
===Metody czas-częstość===&lt;br /&gt;
&amp;lt;!--* [[Wstęp do analizy obrazu]]--&amp;gt;&lt;br /&gt;
* [[Laboratorium_EEG/Analiza czas-częstość w matlabie|Analiza czas-częstość w matlabie]]&lt;br /&gt;
* [[Laboratorium_EEG/Analiza zjawiska ERD/ERS|Analiza zjawiska ERD/ERS]]&lt;br /&gt;
&lt;br /&gt;
=== MP===&lt;br /&gt;
* [[Laboratorium_EEG/MMP|MMP]]&lt;/div&gt;</summary>
		<author><name>Maciek</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_Sygna%C5%82%C3%B3w_Biologicznych/Zajecia_9&amp;diff=11226</id>
		<title>Pracownia Sygnałów Biologicznych/Zajecia 9</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_Sygna%C5%82%C3%B3w_Biologicznych/Zajecia_9&amp;diff=11226"/>
		<updated>2025-01-22T10:52:58Z</updated>

		<summary type="html">&lt;p&gt;Maciek: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Wstęp=&lt;br /&gt;
Filmik wstępny o pomiarach EEG: https://medtube.pl/neurologia/filmy-medyczne/20643-eeg?alh=1040be48cf2ead6f193ef0cd3b158dca&lt;br /&gt;
&lt;br /&gt;
[[Plik:Kom_piramid.png|mały]]&lt;br /&gt;
&lt;br /&gt;
[[Plik:Piramid_prady.png|mały]]&lt;br /&gt;
&lt;br /&gt;
[[Plik:EEG_dipol.png|mały]]&lt;br /&gt;
&lt;br /&gt;
[[Plik:grzybkowe_2.png|250px|thumb|right|&amp;lt;figure id=&amp;quot;fig:Grzybkowe_2&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt; Przykład kompletnej elektrody grzybkowej. &lt;br /&gt;
Elektrody grzybkowe. Zaprezentowany na zdjęciu &amp;lt;xr id=&amp;quot;fig:Grzybkowe_1&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt;) metalowy rdzeń owinięty jest gazikiem.]]&lt;br /&gt;
[[Plik:grzybkowe_1.png|250px|thumb|right|&amp;lt;figure id=&amp;quot;fig:Grzybkowe_1&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt; Metalowy rdzeń elektrody grzybkowej.]]&lt;br /&gt;
[[Plik:grzybkowe_czepek.png|250px|thumb|right|&amp;lt;figure id=&amp;quot;fig:grzybkowe_czepek&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt; Czepek do mocowania elektrod grzybkowych założony na szklany model głowy.]]&lt;br /&gt;
[[Plik:miseczkowe_1.png|250px|thumb|right|&amp;lt;figure id=&amp;quot;fig:Miseczkowe_1&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt; Elektrody miseczkowe chlorosrebrowe (Ag-AgCl) do rejestracji sygnału EEG, bezpośrednio przyklejane do powierzchni głowy. Elektroda w górnej części zdjęcia zaprezentowano od strony, która styka się głową. Elektroda w dolnej części zdjęcia została pokazana od strony wierzchniej. Otwory w elektrodach Ag-AgCl służą do umieszczania w nich specjalnych żeli poprawiających przewodnictwo prądu..]]&lt;br /&gt;
[[Plik:miseczkowe_2a.png|250px|thumb|right|&amp;lt;figure id=&amp;quot;fig:Miseczkowe_2a&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt; Elektrody miseczkowe chlorosrebrowe z innej perspektywy.]]&lt;br /&gt;
[[Plik:miseczkowe_2b.png|250px|thumb|right|&amp;lt;figure id=&amp;quot;fig:Miseczkowe_2b&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt; Elektrody miseczkowe chlorosrebrowe. Strzałka wskazuje otwór w elektrodzie, którym wprowadza się żel przewodzący do przestrzeni pomiędzy elektrodą a skórą. Zielonym okręgiem zaznaczono płaski brzeg elektrody, który bezpośrednio styka się ze skórą człowieka.]]&lt;br /&gt;
[[Plik:miseczkowe_3.png|250px|thumb|right|&amp;lt;figure id=&amp;quot;fig:Miseczkowe_3&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt; Przykład elektrod mocowanych do głowy przy pomocy czepka.]]&lt;br /&gt;
[[Plik:miseczkowe_czepek.png|350px|thumb|right|&amp;lt;figure id=&amp;quot;fig:Miseczkowe_czepek&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt; (A) - przykład czepka do mocowania elektrod rejestrujacych sygnał EEG. (B) - czepek wraz z kilkoma elektrodami nałozony na szklany model głowy.]]&lt;br /&gt;
[[Plik:miseczkowe_4.png|250px|thumb|right|&amp;lt;figure id=&amp;quot;fig:Miseczkowe_4&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt; Jeszcze jeden przykład elektrody mocowanej do głowy za pomoca czepka i sam czepek.]]&lt;br /&gt;
[[Plik:10-20.png|350px|thumb|right|&amp;lt;figure id=&amp;quot;fig:10-20&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt; Lokalizacja elektrod 10-20 na jednowymiarowym rzucie głowy. ]]&lt;br /&gt;
[[Plik:pozycje.png|350px|thumb|right|&amp;lt;figure id=&amp;quot;fig:Pozycje&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt; Płaszczyzny anatomiczne ciała ludzkiego: A – płaszczyzna poprzeczna (horyzontalna), B – płaszczyzna czołowa, C – płaszczyzna strzałkowa. Rysunek pochodzi z artykułu opublikowanego na stronach Wikipedii [http://pl.wikipedia.org/wiki/Pozycja_anatomiczna].]]&lt;br /&gt;
[[Plik:czaszka.png|350px|thumb|right|&amp;lt;figure id=&amp;quot;fig:Czaszka&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt; .]]&lt;br /&gt;
&lt;br /&gt;
Elektroencefalogram (gr. elektron elektryczny, enkephalos mózg, gramma litera/pismo, w skrócie EEG) to zapis czynności elektrycznej mózgu, rejestrowany na powierzchni głowy człowieka. Czynność elektryczną mózgu można również rejestrować bezpośrednio z kory mózgowej, przy pomocy specjalnie układanych na jej powierzchni bądź elektrod umieszczonych bezpośrednio na korze mózgu. Tak zebrany sygnał nazywany jest Elektrokortikogramem  (ECoG). &lt;br /&gt;
Kora mózgowa człowieka składa się z około &amp;lt;math&amp;gt;10^{11}&amp;lt;/math&amp;gt; komórek nerwowych (neuronów), z których każda zdolna jest do generowania czynności elektrycznej w postaci:&lt;br /&gt;
* potencjału czynnościowego - to jest krótkotrwałej (rzędu 1 ms) zmiany potencjału błonowego komórki o amplitudzie ~120 mV, względem potencjału spoczynkowego&lt;br /&gt;
* pobudzających i hamujących potencjałów postsynaptycznych - to jest zmian polaryzacji błony komórkowej, trwających od kilkudziesięciu (zwykle 10-30 ms) do nawet kilkuset milisekund, które powstają w wyniku aktywacji synaps danego neuronu przez inne komórki nerwowe. Amplituda tych potencjałów nie przekracza 10 mV. &lt;br /&gt;
&lt;br /&gt;
Obecnie uważa się, że rejestrowana na powierzchni głowy człowieka czynność elektryczna, jest zbiorczą aktywnością wielu potencjałów postsynaptycznych, powstałych na skutek synchronicznego pobudzenia komórek nerwowych. Potencjały czynnościowe, mimo stosunkowo wysokiej amplitudy, mają bardzo krótki czas trwania, a z związku z tym w ich widmie dominują składowe wysoko częstościowe, które są silnie tłumione przez takie tkanki jak płyn mózgowo - rdzeniowy, opony mózgowe-rdzeniowe, kości czaszki oraz skórę. Ponadto krótki czas trwania potencjałów czynnościowych uniemożliwia sumowanie się tych aktywności. W trakcie przetwarzanie informacji przez mózg zwykle pobudzane są całe populacje komórek nerwowych, które mogą się składać nawet z 10000 komórek nerwowych. Komórki te pobudzane są synchroniczne, co sprzyja sumowaniu się od poszczególnych komórek długotrwałych potencjałów postsynaptycznych i powstawaniu zbiorczej aktywności elektrycznej. Również ta aktywność jest silnie tłumiona przez tkanki znajdujące się pomiędzy korą mózgową a powierzchnią głowy. Amplituda sygnału EEG wynosi od 1 &amp;amp;mu;V do około 100 &amp;amp;mu;V, zwykle rzadko jednak przekracza 50 &amp;amp;mu;V. Przyjmuje się, że widmo sygnału EEG mieści się w zakresie od 0 do 100 Hz, w praktyce klinicznej zazwyczaj rejestruje się sygnały w paśmie od ułamka do 50 Hz. Czynność elektryczna mózgu rejestrowana na powierzchni głowy człowieka jest zatem niezwykle słaba. Wszystkie dotychczas poznane i rejestrowane przez nas na zajęciach sygnały mają amplitudy znacznie wyższe, czasami o kilka rzędów wielkości. Sygnały takie jak EKG, EMG, Elektrookulogram zawierają w sobie niezwykle ważną informację diagnostyczną, jednak z punktu widzenia pomiaru EEG są artefaktami, to jest sygnałami które zakłócają rejestrację czynności elektrycznej mózgu. Na najbliższych zajęciach dowiemy się jak rejestrować sygnał EEG, minimalizując wpływ potencjałów elektrycznych pochodzących od innych organów. &lt;br /&gt;
&lt;br /&gt;
==Elektrody pomiarowe==&lt;br /&gt;
Zadaniem elektrod do pomiaru czynności elektrycznej mózgu jest zamiana prądów jonowych płynących po powierzchni głowy na prąd elektronowy i przesłanie tego prądu do aparatu wzmacniającego. Elektrody pomiarowe, jak wspomniano na pierwszych zajęciach, wykonane są z metali niereaktywnych, głównie srebra, lub srebra pokrytego chlorkiem srebra, niekiedy również ze złota oraz platyny. W pomiarach EEG spotykamy się głównie z dwoma trzema rodzajami elektrod, którymi są:&lt;br /&gt;
# Elektrody ''grzybkowe'', zbudowane z metalu uformowanego w kształt zaprezentowany na &amp;lt;xr id=&amp;quot;fig:Grzybkowe_2&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt; i &amp;lt;xr id=&amp;quot;fig:Grzybkowe_1&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt;. Jak można zauważyć, jeden koniec elektrody zakończony jest płaskim dyskiem, który owija się watą oraz gazą, podczas gdy do drugiego końca przymocowane są odpowiednio wyprofilowane elementy z tworzywa sztucznego, służące do umieszczenia elektrody na powierzchni głowy. Całość przypomina kształtem grzyb, stąd nazwa tego typu elektrod. Elektrody grzybkowe mocowane są do powierzchni głowy przy pomocy czepków (&amp;lt;xr id=&amp;quot;fig:grzybkowe_czepek&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt;), których gumowe wężyki dociskają elektrodę do skóry. Przed wykonaniem badania elektrody grzybkowe należy nasączyć w roztworze soli fizjologicznej, która pełni w tym wypadku rolę elektrolitu i zapewnia przewodnictwo prądu pomiędzy skóra a elektrodą. Elektrody grzybkowe są powszechnie stosowane do rejestracji sygnału EEG, jednakże nie są zbyt wygodne dla pacjenta, czującego ucisk plastikowych i gumowych elementów czepka oraz elektrod. W związku z tym, stosuje się je głownie do krótkotrwałych, nie przekraczających 30 minut badań. Jeśli wymagany jest dłuższy pomiar sygnału EEG, powinno się używać inne typy elektrod, omówione w kolejnym punkcie. &lt;br /&gt;
# Elektrody ''miseczkowe'', mające kształt wklęsłego dysku bądź krążka (&amp;lt;xr id=&amp;quot;fig:Miseczkowe_1&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt;, &amp;lt;xr id=&amp;quot;fig:Miseczkowe_2a&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt;), o płaskich brzegach. Zazwyczaj tego rodzaju elektrody są elektrodami chlorosrebrowymi - dysk wykonany jest ze srebra, pokrytego chlorkiem srebra. Spotyka się również elektrody miseczkowe wykonane ze złota lub platyny. Nowe elektrody chlorosrebrowe mają ciemno brązowy lub ciemno fioletowy kolor, który zawdzięczają związkowi chlorku-srebra. Elektrody miseczkowe umieszcza się na głowie za pomocą specjalnych klei. Jednym z najbardziej znanych jest kolodium. Klej ten rozprowadza się po płaskim brzegu elektrody (&amp;lt;xr id=&amp;quot;fig:Miseczkowe_2b&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt;), a następnie przykłada się ją w odpowiednim miejscu na głowie badanej osoby. Po wyschnięciu, kolodium jest w stanie utrzymać elektrodę przy skórze nawet przez klika dni. Tak zamocowane elektrody odkleja się przy pomocy rozpuszczalnika acetonowego. Po umieszczeniu elektrody na głowie, pomiędzy skórą a elektrodą tworzy się wolna przestrzeń wypełniona przez włosy oraz powietrze. Aby umożliwić przewodzenie prądu, pomiędzy skórą a elektrodą wprowadza się za pomocą tępej igły odpowiednie żele przez otwór znajdujący się w elektrodzie miseczkowej (&amp;lt;xr id=&amp;quot;fig:Miseczkowe_2b&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt;). Wadą kolodium jest stosunkowo długi czas potrzebny na jego wyschnięcie. Niedogodności tej pozbawione są nowe rodzaje klejów, które pełnią jednocześnie rolę spoiwa mocującego elektrodę do skóry jak i żelu zapewniającego kontakt elektrody ze skórą. Wadą z kolei tych klejów jest ich stosunkowo niska, w porównaniu z kolodium, przyczepność. Tak przyklejone do głowy elektrody, w przypadku gwałtownego ruchu pacjenta, mogą łatwo ulec odczepieniu od skóry. Ponadto kleje te są wodo-zmywalne, co z jednej strony ułatwia zdjęcie elektrod, z drugiej jednak strony powoduje rozpuszczenie kleju pod wpływem potu wydzielanego przez pacjenta. W związku z tym, kleje wodo-zmywalne uniemożliwiają dłuższe niż 3 - 4 godzinne badanie EEG. Pewnym rodzajem elektrod miseczkowych są elektrody mocowane do głowy przy pomocy specjalnych czepków &amp;lt;xr id=&amp;quot;fig:Miseczkowe_3&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt;, &amp;lt;xr id=&amp;quot;fig:Miseczkowe_czepek&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt;, &amp;lt;xr id=&amp;quot;fig:Miseczkowe_4&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt; przypominających kształtem czepek pływacki. Tego typu czepki wyposażone są w otwory z odpowiednimi zaczepami. Po założeniu czepka o rozmiarze dostosowanym do wielkości głowy badanej osoby, za pomocą tępej igły ze strzykawką wpuszcza się odpowiedni żel, a następnie wpina się elektrody. &lt;br /&gt;
# Klipsy&lt;br /&gt;
&lt;br /&gt;
===Lokalizacja elektrod na powierzchni głowy. System 10-20===&lt;br /&gt;
Liczba elektrod wykorzystywanych w pomiarze czynności elektrycznej mózgu, jak ich lokalizacja na powierzchni głowy może być bardzo różnorodna. Przykładowo, w badaniach naukowych stosuje się od kilku do nawet kilkuset elektrod, które mogą być w przybliżeniu równomiernie rozmieszczone na powierzchni głowy jak i być skoncentrowane tylko w pewnych jej obszarach. &lt;br /&gt;
W praktyce klinicznej elektrody pomiarowe rozlokowywane są na powierzchni głowy, według pewnego międzynarodowego standardu, opracowanego w latach 50 ubiegłego wieku - tzw. Systemu 10-20. Pomiary czynności elektrycznej mózgu dokonuje się w tym systemie za pomocą 19 elektrod rozmieszczonych w miejscach, które wyznacza się po uprzednim zmierzeniu pewnych charakterystycznych wymiarów głowy oraz dwóch elektrod referencyjnych przyczepionych w okolicach uszu. Nazwy elektrod Systemu 10-20 zawierają cyfry, które są nieparzyste dla elektrod umieszczonych po lewej stronie głowy i parzystymi dla elektrod umieszczonych po prawej stronie. Na rysunku &amp;lt;xr id=&amp;quot;fig:10-20&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt; zaprezentowano jednowymiarowy rzut głowy, na którym pokazano pozycje wszystkich elektrod systemu 10-20. Poniższa tabela zawiera spis oraz przybliżoną lokalizacje tych elektrod.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
 |+ Elektrody systemu 10-20 &lt;br /&gt;
 ! nr.&lt;br /&gt;
 ! Półkula lewa&lt;br /&gt;
 ! Linia środkowa głowy&lt;br /&gt;
 ! Półkula prawa&lt;br /&gt;
 ! Główny obszar mózgu, z którego elektroda rejestruje aktywność elektryczną&lt;br /&gt;
 |-&lt;br /&gt;
 | 1&lt;br /&gt;
 | Fp1&lt;br /&gt;
 |&lt;br /&gt;
 | Fp2&lt;br /&gt;
 | elektrody czołowe (lub przedczołowej), rejestrują aktywność głównie z płatów czołowych mózgu&lt;br /&gt;
 |-&lt;br /&gt;
 | 2&lt;br /&gt;
 | F3&lt;br /&gt;
 | &lt;br /&gt;
 | F4&lt;br /&gt;
 | elektrody środkowo czołowe, rejestrują aktywność głównie z okolic płatów czołowych mózgu&lt;br /&gt;
 |-&lt;br /&gt;
 | 3&lt;br /&gt;
 | F7&lt;br /&gt;
 |&lt;br /&gt;
 | F8&lt;br /&gt;
 | elektrody czołowa dolna (lub przednio skroniowa), rejestrują aktywność z okolicy oczodołowej, przednio skroniowej i bocznej czołowej mózgu&lt;br /&gt;
 |-&lt;br /&gt;
 | 4&lt;br /&gt;
 |&lt;br /&gt;
 | Fz&lt;br /&gt;
 | &lt;br /&gt;
 | elektroda środkowo czołowa, rejestruje aktywność z okolicy środkowej i przyśrodkowej okolicy czołowej&lt;br /&gt;
 |-&lt;br /&gt;
 | 5&lt;br /&gt;
 | T3&lt;br /&gt;
 |&lt;br /&gt;
 | T4&lt;br /&gt;
 | elektrody środkowo skroniowe, rejestrują aktywność z okolicy przednio skroniowej i środkowo skroniowej mózgu&lt;br /&gt;
 |-&lt;br /&gt;
 | 6&lt;br /&gt;
 | T5&lt;br /&gt;
 |&lt;br /&gt;
 | T6&lt;br /&gt;
 | elektrody tylno skroniowe, rejestrują aktywność z okolicy tylno skroniowej mózgu&lt;br /&gt;
 |-&lt;br /&gt;
 | 7&lt;br /&gt;
 | C3&lt;br /&gt;
 |&lt;br /&gt;
 | C4&lt;br /&gt;
 | elektrody rejestrujące aktywność z okolicy szczeliny (bruzdy) Rolanda [http://pl.wikipedia.org/wiki/Bruzda_Rolanda].&lt;br /&gt;
 |-&lt;br /&gt;
 | 8&lt;br /&gt;
 |&lt;br /&gt;
 | Cz&lt;br /&gt;
 | &lt;br /&gt;
 | elektroda środkowo centralna, rejestruje aktywność z środkowej i przyśrodkowej okolicy centralnej&lt;br /&gt;
 |-&lt;br /&gt;
 | 9&lt;br /&gt;
 | P3&lt;br /&gt;
 |&lt;br /&gt;
 | P4&lt;br /&gt;
 | elektrody ciemieniowe, rejestrują aktywność z okolicy ciemieniowej mózgu&lt;br /&gt;
 |-&lt;br /&gt;
 | 10&lt;br /&gt;
 | &lt;br /&gt;
 | Pz&lt;br /&gt;
 | &lt;br /&gt;
 | elektroda środkowo ciemieniowa, rejestruje aktywność z środkowej i przyśrodkowej okolicy ciemieniowe&lt;br /&gt;
 |-&lt;br /&gt;
 | 11&lt;br /&gt;
 | O1&lt;br /&gt;
 |&lt;br /&gt;
 | O2&lt;br /&gt;
 | elektrody potyliczne, rejestrują aktywność z okolicy potylicznej mózgu&lt;br /&gt;
 |-&lt;br /&gt;
 | 12&lt;br /&gt;
 | A1&lt;br /&gt;
 | &lt;br /&gt;
 | A2&lt;br /&gt;
 | elektroda uszne, rejestrują aktywność z okolicy środkowo skroniowej, używane są jako elektrody referencyjne (odniesienia) &lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Lokalizując elektrody do pomiaru czynności elektrycznej mózgu, opisuje się ich położenie w trzech płaszczyznach - strzałkowej, wieńcowej i poziomej. Płaszczyzna strzałkowa jest jedną z płaszczyzn określających pozycję anatomiczną człowieka i została zaprezentowana na rysunku &amp;lt;xr id=&amp;quot;fig:Pozycje&amp;quot;&amp;gt; rys. %i&amp;lt;/xr&amp;gt;. Położenie płaszczyzny wieńcowej i poziomej zostanie opisane w dalszej części rozdziału. Elektrody Systemu 10-20 rozmieszcza się na głowie pacjenta, po uprzednim pomiarze długości pewnych łuków biegnących w wyżej wymienionych płaszczyznach. Początki i końce tych łuków określone są względem kilku charakterystycznych punktów na powierzchni głowy.&lt;br /&gt;
====Wyznaczenie płaszczyzny strzałkowej głowy i wymiaru strzałkowego====&lt;br /&gt;
Rozmieszczenie elektrod EEG rozpoczynamy od określenia płszczyzny strzałkowej głowy. Płaszczyzna ta przebiega przez punkty   &lt;br /&gt;
''nasion'' (zagłębienie na szczycie nosa - patrz rysunek  &amp;lt;xr id=&amp;quot;fig:Czaszka&amp;quot;&amp;gt;&amp;lt;/xr&amp;gt;), wzdłuż linii środkowej głowy do punktu ''inion'' (wypukłość leżąca w linii środkowej podstawy czaszki - patrz rysunek &amp;lt;xr id=&amp;quot;fig:Czaszka&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt;) i dzieli głowę na półkulę prawą i lewą. Wymiar strzałkowy głowy jest to długość łuku biegnącego w płaszczyźnie strzałkowej od punktu ''nasion''  poprzez szczyt głowy, do punktu ''inion''. Na rysunku &amp;lt;xr id=&amp;quot;fig:10-20&amp;quot;&amp;gt; rys. %i&amp;lt;/xr&amp;gt; łuk ten zaznaczono kolorem czerwonym.&lt;br /&gt;
&lt;br /&gt;
====Wyznaczenie płaszczyzny wieńcowej i wymiaru wieńcowego głowy====&lt;br /&gt;
Do określenia płaszczyzny wieńcowej głowy potrzebujemy trzech punktów. Jednym z nich jest szczyt głowy (punkt ''Vertex'' na rysunku &amp;lt;xr id=&amp;quot;fig:Czaszka&amp;quot;&amp;gt; rys. %i&amp;lt;/xr&amp;gt;), leżący w odległości 50% wymiaru strzałkowego od punktu ''nasion'' lub ''inion''. &lt;br /&gt;
Dwa kolejne punkty leżą tuż przed skrawkiem ucha (punkt ''Preaurical'' na rysunku  &amp;lt;xr id=&amp;quot;fig:Czaszka&amp;quot;&amp;gt; rys. %i&amp;lt;/xr&amp;gt;) odpowiednio po prawej i lewej stronie głowy. Punkty ''Vertex'' oraz punkty ''Preaurical'' określają płaszczyznę wieńcową. Wymiar wieńcowy to długość łuku biegnącego od punktu ''Preaurical'' z jednej strony głowy, poprzez punkt ''Vertex'' do puntu ''Preaurical'' umiejscowionego po drugiej stronie głowy. Na rysunkach &amp;lt;xr id=&amp;quot;fig:10-20&amp;quot;&amp;gt; rys. %i&amp;lt;/xr&amp;gt; i &amp;lt;xr id=&amp;quot;fig:Czaszka&amp;quot;&amp;gt; rys. %i&amp;lt;/xr&amp;gt; łuk ten zaznaczono przerywaną linią koloru niebieskiego.&lt;br /&gt;
&lt;br /&gt;
====Wyznaczenie płaszczyzny poziomej i wymiaru poziomego głowy====&lt;br /&gt;
Do określenia położenia płaszczyzny w przestrzeni niezbędne są trzy punktu. W przypadku głowy jednak, która u badanej osoby może nie mieć kształtu symetrycznego, do wyznaczenia płaszczyzny poziomej stosuje się cztery punkty, zaś wymiar poziomy określa sie dla każdej półkuli osobno. Punkty te na rysunku &amp;lt;xr id=&amp;quot;fig:Czaszka&amp;quot;&amp;gt; %i&amp;lt;/xr&amp;gt; oznaczono nazwami ''B1'', ''B2'', ''B3'' (punkt ''B4'' leży odpowiednio pod drugiej stronie głowy, nie zaprezentowanej na rysunku). '''Uwaga, nazwy tych punktów zostały nadane tylko na potrzeby bieżącego rozdziału.''' Punkt ''B1'' leży w odległości 10% wymiaru strzałkowego od punktu ''Nasion'', punkt ''B2'' w odległości 10% wymiaru strzałkowego od punktu ''Inion''. Punkty ''B3'' i ''B4'' leżą odpowiednio w odległości 10% wymiaru wieńcowego od punktów ''Preaurical''. Wymiar wieńcowy dla prawej półkuli to długość łuku biegnącego od punktu ''B1'' poprzez punkt ''B3'' do punktu ''B2'', zaś wymiar wieńcowy dla lewej półkuli to długość łuku biegnącego od punktu ''B1'' poprzez punkt ''B4'' do punktu ''B2''.&lt;br /&gt;
&lt;br /&gt;
====Lokalizacja elektrod Fz, Cz, Pz====&lt;br /&gt;
Elektrody Fz, Cz, Pz, lezą wzdłuż linii środkowej głowy, biegnącej od punktu ''Nasion'' poprzez punkt 'Vertex'' do punktu ''Inion'' (patrz rysunek &amp;lt;xr id=&amp;quot;fig:10-20&amp;quot;&amp;gt; %i&amp;lt;/xr&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
 |+ Położenie elektrod Fz, Cz, Pz&lt;br /&gt;
 ! nazwa elektrody&lt;br /&gt;
 ! odległość od punkty &amp;quot;Nasion&amp;quot; &amp;lt;br\&amp;gt; liczona jako procent wymiaru strzałkowego&lt;br /&gt;
 ! odległość od punkty &amp;quot;Inion&amp;quot; &amp;lt;br\&amp;gt; liczona jako procent wymiaru strzałkowego&lt;br /&gt;
 ! uwagi&lt;br /&gt;
 |-&lt;br /&gt;
 | Fz&lt;br /&gt;
 | 30%&lt;br /&gt;
 | 70%&lt;br /&gt;
 |&lt;br /&gt;
 |-&lt;br /&gt;
 | Cz&lt;br /&gt;
 | 50%&lt;br /&gt;
 | 50%&lt;br /&gt;
 | elektroda zlokalizowana jest na szczycie głowy&amp;lt;br\&amp;gt; w odległości 50% wymiaru wieńcowego od punktów &amp;lt;br\&amp;gt; ''Nasion'' i ''Inion'' oraz w odległości 50% wymiaru &amp;lt;br\&amp;gt; wieńcowego od punktów ''Preaurical''.&lt;br /&gt;
 |-&lt;br /&gt;
 | Pz&lt;br /&gt;
 | 70%&lt;br /&gt;
 | 30%&lt;br /&gt;
 |&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
====Lokalizacja elektrod T3, C3, C4, T4====&lt;br /&gt;
Elektrody T3, C3, C4, T4 zlokalizowane są na łuku określającym płaszczyznę wieńcową i biegnącym od punktu ''Preaurical'' po lewej stronie głowy,&amp;lt;br\&amp;gt; przez punkt ''Vertex'', do punktu ''Preaurical'' umiejscowionego po prawej stronie głowy (patrz rysunki  &amp;lt;xr id=&amp;quot;fig:10-20&amp;quot;&amp;gt; %i&amp;lt;/xr&amp;gt; i &amp;lt;xr id=&amp;quot;fig:Czaszka&amp;quot;&amp;gt; %i&amp;lt;/xr&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
 |+ Położenie elektrod T3, C3, C4, T4&lt;br /&gt;
 ! nazwa elektrody&lt;br /&gt;
 ! odległość od lewego punktu &amp;quot;Preaurical&amp;quot; &amp;lt;br\&amp;gt; liczona jako procent wymiaru wieńcowego&lt;br /&gt;
 ! odległość od prawego punktu &amp;quot;Preaurical&amp;quot; &amp;lt;br\&amp;gt; liczona jako procent wymiaru wieńcowego&lt;br /&gt;
 ! uwagi&lt;br /&gt;
 |-&lt;br /&gt;
 | T3&lt;br /&gt;
 | 10%&lt;br /&gt;
 | 90%&lt;br /&gt;
 | leży na przecięciu płaszczyzny poziomej i wieńcowej&lt;br /&gt;
 |-&lt;br /&gt;
 | C3&lt;br /&gt;
 | 30%&lt;br /&gt;
 | 70%&lt;br /&gt;
 |&lt;br /&gt;
 |-&lt;br /&gt;
 | C4&lt;br /&gt;
 | 70%&lt;br /&gt;
 | 30%&lt;br /&gt;
 |&lt;br /&gt;
 |-&lt;br /&gt;
 | T4&lt;br /&gt;
 | 90%&lt;br /&gt;
 | 10%&lt;br /&gt;
 | leży na przecięciu płaszczyzny poziomej i wieńcowej&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
====Lokalizacja elektrod Fp1, Fp2, F7, F8, T5, T6, O1, O2====&lt;br /&gt;
&lt;br /&gt;
Elektrody Fp1, Fp2, F7, F8, T5, T6, O1, O2 (a także T3 i T4) umiejscowione są w płaszczyźnie poziomej, wzdłuż łuku łączącego punkty''B1'', ''B3'' i ''B2'' (patrz rysunki &amp;lt;xr id=&amp;quot;fig:Czaszka&amp;quot;&amp;gt; rys. %i&amp;lt;/xr&amp;gt;, &amp;lt;xr id=&amp;quot;fig:10-20&amp;quot;&amp;gt; rys. %i&amp;lt;/xr&amp;gt; )), po lewej stronie głowy i łuku łączącego punkty ''B1'', ''B4'' i ''B2'' po prawe stronie głowy. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
 |+ Położenie elektrod Fp1, F7, T3, T5, O1 &lt;br /&gt;
 ! nazwa elektrody&lt;br /&gt;
 ! odległość od punktu &amp;quot;B1&amp;quot; &amp;lt;br\&amp;gt; liczona jako procent lewego wymiaru wieńcowego&lt;br /&gt;
 ! odległość od punktu &amp;quot;B2&amp;quot; &amp;lt;br\&amp;gt; liczona jako procent lewego wymiaru wieńcowego&lt;br /&gt;
 ! uwagi&lt;br /&gt;
 |-&lt;br /&gt;
 | Fp1&lt;br /&gt;
 | 10%&lt;br /&gt;
 | 90%&lt;br /&gt;
 | &lt;br /&gt;
 |-&lt;br /&gt;
 | F7&lt;br /&gt;
 | 30%&lt;br /&gt;
 | 70%&lt;br /&gt;
 |&lt;br /&gt;
 |-&lt;br /&gt;
 | T3&lt;br /&gt;
 | 50%&lt;br /&gt;
 | 50%&lt;br /&gt;
 | elektroda leży na przecięciu płaszczyzny wieńcowej i poziomej&lt;br /&gt;
 |-&lt;br /&gt;
 | T5&lt;br /&gt;
 | 70%&lt;br /&gt;
 | 30%&lt;br /&gt;
 | &lt;br /&gt;
 |-&lt;br /&gt;
 | O1&lt;br /&gt;
 | 90%&lt;br /&gt;
 | 10%&lt;br /&gt;
 | &lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
 |+ Położenie elektrod Fp2, F8, T4, T6, O2 &lt;br /&gt;
 ! nazwa elektrody&lt;br /&gt;
 ! odległość od punktu &amp;quot;B1&amp;quot; &amp;lt;br\&amp;gt; liczona jako procent prawego wymiaru wieńcowego&lt;br /&gt;
 ! odległość od punktu &amp;quot;B2&amp;quot; &amp;lt;br\&amp;gt; liczona jako procent prawego wymiaru wieńcowego&lt;br /&gt;
 ! uwagi&lt;br /&gt;
 |-&lt;br /&gt;
 | Fp2&lt;br /&gt;
 | 10%&lt;br /&gt;
 | 90%&lt;br /&gt;
 | &lt;br /&gt;
 |-&lt;br /&gt;
 | F8&lt;br /&gt;
 | 30%&lt;br /&gt;
 | 70%&lt;br /&gt;
 |&lt;br /&gt;
 |-&lt;br /&gt;
 | T4&lt;br /&gt;
 | 50%&lt;br /&gt;
 | 50%&lt;br /&gt;
 | elektroda leży na przecięciu płaszczyzny wieńcowej i poziomej&lt;br /&gt;
 |-&lt;br /&gt;
 | T6&lt;br /&gt;
 | 70%&lt;br /&gt;
 | 30%&lt;br /&gt;
 | &lt;br /&gt;
 |-&lt;br /&gt;
 | O2&lt;br /&gt;
 | 90%&lt;br /&gt;
 | 10%&lt;br /&gt;
 | &lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
====Loaklizacja elektrod F3, F4, P3 i P4====&lt;br /&gt;
Elektroda F3 znajdują się w połowie łuku łączącego elektrody F7 i Fz, zaś elektrody F4 w połowie łuku łączącego elektrody F8 i Fz (patrz rysunek &amp;lt;xr id=&amp;quot;fig:10-20&amp;quot;&amp;gt; rys. %i&amp;lt;/xr&amp;gt;). &lt;br /&gt;
Elektroda P3 znajdują się w połowie łuku łączącego elektrody T5 i Pz, zaś elektrody P4 w połowie łuku łączącego elektrody T6 i Pz (patrz rysunek &amp;lt;xr id=&amp;quot;fig:10-20&amp;quot;&amp;gt; rys. %i&amp;lt;/xr&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
====Procedura wyznaczania pozycji elektrod przyklejanych na powierzchni głowy====&lt;br /&gt;
Jak można zauważyć, odległości pomiędzy poszczególnymi elektrodami leżącymi w danej płaszczyźnie, wynoszą 10% lub 20% wymiaru głowy odpowiadającemu tejże płaszczyźnie. W związku z tym, opisany w poprzednim rozdziale standard lokalizacji elektrod nazwano Systemem 10-20. W podręcznikach dotyczących rejestracji sygnału EEG można spotkać opis procedury lokalizacji elektrod pomiarowych poprzez znajdowanie odległości pomiędzy poszczególnymi elektrodami. Na przykład, jeśli znamy już położenie elektrody Cz, elektroda Pz powinna znajdować się o odległości 20% wymiaru strzałkowego za elektrodą Cz. Jednakże, taki sposób lokalizacji położenia elektrod może prowadzić do kumulacji i propagacji błędów, jeśli bowiem pozycja elektrody Cz jest wyznaczona niedokładnie, również z pewnym błędem będzie określona pozycja elektrody Pz. Poniżej opisano procedurę pozbawioną tej wady.&lt;br /&gt;
* Przygotój miarkę krawiecką i czerwony pisak.&lt;br /&gt;
* Znajdź punkty ''Nasion'' i ''Inion''.&lt;br /&gt;
* Wyznacz wymiar strzałkowy (długość łuku biegnącego w płaszczyźnie strzałkowej,  od punktu ''Nasion'', poprzez szczyt głowy do punktu ''Inion''). Oblicz 10%, 20%, 30% i 50% długości tego wymiaru. Przykładowo załóżmy, że wymiar strzałkowy wynosi 40 cm, obliczone długości będą wynosiły odpowiednio 4 cm, 8 cm, 12 cm i 20 cm.&lt;br /&gt;
* Przyłóż centymetr krawiecki do głowy tak, aby biegł od punktu ''Inion'' do ''Nasion'' wzdłuż linii środkowej głowy przez jej szczyt. Zaznacz czerwonym pisakiem następujące pozycje:&lt;br /&gt;
** 10% wymiaru strzałkowego (w podanym przykładzie to 4 cm) od punktu ''Nasion''. Pozycja ta odpowiada położeniu punktu ''B1''.&lt;br /&gt;
** 30% wymiaru strzałkowego (w podanym przykładzie to 8 cm) od punktu ''Nasion''. Pozycja ta odpowiada położeniu elektrody Fz.&lt;br /&gt;
** 50% wymiaru strzałkowego (w podanym przykładzie to 20 cm) od punktu ''Nasion''. Pozycja ta odpowiada położeniu elektrody Cz.&lt;br /&gt;
** 30% wymiaru strzałkowego (w podanym przykładzie to 8 cm) od punktu ''Inion''. Pozycja ta odpowiada położeniu elektrody Pz.&lt;br /&gt;
** 10% wymiaru strzałkowego (w podanym przykładzie to 8 cm) od punktu ''Inion''. Pozycja ta odpowiada położeniu punktu B2.&lt;br /&gt;
Dokonaj kontroli pozycji, poprzez sprawdzenie odległości elektrody Cz od punktu ''Inion'' - powinien on wynosić 50% wymiaru strzałkowego oraz sprawdź odległości elektrod Fz i Pz od elektrody Cz. Odległości te powinny stanowić 20% wymiaru strzałkowego. &lt;br /&gt;
* Przyłóż centymetr krawiecki do głowy tak, aby biegł od punktu ''Preaurical'' po lewej stronie głowy, poprzez punkt ''Vertex'', do punktu ''Preaurical'' po prawej stronie głowy. Odczytaj wymiar wieńcowy głowy. Oblicz długości równe 10%, 20%, 30% i 50% wymiaru wieńcowego. Przy pomocy czerwonego pisaka zaznacz na powierzchni głowy następujące pozycje:&lt;br /&gt;
** 10% wymiaru wieńcowego od punktu prawego punktu ''''Preaurical''. Pozycja ta odpowiada położeniu punktu ''B2'' i pozycji elektrody T3.&lt;br /&gt;
** 30% wymiaru wieńcowego od punktu prawego punktu ''''Preaurical''. Pozycja ta odpowiada położeniu elektrody C3.&lt;br /&gt;
** 50% wymiaru wieńcowego od punktu prawego punktu ''''Preaurical''. Pozycja ta odpowiada położeniu elektrody Cz.&lt;br /&gt;
** 30% wymiaru wieńcowego od punktu lewego  punktu ''''Preaurical''. Pozycja ta odpowiada położeniu elektrody C4.&lt;br /&gt;
** 10% wymiaru wieńcowego od punktu lewego  punktu ''''Preaurical''. Pozycja ta odpowiada położeniu punktu ''B2'' i pozycji elektrody T4.&lt;br /&gt;
Dokonaj kontroli zaznaczonych pozycji. Sprawdź odległości elektrody Cz od lewego punktu ''''Preaurical'' - powinna ona wynosić 50% wymiaru wieńcowego. Sprawdź także odległości elektrod C3 i C4 od elektrody Cz - odległość ta powinna stanowić 20% wymiaru wieńcowego, a także odległość elektrody T3 od C3 i T4 od C4, która powinna wynosić 10% wymiaru wieńcowego.&lt;br /&gt;
* Przyłóż centymetr krawiecki do głowy tak, aby biegł on w płaszczyźnie poziomej po lewej stronie głowy, czyli od punktu ''B1'' poprzez punkt ''B3'' (punkt ten to równocześnie pozycja elektrody T3), do punktu ''B2''. Odczytaj lewy wymiar poziomy głowy. Oblicz długości równe 10%, 20%, 30% i 50% lewego wymiaru poziomego. Przy pomocy czerwonego pisaka zaznacz na powierzchni głowy następujące pozycje:&lt;br /&gt;
** 10% lewego wymiaru poziomego od punktu ''B1''. Pozycja ta odpowiada położeniu elektrody Fp1.&lt;br /&gt;
** 30% lewego wymiaru poziomego od punktu ''B1''. Pozycja ta odpowiada położeniu elektrody F7.&lt;br /&gt;
** 50% lewego wymiaru poziomego od punktu ''B1''. Pozycja ta odpowiada położeniu elektrody T3.&lt;br /&gt;
** 30% lewego wymiaru poziomego od punktu ''B2''. Pozycja ta odpowiada położeniu elektrody T5.&lt;br /&gt;
** 10% lewego wymiaru poziomego od punktu ''B2''. Pozycja ta odpowiada położeniu elektrody O1.&lt;br /&gt;
Dokonaj kontroli zaznaczonych pozycji. Sprawdź odległości elektrody T3 elektrody od punktu ''B2'' - powinna ona wynosić 50% lewego wymiaru poziomego. Sprawdź także odległości elektrod F7 i T5 od elektrody T3 - odległość ta powinna stanowić 20% lewego wymiaru poziomego, a także odległość elektrody Fp1 od F7 i T5 od O1, która powinna wynosić 10% lewego wymiaru poziomego.&lt;br /&gt;
* Przyłóż centymetr krawiecki do głowy tak, aby biegł on w płaszczyźnie poziomej po prawej stronie głowy, czyli od punktu ''B1'' poprzez punkt ''B4'' (punkt ten to równocześnie pozycja elektrody T4), do punktu ''B2''. Odczytaj prawy wymiar poziomy głowy. Oblicz długości równe 10%, 20%, 30% i 50% prawego wymiaru poziomego. Przy pomocy czerwonego pisaka zaznacz na powierzchni głowy następujące pozycje:&lt;br /&gt;
** 10% prawego wymiaru poziomego od punktu ''B1''. Pozycja ta odpowiada położeniu elektrody Fp2.&lt;br /&gt;
** 30% prawego wymiaru poziomego od punktu ''B1''. Pozycja ta odpowiada położeniu elektrody F8.&lt;br /&gt;
** 50% prawego wymiaru poziomego od punktu ''B1''. Pozycja ta odpowiada położeniu elektrody T4.&lt;br /&gt;
** 30% prawego wymiaru poziomego od punktu ''B2''. Pozycja ta odpowiada położeniu elektrody T6.&lt;br /&gt;
** 10% prawego wymiaru poziomego od punktu ''B2''. Pozycja ta odpowiada położeniu elektrody O2.&lt;br /&gt;
Dokonaj kontroli zaznaczonych pozycji. Sprawdź odległości elektrody T4 elektrody od punktu ''B2'' - powinna ona wynosić 50% prawego wymiaru poziomego. Sprawdź także odległości elektrod F8 i T6 od elektrody T4 - odległość ta powinna stanowić 20% prawego wymiaru poziomego, a także odległość elektrody Fp2 od F8 i T6 od O2, która powinna wynosić 10% prawego wymiaru poziomego.&lt;br /&gt;
* Za pocą czerwonego pisaka zaznacz punkty lezące w połowie długości łuków łączących następujące elektrody:&lt;br /&gt;
** F7 i Fz,&lt;br /&gt;
** F8 i Fz,&lt;br /&gt;
** T5 i Pz,&lt;br /&gt;
** T6 i Pz,&lt;br /&gt;
punkty te określają pozycją elektrod F3, F4, P3 i P4.&lt;br /&gt;
&lt;br /&gt;
====Procedura zakładania czepka====&lt;br /&gt;
* Znajdź punkty ''Nasion'' oraz ''Inion''. &lt;br /&gt;
* Wyznacz wymiar strzałkowy (długość łuku biegnącego w płaszczyźnie strzałkowej,  od punktu ''Nasion'', poprzez szczyt głowy do punktu ''Inion'').&lt;br /&gt;
* Zlokalizuj punkty B1 i B2, czyli punkty leżące w odległości 10% wymiaru strzałkowego od punkty ''Nasion'' i ''Inion'' oraz zlokalizuj punkt ''Vertex''.&lt;br /&gt;
* Wyznacz wymiar wieńcowy głowy (długość łuku biegnącego w płaszczyźnie wieńcowej, od prawego punktu ''Preaurical'', poprzez szczyt głowy do punktu lewego punktu ''Preaurical'').&lt;br /&gt;
* Zlokalizuj punkty B3 i B4, czyli punkty leżące w odległości 10% wymiaru wieńcowego od prawego i lewego punktu ''Preaurical''.&lt;br /&gt;
* Dokonaj pomiaru obwodu głowy, przykładając miarkę tak, aby biegła w płaszczyźnie wieńcowej, to jest przez punkty ''B1'', ''B2'', ''B3'' i ''B4''. na podstawie tego pomiaru wybierz odpowiedni rozmiar czepka.&lt;br /&gt;
* Czepek umieść na głowie tak, aby:&lt;br /&gt;
** elektrody Fp1 i Fp2 leżały w płaszczyźnie poziomej, w odległości 10% wymiaru poziomego od punktu ''B1'', &lt;br /&gt;
** elektrody O1 i O2 leżały także w płaszczyźnie poziomej, w odległości 10% wymiaru poziomego od punktu ''B2'',&lt;br /&gt;
** elektrody T3 i T4 leżały w miejscu przecinania się płaszczyzny wieńcowej i poziomej,&lt;br /&gt;
** elektroda Cz znajdowała się na szczycie głowy, w punkcie ''Vertex'' (punkcie przecięcia się płaszczyzny strzałkowej i wieńcowej).&lt;br /&gt;
&lt;br /&gt;
====Oczyszczanie skóry w miejscu przyłożenia elektrody====&lt;br /&gt;
Niezależnie od tego, czy elektrody będą przyklejane bezpośrednio do powierzchni głowy, czy też umieszczane na niej za pomocą czepka, miejsca z których będzie zbierana czynność elektryczna trzeba przemyć w celu usunięcia tłuszczu oraz naskórka.&lt;br /&gt;
Jak zostało to omawiane na pierwszych zajęciach, zewnętrzna warstwa skóry - naskórek, jest zrogowaciała oraz pokryta różnymi tłuszczami, w związku z czym charakteryzuje się dużym oporem elektrycznym (rzędu 1 M&amp;amp;Omega;). Opór ten prowadzi do tłumienia sygnału EEG oraz sprzyja przedostawaniu się różnego rodzaju artefaktów. W przypadku rejestracji sygnału EEG przyjęto standard, w którym opór pomiędzy elektrodą a skórą powinien być mniejszy od 5k&amp;amp;Omega;. Sugerowane jest również, aby opory pomiędzy skórą a elektrodą były na wszystkich elektrodach takie same. Z oczywistych względów, w praktyce jest to wymaganie niemalże nieosiągalne. Należy również pamiętać, iż zwykły spirytus spożywczy dosyć słabo odtłuszcza skórę, dlatego lepiej jest stosować przygotowane przez firmy farmaceutyczne odpowiednie alkohole. Dobrze jest mieć również na wyposażeniu pracowni tępą, sterylną igłę oraz specjalne papierki ścierne do skóry. W niektórych przypadkach bowiem, zwłaszcza u osób pozbawionych włosów na głowie, warstwa naskórka pod wpływem czynników atmosferycznych osiągnęła taką grubość, iż jej usunięcie przy pomocy gazika z alkoholem jest niemożliwe. W takim przypadku naskórek w miejscu przyczepienia elektrody trzeba usunąć delikatnie zdrapując go igłą lub papierkiem ściernym. Aby odtłuścić skórę i usunąć naskórek wykonujemy następujące kroki:&lt;br /&gt;
* Z pojemnika zawierającego alkohol do przemywania skóry odlewamy porcje płynu przeznaczoną do bieżącego eksperymentu. Uwaga - nigdy nie należy maczać gazika, którym przecieramy skórę, w pojemniku, w którym przechowujemy zapas alkoholu. Gazik ten bowiem będzie nasączony tłuszczami usuniętymi ze skóry, którymi zanieczyścimy nasz zapas spirytusu. Po wprowadzeniu zbyt dużej ilości zanieczyszczeń, alkohol straci swoje właściwości. Z tego samego względu nie należy zlewać alkoholu, który pozostał po eksperymencie, z powrotem do pojemnika w którym przechowujemy zapas alkohol.&lt;br /&gt;
* Staramy się tak ułożyć włosy w miejscu lokalizacji elektrody, aby odsłonić skórę. Skórę przecieramy delikatnie kilkukrotnie wacikiem nasączonym alkoholem. Po przetarciu w ten sposób kilku miejsc, wacik wyrzucamy i bierzemy nowy.&lt;br /&gt;
* Po przemyciu danego miejsca, odczekujemy chwilę, aby alkohol wyparował z powierzchni skóry i przyklejamy w to miejsce elektrodę bądź wpinamy ją w czepek.  &lt;br /&gt;
&lt;br /&gt;
'''Przyklejanie elektrod do skóry za pomocą kleju Collodium'''&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
W przypadku umieszczania elektrod za pomocą kleju Collodium, należy się wyposażyć w odpowiedni rozpuszczalnik do tego kleju, nie jest on bowiem wodozmywalny. Rolę takiego rozpuszczalnika może pełnić aceton, a w przypadku jego braku, zmywacz lakieru do paznokci (uwaga - obecnie nie wszystkie zmywacze zawierają aceton). Warto posiadać również pędzelek do rozprowadzenia kleju, wąski, długi patyczek (może to być patyczek od pałeczek higienicznych po uprzednim usunięciu z jego końców bawełny) oraz suszarkę - Collodium bowiem schnie stosunkowo długo. Proces schnięcia można przyspieszyć kierując na elektrodę strumień ciepłego powietrza, należy jednak zwrócić uwagę, aby pod wpływem tego strumienia elektroda nie nagrzała się zbyt mocno, może to bowiem wywołać odczucie parzenia, zwłaszcza, że miejsce przyłożenia elektrody zostało wcześniej podrażnione poprzez tarcie wacikiem ze spirytusem. Przyklejanie elektrody za pomocą Collodium realizujemy w następujący sposób:&lt;br /&gt;
* Odtłuszczamy skórę w miejscu przyklejenia elektrody, zgodnie z procedurą podana w poprzednim rozdziale,&lt;br /&gt;
* Brzeg elektrody miseczkowej smarujemy pędzelkiem z klejem Collodium&lt;br /&gt;
* Jedną ręka (np. lewą) odsłaniamy włosy, znad miejsca gdzie mam być przyklejona elektroda, drugą chwytamy elektrodę, którą przykładamy do powierzchni skóry. Puszczamy włosy i lewą rękę chwytamy pałeczkę, którą dociskamy elektrodę do skóry. Puszczamy elektrodę i w prawą rękę bierzemy suszarkę, za pomocą której możemy przyspieszyć wysychanie kleju. Po kilkudziesięciu sekundach elektroda powinna trzymać się skóry.&lt;br /&gt;
* W pustą przestrzeń pomiędzy elektrodą a skórą, wpuszczamy przewodzący żel. Robimy to za pomocą strzykawki z tępą igłą, którą w prowadzamy przez otwór w elektrodzie miseczkowej.&lt;br /&gt;
&lt;br /&gt;
'''Przyklejanie elektrod do skóry za pomocą klejów wodozmywalnych'''&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Proces przyklejania elektrod na powierzchni głowy za pomocą Collodium jest stosunkowo długotrwały i mało komfortowy. Również odklejenie elektrod zabiera relatywnie dużo czasu. Ponadto elektrody po badaniu z użyciem kleju Collodium wymagają wyczyszczenia z resztek kleju. Powyższych wad pozbawione są specjalne pasty, które pełnią role zarówno kleju jak i przewodzącego żelu. Przygotowując się do badania z użyciem tych past powinniśmy nabyć w aptece szpatułkę (do nakładania maści lub badania gardła) oraz sterylne gaziki. Kleje wodozmywalne mają konsystencję gęstej pasty, dlatego też próba wydłubania kleju z pojemnika za pomocą elektrody miseczkowej może się skończyć uszkodzeniem tej ostatniej (cena pojedynczej elektrody miseczkowej &amp;gt; 50 zł). Klej nakładamy zawsze przy pomocy szpatułki. Przyczepianie elektrod do powierzchni skóry za pomocą pasty realizujemy w następujących krokach:&lt;br /&gt;
* Odmierzamy z zasobnika odpowiednią ilość kleju niezbędną do przyczepienia elektrod w danym eksperymencie, do oddzielnego pojemnika,&lt;br /&gt;
* Gaziki tniemy na kwadratowe kawałki o długości boku około 1 cm.&lt;br /&gt;
* Przemywamy skórę w miejscu umieszczenia elektrod,&lt;br /&gt;
* Czekając aż alkohol wyparuje ze skóry, szpatułką nakładamy pastę do zagłębienia elektrodę miseczkowej. Do strony wypukłej przykładamy przycięty gazik. Rolą tego gazika jest zwiększenie powierzchni przyczepu elektrody do skóry.&lt;br /&gt;
* Lewą ręka odgarniamy włosy znad miejsca lokalizacji elektrody, prawą ręką przykłady w to miejsce elektrodę. Palcami wskazującym i środkowym delikatnie dociskamy elektrodę do powierzchni głowy.&lt;br /&gt;
&lt;br /&gt;
'''Umieszczanie elektrod na czepku'''&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Po założeniu czepka na głowę, wykonujemy następujące kroki:&lt;br /&gt;
* Przy pomocy bawełnianej pałeczki staramy się tak ułożyć włosy w otworach na czepku, aby odsłonić skórę.&lt;br /&gt;
* Odtłuszczamy skórę.&lt;br /&gt;
* Brzegi otworów w czepku, na granicy pomiędzy skórą a zaczepem elektrody smarujemy pastą przewodzącą. Spowoduje to pozlepianie się włosów i ich przylgnięcie do brzegu czepka, dzięki czemu skóra w otworze czepka nadal powinna być odsłonięta.&lt;br /&gt;
* Wpinamy elektrody w zatrzaski czepka. Uzupełniamy żel przewodzący poprzez otwory znajdujące się w elektrodach.&lt;br /&gt;
&lt;br /&gt;
===Kolejność umieszczania elektrod na powierzchni głowy===&lt;br /&gt;
Elektrody, zarówno te przyklejane do powierzchni głowy jak przyczepiane za pomocą czepka, należy umieszczać na powierzchni głowy poczynając od elektrod zlokalizowanych w potylicznej części głowy a następnie wybierając elektrody zlokalizowane w części centralnej i na końcu z części czołowej. Dzięki temu, kable od już przyklejonych elektrod nie będą przeszkadzały w mocowaniu następnych. Ponadto kable od przyczepionych elektrod centralnych, można umieścić na głowie tak, aby leżały one na elektrodach potylicznych, co spowoduje lepsze umocowanie tych ostatnich. Z kolei kable z elektrod czołowych można poprowadzić po elektrodach centralnych, co również poprawi mocowanie elektrod. W trakcie procesu przyczepiania elektrod warto zadbać, aby elektrod nie zwisały swobodnie, łatwo bowiem wtedy mogą oderwać się od skóry. Kable z lewej strony głowy powinny być poprowadzone nad lewym barkiem, następnie nad szyją i prawym barkiem, z którego mogą swobodnie zwisać nad prawą częścią klatki piersiowej. &lt;br /&gt;
Z kolei kable z prawej strony głowy powinny być poprowadzone nad prawym barkiem, a dalej nad szyją i lewym barkiem, z którego również mogą już spokojnie zwisać. Po zakończeniu przyczepiania wszystkich elektrod, kable powinny być spięte taśmą w jeden warkocz.&lt;br /&gt;
&lt;br /&gt;
===Praktyczne uwagi dotyczące rejestracji sygnału EEG===&lt;br /&gt;
Niezależnie od ceny i jakości sprzętu zastosowanego do rejestracji sygnału EEG, jakość zbieranego sygnału zależy głównie od technika przeprowadzającego badanie. Każdy eksperyment związany z rejestracją czynności elektrycznej mózgu należy starannie zaplanować. Poniżej w punktach wymieniamy pewne kwestie na które warto zwrócić uwagę przygotowując się do rejestracji sygnału EEG.&lt;br /&gt;
==== Wybór sposobu umieszczania elektrod na głowie====&lt;br /&gt;
Najszybszym i najbardziej komfortowym sposób umieszczania elektrod na głowie jest wykorzystanie czepka. Jednakże ten sposób lokalizacji elektrod nie jest precyzyjny. Pomiędzy badanymi występują różnicę międzyosobnicze, które z oczywistych względów nie będą uwzględnione w uniwersalnym czepku przeznaczonym &amp;quot;na każdą głowę&amp;quot;. Dysponując czepkiem jesteśmy ponadto skazani na dany montaż elektrod, podczas gdy elektrody przyklejane możemy lokalizować w różnych miejscach na powierzchni głowy, możemy też dowolnie rozszerzać montaż 10-20. Przykładowo, w niektórych podręcznikach dotyczących elektroencefalografii pojawia się opinia, iż elektrody F7 i F8 są umieszczone zbyt wysoko, aby dobrze rejestrować sygnał z okolicy przednio skroniowej, zaś elektrody T5 i T6 również umieszczone są zbyt wysoko, aby optymalnie rejestrować sygnały okolicy tylno skroniowej. W celu eliminacji tej wady wprowadza się dodatkowe elektrody T1 i T2, które nie występują jednak w standardowych czepkach Systemu 10-20. Inna wadą czepków jest wysychanie żelu wypełniającego przestrzeń pomiędzy elektrodą a skóra. Zwykle po 3 - 4 godzinach żel ten traci swoje właściwości. Niektórych spośród wyżej wymienionych wad umieszczania elektrod  za pomocą czepka pozbawione są elektrody przyklejane do powierzchni skóry. Przede wszystkim można ich lokalizacje określić dużo dokładniej niż elektrod umieszczanych w czepku. Elektrody te można umieszczać na głowie w dowolnych miejscach, jak i dowolnie można rozszerzać system 10-20. Najszybciej elektrody przykleimy do powierzchni za pomocą past pełniących rolę żelu przewodzącego i kleju. Sprawny technik, przyczepi przyczepi w ten sposób 21 elektrod Systemu 10-20 w czasie krótszym niż 30 minut. Niestety, pasty te są wodozmywalne, w związku z czym, na skutek pocenia się skóry, po około 3-4 godzinach badania EEG, elektrody te będą odpadać od skóry. Najdłużej skóry będą trzymać się elektrody przyklejone za pomocą Collodium. Jeśli zatem planujemy wielogodzinny zapis EEG, elektrody powinniśmy przyczepiać do powierzchni skóry za pomocą tego kleju, co niestety może nam zabrać ponad godzinę czasu. Tak długotrwałe mocowanie elektrod źle wpłynie na badaną osobę, powodując jej zmęczenie i znużenie. Ponadto, po wykonaniu badania, elektrody musimy odklejać przy pomocy specjalnego rozpuszczalnika, którym należy również użyć do zmycia resztek zaschniętego Collodium z elektrod, co zabiera sporo czasu. Jeśli wykonujemy serię eksperymentu na kilku badanych, w przypadku zastosowania Collodium, aby skrócić przerwy pomiędzy eksperymentami, warto być wyposażonym w dwa zestawy elektrod. Podczas gdy jeden wykorzystywany jest w bieżącym pomiarze, drugi powinien być czyszczony po poprzednim eksperymencie. Z kolei elektrody przyklejane za pomocą specjalnych past zdejmuje się z głowy bardzo szybko, zaś do zmycia resztek kleju wystarczy zwykła woda z mydłem. Po około 5 minutach od zakończenia eksperymentu z wykorzystaniem past, elektrody miseczkowe są gotowe do kolejnego użycia.&lt;br /&gt;
&lt;br /&gt;
=== Ułożenie badanej osoby ===&lt;br /&gt;
O ile to możliwe, badaną osobę powinniśmy umieść na specjalnym fotelu, przeznaczonym do rejestracji sygnału EEG. Wiele artefaktów zakłócających pomiar czynności elektrycznych mózgu, to artefakty mięśniowe powstałe na skutek (prawie zawsze nieświadomego) napięcia mięśni, związanego z niekomfortową pozycją. Typowym przykładem takich artefaktów są zakłócenia pochodzące od napięcia mięśni szyi, które starają się utrzymać głowę w pozycji pionowej. Aby wyeliminować artefakty pochodzące od mięśni szyi, głowa powinna być podparta specjalnym zagłówkiem. Nie zawsze jednak możemy ułożyć badaną osobę na specjalnym fotelu do badań EEG. W takim przypadku powinniśmy zadbać, aby badana osoba została posadzona na fotelu z oparciami na których wygodnie może położyć ręce. Wysokość fotela należy dobrać tak, aby pacjent mógł swobodnie oprzeć stopy o podłogę.&lt;br /&gt;
&lt;br /&gt;
=== O co należy poprosić badanego przed eksperymentem ===&lt;br /&gt;
Umawiając się z osobą na pomiar sygnału EEG, prosimy ją aby przed badaniem umyła głowę oraz nie zastosowała do włosów żadnych odżywek ani balsamów do skóry. Przyczyniają się bowiem one do zwiększenia impedancji skóry i utrudniają jej odtłuszczenie.&lt;br /&gt;
Czynność elektryczna mózgu obserwowana na powierzchni głowy, z uwagi na bardzo małą amplitudę, łatwo ulega zakłóceniom przez sygnały takie jak EMG, czy Elektrookulogram. Artefakty związane z ruchem gałki ocznej powstają w trakcie badania EEG głównie podczas mrugania, które jest naturalnym odruchem, dzięki któremu powierzchnia oka zostaje nawilżona. Można spotkać się z opinią, iż pacjent powinien przed badaniem EEG &amp;quot;wymrugać się na zapas&amp;quot;, zaś w trakcie samego badania mrugać oczami jak najrzadziej. Nie jest to jednak dobre rozwiązanie, bowiem gałka oczna wymaga stałego nawilżenia, zaś powstrzymywanie się od mrugania może wywołać czynniki niekorzystnie wpływające rejestrację sygnału EEG (badana osoba przestanie być skoncentrowana, poczuje dyskomfort, zacznie się napinać). Pacjent powinien zatem mrugać tak często jak tylko jest to mu potrzebne. Zmniejszenie częstości mrugnięć można osiągnąć poprzez zastosowanie do oczu przed badaniem EEG specjalnych żeli nawilżających oraz prosząc pacjenta, aby w trakcie badania lekko przymrużył oczy. Innymi sygnałami bioelektrycznymi zakłócającymi pomiar EEG są  potencjały związane z ruchami języka oraz zaciśniętymi szczękami. Aby zminimalizować wpływ tych artefaktów na pomiar czynności elektrycznej mózgu, przed daniem EEG prosimy pacjenta aby język wsunął między zęby, co zapobiegnie zarówno ruchom języka jak i zaciskaniu zębów.&lt;br /&gt;
&lt;br /&gt;
=== Inne standardy lokalizacji elektrod ===&lt;br /&gt;
Jak zostało to wspomniane w poprzednim rozdziale, Międzynarodowy Standard 10-20 lokalizacji elektrod posiada pewne wady, które eliminowane są poprzez umieszczanie na głowie kolejnych elektrod, np. wymienione już elektrody T1 i T2, czy elektroda FPz, umieszczana pomiędzy elektrodami Fp1 i Fp2 czy elektroda Oz lokalizowana między elektrodami O1 i O2. Ostatecznie w roku 1985 G.E. Chatrian zaproponował bardzo proste rozszerzenie systemu 10-20, poprzez wprowadzenie kolejnych łuków głowy (pomiędzy już istniejącymi łukami strzałkowym, wieńcowym i poziomym) oraz umieszczanie elektrod tylko w odległości 10% długości poszczególnych łuków (a nie 10% lub 20% jak ma to miejsce w systemie 10-20). Wprowadzanie nowego systemu upraszczał fakt, iż w oryginalnym standardzie 10-20 przewidywano możliwość lokalizacji kolejnych elektrod, pozostawiając odpowiednie numery do ich oznaczeń (np. pomiędzy elektrodami C3 i Cz można wprowadzić elektrodę C2). Nowy standard nazwano rozszerzonym systemem 10-20 lub też systemem 10-10. Z oczywistych względów system 10-10 zawiera w sobie elektrody systemu 10-20. W literaturze można spotkać propozycję kolejnych rozszerzeń systemu 10-20 i 10-10, np. 10-5, w którym odległości pomiędzy elektrodami stanowią 10% lub 5% długości odpowiednich łuków głowy. Nie będziemy się jednak nimi zajmować na bieżących zajęciach, zostaną one dokładnie omówione, podbnie jak i standard 10-10 na zajęciach poświęconych tylko i wyłącznie pomiarowi sygnałów EEG w przyszłym semestrze.&lt;br /&gt;
&lt;br /&gt;
=== Odprowadzenia, montaże ===&lt;br /&gt;
Zanim przystąpimy do mówienia tematów zawartych w tytule rozdziałów, przejdziemy do wyjaśnienia i omówienia pewnej nomenklatury występującej w Elektroencefalografii. Rejestracja czynności elektrycznej mózgu, jest badaniem znanym od ponad 100 lat. W międzyczasie dokonał się olbrzymi postęp technologiczny, jednak przyjęte kilkadziesiąt lat temu terminy funkcjonują do dziś, także w przypadku opisu parametrów technicznych urządzeń. Podobnie jak ma to miejsce w przypadku rejestracji elektrycznej czynności serca, elektrody zbierające sygnał EEG, połączone do aparatury rejestrującej nazywamy odprowadzeniami. Z kolei montaż to wzorzec określonego układu połączeń elektrod pomiarowych. W przeszłości taki wzorzec uzyskiwano poprzez odpowiednie elektroniczne połączenie elektrod ze wzmacniaczem, innymi słowy były one &amp;quot;montowane&amp;quot;. Obecnie końcówki elektrod wtyka się odpowiadające im gniazdka we wzmacniaczu, zaś połączenia wytwarza się w sposób programowy. &lt;br /&gt;
Sygnały bioelektryczne, co wiemy z pierwszych zajęć na pracowni, mierzymy różnicowo aby wyeliminować artefakty pochodzące od sieci i urządzeń elektrycznych. Nie inaczej jest z sygnałem EEG. Powstaje oczywiście problem, gdzie na ciele człowieka wybrać miejsce, które będzie źródłem sygnału odniesienia dla pomiaru czynności elektrycznej mózgu. Oczywiście, w zależności gdzie to miejsce zostanie zlokalizowane, zapis czynności elektrycznej mózgu będzie mieć różny przebieg i różną wartość diagnostyczną oraz naukową. Przypominamy, że w przypadku pomiaru sygnałów bioelektrycznych, metody wyboru sygnałów odniesienia można podzielić na dwie grupy:&lt;br /&gt;
* Odprowadzenia dwubiegunowe (lub bipolarne). W tym przypadku sygnał jest różnicą potencjałów pomiędzy danymi dwiema elektrodami umieszczonymi na powierzchni głowy.&lt;br /&gt;
* Odprowadzenia jednobiegunowe (lub monopolarne). Zapisywany sygnał jest różnicą potencjałów pomiędzy elektrodami, a jednym wspólnym potencjałem odniesienia, który nie musi leżeć koniecznie na powierzchni głowy.&lt;br /&gt;
Innymi słowy, w przypadku odprowadzeń dwubiegunowych, sygnał z każdej elektrody jest mierzony  względem innego odniesienia, podczas gdy w przypadku odprowadzeń jednobiegunowych odniesienie jest wspólne dla wszystkich elektrod. W przypadku odprowadzeń dwubiegunowych zakłada się, iż elektroda odniesienia powinna być umieszczona w miejscu wolnym od artefaktów mięśniowych oraz w którym nie obserwuje się czynności elektrycznej mózgu. Niestety takie miejsca na ciele ludzkim nie istnieją. Umieszczenie elektrody odniesienia np. na klatce piersiowej spowodowałoby rejestrację zakłóceń w postaci sygnału EKG oraz artefaktów mięśniowych. Zwykle, jako sygnał odniesienia wybiera się średni potencjał rejestrowany przez elektrody A1 i A2 (które przewidziane są w systemie 10-20). Elektrody te są umieszczone bezpośrednio na uszach lub za uszami na wyrostku ''sutkowatym ''[http://pl.wikipedia.org/wiki/Wyrostek_sutkowaty]. jest to miejsce względnie wolne od artefaktów EKG i mięśniowych. Niestety, elektrody A1 i A2 rejestrują sygnał z środkowo skroniowej części mózgu, ponadto w niektórych przypadkach obserwuje się także na tych elektrodach sygnał EKG. Inną często spotykaną elektrodą odniesienia jest elektroda Cz umieszczona na szczycie głowy. Stosuje się także jako potencjał odniesienia tzw. ''Common Average'' to jest średni potencjał mierzony przez wszystkie elektrody.&lt;br /&gt;
O ile w trakcie 100 lat historii pomiarów czynności elektrycznej mózgu powstał pewien standard lokalizacji elektrod, tak nie istnieje żaden oficjalny standard montaży. Istnieją jednak pewne powszechnie przyjęte i stosowane montaże, umożliwiające lepsze zobrazowanie w zapisie EEG iglic związanych z nieprawidłowym funkcjonowaniem mózgu.&lt;br /&gt;
Najczęściej spotykane montaże to:&lt;br /&gt;
* Montaż przednio-tylny, (łac. anterior-posterior A-P), zwany również &amp;quot;podwójnym bananem). Jest to najpopularniejszy montaż dwubiegunowy, w którym schemat połączeń między elektrodami tworzy łańcuchy układające się w kształt bananów. W montażu tym rejestrowany jest różnica potencjałów pomiędzy elektrodami: &lt;br /&gt;
** F7 i Fp1, T3 i F7, T5 i T3, O1 i T3 - łańcuch przebiega wzdłuż lewego łuku poziomego&lt;br /&gt;
** F8 i Fp2, T4 i F8, T6 i T4, O2 i T4 - łańcuch przebiega wzdłuż prawgo łuku poziomego&lt;br /&gt;
** F3 i Fp1, C3 i F3, P3 i C3, O1 i P3 - łańcuch przebiega po łuku między łukiem strzałkowym a poziomym, z lewej strony głowy&lt;br /&gt;
** F4 i Fp2, C4 i F4, P4 i C4, O2 i P4 - łańcuch przebiega po łuku między łukiem strzałkowym a poziomym, z prawej strony głowy&lt;br /&gt;
** Cz i Fz,  Pz i Cz - łańcuch przebiega po łuku strzałkowym&lt;br /&gt;
* Montaż poprzeczny, także dwubiegunowy, w którym przyległe elektrody łączy się w łańcuchy biegnące w poprzek głowy.&lt;br /&gt;
* Montaż A1/A2 - montaż jednobiegunowy, w którym jako elektrody odniesienia wybrano średni potencjał z elektrod A1 i A2.* Montaż * Montaż ''Common Average'' - montaż jednobiegunowy, w którym jako elektrody odniesienia wybrano średni potencjał ze wszystkich elektrod.&lt;br /&gt;
&lt;br /&gt;
==== Lokalizacja elektrody GND ====&lt;br /&gt;
W przypadku pomiarów różnicowych, lokalizacja elektrody masy nie powinna mieć żadnego wpływu na rejestrowany sygnał, pod warunkiem że opór pomiędzy nią a skórą jest bardzo mały oraz jest ona dobrze przytwierdzona do powierzchni skóry. W związku z powyższym, lokalizację elektrody GND wybrano w miejscach, które z uwagi na budowę anatomiczną umożliwiają stabilne umieszczenie jej na głowie. Najczęściej są to miejsca:&lt;br /&gt;
* pomiędzy elektrodą Fp1 i Fp2 na czole,&lt;br /&gt;
* pomiędzy elektrodą Fz i Cz&lt;br /&gt;
* pomiędzy elektrodami Fp1, F7 i Fz (występuje tam płaski obszar czaszki sprzyjający dobremu umocowaniu elektrody)&lt;br /&gt;
* na klatce piersiowej&lt;br /&gt;
* na karku&lt;br /&gt;
&lt;br /&gt;
==Aparatura rejestrująca sygnał EEG==&lt;br /&gt;
Wymagania stawiane aparaturze do rejestracji sygnałów bioelektrycznych zostały omówione na pierwszych zajęciach i wielu kwestiach dotyczą również urządzeń do pomiaru sygnału EEG. Jak można zauważyć aparat do rejestracji czynności elektrycznej mózgu powinien zawierać wielokanałowy wzmacniacz, o liczbie wejść równej przynajmniej liczbie elektrod standardu 10-20. W poprzednich rozdziałach wspomniano jednak o pewnych wadach systemu 10-20, do którego czasami dokładane są kolejne elektrody (Fpz, Oz, T1, T2, P8, P7). W takim przypadku liczba wejść rośnie już do 27, warto jedna, a by nasz wzmacniacz był wyposażony w 32 wejścia, bowiem w różnego rodzaju eksperymentach możemy potrzebować kolejnych elektrod. Ponadto w trakcie rejestracji sygnału EEG powinniśmy mierzyć również sygnał EKG O(jedno odprowadzenie dwubiegunowe), Elektrokulogram (jedno odprowadzenie dwubiegunowe,lub dwa jeśli chcemy dokonywać analiz snu), niekiedy potrzebujemy również czynności EMG (np. jeśli rejestrujemu ruch palaca jako odpowiedź pacjent na jakiś bodziec, co daje kolejne oprowadzenie dwubiegunowe). Łącznie nasz wzmacniacz powinien mieć co najmniej 32 wejścia jednobiegunowe i 4 wejścia dwubiegunowe. Szczegółowa budowa wzmacniacza do rejestracji czynności EEG wykracza poza ramy niniejszych zajęć i zostanie omówiona w przyszłym semestrze, tym bardziej, iż nadal w nomenklaturze Elektroencefalograficznej funkcjonują terminy, które powstały kilkadziesiąt lat temu, kiedy aparatura do rejestracji czynności elektrycznej mózgu była oparta na układach analogowych. Właściwe zrozumienie tych terminów wymaga zaznajomienia się z pewnymi aspektami tejże aparatury.&lt;br /&gt;
&lt;br /&gt;
==Artefakty==&lt;br /&gt;
Pomiarowi czynności elektrycznej mózgu towarzyszy również rejestracja innych sygnałów bioelektrycznych, które są znacznie silniejsze od sygnału EEG. Z niektórymi z nich, takimi jak EKG, EMG, EOG, zapoznaliśmy się na wcześniejszych zajęciach.&lt;br /&gt;
Inne artefakty oraz metody ich eliminacji poznamy na zajęciach w przyszłym semstrze.&lt;/div&gt;</summary>
		<author><name>Maciek</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG_2/AR_1&amp;diff=11208</id>
		<title>Pracownia EEG 2/AR 1</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG_2/AR_1&amp;diff=11208"/>
		<updated>2024-12-10T11:18:24Z</updated>

		<summary type="html">&lt;p&gt;Maciek: /* Ćwiczenie 4 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Pracownia EEG 2|Pracownia EEG 2]] / Widmowa analiza parametryczna&lt;br /&gt;
&lt;br /&gt;
==Model autoregresyjny stochastycznego szeregu czasowego==&lt;br /&gt;
===Wstęp===&lt;br /&gt;
Do tej pory, aby zbadać własności widmowe sygnałów, używaliśmy transformacji Fouriera. Sygnał ''X''(''t'') z dziedziny czasu transformowaliśmy do dziedziny częstości ''X''(''f''):&lt;br /&gt;
&amp;lt;equation id=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;X(f)=\mathcal{F}[X(t)]&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Następnie z  transformaty estymowaliśmy funkcję gęstości widmowej mocy danego sygnału zgodnie ze wzorem:&lt;br /&gt;
&amp;lt;equation id=&amp;quot;2&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math id=2&amp;gt;S(f)=X(f)X^*(f)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Możliwe jest jednak trochę inne podejście: załóżmy, że nasz sygnał jest ''realizacją procesu stochastycznego'' opisanego pewną, znaną nam zależnością. Typowym założeniem w dziedzinie analizy sygnałów EEG jest opisanie ich jako procesów ''autoregresyjnych'' (AR):&lt;br /&gt;
&amp;lt;equation id=&amp;quot;3&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;X(t)=\sum_{j=1}^{p}A(j)X(t-j)+E(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ze względu na charakter widma takiego procesu dobrze nadaje się on do opisu sygnałów składających się z kilku rytmów o częstościach zawierających się w pewnych zakresach oraz tła o charakterze szumu. EEG i wiele innych sygnałów biologicznych ma właśnie taką strukturę.&lt;br /&gt;
&lt;br /&gt;
Co to znaczy opisać sygnał modelem AR? Musimy dopasować tak współczynniki ''A'' ze wzoru (&amp;lt;xr id=&amp;quot;3&amp;quot;/&amp;gt;), czyli tzw. współczynniki modelu, aby realizowany za jego pomocą proces AR miał funkcję autokowariancji jak najbliższą do badanego sygnału. Jeśli się nam to uda, to wszystkie wnioski dotyczące badanego sygnału możemy wyciągać na podstawie analizy parametrów modelu, a nie wartości sygnału.&lt;br /&gt;
&lt;br /&gt;
===Parametryczna analiza widmowa===&lt;br /&gt;
Równanie opisujące proces AR transformujemy do przestrzeni częstości za pomocą transformacji Z — jest to uogólnienie transformacji Fouriera stosowane dla dyskretnych ciągów wartości. Skorzystamy tu z faktu, że transformacja Z ma (podobnie do transformacji Fouriera) własność transformowania splotu sygnałów w iloczyn ich transformat. Zauważmy, że jeśli przepiszemy równanie (&amp;lt;xr id=&amp;quot;3&amp;quot;/&amp;gt;) tak, aby włączyć ''X''(''t'') do sumowania (możemy to zrobić przyjmując ''A''(0) = 1 oraz zmieniając znak pozostałych współczynników), to po lewej stronie równania otrzymujemy splot ciągu współczynników ''A'' z ciągiem wartości ''X''. Tak więc po przetransformowaniu tego równania otrzymujemy iloczyn odpowiednich transformat:&lt;br /&gt;
&amp;lt;equation id=&amp;quot;4&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{lcl}&lt;br /&gt;
\displaystyle{\sum_{j=0}^{p}A(t)X(t-j) = E(t)}&amp;amp;&amp;amp;\\&lt;br /&gt;
\;\;\Downarrow\;\scriptstyle{\mathrm{transformacja\ Z}}\;\Downarrow&amp;amp;&amp;amp;\\&lt;br /&gt;
\\&lt;br /&gt;
A(z)X(z)=E(z) &amp;amp; \Rightarrow  &amp;amp;   X(z)=A^{-1}(z)E(z)=H(z)E(z)&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Z dziedziny zmiennej ''z'' możemy przejść do dziedziny częstości podstawiając ''z'' = ''e''&amp;lt;sup&amp;gt;2&amp;amp;pi;''if''&amp;amp;Delta;''t''&amp;lt;/sup&amp;gt; (''f'' &amp;amp;mdash; częstość, &amp;amp;Delta;''t'' &amp;amp;mdash; odstęp czasu między kolejnymi próbkami sygnału):&lt;br /&gt;
&amp;lt;equation id=&amp;quot;5&amp;quot;&amp;gt;&amp;lt;math&amp;gt;&lt;br /&gt;
X(f)=H(f)E(f)&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcję ''H''(''f'') nazywamy macierzą przejścia modelu.&lt;br /&gt;
&lt;br /&gt;
Gęstość widmową mocy uzyskamy ze znanej już zależności (&amp;lt;xr id=&amp;quot;2&amp;quot;/&amp;gt;):&lt;br /&gt;
&amp;lt;equation id=&amp;quot;6&amp;quot;&amp;gt;&amp;lt;math&amp;gt;&lt;br /&gt;
S(f)=X(f)X^*(f)&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Opis własności sygnałów w języku modeli stochastycznych ma kilka zalet. Jedną z nich jest możliwość zastosowania w przypadku krótkich odcinków sygnału. Ale dla nas najważniejsza będzie łatwość modelowania sygnałów wielokanałowych przez jeden wielokanałowy model AR.&lt;br /&gt;
&lt;br /&gt;
===Wybór rzędu modelu===&lt;br /&gt;
Przyglądając się równaniu (&amp;lt;xr id=&amp;quot;3&amp;quot;/&amp;gt;) widzimy, że musimy również wiedzieć ''ile'' wcześniejszych próbek sygnału należy uwzględnić w naszych obliczeniach, czyli ustalić liczbę ''p''. Liczbę tę nazywamy ''rzędem modelu''. Wydawać by się mogło, że im więcej uwzględnimy poprzednich próbek, tym lepsze dopasowanie uzyskamy. Tak jednak nie jest. Ponieważ teoretyczne widmo procesu AR posiada maksima zależne od liczby użytych współczynników, modele o zbyt wysokich rzędach mają tendencję do generowania fałszywych maksimów w estymowanym widmie. Jeśli nie wiemy ilu składowych oczekujemy w naszym widmie, do oszacowania optymalnego rzędu modelu możemy zastosować jedno z kryteriów statystycznych, dostępnych w literaturze. Kryteria takie przeważnie mają dwie składowe: człon &amp;amp;bdquo;nagradzający&amp;amp;rdquo;  za coraz &amp;amp;bdquo;ściślejsze&amp;amp;rdquo; dopasowanie wraz z rosnącym rzędem modelu oraz człon &amp;amp;bdquo;karzący&amp;amp;rdquo; za nadmierny wzrost rzędu. Szukamy wtedy minimum funkcji kryterium policzonej dla pewnego zakresu rzędów i tak wybraną wartość stosujemy potem w obliczeniach.&lt;br /&gt;
&lt;br /&gt;
Jednym z popularnych kryteriów jest kryterium Akaikego (Hirotugu Akaike &amp;amp;mdash; matematyk japoński). Jest to funkcja:&lt;br /&gt;
&amp;lt;equation id=&amp;quot;7&amp;quot;&amp;gt;&amp;lt;math&amp;gt;&lt;br /&gt;
\mathrm{AIC}(p)=\mathrm{ln}(\det({V}))+2\frac{pk^2}{N}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/equation&amp;gt;&lt;br /&gt;
gdzie:&amp;lt;br&amp;gt;&lt;br /&gt;
''N'' &amp;amp;mdash; liczba próbek w analizowanym sygnale, ''k'' &amp;amp;mdash; liczba kanałów.&lt;br /&gt;
&lt;br /&gt;
Logarytm wyznacznika macierzy wariancji szumów jest coraz bardziej ujemny, bo dopasowanie się polepsza i elementy macierzy ''V'' maleją. Funkcją kary jest tu 2''pk''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;/''N'' &amp;amp;mdash; funkcja liniowa rosnąca (od ''p''). Szukamy pierwszego istotnego minimum krzywej opisywanej tą funkcją. W praktyce analizy EEG najczęściej stosuje się rzędy w zakresie od 4 do 9. Poniższe rysunki ilustrują możliwe sytuacje:&lt;br /&gt;
&lt;br /&gt;
[[Plik:AIC_rys_1.png|thumb|center|800px|U góry: symulacja modelu autorgresyjnego:&lt;br /&gt;
''x''(''t'') = 0,5&amp;amp;middot;''x''(''t''&amp;amp;minus;1)  &amp;amp;minus; 0,75&amp;amp;middot;''x''(''t''&amp;amp;minus;2) + ''e''(''t'')&lt;br /&gt;
przy częstości próbkowania 100 Hz. Maksimum powinno być w 20 Hz.&lt;br /&gt;
&lt;br /&gt;
AIC daje prawidłowo minimum dla rzędu 2 i widmo jest zgodne z oczekiwanym.]]&lt;br /&gt;
&lt;br /&gt;
[[Plik:AIC_rys_2.png|thumb|center|800px|U góry: symulacja sygnału:&lt;br /&gt;
&lt;br /&gt;
''x''(''t'') = cos(2&amp;amp;pi;&amp;amp;middot;20''t'')  + ''e''(''t'')&lt;br /&gt;
AIC nie daje jednoznacznego wyniku.&lt;br /&gt;
Wydaje się, że minimum istnieje dla rzędu 9.&lt;br /&gt;
Wybranie takiego rzędu powoduje wytworzenie maksimum nie tylko w 20 Hz ale i w 43 Hz. ]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Sygnały wielokanałowe===&lt;br /&gt;
Sygnały wielokanałowe to zbiory danych, w których podczas jednej sesji zapisu zbieramy wartości wielu sygnałów w tych samych chwilach czasu. Zapisy EEG z wielu elektrod są oczywiście zapisami wielokanałowymi. Ważna jest tu ''jednoczesność'' rejestracji wielkości powiązanych ze sobą.&lt;br /&gt;
&lt;br /&gt;
Przykładem danych wielokanałowych jest zapis EEG z wielu elektrod.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Czlowiek_badanie.gif|800px|thumb|center|Rejestracja EEG jako zapis wielokanałowy.]]&lt;br /&gt;
&lt;br /&gt;
W przypadku wielokanałowego modelu w wyżej wypisanych wzorach opisujących model AR musimy dokonać pewnych modyfikacji. Jeśli zbieramy jednocześnie ''k'' sygnałów (kanałów), to ''X''(''t'') jest w rzeczywistości wektorem ''k''-wierszowym [''X''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;(''t''), ''X''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;(''t''),..., ''X&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;''(''t'')]&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;, współczynniki modelu są (każdy z nich) macierzami rozmiaru ''k''&amp;amp;times;''k''; wartości szumu są inne w każdym sygnale więc ''E''(''t'') jest również wektorem [''E''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;(''t''), ''E''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;(''t''),..., ''E&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;''(''t'')]&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Po zaaplikowaniu transformacji Z i przejściu do dziedziny częstości, każda z uzyskanych transformat jest również albo wektorem ''k''-wierszowym (''X''(''f''), ''E''(''f'')) albo macierzą ''k''&amp;amp;times;''k'' (''A''(''f''), ''H''(''f'')).&lt;br /&gt;
&lt;br /&gt;
Gęstość widmowa mocy jest w tym przypadku dana jako (znak &amp;lt;sup&amp;gt;+&amp;lt;/sup&amp;gt; oznacza tu transpozycję macierzy połączoną ze sprzężeniem zespolonym jej elementów):&lt;br /&gt;
&amp;lt;equation id=&amp;quot;8&amp;quot;&amp;gt;&amp;lt;math&amp;gt;&lt;br /&gt;
S(f)=X(f)X^+(f)=H(f)E(f)[H(f)E(f)]^+=H(f)E(f)E^+(f)H^+(f)=H(f)VH^+(f)&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Skorzystaliśmy tu z wiadomości, że widmo procesu czysto losowego ''E''(''f'') jest funkcją stałą, a po wymnożeniu ''E''(''f'')''E''&amp;lt;sup&amp;gt;+&amp;lt;/sup&amp;gt;(''f'') dostajemy macierz wariancji szumów ''V'' (rozmiaru ''k''&amp;amp;times;''k''), niezależną od częstości.&lt;br /&gt;
&lt;br /&gt;
Z powyższego wzoru widać, że funkcja gęstości widmowej mocy jest macierzą rozmiaru ''k''&amp;amp;times;''k''. Jej diagonalne elementy zawierają tzw. widma własne (auto-widma) każdego z sygnałów składowych, a elementy pozadiagonalne widma wzajemne (kross-widma).&lt;br /&gt;
&lt;br /&gt;
Widzimy więc, że w przypadku analizy danych wielokanałowych mamy nie tylko wielkości opisujące każdy kanał osobno, ale również wielkości mówiące o informacji zawartej w zależnościach istniejących pomiędzy kanałami.&lt;br /&gt;
&lt;br /&gt;
Widmo wzajemne opisuje istnienie spójnej zależności między dwoma sygnałami dla danej częstości. Jego moduł mówi nam o tym jak silna jest ta zależność, a faza mówi o wzajemnym przesunięciu fazowym składowych o danej częstości w każdym z dwóch sygnałów. Jeśli oba sygnały zawierają daną częstość, ale faza wzajemna tych składowych zmienia się, to widmo wzajemne będzie mieć wartość niską.&lt;br /&gt;
Aby mieć wygodniejsze narzędzie porównawcze wprowadza się znormalizowaną wersję widma wzajemnego zwane koherencją (zwyczajną):&lt;br /&gt;
&amp;lt;equation id=&amp;quot;9&amp;quot;&amp;gt;&amp;lt;math&amp;gt;&lt;br /&gt;
K_{ij}(f)=\frac{S_{ij}(f)}{\sqrt{S_{ii}(f)S_{jj}(f)}}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Moduł koherencji zawiera się w przedziale [0,1], co znacznie ułatwia porównywanie wyników.&lt;br /&gt;
&lt;br /&gt;
===Miary cząstkowe===&lt;br /&gt;
&lt;br /&gt;
W przypadku, gdy nasz zbiór danych składa się z dwóch kanałów, interpretacja koherencji jest w zasadzie jednoznaczna. Wydawać by się mogło, że jeśli będziemy ich używać do badania układów trzy- i więcej-kanałowych, to poza większą ilością obliczeń sytuacja ideowo nie będzie się różnić. Niestety, wraz ze wzrostem liczby kanałów sytuacja ulega zmianie.&lt;br /&gt;
&lt;br /&gt;
Już w sytuacji trzech kanałów możemy napotkać tzw. wspólne źródło: kanał będący źródłem sygnału, który pojawia się w pozostałych kanałach (jak ta sama audycja u dwóch słuchaczy radia w innych miastach). Wtedy wartości koherencji nawet pomiędzy kanałami-odbiorcami sygnału będą wskazywać na istnienie związku między nimi, chociaż kanały te mogą nie być w żaden inny sposób ze sobą związane.&lt;br /&gt;
&lt;br /&gt;
Aby móc łatwiej odróżnić taką sytuację dobrze byłoby umieć jakoś &amp;amp;bdquo;odjąć&amp;amp;rdquo; wpływ kanału-źródła na pozostałe. Czynność taka nazywa się w literaturze ''parcjalizacją'' względem danego kanału.&lt;br /&gt;
&lt;br /&gt;
W ogólności mamy do dyspozycji funkcję koherencji cząstkowej, która zachowuje się podobnie do koherencji zwyczajnej, ale pokazuje związek między kanałami po odjęciu wszystkich kombinacji liniowych pozostałych kanałów. Zdefiniowana jest ona następująco:&lt;br /&gt;
&amp;lt;equation id=&amp;quot;10&amp;quot;&amp;gt;&amp;lt;math&amp;gt;&lt;br /&gt;
C_{ij}(f)=\frac{\mathrm{M}_{ij}(f)}{\sqrt{\mathrm{M}_{ii}(f)\mathrm{M}_{jj}(f)}}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We wzorze tym M&amp;lt;sub&amp;gt;''ij''&amp;lt;/sub&amp;gt; jest minorem macierzy widmowej ''S'', czyli wyznacznikiem macierzy ''S'' w której usunięto ''i''-ty wiersz i ''j''-tą kolumnę. Można tę definicję przekształcić do łatwiejszej do zastosowania postaci z użyciem elementów macierzy odwrotnej ''S''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;. Jeśli ''d&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt;''(''f'') = [''S''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;]&amp;lt;sub&amp;gt;''ij''&amp;lt;/sub&amp;gt;(''f''), mamy:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;11&amp;quot;&amp;gt;&amp;lt;math&amp;gt;&lt;br /&gt;
C_{ij}(f)=(-1)^{i+j}\frac{d_{ji}(f)}{\sqrt{d_{ii}(f)d_{jj}(f)}}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tak więc miary cząstkowe muszą operować na więcej niż dwóch kanałach jednocześnie. Dzięki zastosowaniu wielokanałowego modelu AR założenie to jest spełnione i możemy w prosty sposób policzyć zarówno koherencje zwyczajne jak i cząstkowe dla dowolnej liczby kanałów w zestawie.&lt;br /&gt;
&lt;br /&gt;
==Ćwiczenia==&lt;br /&gt;
&lt;br /&gt;
W tekście ćwiczeń używać będziemy następujących założeń: posiadamy ''k'' kanałów danych, używamy modelu AR rzędu ''p'', częstość próbkowania danych wynosi ''f&amp;lt;sub&amp;gt;s&amp;lt;/sub&amp;gt;''. W każdym kanale zebrano ''N'' próbek danych.&lt;br /&gt;
&lt;br /&gt;
Aby ułatwić zapoznanie się z parametrycznymi metodami analizy widmowej, a nie rozpraszać uwagi na dopasowywanie współczynników modelu, przygotowana została biblioteka procedur (w języku Python) estymacji współczynników wielokanałowego modelu AR dla posiadanych danych. Aby jej użyć musimy napisać:&lt;br /&gt;
&amp;lt;tt&amp;gt;import mtmvar&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W zaimportowanym module mamy do dyspozycji funkcję &amp;lt;tt&amp;gt;mult_AR&amp;lt;/tt&amp;gt;, która oczekuje parametrów:&lt;br /&gt;
# macierzy danych o wymiarach (''k'', ''N'');&lt;br /&gt;
# wybranego rzędu modelu;&lt;br /&gt;
# numeru metody liczenia współczynników (aktualnie należy wybrać zawsze liczbę 1).&lt;br /&gt;
 &lt;br /&gt;
Funkcja zwraca krotkę zawierającą dwa obiekty:&lt;br /&gt;
# macierz policzonych współczynników, rozmiaru (''p'', ''k'', ''k'') &amp;amp;mdash; czyli ''p'' współczynników macierzowych rozmiaru ''k''&amp;amp;times;''k'';&lt;br /&gt;
# macierz wariancji szumów ''V'', rozmiaru (''k'', ''k'') &amp;amp;mdash; patrz równanie (&amp;lt;xr id=&amp;quot;8&amp;quot;/&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Uwaga:&amp;lt;/b&amp;gt; macierz danych wejściowych musi mieć zawsze rozmiar (''k'',''N''), nawet jeśli ''k''=1 (możemy ją wtedy uzyskać z pojedynczego wektora &amp;lt;tt&amp;gt;dane&amp;lt;/tt&amp;gt; funkcją &amp;lt;tt&amp;gt;numpy.reshape(dane,(1,-1))&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
===Kilka słów o transformacji Z===&lt;br /&gt;
&lt;br /&gt;
Dla skończonego ciągu współczynników ''A''(0), ''A''(1), ..., ''A''(''p'') ich transformata Z może być obliczona następująco:&lt;br /&gt;
&amp;lt;equation id=&amp;quot;12&amp;quot;&amp;gt;&amp;lt;math&amp;gt;&lt;br /&gt;
A(z)=A(0)+A(1)z^{-1}+A(2)z^{-2}+...+A(p)z^{-p}=\sum_{j=0}^{p}A(j)z^{-j}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aby obliczyć wartość transformaty dla konkretnej częstości ''f'' musimy w powyższym wzorze dokonać podstawienia&lt;br /&gt;
&amp;lt;equation id=&amp;quot;13&amp;quot;&amp;gt;&amp;lt;math&amp;gt;&lt;br /&gt;
z=\exp(2\pi if \Delta t),&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/equation&amp;gt;&lt;br /&gt;
gdzie &amp;amp;Delta;''t'' = 1 / ''f&amp;lt;sub&amp;gt;s&amp;lt;/sub&amp;gt;''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Uwaga:&amp;lt;/b&amp;gt; procedura &amp;lt;tt&amp;gt;mult_AR&amp;lt;/tt&amp;gt; zwraca współczynniki od ''A''(1) do ''A''(''p'') jak dla równania (&amp;lt;xr id=&amp;quot;3&amp;quot;/&amp;gt;). Aby mieć zgodność z równaniem (&amp;lt;xr id=&amp;quot;4&amp;quot;/&amp;gt;) musimy założyć ''A''(0) = 1 oraz zmienić znak pozostałych współczynników na przeciwny.&lt;br /&gt;
&lt;br /&gt;
===Ćwiczenie 1===&lt;br /&gt;
&lt;br /&gt;
Z danych EEG zebranych na zajęciach dotyczących EEG spoczynkowego wyodrębnij jeden kanał. Wytnij z niego sygnał o długości 1000 próbek. Przefiltruj wycięty sygnał filtrem górnoprzepustowym (np. Butterwortha) o częstości odcięcia 1 Hz.&lt;br /&gt;
&lt;br /&gt;
Oblicz współczynniki modelu AR dla wyciętego sygnału dla rzędów od 1 do 5. Zobacz również jak ze wzrostem rzędu modelu zmienia się macierz wariancji szumu.&lt;br /&gt;
&lt;br /&gt;
Powtórz to samo dla sygnału w postaci pojedynczego sinusa oraz dla szumu.&lt;br /&gt;
&lt;br /&gt;
Napisz funkcję liczącą kryterium Akaikego dla posiadanych danych dla zakresu rzędów 1-20. Funkcja powinna działać dla dowolnej liczby kanałów. Następnie napisz procedurę rysującą policzone kryterium tak, aby można było ocenić wizualnie jego przebieg i wybrać optymalny rząd modelu AR.&lt;br /&gt;
&lt;br /&gt;
===Ćwiczenie 2===&lt;br /&gt;
Napisz funkcję obliczającą macierze ''A''(''f'') i ''H''(''f'') z równań (&amp;lt;xr id=&amp;quot;4&amp;quot;/&amp;gt;) i (&amp;lt;xr id=&amp;quot;5&amp;quot;/&amp;gt;) dla wybranego zestawu częstości z zakresu ''f''&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;-''f''&amp;lt;sub&amp;gt;max&amp;lt;/sub&amp;gt;. Wykorzystaj tutaj równanie (&amp;lt;xr id=&amp;quot;12&amp;quot;/&amp;gt;). Funkcja ma działać dla danych wielokanałowych (no i oczywiście jednokanałowych jako przypadek szczególny), tzn. jej argumentami powinny być: macierz zawierająca sygnał i rząd modelu.&lt;br /&gt;
&lt;br /&gt;
Stosując napisaną funkcję oraz równanie (&amp;lt;xr id=&amp;quot;8&amp;quot;/&amp;gt;) oblicz macierz gęstości widmowej mocy w zakresie częstości od 0 Hz do częstości Nyquista dla danych z poprzedniego ćwiczenia (z użyciem optymalnego rzędu modelu AR). Narysuj wykresy widm własnych i wzajemnych.&lt;br /&gt;
&lt;br /&gt;
===Ćwiczenie 3===&lt;br /&gt;
&lt;br /&gt;
* Wygeneruj dwa sygnały sinusoidalne o długości 1000 próbek każdy, o tej samej częstości 32 Hz i częstości próbkowania 128 Hz, ale różnych fazach początkowych. &lt;br /&gt;
* Pierwszy sygnał powinien mieć fazę początkową równą 0, drugi sygnał sinusoidalny powinien mieć fazę początkową równą &amp;amp;pi;/4.&lt;br /&gt;
* Do drugiego z sygnałów dodaj małą (o amplitudzie ok 0,2 amplitudy sinusoidy) składową losową (czyli dodatkowy niezależny szum biały) o średniej 0.&lt;br /&gt;
* Z tak otrzymanych sygnałów utwórz jeden sygnał dwukanałowy (macierz o rozmiarze &amp;lt;tt&amp;gt;(2,1000)&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Podobnie jak poprzednio, ustal optymalny rząd modelu AR (tym razem dwukanałowego) i oblicz macierz gęstości widmowej mocy. Oblicz koherencje między tymi sygnałami. Narysuj moduł i fazę koherencji ''C''&amp;lt;sub&amp;gt;12&amp;lt;/sub&amp;gt; i ''C''&amp;lt;sub&amp;gt;21&amp;lt;/sub&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Zmień fazę początkową drugiego sygnału. Jak zmienia się funkcja koherencji?&lt;br /&gt;
&lt;br /&gt;
===Ćwiczenie 4===&lt;br /&gt;
&lt;br /&gt;
Wygeneruj układ trzech sygnałów w następujący sposób:&lt;br /&gt;
* jako pierwszego kanału użyj sygnału z ćwiczenia 1;&lt;br /&gt;
* sygnał_w_drugim_kanale(''t'') = 0,4 * sygnał_z_pierwszego_kanału(''t''&amp;amp;minus;1) + szum1;&lt;br /&gt;
* sygnał_w_trzecim_kanale(''t'') = 0,3 * sygnał_z_pierwszego_kanału(''t''&amp;amp;minus;2) + szum2.&lt;br /&gt;
&lt;br /&gt;
Oblicz macierz koherencji zwyczajnych dla tego układu i na ich podstawie wyznacz zależności między kanałami. Powtórz to samo dla koherencji cząstkowych.&lt;br /&gt;
&lt;br /&gt;
Wygeneruj zestaw danych jak poprzednio używając w kanale 1 sygnału z ćwiczenia 1. Powtórz obliczenia i porównaj wyniki.&lt;br /&gt;
&lt;br /&gt;
Wyniki wszystkich obliczeń przedstaw na rysunkach.&lt;br /&gt;
&lt;br /&gt;
===Ćwiczenie 5===&lt;br /&gt;
&lt;br /&gt;
Z danych zawierających spoczynkowe EEG wytnij dwa fragmenty: zawierający i nie zawierający czynności alfa. Fragmenty powinny mieć cztery wybrane kanały danych (dwa z tyłu i dwa z przodu głowy, na przykład O1, O2, F3, F4) oraz długość ok. 500 próbek.&lt;br /&gt;
&lt;br /&gt;
Dopasuj czterokanałowe modele AR do wyciętych fragmentów danych. Oblicz macierze gęstości widmowej mocy, koherencji zwyczajnych i koherencji cząstkowych dla obu fragmentów. Narysuj wykresy otrzymanych funkcji.&lt;/div&gt;</summary>
		<author><name>Maciek</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG_2/AR_1&amp;diff=11207</id>
		<title>Pracownia EEG 2/AR 1</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG_2/AR_1&amp;diff=11207"/>
		<updated>2024-12-10T11:17:44Z</updated>

		<summary type="html">&lt;p&gt;Maciek: /* Ćwiczenie 4 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Pracownia EEG 2|Pracownia EEG 2]] / Widmowa analiza parametryczna&lt;br /&gt;
&lt;br /&gt;
==Model autoregresyjny stochastycznego szeregu czasowego==&lt;br /&gt;
===Wstęp===&lt;br /&gt;
Do tej pory, aby zbadać własności widmowe sygnałów, używaliśmy transformacji Fouriera. Sygnał ''X''(''t'') z dziedziny czasu transformowaliśmy do dziedziny częstości ''X''(''f''):&lt;br /&gt;
&amp;lt;equation id=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;X(f)=\mathcal{F}[X(t)]&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Następnie z  transformaty estymowaliśmy funkcję gęstości widmowej mocy danego sygnału zgodnie ze wzorem:&lt;br /&gt;
&amp;lt;equation id=&amp;quot;2&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math id=2&amp;gt;S(f)=X(f)X^*(f)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Możliwe jest jednak trochę inne podejście: załóżmy, że nasz sygnał jest ''realizacją procesu stochastycznego'' opisanego pewną, znaną nam zależnością. Typowym założeniem w dziedzinie analizy sygnałów EEG jest opisanie ich jako procesów ''autoregresyjnych'' (AR):&lt;br /&gt;
&amp;lt;equation id=&amp;quot;3&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;X(t)=\sum_{j=1}^{p}A(j)X(t-j)+E(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ze względu na charakter widma takiego procesu dobrze nadaje się on do opisu sygnałów składających się z kilku rytmów o częstościach zawierających się w pewnych zakresach oraz tła o charakterze szumu. EEG i wiele innych sygnałów biologicznych ma właśnie taką strukturę.&lt;br /&gt;
&lt;br /&gt;
Co to znaczy opisać sygnał modelem AR? Musimy dopasować tak współczynniki ''A'' ze wzoru (&amp;lt;xr id=&amp;quot;3&amp;quot;/&amp;gt;), czyli tzw. współczynniki modelu, aby realizowany za jego pomocą proces AR miał funkcję autokowariancji jak najbliższą do badanego sygnału. Jeśli się nam to uda, to wszystkie wnioski dotyczące badanego sygnału możemy wyciągać na podstawie analizy parametrów modelu, a nie wartości sygnału.&lt;br /&gt;
&lt;br /&gt;
===Parametryczna analiza widmowa===&lt;br /&gt;
Równanie opisujące proces AR transformujemy do przestrzeni częstości za pomocą transformacji Z — jest to uogólnienie transformacji Fouriera stosowane dla dyskretnych ciągów wartości. Skorzystamy tu z faktu, że transformacja Z ma (podobnie do transformacji Fouriera) własność transformowania splotu sygnałów w iloczyn ich transformat. Zauważmy, że jeśli przepiszemy równanie (&amp;lt;xr id=&amp;quot;3&amp;quot;/&amp;gt;) tak, aby włączyć ''X''(''t'') do sumowania (możemy to zrobić przyjmując ''A''(0) = 1 oraz zmieniając znak pozostałych współczynników), to po lewej stronie równania otrzymujemy splot ciągu współczynników ''A'' z ciągiem wartości ''X''. Tak więc po przetransformowaniu tego równania otrzymujemy iloczyn odpowiednich transformat:&lt;br /&gt;
&amp;lt;equation id=&amp;quot;4&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{lcl}&lt;br /&gt;
\displaystyle{\sum_{j=0}^{p}A(t)X(t-j) = E(t)}&amp;amp;&amp;amp;\\&lt;br /&gt;
\;\;\Downarrow\;\scriptstyle{\mathrm{transformacja\ Z}}\;\Downarrow&amp;amp;&amp;amp;\\&lt;br /&gt;
\\&lt;br /&gt;
A(z)X(z)=E(z) &amp;amp; \Rightarrow  &amp;amp;   X(z)=A^{-1}(z)E(z)=H(z)E(z)&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Z dziedziny zmiennej ''z'' możemy przejść do dziedziny częstości podstawiając ''z'' = ''e''&amp;lt;sup&amp;gt;2&amp;amp;pi;''if''&amp;amp;Delta;''t''&amp;lt;/sup&amp;gt; (''f'' &amp;amp;mdash; częstość, &amp;amp;Delta;''t'' &amp;amp;mdash; odstęp czasu między kolejnymi próbkami sygnału):&lt;br /&gt;
&amp;lt;equation id=&amp;quot;5&amp;quot;&amp;gt;&amp;lt;math&amp;gt;&lt;br /&gt;
X(f)=H(f)E(f)&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcję ''H''(''f'') nazywamy macierzą przejścia modelu.&lt;br /&gt;
&lt;br /&gt;
Gęstość widmową mocy uzyskamy ze znanej już zależności (&amp;lt;xr id=&amp;quot;2&amp;quot;/&amp;gt;):&lt;br /&gt;
&amp;lt;equation id=&amp;quot;6&amp;quot;&amp;gt;&amp;lt;math&amp;gt;&lt;br /&gt;
S(f)=X(f)X^*(f)&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Opis własności sygnałów w języku modeli stochastycznych ma kilka zalet. Jedną z nich jest możliwość zastosowania w przypadku krótkich odcinków sygnału. Ale dla nas najważniejsza będzie łatwość modelowania sygnałów wielokanałowych przez jeden wielokanałowy model AR.&lt;br /&gt;
&lt;br /&gt;
===Wybór rzędu modelu===&lt;br /&gt;
Przyglądając się równaniu (&amp;lt;xr id=&amp;quot;3&amp;quot;/&amp;gt;) widzimy, że musimy również wiedzieć ''ile'' wcześniejszych próbek sygnału należy uwzględnić w naszych obliczeniach, czyli ustalić liczbę ''p''. Liczbę tę nazywamy ''rzędem modelu''. Wydawać by się mogło, że im więcej uwzględnimy poprzednich próbek, tym lepsze dopasowanie uzyskamy. Tak jednak nie jest. Ponieważ teoretyczne widmo procesu AR posiada maksima zależne od liczby użytych współczynników, modele o zbyt wysokich rzędach mają tendencję do generowania fałszywych maksimów w estymowanym widmie. Jeśli nie wiemy ilu składowych oczekujemy w naszym widmie, do oszacowania optymalnego rzędu modelu możemy zastosować jedno z kryteriów statystycznych, dostępnych w literaturze. Kryteria takie przeważnie mają dwie składowe: człon &amp;amp;bdquo;nagradzający&amp;amp;rdquo;  za coraz &amp;amp;bdquo;ściślejsze&amp;amp;rdquo; dopasowanie wraz z rosnącym rzędem modelu oraz człon &amp;amp;bdquo;karzący&amp;amp;rdquo; za nadmierny wzrost rzędu. Szukamy wtedy minimum funkcji kryterium policzonej dla pewnego zakresu rzędów i tak wybraną wartość stosujemy potem w obliczeniach.&lt;br /&gt;
&lt;br /&gt;
Jednym z popularnych kryteriów jest kryterium Akaikego (Hirotugu Akaike &amp;amp;mdash; matematyk japoński). Jest to funkcja:&lt;br /&gt;
&amp;lt;equation id=&amp;quot;7&amp;quot;&amp;gt;&amp;lt;math&amp;gt;&lt;br /&gt;
\mathrm{AIC}(p)=\mathrm{ln}(\det({V}))+2\frac{pk^2}{N}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/equation&amp;gt;&lt;br /&gt;
gdzie:&amp;lt;br&amp;gt;&lt;br /&gt;
''N'' &amp;amp;mdash; liczba próbek w analizowanym sygnale, ''k'' &amp;amp;mdash; liczba kanałów.&lt;br /&gt;
&lt;br /&gt;
Logarytm wyznacznika macierzy wariancji szumów jest coraz bardziej ujemny, bo dopasowanie się polepsza i elementy macierzy ''V'' maleją. Funkcją kary jest tu 2''pk''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;/''N'' &amp;amp;mdash; funkcja liniowa rosnąca (od ''p''). Szukamy pierwszego istotnego minimum krzywej opisywanej tą funkcją. W praktyce analizy EEG najczęściej stosuje się rzędy w zakresie od 4 do 9. Poniższe rysunki ilustrują możliwe sytuacje:&lt;br /&gt;
&lt;br /&gt;
[[Plik:AIC_rys_1.png|thumb|center|800px|U góry: symulacja modelu autorgresyjnego:&lt;br /&gt;
''x''(''t'') = 0,5&amp;amp;middot;''x''(''t''&amp;amp;minus;1)  &amp;amp;minus; 0,75&amp;amp;middot;''x''(''t''&amp;amp;minus;2) + ''e''(''t'')&lt;br /&gt;
przy częstości próbkowania 100 Hz. Maksimum powinno być w 20 Hz.&lt;br /&gt;
&lt;br /&gt;
AIC daje prawidłowo minimum dla rzędu 2 i widmo jest zgodne z oczekiwanym.]]&lt;br /&gt;
&lt;br /&gt;
[[Plik:AIC_rys_2.png|thumb|center|800px|U góry: symulacja sygnału:&lt;br /&gt;
&lt;br /&gt;
''x''(''t'') = cos(2&amp;amp;pi;&amp;amp;middot;20''t'')  + ''e''(''t'')&lt;br /&gt;
AIC nie daje jednoznacznego wyniku.&lt;br /&gt;
Wydaje się, że minimum istnieje dla rzędu 9.&lt;br /&gt;
Wybranie takiego rzędu powoduje wytworzenie maksimum nie tylko w 20 Hz ale i w 43 Hz. ]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Sygnały wielokanałowe===&lt;br /&gt;
Sygnały wielokanałowe to zbiory danych, w których podczas jednej sesji zapisu zbieramy wartości wielu sygnałów w tych samych chwilach czasu. Zapisy EEG z wielu elektrod są oczywiście zapisami wielokanałowymi. Ważna jest tu ''jednoczesność'' rejestracji wielkości powiązanych ze sobą.&lt;br /&gt;
&lt;br /&gt;
Przykładem danych wielokanałowych jest zapis EEG z wielu elektrod.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Czlowiek_badanie.gif|800px|thumb|center|Rejestracja EEG jako zapis wielokanałowy.]]&lt;br /&gt;
&lt;br /&gt;
W przypadku wielokanałowego modelu w wyżej wypisanych wzorach opisujących model AR musimy dokonać pewnych modyfikacji. Jeśli zbieramy jednocześnie ''k'' sygnałów (kanałów), to ''X''(''t'') jest w rzeczywistości wektorem ''k''-wierszowym [''X''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;(''t''), ''X''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;(''t''),..., ''X&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;''(''t'')]&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;, współczynniki modelu są (każdy z nich) macierzami rozmiaru ''k''&amp;amp;times;''k''; wartości szumu są inne w każdym sygnale więc ''E''(''t'') jest również wektorem [''E''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;(''t''), ''E''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;(''t''),..., ''E&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;''(''t'')]&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Po zaaplikowaniu transformacji Z i przejściu do dziedziny częstości, każda z uzyskanych transformat jest również albo wektorem ''k''-wierszowym (''X''(''f''), ''E''(''f'')) albo macierzą ''k''&amp;amp;times;''k'' (''A''(''f''), ''H''(''f'')).&lt;br /&gt;
&lt;br /&gt;
Gęstość widmowa mocy jest w tym przypadku dana jako (znak &amp;lt;sup&amp;gt;+&amp;lt;/sup&amp;gt; oznacza tu transpozycję macierzy połączoną ze sprzężeniem zespolonym jej elementów):&lt;br /&gt;
&amp;lt;equation id=&amp;quot;8&amp;quot;&amp;gt;&amp;lt;math&amp;gt;&lt;br /&gt;
S(f)=X(f)X^+(f)=H(f)E(f)[H(f)E(f)]^+=H(f)E(f)E^+(f)H^+(f)=H(f)VH^+(f)&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Skorzystaliśmy tu z wiadomości, że widmo procesu czysto losowego ''E''(''f'') jest funkcją stałą, a po wymnożeniu ''E''(''f'')''E''&amp;lt;sup&amp;gt;+&amp;lt;/sup&amp;gt;(''f'') dostajemy macierz wariancji szumów ''V'' (rozmiaru ''k''&amp;amp;times;''k''), niezależną od częstości.&lt;br /&gt;
&lt;br /&gt;
Z powyższego wzoru widać, że funkcja gęstości widmowej mocy jest macierzą rozmiaru ''k''&amp;amp;times;''k''. Jej diagonalne elementy zawierają tzw. widma własne (auto-widma) każdego z sygnałów składowych, a elementy pozadiagonalne widma wzajemne (kross-widma).&lt;br /&gt;
&lt;br /&gt;
Widzimy więc, że w przypadku analizy danych wielokanałowych mamy nie tylko wielkości opisujące każdy kanał osobno, ale również wielkości mówiące o informacji zawartej w zależnościach istniejących pomiędzy kanałami.&lt;br /&gt;
&lt;br /&gt;
Widmo wzajemne opisuje istnienie spójnej zależności między dwoma sygnałami dla danej częstości. Jego moduł mówi nam o tym jak silna jest ta zależność, a faza mówi o wzajemnym przesunięciu fazowym składowych o danej częstości w każdym z dwóch sygnałów. Jeśli oba sygnały zawierają daną częstość, ale faza wzajemna tych składowych zmienia się, to widmo wzajemne będzie mieć wartość niską.&lt;br /&gt;
Aby mieć wygodniejsze narzędzie porównawcze wprowadza się znormalizowaną wersję widma wzajemnego zwane koherencją (zwyczajną):&lt;br /&gt;
&amp;lt;equation id=&amp;quot;9&amp;quot;&amp;gt;&amp;lt;math&amp;gt;&lt;br /&gt;
K_{ij}(f)=\frac{S_{ij}(f)}{\sqrt{S_{ii}(f)S_{jj}(f)}}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Moduł koherencji zawiera się w przedziale [0,1], co znacznie ułatwia porównywanie wyników.&lt;br /&gt;
&lt;br /&gt;
===Miary cząstkowe===&lt;br /&gt;
&lt;br /&gt;
W przypadku, gdy nasz zbiór danych składa się z dwóch kanałów, interpretacja koherencji jest w zasadzie jednoznaczna. Wydawać by się mogło, że jeśli będziemy ich używać do badania układów trzy- i więcej-kanałowych, to poza większą ilością obliczeń sytuacja ideowo nie będzie się różnić. Niestety, wraz ze wzrostem liczby kanałów sytuacja ulega zmianie.&lt;br /&gt;
&lt;br /&gt;
Już w sytuacji trzech kanałów możemy napotkać tzw. wspólne źródło: kanał będący źródłem sygnału, który pojawia się w pozostałych kanałach (jak ta sama audycja u dwóch słuchaczy radia w innych miastach). Wtedy wartości koherencji nawet pomiędzy kanałami-odbiorcami sygnału będą wskazywać na istnienie związku między nimi, chociaż kanały te mogą nie być w żaden inny sposób ze sobą związane.&lt;br /&gt;
&lt;br /&gt;
Aby móc łatwiej odróżnić taką sytuację dobrze byłoby umieć jakoś &amp;amp;bdquo;odjąć&amp;amp;rdquo; wpływ kanału-źródła na pozostałe. Czynność taka nazywa się w literaturze ''parcjalizacją'' względem danego kanału.&lt;br /&gt;
&lt;br /&gt;
W ogólności mamy do dyspozycji funkcję koherencji cząstkowej, która zachowuje się podobnie do koherencji zwyczajnej, ale pokazuje związek między kanałami po odjęciu wszystkich kombinacji liniowych pozostałych kanałów. Zdefiniowana jest ona następująco:&lt;br /&gt;
&amp;lt;equation id=&amp;quot;10&amp;quot;&amp;gt;&amp;lt;math&amp;gt;&lt;br /&gt;
C_{ij}(f)=\frac{\mathrm{M}_{ij}(f)}{\sqrt{\mathrm{M}_{ii}(f)\mathrm{M}_{jj}(f)}}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We wzorze tym M&amp;lt;sub&amp;gt;''ij''&amp;lt;/sub&amp;gt; jest minorem macierzy widmowej ''S'', czyli wyznacznikiem macierzy ''S'' w której usunięto ''i''-ty wiersz i ''j''-tą kolumnę. Można tę definicję przekształcić do łatwiejszej do zastosowania postaci z użyciem elementów macierzy odwrotnej ''S''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;. Jeśli ''d&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt;''(''f'') = [''S''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;]&amp;lt;sub&amp;gt;''ij''&amp;lt;/sub&amp;gt;(''f''), mamy:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;11&amp;quot;&amp;gt;&amp;lt;math&amp;gt;&lt;br /&gt;
C_{ij}(f)=(-1)^{i+j}\frac{d_{ji}(f)}{\sqrt{d_{ii}(f)d_{jj}(f)}}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tak więc miary cząstkowe muszą operować na więcej niż dwóch kanałach jednocześnie. Dzięki zastosowaniu wielokanałowego modelu AR założenie to jest spełnione i możemy w prosty sposób policzyć zarówno koherencje zwyczajne jak i cząstkowe dla dowolnej liczby kanałów w zestawie.&lt;br /&gt;
&lt;br /&gt;
==Ćwiczenia==&lt;br /&gt;
&lt;br /&gt;
W tekście ćwiczeń używać będziemy następujących założeń: posiadamy ''k'' kanałów danych, używamy modelu AR rzędu ''p'', częstość próbkowania danych wynosi ''f&amp;lt;sub&amp;gt;s&amp;lt;/sub&amp;gt;''. W każdym kanale zebrano ''N'' próbek danych.&lt;br /&gt;
&lt;br /&gt;
Aby ułatwić zapoznanie się z parametrycznymi metodami analizy widmowej, a nie rozpraszać uwagi na dopasowywanie współczynników modelu, przygotowana została biblioteka procedur (w języku Python) estymacji współczynników wielokanałowego modelu AR dla posiadanych danych. Aby jej użyć musimy napisać:&lt;br /&gt;
&amp;lt;tt&amp;gt;import mtmvar&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W zaimportowanym module mamy do dyspozycji funkcję &amp;lt;tt&amp;gt;mult_AR&amp;lt;/tt&amp;gt;, która oczekuje parametrów:&lt;br /&gt;
# macierzy danych o wymiarach (''k'', ''N'');&lt;br /&gt;
# wybranego rzędu modelu;&lt;br /&gt;
# numeru metody liczenia współczynników (aktualnie należy wybrać zawsze liczbę 1).&lt;br /&gt;
 &lt;br /&gt;
Funkcja zwraca krotkę zawierającą dwa obiekty:&lt;br /&gt;
# macierz policzonych współczynników, rozmiaru (''p'', ''k'', ''k'') &amp;amp;mdash; czyli ''p'' współczynników macierzowych rozmiaru ''k''&amp;amp;times;''k'';&lt;br /&gt;
# macierz wariancji szumów ''V'', rozmiaru (''k'', ''k'') &amp;amp;mdash; patrz równanie (&amp;lt;xr id=&amp;quot;8&amp;quot;/&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Uwaga:&amp;lt;/b&amp;gt; macierz danych wejściowych musi mieć zawsze rozmiar (''k'',''N''), nawet jeśli ''k''=1 (możemy ją wtedy uzyskać z pojedynczego wektora &amp;lt;tt&amp;gt;dane&amp;lt;/tt&amp;gt; funkcją &amp;lt;tt&amp;gt;numpy.reshape(dane,(1,-1))&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
===Kilka słów o transformacji Z===&lt;br /&gt;
&lt;br /&gt;
Dla skończonego ciągu współczynników ''A''(0), ''A''(1), ..., ''A''(''p'') ich transformata Z może być obliczona następująco:&lt;br /&gt;
&amp;lt;equation id=&amp;quot;12&amp;quot;&amp;gt;&amp;lt;math&amp;gt;&lt;br /&gt;
A(z)=A(0)+A(1)z^{-1}+A(2)z^{-2}+...+A(p)z^{-p}=\sum_{j=0}^{p}A(j)z^{-j}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aby obliczyć wartość transformaty dla konkretnej częstości ''f'' musimy w powyższym wzorze dokonać podstawienia&lt;br /&gt;
&amp;lt;equation id=&amp;quot;13&amp;quot;&amp;gt;&amp;lt;math&amp;gt;&lt;br /&gt;
z=\exp(2\pi if \Delta t),&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/equation&amp;gt;&lt;br /&gt;
gdzie &amp;amp;Delta;''t'' = 1 / ''f&amp;lt;sub&amp;gt;s&amp;lt;/sub&amp;gt;''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Uwaga:&amp;lt;/b&amp;gt; procedura &amp;lt;tt&amp;gt;mult_AR&amp;lt;/tt&amp;gt; zwraca współczynniki od ''A''(1) do ''A''(''p'') jak dla równania (&amp;lt;xr id=&amp;quot;3&amp;quot;/&amp;gt;). Aby mieć zgodność z równaniem (&amp;lt;xr id=&amp;quot;4&amp;quot;/&amp;gt;) musimy założyć ''A''(0) = 1 oraz zmienić znak pozostałych współczynników na przeciwny.&lt;br /&gt;
&lt;br /&gt;
===Ćwiczenie 1===&lt;br /&gt;
&lt;br /&gt;
Z danych EEG zebranych na zajęciach dotyczących EEG spoczynkowego wyodrębnij jeden kanał. Wytnij z niego sygnał o długości 1000 próbek. Przefiltruj wycięty sygnał filtrem górnoprzepustowym (np. Butterwortha) o częstości odcięcia 1 Hz.&lt;br /&gt;
&lt;br /&gt;
Oblicz współczynniki modelu AR dla wyciętego sygnału dla rzędów od 1 do 5. Zobacz również jak ze wzrostem rzędu modelu zmienia się macierz wariancji szumu.&lt;br /&gt;
&lt;br /&gt;
Powtórz to samo dla sygnału w postaci pojedynczego sinusa oraz dla szumu.&lt;br /&gt;
&lt;br /&gt;
Napisz funkcję liczącą kryterium Akaikego dla posiadanych danych dla zakresu rzędów 1-20. Funkcja powinna działać dla dowolnej liczby kanałów. Następnie napisz procedurę rysującą policzone kryterium tak, aby można było ocenić wizualnie jego przebieg i wybrać optymalny rząd modelu AR.&lt;br /&gt;
&lt;br /&gt;
===Ćwiczenie 2===&lt;br /&gt;
Napisz funkcję obliczającą macierze ''A''(''f'') i ''H''(''f'') z równań (&amp;lt;xr id=&amp;quot;4&amp;quot;/&amp;gt;) i (&amp;lt;xr id=&amp;quot;5&amp;quot;/&amp;gt;) dla wybranego zestawu częstości z zakresu ''f''&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;-''f''&amp;lt;sub&amp;gt;max&amp;lt;/sub&amp;gt;. Wykorzystaj tutaj równanie (&amp;lt;xr id=&amp;quot;12&amp;quot;/&amp;gt;). Funkcja ma działać dla danych wielokanałowych (no i oczywiście jednokanałowych jako przypadek szczególny), tzn. jej argumentami powinny być: macierz zawierająca sygnał i rząd modelu.&lt;br /&gt;
&lt;br /&gt;
Stosując napisaną funkcję oraz równanie (&amp;lt;xr id=&amp;quot;8&amp;quot;/&amp;gt;) oblicz macierz gęstości widmowej mocy w zakresie częstości od 0 Hz do częstości Nyquista dla danych z poprzedniego ćwiczenia (z użyciem optymalnego rzędu modelu AR). Narysuj wykresy widm własnych i wzajemnych.&lt;br /&gt;
&lt;br /&gt;
===Ćwiczenie 3===&lt;br /&gt;
&lt;br /&gt;
* Wygeneruj dwa sygnały sinusoidalne o długości 1000 próbek każdy, o tej samej częstości 32 Hz i częstości próbkowania 128 Hz, ale różnych fazach początkowych. &lt;br /&gt;
* Pierwszy sygnał powinien mieć fazę początkową równą 0, drugi sygnał sinusoidalny powinien mieć fazę początkową równą &amp;amp;pi;/4.&lt;br /&gt;
* Do drugiego z sygnałów dodaj małą (o amplitudzie ok 0,2 amplitudy sinusoidy) składową losową (czyli dodatkowy niezależny szum biały) o średniej 0.&lt;br /&gt;
* Z tak otrzymanych sygnałów utwórz jeden sygnał dwukanałowy (macierz o rozmiarze &amp;lt;tt&amp;gt;(2,1000)&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Podobnie jak poprzednio, ustal optymalny rząd modelu AR (tym razem dwukanałowego) i oblicz macierz gęstości widmowej mocy. Oblicz koherencje między tymi sygnałami. Narysuj moduł i fazę koherencji ''C''&amp;lt;sub&amp;gt;12&amp;lt;/sub&amp;gt; i ''C''&amp;lt;sub&amp;gt;21&amp;lt;/sub&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Zmień fazę początkową drugiego sygnału. Jak zmienia się funkcja koherencji?&lt;br /&gt;
&lt;br /&gt;
===Ćwiczenie 4===&lt;br /&gt;
&lt;br /&gt;
Wygeneruj układ trzech sygnałów w następujący sposób:&lt;br /&gt;
* jako pierwszego kanału użyj sygnału z [[Pracownia_EEG/AR_1#Ćwiczenie 1|ćwiczenia 1];&lt;br /&gt;
* sygnał_w_drugim_kanale(''t'') = 0,4 * sygnał_z_pierwszego_kanału(''t''&amp;amp;minus;1) + szum1;&lt;br /&gt;
* sygnał_w_trzecim_kanale(''t'') = 0,3 * sygnał_z_pierwszego_kanału(''t''&amp;amp;minus;2) + szum2.&lt;br /&gt;
&lt;br /&gt;
Oblicz macierz koherencji zwyczajnych dla tego układu i na ich podstawie wyznacz zależności między kanałami. Powtórz to samo dla koherencji cząstkowych.&lt;br /&gt;
&lt;br /&gt;
Wygeneruj zestaw danych jak poprzednio używając w kanale 1 sygnału z ćwiczenia 1. Powtórz obliczenia i porównaj wyniki.&lt;br /&gt;
&lt;br /&gt;
Wyniki wszystkich obliczeń przedstaw na rysunkach.&lt;br /&gt;
&lt;br /&gt;
===Ćwiczenie 5===&lt;br /&gt;
&lt;br /&gt;
Z danych zawierających spoczynkowe EEG wytnij dwa fragmenty: zawierający i nie zawierający czynności alfa. Fragmenty powinny mieć cztery wybrane kanały danych (dwa z tyłu i dwa z przodu głowy, na przykład O1, O2, F3, F4) oraz długość ok. 500 próbek.&lt;br /&gt;
&lt;br /&gt;
Dopasuj czterokanałowe modele AR do wyciętych fragmentów danych. Oblicz macierze gęstości widmowej mocy, koherencji zwyczajnych i koherencji cząstkowych dla obu fragmentów. Narysuj wykresy otrzymanych funkcji.&lt;/div&gt;</summary>
		<author><name>Maciek</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG_2/AR_1&amp;diff=11206</id>
		<title>Pracownia EEG 2/AR 1</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG_2/AR_1&amp;diff=11206"/>
		<updated>2024-12-10T10:52:41Z</updated>

		<summary type="html">&lt;p&gt;Maciek: /* Ćwiczenie 3 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Pracownia EEG 2|Pracownia EEG 2]] / Widmowa analiza parametryczna&lt;br /&gt;
&lt;br /&gt;
==Model autoregresyjny stochastycznego szeregu czasowego==&lt;br /&gt;
===Wstęp===&lt;br /&gt;
Do tej pory, aby zbadać własności widmowe sygnałów, używaliśmy transformacji Fouriera. Sygnał ''X''(''t'') z dziedziny czasu transformowaliśmy do dziedziny częstości ''X''(''f''):&lt;br /&gt;
&amp;lt;equation id=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;X(f)=\mathcal{F}[X(t)]&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Następnie z  transformaty estymowaliśmy funkcję gęstości widmowej mocy danego sygnału zgodnie ze wzorem:&lt;br /&gt;
&amp;lt;equation id=&amp;quot;2&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math id=2&amp;gt;S(f)=X(f)X^*(f)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Możliwe jest jednak trochę inne podejście: załóżmy, że nasz sygnał jest ''realizacją procesu stochastycznego'' opisanego pewną, znaną nam zależnością. Typowym założeniem w dziedzinie analizy sygnałów EEG jest opisanie ich jako procesów ''autoregresyjnych'' (AR):&lt;br /&gt;
&amp;lt;equation id=&amp;quot;3&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;X(t)=\sum_{j=1}^{p}A(j)X(t-j)+E(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ze względu na charakter widma takiego procesu dobrze nadaje się on do opisu sygnałów składających się z kilku rytmów o częstościach zawierających się w pewnych zakresach oraz tła o charakterze szumu. EEG i wiele innych sygnałów biologicznych ma właśnie taką strukturę.&lt;br /&gt;
&lt;br /&gt;
Co to znaczy opisać sygnał modelem AR? Musimy dopasować tak współczynniki ''A'' ze wzoru (&amp;lt;xr id=&amp;quot;3&amp;quot;/&amp;gt;), czyli tzw. współczynniki modelu, aby realizowany za jego pomocą proces AR miał funkcję autokowariancji jak najbliższą do badanego sygnału. Jeśli się nam to uda, to wszystkie wnioski dotyczące badanego sygnału możemy wyciągać na podstawie analizy parametrów modelu, a nie wartości sygnału.&lt;br /&gt;
&lt;br /&gt;
===Parametryczna analiza widmowa===&lt;br /&gt;
Równanie opisujące proces AR transformujemy do przestrzeni częstości za pomocą transformacji Z — jest to uogólnienie transformacji Fouriera stosowane dla dyskretnych ciągów wartości. Skorzystamy tu z faktu, że transformacja Z ma (podobnie do transformacji Fouriera) własność transformowania splotu sygnałów w iloczyn ich transformat. Zauważmy, że jeśli przepiszemy równanie (&amp;lt;xr id=&amp;quot;3&amp;quot;/&amp;gt;) tak, aby włączyć ''X''(''t'') do sumowania (możemy to zrobić przyjmując ''A''(0) = 1 oraz zmieniając znak pozostałych współczynników), to po lewej stronie równania otrzymujemy splot ciągu współczynników ''A'' z ciągiem wartości ''X''. Tak więc po przetransformowaniu tego równania otrzymujemy iloczyn odpowiednich transformat:&lt;br /&gt;
&amp;lt;equation id=&amp;quot;4&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{lcl}&lt;br /&gt;
\displaystyle{\sum_{j=0}^{p}A(t)X(t-j) = E(t)}&amp;amp;&amp;amp;\\&lt;br /&gt;
\;\;\Downarrow\;\scriptstyle{\mathrm{transformacja\ Z}}\;\Downarrow&amp;amp;&amp;amp;\\&lt;br /&gt;
\\&lt;br /&gt;
A(z)X(z)=E(z) &amp;amp; \Rightarrow  &amp;amp;   X(z)=A^{-1}(z)E(z)=H(z)E(z)&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Z dziedziny zmiennej ''z'' możemy przejść do dziedziny częstości podstawiając ''z'' = ''e''&amp;lt;sup&amp;gt;2&amp;amp;pi;''if''&amp;amp;Delta;''t''&amp;lt;/sup&amp;gt; (''f'' &amp;amp;mdash; częstość, &amp;amp;Delta;''t'' &amp;amp;mdash; odstęp czasu między kolejnymi próbkami sygnału):&lt;br /&gt;
&amp;lt;equation id=&amp;quot;5&amp;quot;&amp;gt;&amp;lt;math&amp;gt;&lt;br /&gt;
X(f)=H(f)E(f)&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcję ''H''(''f'') nazywamy macierzą przejścia modelu.&lt;br /&gt;
&lt;br /&gt;
Gęstość widmową mocy uzyskamy ze znanej już zależności (&amp;lt;xr id=&amp;quot;2&amp;quot;/&amp;gt;):&lt;br /&gt;
&amp;lt;equation id=&amp;quot;6&amp;quot;&amp;gt;&amp;lt;math&amp;gt;&lt;br /&gt;
S(f)=X(f)X^*(f)&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Opis własności sygnałów w języku modeli stochastycznych ma kilka zalet. Jedną z nich jest możliwość zastosowania w przypadku krótkich odcinków sygnału. Ale dla nas najważniejsza będzie łatwość modelowania sygnałów wielokanałowych przez jeden wielokanałowy model AR.&lt;br /&gt;
&lt;br /&gt;
===Wybór rzędu modelu===&lt;br /&gt;
Przyglądając się równaniu (&amp;lt;xr id=&amp;quot;3&amp;quot;/&amp;gt;) widzimy, że musimy również wiedzieć ''ile'' wcześniejszych próbek sygnału należy uwzględnić w naszych obliczeniach, czyli ustalić liczbę ''p''. Liczbę tę nazywamy ''rzędem modelu''. Wydawać by się mogło, że im więcej uwzględnimy poprzednich próbek, tym lepsze dopasowanie uzyskamy. Tak jednak nie jest. Ponieważ teoretyczne widmo procesu AR posiada maksima zależne od liczby użytych współczynników, modele o zbyt wysokich rzędach mają tendencję do generowania fałszywych maksimów w estymowanym widmie. Jeśli nie wiemy ilu składowych oczekujemy w naszym widmie, do oszacowania optymalnego rzędu modelu możemy zastosować jedno z kryteriów statystycznych, dostępnych w literaturze. Kryteria takie przeważnie mają dwie składowe: człon &amp;amp;bdquo;nagradzający&amp;amp;rdquo;  za coraz &amp;amp;bdquo;ściślejsze&amp;amp;rdquo; dopasowanie wraz z rosnącym rzędem modelu oraz człon &amp;amp;bdquo;karzący&amp;amp;rdquo; za nadmierny wzrost rzędu. Szukamy wtedy minimum funkcji kryterium policzonej dla pewnego zakresu rzędów i tak wybraną wartość stosujemy potem w obliczeniach.&lt;br /&gt;
&lt;br /&gt;
Jednym z popularnych kryteriów jest kryterium Akaikego (Hirotugu Akaike &amp;amp;mdash; matematyk japoński). Jest to funkcja:&lt;br /&gt;
&amp;lt;equation id=&amp;quot;7&amp;quot;&amp;gt;&amp;lt;math&amp;gt;&lt;br /&gt;
\mathrm{AIC}(p)=\mathrm{ln}(\det({V}))+2\frac{pk^2}{N}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/equation&amp;gt;&lt;br /&gt;
gdzie:&amp;lt;br&amp;gt;&lt;br /&gt;
''N'' &amp;amp;mdash; liczba próbek w analizowanym sygnale, ''k'' &amp;amp;mdash; liczba kanałów.&lt;br /&gt;
&lt;br /&gt;
Logarytm wyznacznika macierzy wariancji szumów jest coraz bardziej ujemny, bo dopasowanie się polepsza i elementy macierzy ''V'' maleją. Funkcją kary jest tu 2''pk''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;/''N'' &amp;amp;mdash; funkcja liniowa rosnąca (od ''p''). Szukamy pierwszego istotnego minimum krzywej opisywanej tą funkcją. W praktyce analizy EEG najczęściej stosuje się rzędy w zakresie od 4 do 9. Poniższe rysunki ilustrują możliwe sytuacje:&lt;br /&gt;
&lt;br /&gt;
[[Plik:AIC_rys_1.png|thumb|center|800px|U góry: symulacja modelu autorgresyjnego:&lt;br /&gt;
''x''(''t'') = 0,5&amp;amp;middot;''x''(''t''&amp;amp;minus;1)  &amp;amp;minus; 0,75&amp;amp;middot;''x''(''t''&amp;amp;minus;2) + ''e''(''t'')&lt;br /&gt;
przy częstości próbkowania 100 Hz. Maksimum powinno być w 20 Hz.&lt;br /&gt;
&lt;br /&gt;
AIC daje prawidłowo minimum dla rzędu 2 i widmo jest zgodne z oczekiwanym.]]&lt;br /&gt;
&lt;br /&gt;
[[Plik:AIC_rys_2.png|thumb|center|800px|U góry: symulacja sygnału:&lt;br /&gt;
&lt;br /&gt;
''x''(''t'') = cos(2&amp;amp;pi;&amp;amp;middot;20''t'')  + ''e''(''t'')&lt;br /&gt;
AIC nie daje jednoznacznego wyniku.&lt;br /&gt;
Wydaje się, że minimum istnieje dla rzędu 9.&lt;br /&gt;
Wybranie takiego rzędu powoduje wytworzenie maksimum nie tylko w 20 Hz ale i w 43 Hz. ]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Sygnały wielokanałowe===&lt;br /&gt;
Sygnały wielokanałowe to zbiory danych, w których podczas jednej sesji zapisu zbieramy wartości wielu sygnałów w tych samych chwilach czasu. Zapisy EEG z wielu elektrod są oczywiście zapisami wielokanałowymi. Ważna jest tu ''jednoczesność'' rejestracji wielkości powiązanych ze sobą.&lt;br /&gt;
&lt;br /&gt;
Przykładem danych wielokanałowych jest zapis EEG z wielu elektrod.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Czlowiek_badanie.gif|800px|thumb|center|Rejestracja EEG jako zapis wielokanałowy.]]&lt;br /&gt;
&lt;br /&gt;
W przypadku wielokanałowego modelu w wyżej wypisanych wzorach opisujących model AR musimy dokonać pewnych modyfikacji. Jeśli zbieramy jednocześnie ''k'' sygnałów (kanałów), to ''X''(''t'') jest w rzeczywistości wektorem ''k''-wierszowym [''X''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;(''t''), ''X''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;(''t''),..., ''X&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;''(''t'')]&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;, współczynniki modelu są (każdy z nich) macierzami rozmiaru ''k''&amp;amp;times;''k''; wartości szumu są inne w każdym sygnale więc ''E''(''t'') jest również wektorem [''E''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;(''t''), ''E''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;(''t''),..., ''E&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;''(''t'')]&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Po zaaplikowaniu transformacji Z i przejściu do dziedziny częstości, każda z uzyskanych transformat jest również albo wektorem ''k''-wierszowym (''X''(''f''), ''E''(''f'')) albo macierzą ''k''&amp;amp;times;''k'' (''A''(''f''), ''H''(''f'')).&lt;br /&gt;
&lt;br /&gt;
Gęstość widmowa mocy jest w tym przypadku dana jako (znak &amp;lt;sup&amp;gt;+&amp;lt;/sup&amp;gt; oznacza tu transpozycję macierzy połączoną ze sprzężeniem zespolonym jej elementów):&lt;br /&gt;
&amp;lt;equation id=&amp;quot;8&amp;quot;&amp;gt;&amp;lt;math&amp;gt;&lt;br /&gt;
S(f)=X(f)X^+(f)=H(f)E(f)[H(f)E(f)]^+=H(f)E(f)E^+(f)H^+(f)=H(f)VH^+(f)&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Skorzystaliśmy tu z wiadomości, że widmo procesu czysto losowego ''E''(''f'') jest funkcją stałą, a po wymnożeniu ''E''(''f'')''E''&amp;lt;sup&amp;gt;+&amp;lt;/sup&amp;gt;(''f'') dostajemy macierz wariancji szumów ''V'' (rozmiaru ''k''&amp;amp;times;''k''), niezależną od częstości.&lt;br /&gt;
&lt;br /&gt;
Z powyższego wzoru widać, że funkcja gęstości widmowej mocy jest macierzą rozmiaru ''k''&amp;amp;times;''k''. Jej diagonalne elementy zawierają tzw. widma własne (auto-widma) każdego z sygnałów składowych, a elementy pozadiagonalne widma wzajemne (kross-widma).&lt;br /&gt;
&lt;br /&gt;
Widzimy więc, że w przypadku analizy danych wielokanałowych mamy nie tylko wielkości opisujące każdy kanał osobno, ale również wielkości mówiące o informacji zawartej w zależnościach istniejących pomiędzy kanałami.&lt;br /&gt;
&lt;br /&gt;
Widmo wzajemne opisuje istnienie spójnej zależności między dwoma sygnałami dla danej częstości. Jego moduł mówi nam o tym jak silna jest ta zależność, a faza mówi o wzajemnym przesunięciu fazowym składowych o danej częstości w każdym z dwóch sygnałów. Jeśli oba sygnały zawierają daną częstość, ale faza wzajemna tych składowych zmienia się, to widmo wzajemne będzie mieć wartość niską.&lt;br /&gt;
Aby mieć wygodniejsze narzędzie porównawcze wprowadza się znormalizowaną wersję widma wzajemnego zwane koherencją (zwyczajną):&lt;br /&gt;
&amp;lt;equation id=&amp;quot;9&amp;quot;&amp;gt;&amp;lt;math&amp;gt;&lt;br /&gt;
K_{ij}(f)=\frac{S_{ij}(f)}{\sqrt{S_{ii}(f)S_{jj}(f)}}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Moduł koherencji zawiera się w przedziale [0,1], co znacznie ułatwia porównywanie wyników.&lt;br /&gt;
&lt;br /&gt;
===Miary cząstkowe===&lt;br /&gt;
&lt;br /&gt;
W przypadku, gdy nasz zbiór danych składa się z dwóch kanałów, interpretacja koherencji jest w zasadzie jednoznaczna. Wydawać by się mogło, że jeśli będziemy ich używać do badania układów trzy- i więcej-kanałowych, to poza większą ilością obliczeń sytuacja ideowo nie będzie się różnić. Niestety, wraz ze wzrostem liczby kanałów sytuacja ulega zmianie.&lt;br /&gt;
&lt;br /&gt;
Już w sytuacji trzech kanałów możemy napotkać tzw. wspólne źródło: kanał będący źródłem sygnału, który pojawia się w pozostałych kanałach (jak ta sama audycja u dwóch słuchaczy radia w innych miastach). Wtedy wartości koherencji nawet pomiędzy kanałami-odbiorcami sygnału będą wskazywać na istnienie związku między nimi, chociaż kanały te mogą nie być w żaden inny sposób ze sobą związane.&lt;br /&gt;
&lt;br /&gt;
Aby móc łatwiej odróżnić taką sytuację dobrze byłoby umieć jakoś &amp;amp;bdquo;odjąć&amp;amp;rdquo; wpływ kanału-źródła na pozostałe. Czynność taka nazywa się w literaturze ''parcjalizacją'' względem danego kanału.&lt;br /&gt;
&lt;br /&gt;
W ogólności mamy do dyspozycji funkcję koherencji cząstkowej, która zachowuje się podobnie do koherencji zwyczajnej, ale pokazuje związek między kanałami po odjęciu wszystkich kombinacji liniowych pozostałych kanałów. Zdefiniowana jest ona następująco:&lt;br /&gt;
&amp;lt;equation id=&amp;quot;10&amp;quot;&amp;gt;&amp;lt;math&amp;gt;&lt;br /&gt;
C_{ij}(f)=\frac{\mathrm{M}_{ij}(f)}{\sqrt{\mathrm{M}_{ii}(f)\mathrm{M}_{jj}(f)}}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We wzorze tym M&amp;lt;sub&amp;gt;''ij''&amp;lt;/sub&amp;gt; jest minorem macierzy widmowej ''S'', czyli wyznacznikiem macierzy ''S'' w której usunięto ''i''-ty wiersz i ''j''-tą kolumnę. Można tę definicję przekształcić do łatwiejszej do zastosowania postaci z użyciem elementów macierzy odwrotnej ''S''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;. Jeśli ''d&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt;''(''f'') = [''S''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;]&amp;lt;sub&amp;gt;''ij''&amp;lt;/sub&amp;gt;(''f''), mamy:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;11&amp;quot;&amp;gt;&amp;lt;math&amp;gt;&lt;br /&gt;
C_{ij}(f)=(-1)^{i+j}\frac{d_{ji}(f)}{\sqrt{d_{ii}(f)d_{jj}(f)}}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tak więc miary cząstkowe muszą operować na więcej niż dwóch kanałach jednocześnie. Dzięki zastosowaniu wielokanałowego modelu AR założenie to jest spełnione i możemy w prosty sposób policzyć zarówno koherencje zwyczajne jak i cząstkowe dla dowolnej liczby kanałów w zestawie.&lt;br /&gt;
&lt;br /&gt;
==Ćwiczenia==&lt;br /&gt;
&lt;br /&gt;
W tekście ćwiczeń używać będziemy następujących założeń: posiadamy ''k'' kanałów danych, używamy modelu AR rzędu ''p'', częstość próbkowania danych wynosi ''f&amp;lt;sub&amp;gt;s&amp;lt;/sub&amp;gt;''. W każdym kanale zebrano ''N'' próbek danych.&lt;br /&gt;
&lt;br /&gt;
Aby ułatwić zapoznanie się z parametrycznymi metodami analizy widmowej, a nie rozpraszać uwagi na dopasowywanie współczynników modelu, przygotowana została biblioteka procedur (w języku Python) estymacji współczynników wielokanałowego modelu AR dla posiadanych danych. Aby jej użyć musimy napisać:&lt;br /&gt;
&amp;lt;tt&amp;gt;import mtmvar&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W zaimportowanym module mamy do dyspozycji funkcję &amp;lt;tt&amp;gt;mult_AR&amp;lt;/tt&amp;gt;, która oczekuje parametrów:&lt;br /&gt;
# macierzy danych o wymiarach (''k'', ''N'');&lt;br /&gt;
# wybranego rzędu modelu;&lt;br /&gt;
# numeru metody liczenia współczynników (aktualnie należy wybrać zawsze liczbę 1).&lt;br /&gt;
 &lt;br /&gt;
Funkcja zwraca krotkę zawierającą dwa obiekty:&lt;br /&gt;
# macierz policzonych współczynników, rozmiaru (''p'', ''k'', ''k'') &amp;amp;mdash; czyli ''p'' współczynników macierzowych rozmiaru ''k''&amp;amp;times;''k'';&lt;br /&gt;
# macierz wariancji szumów ''V'', rozmiaru (''k'', ''k'') &amp;amp;mdash; patrz równanie (&amp;lt;xr id=&amp;quot;8&amp;quot;/&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Uwaga:&amp;lt;/b&amp;gt; macierz danych wejściowych musi mieć zawsze rozmiar (''k'',''N''), nawet jeśli ''k''=1 (możemy ją wtedy uzyskać z pojedynczego wektora &amp;lt;tt&amp;gt;dane&amp;lt;/tt&amp;gt; funkcją &amp;lt;tt&amp;gt;numpy.reshape(dane,(1,-1))&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
===Kilka słów o transformacji Z===&lt;br /&gt;
&lt;br /&gt;
Dla skończonego ciągu współczynników ''A''(0), ''A''(1), ..., ''A''(''p'') ich transformata Z może być obliczona następująco:&lt;br /&gt;
&amp;lt;equation id=&amp;quot;12&amp;quot;&amp;gt;&amp;lt;math&amp;gt;&lt;br /&gt;
A(z)=A(0)+A(1)z^{-1}+A(2)z^{-2}+...+A(p)z^{-p}=\sum_{j=0}^{p}A(j)z^{-j}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aby obliczyć wartość transformaty dla konkretnej częstości ''f'' musimy w powyższym wzorze dokonać podstawienia&lt;br /&gt;
&amp;lt;equation id=&amp;quot;13&amp;quot;&amp;gt;&amp;lt;math&amp;gt;&lt;br /&gt;
z=\exp(2\pi if \Delta t),&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/equation&amp;gt;&lt;br /&gt;
gdzie &amp;amp;Delta;''t'' = 1 / ''f&amp;lt;sub&amp;gt;s&amp;lt;/sub&amp;gt;''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Uwaga:&amp;lt;/b&amp;gt; procedura &amp;lt;tt&amp;gt;mult_AR&amp;lt;/tt&amp;gt; zwraca współczynniki od ''A''(1) do ''A''(''p'') jak dla równania (&amp;lt;xr id=&amp;quot;3&amp;quot;/&amp;gt;). Aby mieć zgodność z równaniem (&amp;lt;xr id=&amp;quot;4&amp;quot;/&amp;gt;) musimy założyć ''A''(0) = 1 oraz zmienić znak pozostałych współczynników na przeciwny.&lt;br /&gt;
&lt;br /&gt;
===Ćwiczenie 1===&lt;br /&gt;
&lt;br /&gt;
Z danych EEG zebranych na zajęciach dotyczących EEG spoczynkowego wyodrębnij jeden kanał. Wytnij z niego sygnał o długości 1000 próbek. Przefiltruj wycięty sygnał filtrem górnoprzepustowym (np. Butterwortha) o częstości odcięcia 1 Hz.&lt;br /&gt;
&lt;br /&gt;
Oblicz współczynniki modelu AR dla wyciętego sygnału dla rzędów od 1 do 5. Zobacz również jak ze wzrostem rzędu modelu zmienia się macierz wariancji szumu.&lt;br /&gt;
&lt;br /&gt;
Powtórz to samo dla sygnału w postaci pojedynczego sinusa oraz dla szumu.&lt;br /&gt;
&lt;br /&gt;
Napisz funkcję liczącą kryterium Akaikego dla posiadanych danych dla zakresu rzędów 1-20. Funkcja powinna działać dla dowolnej liczby kanałów. Następnie napisz procedurę rysującą policzone kryterium tak, aby można było ocenić wizualnie jego przebieg i wybrać optymalny rząd modelu AR.&lt;br /&gt;
&lt;br /&gt;
===Ćwiczenie 2===&lt;br /&gt;
Napisz funkcję obliczającą macierze ''A''(''f'') i ''H''(''f'') z równań (&amp;lt;xr id=&amp;quot;4&amp;quot;/&amp;gt;) i (&amp;lt;xr id=&amp;quot;5&amp;quot;/&amp;gt;) dla wybranego zestawu częstości z zakresu ''f''&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;-''f''&amp;lt;sub&amp;gt;max&amp;lt;/sub&amp;gt;. Wykorzystaj tutaj równanie (&amp;lt;xr id=&amp;quot;12&amp;quot;/&amp;gt;). Funkcja ma działać dla danych wielokanałowych (no i oczywiście jednokanałowych jako przypadek szczególny), tzn. jej argumentami powinny być: macierz zawierająca sygnał i rząd modelu.&lt;br /&gt;
&lt;br /&gt;
Stosując napisaną funkcję oraz równanie (&amp;lt;xr id=&amp;quot;8&amp;quot;/&amp;gt;) oblicz macierz gęstości widmowej mocy w zakresie częstości od 0 Hz do częstości Nyquista dla danych z poprzedniego ćwiczenia (z użyciem optymalnego rzędu modelu AR). Narysuj wykresy widm własnych i wzajemnych.&lt;br /&gt;
&lt;br /&gt;
===Ćwiczenie 3===&lt;br /&gt;
&lt;br /&gt;
* Wygeneruj dwa sygnały sinusoidalne o długości 1000 próbek każdy, o tej samej częstości 32 Hz i częstości próbkowania 128 Hz, ale różnych fazach początkowych. &lt;br /&gt;
* Pierwszy sygnał powinien mieć fazę początkową równą 0, drugi sygnał sinusoidalny powinien mieć fazę początkową równą &amp;amp;pi;/4.&lt;br /&gt;
* Do drugiego z sygnałów dodaj małą (o amplitudzie ok 0,2 amplitudy sinusoidy) składową losową (czyli dodatkowy niezależny szum biały) o średniej 0.&lt;br /&gt;
* Z tak otrzymanych sygnałów utwórz jeden sygnał dwukanałowy (macierz o rozmiarze &amp;lt;tt&amp;gt;(2,1000)&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Podobnie jak poprzednio, ustal optymalny rząd modelu AR (tym razem dwukanałowego) i oblicz macierz gęstości widmowej mocy. Oblicz koherencje między tymi sygnałami. Narysuj moduł i fazę koherencji ''C''&amp;lt;sub&amp;gt;12&amp;lt;/sub&amp;gt; i ''C''&amp;lt;sub&amp;gt;21&amp;lt;/sub&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Zmień fazę początkową drugiego sygnału. Jak zmienia się funkcja koherencji?&lt;br /&gt;
&lt;br /&gt;
===Ćwiczenie 4===&lt;br /&gt;
&lt;br /&gt;
Wygeneruj układ trzech sygnałów w następujący sposób:&lt;br /&gt;
* jako pierwszego kanału użyj sygnału z [[Pracownia_EEG/AR_1#Ćwiczenie 3|ćwiczenia 3]];&lt;br /&gt;
* sygnał_w_drugim_kanale(''t'') = 0,4 * sygnał_z_pierwszego_kanału(''t''&amp;amp;minus;1) + szum1;&lt;br /&gt;
* sygnał_w_trzecim_kanale(''t'') = 0,3 * sygnał_z_pierwszego_kanału(''t''&amp;amp;minus;2) + szum2.&lt;br /&gt;
&lt;br /&gt;
Oblicz macierz koherencji zwyczajnych dla tego układu i na ich podstawie wyznacz zależności między kanałami. Powtórz to samo dla koherencji cząstkowych.&lt;br /&gt;
&lt;br /&gt;
Wygeneruj zestaw danych jak poprzednio używając w kanale 1 sygnału z ćwiczenia 1. Powtórz obliczenia i porównaj wyniki.&lt;br /&gt;
&lt;br /&gt;
Wyniki wszystkich obliczeń przedstaw na rysunkach.&lt;br /&gt;
&lt;br /&gt;
===Ćwiczenie 5===&lt;br /&gt;
&lt;br /&gt;
Z danych zawierających spoczynkowe EEG wytnij dwa fragmenty: zawierający i nie zawierający czynności alfa. Fragmenty powinny mieć cztery wybrane kanały danych (dwa z tyłu i dwa z przodu głowy, na przykład O1, O2, F3, F4) oraz długość ok. 500 próbek.&lt;br /&gt;
&lt;br /&gt;
Dopasuj czterokanałowe modele AR do wyciętych fragmentów danych. Oblicz macierze gęstości widmowej mocy, koherencji zwyczajnych i koherencji cząstkowych dla obu fragmentów. Narysuj wykresy otrzymanych funkcji.&lt;/div&gt;</summary>
		<author><name>Maciek</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG_2/AR_1&amp;diff=11205</id>
		<title>Pracownia EEG 2/AR 1</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG_2/AR_1&amp;diff=11205"/>
		<updated>2024-12-10T10:12:58Z</updated>

		<summary type="html">&lt;p&gt;Maciek: /* Ćwiczenie 1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Pracownia EEG 2|Pracownia EEG 2]] / Widmowa analiza parametryczna&lt;br /&gt;
&lt;br /&gt;
==Model autoregresyjny stochastycznego szeregu czasowego==&lt;br /&gt;
===Wstęp===&lt;br /&gt;
Do tej pory, aby zbadać własności widmowe sygnałów, używaliśmy transformacji Fouriera. Sygnał ''X''(''t'') z dziedziny czasu transformowaliśmy do dziedziny częstości ''X''(''f''):&lt;br /&gt;
&amp;lt;equation id=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;X(f)=\mathcal{F}[X(t)]&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Następnie z  transformaty estymowaliśmy funkcję gęstości widmowej mocy danego sygnału zgodnie ze wzorem:&lt;br /&gt;
&amp;lt;equation id=&amp;quot;2&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math id=2&amp;gt;S(f)=X(f)X^*(f)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Możliwe jest jednak trochę inne podejście: załóżmy, że nasz sygnał jest ''realizacją procesu stochastycznego'' opisanego pewną, znaną nam zależnością. Typowym założeniem w dziedzinie analizy sygnałów EEG jest opisanie ich jako procesów ''autoregresyjnych'' (AR):&lt;br /&gt;
&amp;lt;equation id=&amp;quot;3&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;X(t)=\sum_{j=1}^{p}A(j)X(t-j)+E(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ze względu na charakter widma takiego procesu dobrze nadaje się on do opisu sygnałów składających się z kilku rytmów o częstościach zawierających się w pewnych zakresach oraz tła o charakterze szumu. EEG i wiele innych sygnałów biologicznych ma właśnie taką strukturę.&lt;br /&gt;
&lt;br /&gt;
Co to znaczy opisać sygnał modelem AR? Musimy dopasować tak współczynniki ''A'' ze wzoru (&amp;lt;xr id=&amp;quot;3&amp;quot;/&amp;gt;), czyli tzw. współczynniki modelu, aby realizowany za jego pomocą proces AR miał funkcję autokowariancji jak najbliższą do badanego sygnału. Jeśli się nam to uda, to wszystkie wnioski dotyczące badanego sygnału możemy wyciągać na podstawie analizy parametrów modelu, a nie wartości sygnału.&lt;br /&gt;
&lt;br /&gt;
===Parametryczna analiza widmowa===&lt;br /&gt;
Równanie opisujące proces AR transformujemy do przestrzeni częstości za pomocą transformacji Z — jest to uogólnienie transformacji Fouriera stosowane dla dyskretnych ciągów wartości. Skorzystamy tu z faktu, że transformacja Z ma (podobnie do transformacji Fouriera) własność transformowania splotu sygnałów w iloczyn ich transformat. Zauważmy, że jeśli przepiszemy równanie (&amp;lt;xr id=&amp;quot;3&amp;quot;/&amp;gt;) tak, aby włączyć ''X''(''t'') do sumowania (możemy to zrobić przyjmując ''A''(0) = 1 oraz zmieniając znak pozostałych współczynników), to po lewej stronie równania otrzymujemy splot ciągu współczynników ''A'' z ciągiem wartości ''X''. Tak więc po przetransformowaniu tego równania otrzymujemy iloczyn odpowiednich transformat:&lt;br /&gt;
&amp;lt;equation id=&amp;quot;4&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{lcl}&lt;br /&gt;
\displaystyle{\sum_{j=0}^{p}A(t)X(t-j) = E(t)}&amp;amp;&amp;amp;\\&lt;br /&gt;
\;\;\Downarrow\;\scriptstyle{\mathrm{transformacja\ Z}}\;\Downarrow&amp;amp;&amp;amp;\\&lt;br /&gt;
\\&lt;br /&gt;
A(z)X(z)=E(z) &amp;amp; \Rightarrow  &amp;amp;   X(z)=A^{-1}(z)E(z)=H(z)E(z)&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Z dziedziny zmiennej ''z'' możemy przejść do dziedziny częstości podstawiając ''z'' = ''e''&amp;lt;sup&amp;gt;2&amp;amp;pi;''if''&amp;amp;Delta;''t''&amp;lt;/sup&amp;gt; (''f'' &amp;amp;mdash; częstość, &amp;amp;Delta;''t'' &amp;amp;mdash; odstęp czasu między kolejnymi próbkami sygnału):&lt;br /&gt;
&amp;lt;equation id=&amp;quot;5&amp;quot;&amp;gt;&amp;lt;math&amp;gt;&lt;br /&gt;
X(f)=H(f)E(f)&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcję ''H''(''f'') nazywamy macierzą przejścia modelu.&lt;br /&gt;
&lt;br /&gt;
Gęstość widmową mocy uzyskamy ze znanej już zależności (&amp;lt;xr id=&amp;quot;2&amp;quot;/&amp;gt;):&lt;br /&gt;
&amp;lt;equation id=&amp;quot;6&amp;quot;&amp;gt;&amp;lt;math&amp;gt;&lt;br /&gt;
S(f)=X(f)X^*(f)&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Opis własności sygnałów w języku modeli stochastycznych ma kilka zalet. Jedną z nich jest możliwość zastosowania w przypadku krótkich odcinków sygnału. Ale dla nas najważniejsza będzie łatwość modelowania sygnałów wielokanałowych przez jeden wielokanałowy model AR.&lt;br /&gt;
&lt;br /&gt;
===Wybór rzędu modelu===&lt;br /&gt;
Przyglądając się równaniu (&amp;lt;xr id=&amp;quot;3&amp;quot;/&amp;gt;) widzimy, że musimy również wiedzieć ''ile'' wcześniejszych próbek sygnału należy uwzględnić w naszych obliczeniach, czyli ustalić liczbę ''p''. Liczbę tę nazywamy ''rzędem modelu''. Wydawać by się mogło, że im więcej uwzględnimy poprzednich próbek, tym lepsze dopasowanie uzyskamy. Tak jednak nie jest. Ponieważ teoretyczne widmo procesu AR posiada maksima zależne od liczby użytych współczynników, modele o zbyt wysokich rzędach mają tendencję do generowania fałszywych maksimów w estymowanym widmie. Jeśli nie wiemy ilu składowych oczekujemy w naszym widmie, do oszacowania optymalnego rzędu modelu możemy zastosować jedno z kryteriów statystycznych, dostępnych w literaturze. Kryteria takie przeważnie mają dwie składowe: człon &amp;amp;bdquo;nagradzający&amp;amp;rdquo;  za coraz &amp;amp;bdquo;ściślejsze&amp;amp;rdquo; dopasowanie wraz z rosnącym rzędem modelu oraz człon &amp;amp;bdquo;karzący&amp;amp;rdquo; za nadmierny wzrost rzędu. Szukamy wtedy minimum funkcji kryterium policzonej dla pewnego zakresu rzędów i tak wybraną wartość stosujemy potem w obliczeniach.&lt;br /&gt;
&lt;br /&gt;
Jednym z popularnych kryteriów jest kryterium Akaikego (Hirotugu Akaike &amp;amp;mdash; matematyk japoński). Jest to funkcja:&lt;br /&gt;
&amp;lt;equation id=&amp;quot;7&amp;quot;&amp;gt;&amp;lt;math&amp;gt;&lt;br /&gt;
\mathrm{AIC}(p)=\mathrm{ln}(\det({V}))+2\frac{pk^2}{N}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/equation&amp;gt;&lt;br /&gt;
gdzie:&amp;lt;br&amp;gt;&lt;br /&gt;
''N'' &amp;amp;mdash; liczba próbek w analizowanym sygnale, ''k'' &amp;amp;mdash; liczba kanałów.&lt;br /&gt;
&lt;br /&gt;
Logarytm wyznacznika macierzy wariancji szumów jest coraz bardziej ujemny, bo dopasowanie się polepsza i elementy macierzy ''V'' maleją. Funkcją kary jest tu 2''pk''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;/''N'' &amp;amp;mdash; funkcja liniowa rosnąca (od ''p''). Szukamy pierwszego istotnego minimum krzywej opisywanej tą funkcją. W praktyce analizy EEG najczęściej stosuje się rzędy w zakresie od 4 do 9. Poniższe rysunki ilustrują możliwe sytuacje:&lt;br /&gt;
&lt;br /&gt;
[[Plik:AIC_rys_1.png|thumb|center|800px|U góry: symulacja modelu autorgresyjnego:&lt;br /&gt;
''x''(''t'') = 0,5&amp;amp;middot;''x''(''t''&amp;amp;minus;1)  &amp;amp;minus; 0,75&amp;amp;middot;''x''(''t''&amp;amp;minus;2) + ''e''(''t'')&lt;br /&gt;
przy częstości próbkowania 100 Hz. Maksimum powinno być w 20 Hz.&lt;br /&gt;
&lt;br /&gt;
AIC daje prawidłowo minimum dla rzędu 2 i widmo jest zgodne z oczekiwanym.]]&lt;br /&gt;
&lt;br /&gt;
[[Plik:AIC_rys_2.png|thumb|center|800px|U góry: symulacja sygnału:&lt;br /&gt;
&lt;br /&gt;
''x''(''t'') = cos(2&amp;amp;pi;&amp;amp;middot;20''t'')  + ''e''(''t'')&lt;br /&gt;
AIC nie daje jednoznacznego wyniku.&lt;br /&gt;
Wydaje się, że minimum istnieje dla rzędu 9.&lt;br /&gt;
Wybranie takiego rzędu powoduje wytworzenie maksimum nie tylko w 20 Hz ale i w 43 Hz. ]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Sygnały wielokanałowe===&lt;br /&gt;
Sygnały wielokanałowe to zbiory danych, w których podczas jednej sesji zapisu zbieramy wartości wielu sygnałów w tych samych chwilach czasu. Zapisy EEG z wielu elektrod są oczywiście zapisami wielokanałowymi. Ważna jest tu ''jednoczesność'' rejestracji wielkości powiązanych ze sobą.&lt;br /&gt;
&lt;br /&gt;
Przykładem danych wielokanałowych jest zapis EEG z wielu elektrod.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Czlowiek_badanie.gif|800px|thumb|center|Rejestracja EEG jako zapis wielokanałowy.]]&lt;br /&gt;
&lt;br /&gt;
W przypadku wielokanałowego modelu w wyżej wypisanych wzorach opisujących model AR musimy dokonać pewnych modyfikacji. Jeśli zbieramy jednocześnie ''k'' sygnałów (kanałów), to ''X''(''t'') jest w rzeczywistości wektorem ''k''-wierszowym [''X''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;(''t''), ''X''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;(''t''),..., ''X&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;''(''t'')]&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;, współczynniki modelu są (każdy z nich) macierzami rozmiaru ''k''&amp;amp;times;''k''; wartości szumu są inne w każdym sygnale więc ''E''(''t'') jest również wektorem [''E''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;(''t''), ''E''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;(''t''),..., ''E&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;''(''t'')]&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Po zaaplikowaniu transformacji Z i przejściu do dziedziny częstości, każda z uzyskanych transformat jest również albo wektorem ''k''-wierszowym (''X''(''f''), ''E''(''f'')) albo macierzą ''k''&amp;amp;times;''k'' (''A''(''f''), ''H''(''f'')).&lt;br /&gt;
&lt;br /&gt;
Gęstość widmowa mocy jest w tym przypadku dana jako (znak &amp;lt;sup&amp;gt;+&amp;lt;/sup&amp;gt; oznacza tu transpozycję macierzy połączoną ze sprzężeniem zespolonym jej elementów):&lt;br /&gt;
&amp;lt;equation id=&amp;quot;8&amp;quot;&amp;gt;&amp;lt;math&amp;gt;&lt;br /&gt;
S(f)=X(f)X^+(f)=H(f)E(f)[H(f)E(f)]^+=H(f)E(f)E^+(f)H^+(f)=H(f)VH^+(f)&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Skorzystaliśmy tu z wiadomości, że widmo procesu czysto losowego ''E''(''f'') jest funkcją stałą, a po wymnożeniu ''E''(''f'')''E''&amp;lt;sup&amp;gt;+&amp;lt;/sup&amp;gt;(''f'') dostajemy macierz wariancji szumów ''V'' (rozmiaru ''k''&amp;amp;times;''k''), niezależną od częstości.&lt;br /&gt;
&lt;br /&gt;
Z powyższego wzoru widać, że funkcja gęstości widmowej mocy jest macierzą rozmiaru ''k''&amp;amp;times;''k''. Jej diagonalne elementy zawierają tzw. widma własne (auto-widma) każdego z sygnałów składowych, a elementy pozadiagonalne widma wzajemne (kross-widma).&lt;br /&gt;
&lt;br /&gt;
Widzimy więc, że w przypadku analizy danych wielokanałowych mamy nie tylko wielkości opisujące każdy kanał osobno, ale również wielkości mówiące o informacji zawartej w zależnościach istniejących pomiędzy kanałami.&lt;br /&gt;
&lt;br /&gt;
Widmo wzajemne opisuje istnienie spójnej zależności między dwoma sygnałami dla danej częstości. Jego moduł mówi nam o tym jak silna jest ta zależność, a faza mówi o wzajemnym przesunięciu fazowym składowych o danej częstości w każdym z dwóch sygnałów. Jeśli oba sygnały zawierają daną częstość, ale faza wzajemna tych składowych zmienia się, to widmo wzajemne będzie mieć wartość niską.&lt;br /&gt;
Aby mieć wygodniejsze narzędzie porównawcze wprowadza się znormalizowaną wersję widma wzajemnego zwane koherencją (zwyczajną):&lt;br /&gt;
&amp;lt;equation id=&amp;quot;9&amp;quot;&amp;gt;&amp;lt;math&amp;gt;&lt;br /&gt;
K_{ij}(f)=\frac{S_{ij}(f)}{\sqrt{S_{ii}(f)S_{jj}(f)}}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Moduł koherencji zawiera się w przedziale [0,1], co znacznie ułatwia porównywanie wyników.&lt;br /&gt;
&lt;br /&gt;
===Miary cząstkowe===&lt;br /&gt;
&lt;br /&gt;
W przypadku, gdy nasz zbiór danych składa się z dwóch kanałów, interpretacja koherencji jest w zasadzie jednoznaczna. Wydawać by się mogło, że jeśli będziemy ich używać do badania układów trzy- i więcej-kanałowych, to poza większą ilością obliczeń sytuacja ideowo nie będzie się różnić. Niestety, wraz ze wzrostem liczby kanałów sytuacja ulega zmianie.&lt;br /&gt;
&lt;br /&gt;
Już w sytuacji trzech kanałów możemy napotkać tzw. wspólne źródło: kanał będący źródłem sygnału, który pojawia się w pozostałych kanałach (jak ta sama audycja u dwóch słuchaczy radia w innych miastach). Wtedy wartości koherencji nawet pomiędzy kanałami-odbiorcami sygnału będą wskazywać na istnienie związku między nimi, chociaż kanały te mogą nie być w żaden inny sposób ze sobą związane.&lt;br /&gt;
&lt;br /&gt;
Aby móc łatwiej odróżnić taką sytuację dobrze byłoby umieć jakoś &amp;amp;bdquo;odjąć&amp;amp;rdquo; wpływ kanału-źródła na pozostałe. Czynność taka nazywa się w literaturze ''parcjalizacją'' względem danego kanału.&lt;br /&gt;
&lt;br /&gt;
W ogólności mamy do dyspozycji funkcję koherencji cząstkowej, która zachowuje się podobnie do koherencji zwyczajnej, ale pokazuje związek między kanałami po odjęciu wszystkich kombinacji liniowych pozostałych kanałów. Zdefiniowana jest ona następująco:&lt;br /&gt;
&amp;lt;equation id=&amp;quot;10&amp;quot;&amp;gt;&amp;lt;math&amp;gt;&lt;br /&gt;
C_{ij}(f)=\frac{\mathrm{M}_{ij}(f)}{\sqrt{\mathrm{M}_{ii}(f)\mathrm{M}_{jj}(f)}}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We wzorze tym M&amp;lt;sub&amp;gt;''ij''&amp;lt;/sub&amp;gt; jest minorem macierzy widmowej ''S'', czyli wyznacznikiem macierzy ''S'' w której usunięto ''i''-ty wiersz i ''j''-tą kolumnę. Można tę definicję przekształcić do łatwiejszej do zastosowania postaci z użyciem elementów macierzy odwrotnej ''S''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;. Jeśli ''d&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt;''(''f'') = [''S''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;]&amp;lt;sub&amp;gt;''ij''&amp;lt;/sub&amp;gt;(''f''), mamy:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;11&amp;quot;&amp;gt;&amp;lt;math&amp;gt;&lt;br /&gt;
C_{ij}(f)=(-1)^{i+j}\frac{d_{ji}(f)}{\sqrt{d_{ii}(f)d_{jj}(f)}}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tak więc miary cząstkowe muszą operować na więcej niż dwóch kanałach jednocześnie. Dzięki zastosowaniu wielokanałowego modelu AR założenie to jest spełnione i możemy w prosty sposób policzyć zarówno koherencje zwyczajne jak i cząstkowe dla dowolnej liczby kanałów w zestawie.&lt;br /&gt;
&lt;br /&gt;
==Ćwiczenia==&lt;br /&gt;
&lt;br /&gt;
W tekście ćwiczeń używać będziemy następujących założeń: posiadamy ''k'' kanałów danych, używamy modelu AR rzędu ''p'', częstość próbkowania danych wynosi ''f&amp;lt;sub&amp;gt;s&amp;lt;/sub&amp;gt;''. W każdym kanale zebrano ''N'' próbek danych.&lt;br /&gt;
&lt;br /&gt;
Aby ułatwić zapoznanie się z parametrycznymi metodami analizy widmowej, a nie rozpraszać uwagi na dopasowywanie współczynników modelu, przygotowana została biblioteka procedur (w języku Python) estymacji współczynników wielokanałowego modelu AR dla posiadanych danych. Aby jej użyć musimy napisać:&lt;br /&gt;
&amp;lt;tt&amp;gt;import mtmvar&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W zaimportowanym module mamy do dyspozycji funkcję &amp;lt;tt&amp;gt;mult_AR&amp;lt;/tt&amp;gt;, która oczekuje parametrów:&lt;br /&gt;
# macierzy danych o wymiarach (''k'', ''N'');&lt;br /&gt;
# wybranego rzędu modelu;&lt;br /&gt;
# numeru metody liczenia współczynników (aktualnie należy wybrać zawsze liczbę 1).&lt;br /&gt;
 &lt;br /&gt;
Funkcja zwraca krotkę zawierającą dwa obiekty:&lt;br /&gt;
# macierz policzonych współczynników, rozmiaru (''p'', ''k'', ''k'') &amp;amp;mdash; czyli ''p'' współczynników macierzowych rozmiaru ''k''&amp;amp;times;''k'';&lt;br /&gt;
# macierz wariancji szumów ''V'', rozmiaru (''k'', ''k'') &amp;amp;mdash; patrz równanie (&amp;lt;xr id=&amp;quot;8&amp;quot;/&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Uwaga:&amp;lt;/b&amp;gt; macierz danych wejściowych musi mieć zawsze rozmiar (''k'',''N''), nawet jeśli ''k''=1 (możemy ją wtedy uzyskać z pojedynczego wektora &amp;lt;tt&amp;gt;dane&amp;lt;/tt&amp;gt; funkcją &amp;lt;tt&amp;gt;numpy.reshape(dane,(1,-1))&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
===Kilka słów o transformacji Z===&lt;br /&gt;
&lt;br /&gt;
Dla skończonego ciągu współczynników ''A''(0), ''A''(1), ..., ''A''(''p'') ich transformata Z może być obliczona następująco:&lt;br /&gt;
&amp;lt;equation id=&amp;quot;12&amp;quot;&amp;gt;&amp;lt;math&amp;gt;&lt;br /&gt;
A(z)=A(0)+A(1)z^{-1}+A(2)z^{-2}+...+A(p)z^{-p}=\sum_{j=0}^{p}A(j)z^{-j}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aby obliczyć wartość transformaty dla konkretnej częstości ''f'' musimy w powyższym wzorze dokonać podstawienia&lt;br /&gt;
&amp;lt;equation id=&amp;quot;13&amp;quot;&amp;gt;&amp;lt;math&amp;gt;&lt;br /&gt;
z=\exp(2\pi if \Delta t),&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/equation&amp;gt;&lt;br /&gt;
gdzie &amp;amp;Delta;''t'' = 1 / ''f&amp;lt;sub&amp;gt;s&amp;lt;/sub&amp;gt;''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Uwaga:&amp;lt;/b&amp;gt; procedura &amp;lt;tt&amp;gt;mult_AR&amp;lt;/tt&amp;gt; zwraca współczynniki od ''A''(1) do ''A''(''p'') jak dla równania (&amp;lt;xr id=&amp;quot;3&amp;quot;/&amp;gt;). Aby mieć zgodność z równaniem (&amp;lt;xr id=&amp;quot;4&amp;quot;/&amp;gt;) musimy założyć ''A''(0) = 1 oraz zmienić znak pozostałych współczynników na przeciwny.&lt;br /&gt;
&lt;br /&gt;
===Ćwiczenie 1===&lt;br /&gt;
&lt;br /&gt;
Z danych EEG zebranych na zajęciach dotyczących EEG spoczynkowego wyodrębnij jeden kanał. Wytnij z niego sygnał o długości 1000 próbek. Przefiltruj wycięty sygnał filtrem górnoprzepustowym (np. Butterwortha) o częstości odcięcia 1 Hz.&lt;br /&gt;
&lt;br /&gt;
Oblicz współczynniki modelu AR dla wyciętego sygnału dla rzędów od 1 do 5. Zobacz również jak ze wzrostem rzędu modelu zmienia się macierz wariancji szumu.&lt;br /&gt;
&lt;br /&gt;
Powtórz to samo dla sygnału w postaci pojedynczego sinusa oraz dla szumu.&lt;br /&gt;
&lt;br /&gt;
Napisz funkcję liczącą kryterium Akaikego dla posiadanych danych dla zakresu rzędów 1-20. Funkcja powinna działać dla dowolnej liczby kanałów. Następnie napisz procedurę rysującą policzone kryterium tak, aby można było ocenić wizualnie jego przebieg i wybrać optymalny rząd modelu AR.&lt;br /&gt;
&lt;br /&gt;
===Ćwiczenie 2===&lt;br /&gt;
Napisz funkcję obliczającą macierze ''A''(''f'') i ''H''(''f'') z równań (&amp;lt;xr id=&amp;quot;4&amp;quot;/&amp;gt;) i (&amp;lt;xr id=&amp;quot;5&amp;quot;/&amp;gt;) dla wybranego zestawu częstości z zakresu ''f''&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;-''f''&amp;lt;sub&amp;gt;max&amp;lt;/sub&amp;gt;. Wykorzystaj tutaj równanie (&amp;lt;xr id=&amp;quot;12&amp;quot;/&amp;gt;). Funkcja ma działać dla danych wielokanałowych (no i oczywiście jednokanałowych jako przypadek szczególny), tzn. jej argumentami powinny być: macierz zawierająca sygnał i rząd modelu.&lt;br /&gt;
&lt;br /&gt;
Stosując napisaną funkcję oraz równanie (&amp;lt;xr id=&amp;quot;8&amp;quot;/&amp;gt;) oblicz macierz gęstości widmowej mocy w zakresie częstości od 0 Hz do częstości Nyquista dla danych z poprzedniego ćwiczenia (z użyciem optymalnego rzędu modelu AR). Narysuj wykresy widm własnych i wzajemnych.&lt;br /&gt;
&lt;br /&gt;
===Ćwiczenie 3===&lt;br /&gt;
&lt;br /&gt;
* Wygeneruj dwa sygnały sinusoidalne o długości 1000 próbek każdy, o tej samej częstości 32 Hz i częstości próbkowania 128 Hz, ale różnych fazach początkowych. &lt;br /&gt;
* Pierwszy sygnał powinien mieć fazę początkową równą 0, drugi sygnał sinusoidalny powinien mieć fazę początkową równą &amp;amp;pi;/4.&lt;br /&gt;
* Do drugiego z sygnałów dodaj małą (o amplitudzie ok 0,2 amplitudy sinusoidy) składową losową (czyli dodatkowy niezależny szum biały).&lt;br /&gt;
* Z tak otrzymanych sygnałów utwórz jeden sygnał dwukanałowy (macierz o rozmiarze &amp;lt;tt&amp;gt;(2,1000)&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Podobnie jak poprzednio, ustal optymalny rząd modelu AR (tym razem dwukanałowego) i oblicz macierz gęstości widmowej mocy. Oblicz koherencje między tymi sygnałami. Narysuj moduł i fazę koherencji ''C''&amp;lt;sub&amp;gt;12&amp;lt;/sub&amp;gt; i ''C''&amp;lt;sub&amp;gt;21&amp;lt;/sub&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Zmień fazę początkową drugiego sygnału. Jak zmienia się funkcja koherencji?&lt;br /&gt;
&lt;br /&gt;
===Ćwiczenie 4===&lt;br /&gt;
&lt;br /&gt;
Wygeneruj układ trzech sygnałów w następujący sposób:&lt;br /&gt;
* jako pierwszego kanału użyj sygnału z [[Pracownia_EEG/AR_1#Ćwiczenie 3|ćwiczenia 3]];&lt;br /&gt;
* sygnał_w_drugim_kanale(''t'') = 0,4 * sygnał_z_pierwszego_kanału(''t''&amp;amp;minus;1) + szum1;&lt;br /&gt;
* sygnał_w_trzecim_kanale(''t'') = 0,3 * sygnał_z_pierwszego_kanału(''t''&amp;amp;minus;2) + szum2.&lt;br /&gt;
&lt;br /&gt;
Oblicz macierz koherencji zwyczajnych dla tego układu i na ich podstawie wyznacz zależności między kanałami. Powtórz to samo dla koherencji cząstkowych.&lt;br /&gt;
&lt;br /&gt;
Wygeneruj zestaw danych jak poprzednio używając w kanale 1 sygnału z ćwiczenia 1. Powtórz obliczenia i porównaj wyniki.&lt;br /&gt;
&lt;br /&gt;
Wyniki wszystkich obliczeń przedstaw na rysunkach.&lt;br /&gt;
&lt;br /&gt;
===Ćwiczenie 5===&lt;br /&gt;
&lt;br /&gt;
Z danych zawierających spoczynkowe EEG wytnij dwa fragmenty: zawierający i nie zawierający czynności alfa. Fragmenty powinny mieć cztery wybrane kanały danych (dwa z tyłu i dwa z przodu głowy, na przykład O1, O2, F3, F4) oraz długość ok. 500 próbek.&lt;br /&gt;
&lt;br /&gt;
Dopasuj czterokanałowe modele AR do wyciętych fragmentów danych. Oblicz macierze gęstości widmowej mocy, koherencji zwyczajnych i koherencji cząstkowych dla obu fragmentów. Narysuj wykresy otrzymanych funkcji.&lt;/div&gt;</summary>
		<author><name>Maciek</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG_2/EEG_wlasno%C5%9Bci_EEG_spoczynkowego&amp;diff=11203</id>
		<title>Pracownia EEG 2/EEG wlasności EEG spoczynkowego</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG_2/EEG_wlasno%C5%9Bci_EEG_spoczynkowego&amp;diff=11203"/>
		<updated>2024-11-27T13:39:07Z</updated>

		<summary type="html">&lt;p&gt;Maciek: /* Polecenie: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Pracownia EEG 2|Pracownia EEG 2]] / Własności EEG spoczynkowego: funkcja autokorelacji i widmo&lt;br /&gt;
&lt;br /&gt;
=Estymacja funkcji autokowariancji, autokorelacji i koherencji sygnału.=&lt;br /&gt;
==Wstęp==&lt;br /&gt;
Z funkcjami tymi spotkaliśmy się już na zajęciach z [[Ćwiczenia_4|analizy sygnałów]].&lt;br /&gt;
&lt;br /&gt;
Funkcja autokowariancji sygnału charakteryzuje liniową zależność wartości tego sygnału w danej określonej chwili czasu od wartości (tego samego sygnału) w innej chwili.&lt;br /&gt;
W przypadku [[Nieparametryczne_widmo_mocy#Sygna.C5.82y_stochastyczne  | stacjonarnych procesów stochastycznych]], przebieg tej funkcji nie zależy od czasu. &lt;br /&gt;
Oznacza to, że obliczając funkcję autokorelacji sygnału pomiędzy chwilą czasu &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;x(t+\tau )&amp;lt;/math&amp;gt; otrzymamy tę samą wartość, jak dla przypadku obliczania funkcji autokorelacji pomiędzy momentami &amp;lt;math&amp;gt;x(t + T)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;x(t + T+\tau )&amp;lt;/math&amp;gt;, gdzie &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; to dowolny przedział czasu. Innymi słowy, funkcja autokorelacji procesu stacjonarnego zależy tylko od odstępu czasu pomiędzy próbkami &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt;, dla którego jest wyznaczana, a nie od konkretnej chwili czasu. Odrębną klasę sygnałów stanowią procesy niestacjonarne, w przypadku których funkcja autokorelacji będzie zależeć od czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; w którym jest obliczana. Estymator funkcji autokowariancji uzyskuje się poprzez obliczanie iloczynów wartości sygnału &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; w chwilach czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; czyli &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; i wartości sygnału &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; w chwili czasu ''t''+&amp;amp;tau; czyli &amp;lt;math&amp;gt;x(t+\tau)&amp;lt;/math&amp;gt; i uśredniając wartości iloczynów po czasie &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid79&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma (\tau) = \mathrm{cov}(x(t),x(t-\tau ))=\mathrm{E}[(x(t)-\mu )(x(t-\tau )-\mu )]&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(1)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid80&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\mu = \mathrm{E}[x(t)]&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(2)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W przypadku sygnałów ciągłych estymatę tę można zapisać w poniższy sposób:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid81&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma (\tau ) = \frac{1}{T}\int _0^{T}(x(t)-\mu )(x(t-\tau )-\mu )dt&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(3)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
natomiast dla sygnałów dyskretnych jako:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid82&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma (k) = \frac{1}{N-1}\sum _{i=1}^{N-|k|}(x(i+k)-x_s)(x(i)-x_s)&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(4)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid83&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
x_s = \frac{\sum _{i=1}^{N}x(i)}{N}&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(5)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcja autokowariancji może osiągać dowolne wartości, dlatego aby można było porównać przebieg tej funkcji np. pomiędzy dwoma sygnałami, wprowadzono wersję znormalizowaną tej funkcji &amp;amp;mdash; ''funkcję autokorelacji''. Normalizacja ta wygląda następująco:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid84&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\rho (k) = \frac{\gamma (\tau )}{\sigma^2}&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(6)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid85&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\sigma ^2 = \mathrm{E}[(x(t)-\mu )^2]&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(7)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wariancję sygnału (&amp;lt;math&amp;gt;\gamma (0)=\sigma ^2&amp;lt;/math&amp;gt;) można wyrazić przez funkcję autokowariancji dla przesunięcia &amp;lt;math&amp;gt;\tau =0&amp;lt;/math&amp;gt;.  Wynika z tego, że funkcja korelacji przyjmuje wartości z zakresu [&amp;amp;minus;1,&amp;amp;nbsp;1]. Ostatecznie estymator funkcji autokorelacji można zapisać jak poniżej:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid86&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\rho(k) = \frac{\gamma (k)}{\gamma (0)}&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(8)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcję autokorelacji estymuje się w celu określenia, w jakim stopniu wartości sygnału w danej chwili czasu wpływają na wartości sygnału w kolejnych chwilach czasu. Ma to kluczowe znaczenie przy rozpoznawaniu rodzaju procesów fizycznych odpowiedzialnego za generowanie sygnału. Funkcja ta zawsze mam maksimum dla przesunięcia &amp;lt;math&amp;gt;\tau =0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cechą charakterystyczną funkcji autokorelacji jest to, iż w przypadku sygnałów harmonicznych, przebieg funkcji ma charakter okresowy, z okresem takim samym jak okres badanego sygnału. W przypadku szumu, funkcja autokorelacji ma kształt funkcji delta Diraca.&lt;br /&gt;
&lt;br /&gt;
==Polecenie:==&lt;br /&gt;
Do policzenia funkcji autokorelacji posłużymy się funkcją biblioteczną &amp;lt;tt&amp;gt;scipy.signal.correlate&amp;lt;/tt&amp;gt;. Funkcja ta, wbrew nazwie, oblicza wyłącznie splot swoich dwóch pierwszych argumentów wywołania. Musimy je więc przystosować do obliczenia wielkości zgodnie ze wzorem (4).&lt;br /&gt;
&lt;br /&gt;
Uwaga: funkcja &amp;lt;tt&amp;gt;numpy.correlate&amp;lt;/tt&amp;gt; zasadniczo robi to samo, ale wyraźnie dłużej, szczególnie dla dłuższych sygnałów.&lt;br /&gt;
&lt;br /&gt;
Zaimplementuj funkcję do obliczania funkcji korelacji zgodnie ze wzorem &amp;lt;xr id=&amp;quot;uid82&amp;quot;&amp;gt;(%i)&amp;lt;/xr&amp;gt;. Funkcja powinna przyjmować jako parametry dwa wektory&amp;lt;!--i maksymalne przesunięcie wzajemne tych wektorów--&amp;gt;, a zwracać wektor zawierający ich funkcję autokorelacji. &lt;br /&gt;
&lt;br /&gt;
Wywołanie przykładowe:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
print(koreluj(a,a))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
powinno dać wynik:&lt;br /&gt;
 [-0.5  0.   1.   0.  -0.5]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
# Średnia&lt;br /&gt;
mean = numpy.mean(data)&lt;br /&gt;
mean2 = numpy.mean(data2)&lt;br /&gt;
&lt;br /&gt;
# Wariancja&lt;br /&gt;
var = numpy.var(data)  # uwaga: domyślnie ddof=0 &lt;br /&gt;
var2 = numpy.var(data2)&lt;br /&gt;
&lt;br /&gt;
# Dane po odjęciu średnich&lt;br /&gt;
ndata = data - mean&lt;br /&gt;
ndata2 = data2 - mean2&lt;br /&gt;
&lt;br /&gt;
# Splot&lt;br /&gt;
acorr = numpy.correlate(ndata, ndata2, 'full')&lt;br /&gt;
&lt;br /&gt;
# Normalizacja kowariancji do korelacji i przez 1/N&lt;br /&gt;
acorr = acorr / numpy.sqrt(var*var2) / len(ndata)   # len(ndata) bez -1, bo ddof=0 w var&lt;br /&gt;
&lt;br /&gt;
print(acorr)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{{hidden begin|title=Przykładowe rozwiązanie:}}--&amp;gt;&lt;br /&gt;
 &amp;lt;!-- &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
def koreluj_pol(x,y,max_tau):&lt;br /&gt;
    x = x - np.mean(x)&lt;br /&gt;
    y = y - np.mean(y)&lt;br /&gt;
    N= len(x)&lt;br /&gt;
    cor = np.zeros(max_tau+1)&lt;br /&gt;
    cor[0] = np.sum(x[:]*y[:]) &lt;br /&gt;
    for i in range(1,max_tau+1):&lt;br /&gt;
        cor[i] = np.sum(x[i:]*y[:-i])&lt;br /&gt;
        &lt;br /&gt;
    cor = cor /(N-1)&lt;br /&gt;
    return cor&lt;br /&gt;
&lt;br /&gt;
def koreluj(x,y,max_tau):&lt;br /&gt;
    cor = np.zeros(2*max_tau+1)    &lt;br /&gt;
    cor[max_tau:] = koreluj_pol(x,y,max_tau)&lt;br /&gt;
    tmp = koreluj_pol(y,x,max_tau)&lt;br /&gt;
    cor[:max_tau+1] = tmp[-1::-1]&lt;br /&gt;
    return cor    &lt;br /&gt;
    &lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    print koreluj(a,a,i)&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
b = np.array([-1,-2,-3])&lt;br /&gt;
&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    print koreluj(a,b,i)&lt;br /&gt;
    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zadanie 1: Pomiar sygnału EEG ==&lt;br /&gt;
&lt;br /&gt;
Zarejestruj 10 minut sygnału EEG, w trakcie których badana osoba będzie siedziała z otwartymi oczami oraz kolejne 10 minut w stanie czuwania z zamkniętymi oczami. Rejestrację należy wykonać na pełnym czepku 10-20 z częstością próbkowania 128 Hz. &lt;br /&gt;
&lt;br /&gt;
==Zadanie 2:  Funkcje autokowariancji i autokorelacji==&lt;br /&gt;
W tym zadaniu posłużymy się sygnałami zarejestrowanymi w punkcie 3. poprzedniego ćwiczenia. Zaobserwuj, na którym kanale rytm alfa osiąga najwyższą wartość. Następnie zaimplementuj w Pythonie następujące kroki:&lt;br /&gt;
&lt;br /&gt;
#	Wczytaj dane z wybranego kanału.&lt;br /&gt;
#	Oblicz funkcję autokorelacji dla sygnału zarejestrowanego w warunkach, gdy osoba badana siedziała z otwartymi oczami. Narysuj autokorelogram, to jest wykres wartości funkcji autokorelacji względem przesunięcia &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt;. Oś &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; wyskaluj w sekundach.&lt;br /&gt;
#	Powtórz krok 2, tym razem dla sygnału zebranego w warunkach czuwania z zamkniętymi oczami.&lt;br /&gt;
#	Porównaj autokorelogramy.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Funkcja kowariancji (wzajemnej)==&lt;br /&gt;
&lt;br /&gt;
W celu scharakteryzowania zależności wzajemnej dwóch sygnałów losowych, stosuje się funkcję kowariancji, zdefiniowaną w następujący sposób:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid98&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy} (\tau ) = \mathrm{cov}(x(t),y(t-\tau ))=\mathrm{E}[(x(t)-\mu _x)(y(t-\tau )-\mu _y)]&amp;lt;/math&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(10)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid99&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\mu _x = \mathrm{E}[x(t)]\\&lt;br /&gt;
\mu _y = \mathrm{E}[y(t)]\\ \end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W przypadku sygnałów ciągłych estymatę tę można zapisać w poniższy sposób:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid100&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy} (\tau ) = \frac{1}{T}\int _0^{T}(x(t)-\mu_x)(y(t-\tau)-\mu_y)dt&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
natomiast dla sygnałów dyskretnych jako:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid101&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy}(k) = \frac{1}{N-1}\sum _{i=0}^{N-k}(x(i+k)-x_s)(y(i)-y_s)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W odróżnieniu od funkcji autokowariancji, funkcja kowariancji nie musi mieć maksimum dla przesunięcia &amp;lt;math&amp;gt;\tau =0&amp;lt;/math&amp;gt;. Ponadto posiada ona następującą cechę:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid102&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy}(-\tau ) = \gamma _{yx}(\tau )&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcję kowariancji można znormalizować:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid103&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\rho (\tau) = \frac{\mathrm{E}[(x(t)-\mu _x)(y(t-\tau )-\mu _y)]}{\sqrt{\mathrm{E}[(x(t)-\mu _x)^2]\mathrm{E}[(y(t)-\mu _y)^2]}} = \frac{\gamma _{xy}}{\sigma_x\sigma_y}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
Otrzymaną funkcję nazywamy funkcją korelacji.&lt;br /&gt;
Jednym z zastosowań funkcji korelacji jest wyznaczanie czasu przejścia sygnału przez dany układ liniowy. Funkcja korelacji pomiędzy sygnałem na wejściu układu i sygnałem na jego wyjściu osiągnie wartość maksymalną dla przesunięcia &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; równego czasowi, jaki potrzebował sygnał na pokonanie danego układu. Niestety, taka metoda wyznaczania opóźnienia obarczona jest pewną wadą &amp;amp;mdash; w przypadku gdy prędkość sygnału bądź jego droga zależą od częstości, wtedy na wykresie funkcji korelacji nie uzyskamy wyraźnego maksimum.&lt;br /&gt;
&lt;br /&gt;
=====Polecenie =====&lt;br /&gt;
Zaimplementuj funkcję obliczającą funkcję kowariancji dla różnych sygnałów ''x'' i ''y'' (równanie &amp;lt;xr id=&amp;quot;uid98&amp;quot;&amp;gt;(%i)&amp;lt;/xr&amp;gt;)&amp;lt;!-- skorzystaj przy tym z własności opisanej równaniem &amp;lt;xr id=&amp;quot;uid98&amp;quot;&amp;gt;(%i)&amp;lt;/xr&amp;gt;--&amp;gt;. &lt;br /&gt;
Przykładowe wywołanie:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
b = np.array([-1,-2,-3])&lt;br /&gt;
&lt;br /&gt;
print(koreluj(a,b))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
powinno dać w wyniku:&lt;br /&gt;
 [ 0.5 0.  -1.   0.   0.5]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
{{hidden begin|title=Przykładowe rozwiązanie:}}&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import pylab as py&lt;br /&gt;
&lt;br /&gt;
def koreluj(x,y,max_tau):&lt;br /&gt;
    x = x - np.mean(x)&lt;br /&gt;
    y = y - np.mean(y)&lt;br /&gt;
    cor = np.zeros(2*max_tau+1)&lt;br /&gt;
    cor[max_tau] = np.sum(x[:]*y[:]) &lt;br /&gt;
    for i in range(1,max_tau+1):&lt;br /&gt;
        cor[max_tau+i] = np.sum(x[i:]*y[:-i])&lt;br /&gt;
        cor[max_tau-i] = np.sum(y[i:]*x[:-i])&lt;br /&gt;
    N= len(x)&lt;br /&gt;
    cor = cor /(N-1)&lt;br /&gt;
    return cor&lt;br /&gt;
&lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
b = np.array([-1,-2,-3])&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    print koreluj(a,b,i)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}} --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadanie 4===&lt;br /&gt;
Z danych zarejestrowanych w trakcie czuwania z zamkniętymi oczami wybierz sygnały z następujących kanałów: Fp1, P3, Pz, P4, Fp2, O1, O2.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Dla każdego kanału oblicz funkcję autokorelacji, zaś  dla każdej pary kanałów oblicz funkcję korelacji wzajemnej. Wyniki zaprezentuj w formie kwadratowej macierzy wykresów (za pomocą funkcji subplot, tak jak na przykładowym rys. (rys. &amp;lt;xr id=&amp;quot;uid9&amp;quot;&amp;gt; %i&amp;lt;/xr&amp;gt;)). Na przekątnej macierzy narysuj funkcję autokorelacji odpowiednich kanałów, poza przekątną &amp;amp;mdash; funkcję korelacji wzajemnej. Wskaż kanały, które są najbardziej skorelowane ze sobą. Czy możliwe jest wyznaczenie opóźnienia sygnału pomiędzy tymi kanałami?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Powtórz punkt 1, tym razem jednak funkcję autokorelacji i korelacji wzajemnej oblicz na sygnałach przefiltrowanych filtrem wąskopasmowym w paśmie alfa charakterystycznym dla badanej osoby. ([[%C4%86wiczenia_7#Funkcje_do_projektowania_filtr.C3.B3w_IIR_dost.C4.99pne_w_module_scipy.signal|przypomnienie konstrukcji filtrów]])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Oszacuj istotność statystyczną zależności między parami kanałów. Twoją hipotezą zerową jest brak istotnej korelacji pomiędzy sygnałami zarejestrowanymi przez dwie różne elektrody EEG. Hipoteza alternatywna to występowanie zależności pomiędzy tymi sygnałami. Podanie estymatorów wariancji funkcji korelacji jest bardzo trudne, dlatego jednym ze sposobów oszacowania progu powyżej którego wartość funkcji korelacji można byłoby uznać za istotną statystycznie, jest zastosowanie metody ''bootstrap''. Teoretycznie, funkcja korelacji policzona dla dwóch rzeczywistych, nieskorelowanych sygnałów, powinna wynosić 0 dla każdego przesunięcia &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt;. Tak jest jednak w przypadku sygnałów nieskończonych; w analizie sygnałów takowych nie spotkamy.&lt;br /&gt;
&lt;br /&gt;
Dokonując losowej zamiany kolejności próbek, możemy doprowadzić do wytworzenia sygnałów zależnych losowo, które jednak ze względu na skończony czas trwania, dadzą niezerową funkcję korelacji. Poziom losowych fluktuacji tej funkcji oszacujemy wykonując następujące kroki:&lt;br /&gt;
&amp;lt;ol type=&amp;quot;A&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Losowa zamiana kolejności próbek w analizowanych sygnałach. Jeżeli pomiędzy dwoma sygnałami istnieją jakieś zależności, losowa zamiana próbek doprowadzi do zniszczenia tych związków. W ten sposób uzyskujemy sygnały, które teoretycznie są nieskorelowane.&lt;br /&gt;
&amp;lt;li&amp;gt; Obliczenie funkcji  korelacji wzajemnej dla sygnałów policzonych w punkcie A.&lt;br /&gt;
&amp;lt;li&amp;gt; Powtórzenie kroków A i B wiele (np. 1000) razy.&lt;br /&gt;
&amp;lt;li&amp;gt; Oszacowanie 95% przedziału ufności dla wartości średniej funkcji korelacji wzajemnej dla danego przesunięcia &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; korzystając z otrzymanego w kroku C empirycznego rozkładu wartości tych funkcji dla sygnałów niezależnych.  &lt;br /&gt;
&amp;lt;li&amp;gt; Powtórzenie kroków A-D dla kolejnych przesunięć &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;li&amp;gt; Sprawdzenie, dla których przesunięć &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; funkcje autokorelacji i korelacji obliczone dla oryginalnych sygnałów uzyskały wartości wyższe niż wartości progowe oszacowane dla sygnałów o losowych zależnościach.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Procedura opisana powyżej ma jednak '''zasadniczą wadę'''. Staramy się w niej oszacować poziom przypadkowych korelacji pomiędzy dwoma sygnałami dla kolejnych przesunięć &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt;, co jest niczym innym jak wielokrotnym powtórzeniem pewnego testu. Obserwowanie korelacji dla wielu par kanałów równocześnie również prowadzi do zwiększenia szansy na zaobserwowanie ekstremalnie dużych fluktuacji.&lt;br /&gt;
Występuje tu zatem ''problem wielokrotnych porównań''.&lt;br /&gt;
Przypominamy, iż może to doprowadzić do przypadkowego uznania wyników jako &amp;amp;bdquo;istotnych&amp;amp;rdquo; statystycznie. Np. jeśli pojedynczy test wykonujemy na poziomie istotności 5% to dopuszczamy odrzucenie w 1 przypadku na 20 hipotezy zerowej pomimo, iż jest ona prawdziwa. Z drugiej jednak strony, jeśli powtórzymy wykonywany test 20 razy, to oczekujemy uzyskania 1 przypadku, w którym poziom ''p'' będzie mniejszy od 5% co jest przesłanką za odrzuceniem hipotezy zerowej. &lt;br /&gt;
&lt;br /&gt;
W przypadku wykonywania serii testów należałoby więc zastosować odpowiednie poprawki, np. [http://www.bmj.com/content/310/6973/170.full korektę Bonferroniego] czy [http://en.wikipedia.org/wiki/False_discovery_rate false discovery rate (FDR)]. Innym rozwiązaniem w analizowanym przez nas problemie jest zastosowanie tzw. statystyk wartości ekstremalnych, które prowadzą do następujących zmian w procedurze:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol type=&amp;quot;A&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;	Losowa zmiana kolejności próbek w analizowanych sygnałach (we wszystkich analizowanych kanałach). Jeżeli pomiędzy dwoma sygnałami istnieją jakieś zależności, losowa zamiana próbek doprowadzi do zniszczenia tych związków. W ten sposób uzyskujemy sygnały, które teoretycznie są nieskorelowane.&lt;br /&gt;
&amp;lt;li&amp;gt;	Obliczenie funkcji korelacji dla sygnałów otrzymanych w punkcie A.&lt;br /&gt;
&amp;lt;li&amp;gt;    Zapamiętanie maksymalnej wartości bezwzględnej funkcji korelacji z punktu B (maksimum bierzemy po wszystkich przesunięciach i po wszystkich parach kanałów; dla funkcji autokorelacji, ze względu na jej normalizację do 1 dla zerowego przesunięcia, tam maksymalnych wartości poszukujemy dla przesunięć innych niż 0).&lt;br /&gt;
&amp;lt;li&amp;gt;	Powtórzenie kroków A-C 1000 razy. Uzyskamy w ten sposób rozkład maksymalnych wartości funkcji korelacji możliwych do zaobserwowania dla sygnałów niezależnych.&lt;br /&gt;
&amp;lt;li&amp;gt;    Wyznaczenie 95 centyla rozkładu wartości maksymalnych.&lt;br /&gt;
&amp;lt;li&amp;gt;	Nałożenie na rysunki funkcji korelacji uzyskane w Zadaniu 2 poziomych linii symbolizujących poziom zależności dwóch sygnałów o losowych zależnościach i sprawdzenie, dla których przesunięć &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; wartości funkcji korelacji przekraczają estymowane progi istotności statystycznej.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Plik:Korelacje_wzajemne.png|700px|center|thumb|&amp;lt;figure id=&amp;quot;uid9&amp;quot; /&amp;gt;Przykład wyniku analizy korelacji wzajemnych dla sygnału niefiltrowanego z naniesionymi granicami możliwych fluktuacji.]]&lt;br /&gt;
&lt;br /&gt;
=Związek autokorelacji z widmem sygnału=&lt;br /&gt;
==Wstęp==&lt;br /&gt;
Zgodnie z twierdzeniem Chinczyna, z którym zapoznaliśmy się na wykładzie z [[Twierdzenie_Wienera-Chinczyna|Analizy Sygnałów]], widmową gęstość mocy sygnału można policzyć jako transformatę Fouriera funkcji autokowariancji:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid93&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
S(f) = \int _{-\infty }^{\infty }\gamma (\tau )e^{-2\pi i f \tau}d\tau &amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(9)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	&amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; &amp;amp;mdash; częstość&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	&amp;lt;math&amp;gt;S(f)&amp;lt;/math&amp;gt; &amp;amp;mdash;  gęstość widmowa mocy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Poniższy kod ilustruje to twierdzenie:&lt;br /&gt;
&amp;lt;source lang = py&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
from numpy.fft import rfft,fft,fftfreq,fftshift&lt;br /&gt;
 &lt;br /&gt;
def widmo_mocy(s, Fs):&lt;br /&gt;
    '''Funkcja licąca widmo mocy metodą periodogramu,&lt;br /&gt;
	pobiera sygnał i częstość próbkowania&lt;br /&gt;
	zwraca widmo mocy i oś częstości&lt;br /&gt;
    '''&lt;br /&gt;
    S = fft(s)/np.sqrt(len(s))&lt;br /&gt;
    S_moc = S*S.conj()&lt;br /&gt;
    S_moc = S_moc.real&lt;br /&gt;
    F = fftfreq(len(s), 1/Fs)&lt;br /&gt;
    return (fftshift(S_moc),fftshift(F))&lt;br /&gt;
 &lt;br /&gt;
def sin(f = 1, T = 1, Fs = 128, phi =0 ):&lt;br /&gt;
    '''sin o zadanej częstości (w Hz), długości, fazie i częstości próbkowania&lt;br /&gt;
    Domyślnie wytwarzany jest sygnał reprezentujący &lt;br /&gt;
    1 sekundę sinusa o częstości 1Hz i zerowej fazie próbkowanego 128 Hz&lt;br /&gt;
    '''&lt;br /&gt;
    dt = 1.0/Fs&lt;br /&gt;
    t = np.arange(0,T,dt)&lt;br /&gt;
    s = np.sin(2*np.pi*f*t + phi)&lt;br /&gt;
    return (s,t)&lt;br /&gt;
 &lt;br /&gt;
# sygnał próbny będzie próbkowany z częstością FS&lt;br /&gt;
FS = 100.0&lt;br /&gt;
# sygnałem próbnym będzie sinusoida o częstości f &lt;br /&gt;
(s,t) = sin(f=10.5,Fs=FS)&lt;br /&gt;
# obliczamy moc i energię sygnału w dziedzinie czasu&lt;br /&gt;
moc_w_czasie = s**2&lt;br /&gt;
energia_w_czasie = np.sum(moc_w_czasie)&lt;br /&gt;
print 'energia w czasie: ', energia_w_czasie&lt;br /&gt;
 &lt;br /&gt;
# obliczamy widmo mocy sygnału i jego energię estymowaną w dziedzinie częstości&lt;br /&gt;
(moc_w_czestosci, F) = widmo_mocy(s, Fs=FS)&lt;br /&gt;
energia_w_czestosci = np.sum(moc_w_czestosci)&lt;br /&gt;
print 'energia w czestosci: ', energia_w_czestosci&lt;br /&gt;
 &lt;br /&gt;
# estymujemy funkcję autokorelacji sygnału&lt;br /&gt;
ak = 1./(2*len(s)-1)*np.correlate(s,s,'full')&lt;br /&gt;
&lt;br /&gt;
# estymujemy widmo mocy i energię sygnału z twierdzenia Chinczyna korzystając z funkcji fft:&lt;br /&gt;
moc_chi = np.abs(fft(ak))&lt;br /&gt;
energia_chin = sum(moc_chi)&lt;br /&gt;
print 'energia z tw. Chinczyna przez fft: ', energia_chin&lt;br /&gt;
 &lt;br /&gt;
# estymujemy widmo mocy i energię sygnału z twierdzenia Chinczyna korzystając z jawnej postaci transformaty Fouriera:&lt;br /&gt;
FF = np.linspace(-FS/2,FS/2,1000)&lt;br /&gt;
M = np.zeros(len(FF),dtype='complex')&lt;br /&gt;
 &lt;br /&gt;
for i,f in enumerate( FF):&lt;br /&gt;
    for tau in range(len(ak)):&lt;br /&gt;
        M[i] += ak[tau]*np.exp(2*np.pi*1j*f*(len(ak)-tau)/FS) &lt;br /&gt;
M = np.abs(M)&lt;br /&gt;
energia_chin_sum = np.sum(M)* (len(ak)/len(FF))&lt;br /&gt;
print 'energia z tw. Chinczyna przez sumowanie: ', energia_chin_sum&lt;br /&gt;
&lt;br /&gt;
# Rysunki&lt;br /&gt;
py.figure(1)&lt;br /&gt;
py.subplot(3,1,1)&lt;br /&gt;
py.plot(t,s)&lt;br /&gt;
py.title(u'Sygnal')&lt;br /&gt;
py.subplot(3,1,2)&lt;br /&gt;
py.plot(t,moc_w_czasie)&lt;br /&gt;
py.title(u'moc w czasie')&lt;br /&gt;
py.subplot(3,1,3)&lt;br /&gt;
py.plot(F,moc_w_czestosci)&lt;br /&gt;
py.title(u'moc w czestosci')&lt;br /&gt;
 &lt;br /&gt;
py.figure(2)&lt;br /&gt;
py.subplot(3,1,1)&lt;br /&gt;
py.title('f. autokowariancji')&lt;br /&gt;
py.plot(np.arange(-len(ak)/2,len(ak)/2,1)/FS ,ak)&lt;br /&gt;
py.subplot(3,1,2)&lt;br /&gt;
py.plot(fftshift(fftfreq(len(moc_chi),1./FS)),fftshift(moc_chi))&lt;br /&gt;
py.title('widmo mocy z Tw. Chinczyna przez fft')&lt;br /&gt;
py.subplot(3,1,3)&lt;br /&gt;
py.plot(FF,M)&lt;br /&gt;
py.title('widmo mocy z Tw. Chinczyna przez sumowanie')&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W wyniku powinniśmy zobaczyć w terminalu:&lt;br /&gt;
 energia w czasie:  50.0&lt;br /&gt;
 energia w czestosci:  50.0&lt;br /&gt;
 energia z tw. Chinczyna przez fft:  50.0&lt;br /&gt;
 energia z tw. Chinczyna przez sumowanie:  49.9501172217&lt;br /&gt;
&lt;br /&gt;
oraz powinny pojawić się rysunki:&lt;br /&gt;
[[Plik:Fig_chinczyn1.png|thumb 200 px|center]]&lt;br /&gt;
[[Plik:Fig_chinczyn2.png|thumb 200 px|center]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Polecenie ==&lt;br /&gt;
Zaimplementuj funkcję obliczającą transformację Fouriera dyskretyzując wzór (9) dla zadanego wektora częstości &amp;lt;tt&amp;gt;f&amp;lt;/tt&amp;gt; i zadanej częstości próbkowania sygnału (tutaj: 10).&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Wywołanie przykładowe:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
t= np.arange(0,1,0.1)&lt;br /&gt;
x = np.sin(2*np.pi*2*t)&lt;br /&gt;
f = np.arange(-5,5,1)&lt;br /&gt;
X,f = fourier(x,f,10.0)&lt;br /&gt;
print X&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Natomiast wywołanie:&lt;br /&gt;
&amp;lt;source lang ='python'&amp;gt;&lt;br /&gt;
t= np.arange(0,1,0.1)&lt;br /&gt;
x = np.sin(2*np.pi*2*t)&lt;br /&gt;
f = np.arange(-5,5,0.01)&lt;br /&gt;
X = fourier(x,f,10.0)&lt;br /&gt;
py.plot(f,np.abs(X))&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Powinno wytworzyć rysunek:&lt;br /&gt;
&lt;br /&gt;
[[Plik:Fourier_test.png]] &lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
import numpy as np&lt;br /&gt;
import pylab as py&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def koreluj_pol(x,y,max_tau):&lt;br /&gt;
    x = x - np.mean(x)&lt;br /&gt;
    y = y - np.mean(y)&lt;br /&gt;
    N= len(x)&lt;br /&gt;
    cor = np.zeros(max_tau+1)&lt;br /&gt;
    cor[0] = np.sum(x[:]*y[:]) &lt;br /&gt;
    for i in range(1,max_tau+1):&lt;br /&gt;
        cor[i] = np.sum(x[i:]*y[:-i])&lt;br /&gt;
        &lt;br /&gt;
    cor = cor /(N)&lt;br /&gt;
    return cor&lt;br /&gt;
&lt;br /&gt;
def koreluj(x,y,max_tau):&lt;br /&gt;
    cor = np.zeros(2*max_tau+1)    &lt;br /&gt;
    cor[max_tau:] = koreluj_pol(x,y,max_tau)&lt;br /&gt;
    tmp = koreluj_pol(y,x,max_tau)&lt;br /&gt;
    cor[:max_tau+1] = tmp[-1::-1]&lt;br /&gt;
    return cor  &lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
def fourier_chin(x, FF, FS):&lt;br /&gt;
    ak = koreluj(x,x,len(x)-1)&lt;br /&gt;
    M = np.zeros(len(FF),dtype='complex') &lt;br /&gt;
    for i,f in enumerate( FF):&lt;br /&gt;
        for tau in range(len(ak)):&lt;br /&gt;
	    M[i] += ak[tau]*np.exp(-2*np.pi*1j*f*( tau- len(x))/FS)&lt;br /&gt;
    #M/=np.sqrt(len(ak))&lt;br /&gt;
    return M&lt;br /&gt;
    &lt;br /&gt;
def fourier(ak, FF, FS):&lt;br /&gt;
   &lt;br /&gt;
    M = np.zeros(len(FF),dtype='complex') &lt;br /&gt;
    for i,f in enumerate( FF):&lt;br /&gt;
        for tau in range(len(ak)):&lt;br /&gt;
	    M[i] += ak[tau]*np.exp(-2*np.pi*1j*f*( tau)/FS)&lt;br /&gt;
    M/=np.sqrt(len(ak))&lt;br /&gt;
    return M&lt;br /&gt;
t= np.arange(0,1,0.05)&lt;br /&gt;
x = np.sin(2*np.pi*2*t)&lt;br /&gt;
f = np.arange(-5,5,0.01)&lt;br /&gt;
&lt;br /&gt;
X = fourier_chin(x,f,10.0)&lt;br /&gt;
Xf = fourier(x,f,10.0)&lt;br /&gt;
print X&lt;br /&gt;
py.plot(f,np.abs(X), f,np.abs(Xf)**2)&lt;br /&gt;
py.show()&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zadanie 3: Związek autokorelacji z widmem sygnału==&lt;br /&gt;
Oblicz gęstość widmową mocy sygnału zarejestrowanego w trakcie czuwania z zamkniętymi oczami, korzystając z twierdzenia Chinczyna oraz [[Nieparametryczne_widmo_mocy#Metoda_Welcha | metodą Welcha]].&lt;br /&gt;
Znajdź częstość rytmu &amp;amp;alpha; dla osoby, która była badana.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Wzajemna gęstość widmowa sygnałów==&lt;br /&gt;
&lt;br /&gt;
Podobnie jak w przypadku twierdzenia Chinczyna dla pojedynczego sygnału, możliwe jest policzenie transformaty Fouriera funkcji kowariancji. Uzyskana w ten sposób wielkość nazywa się funkcją wzajemnej gęstości mocy widmowej sygnału:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid122&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
S_{xy}(f) = \int _{-\infty }^{\infty }\gamma_{xy}(\tau )e^{-2\pi i f \tau}d\tau &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W celu dalszego omówienia własności funkcji wzajemnej mocy widmowej sygnałów funkcję tę zapiszemy w postaci:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid123&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
S_{xy}(f) = |S_{xy}(f)|e^{i\phi _{xy}(f)}\\&lt;br /&gt;
\\&lt;br /&gt;
\phi _{xy} = \arg(S_{xy}) &lt;br /&gt;
\end{array} &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&amp;lt;!-- \mathrm{arc\,tg}\left[\frac{\mathrm{Im}(S_{xy}(f))}{\mathrm{Re}(S_{xy}(f))}\right]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wartość bezwzględna funkcji wzajemnej gęstości mocy widmowej osiąga największą wartość dla '''częstości''', w których sygnały &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;y(t)&amp;lt;/math&amp;gt; są ze sobą skorelowane. Funkcja wzajemnej mocy widmowej sygnałów pozbawiona jest zatem wady, która charakteryzowała funkcję korelacji, to jest problemu z wyznaczeniem czasu transmisji sygnału, w przypadku gdy czas ten zależał od częstości. Przy pomocy funkcji wzajemnej mocy widmowej, czas ten można oszacować przy pomocy fazy tej funkcji &amp;amp;mdash; &amp;lt;math&amp;gt;\phi _{xy}(f)&amp;lt;/math&amp;gt;. Jeśli funkcja wzajemnej mocy widmowej została wyznaczona pomiędzy sygnałami na wejściu i wyjściu układu liniowego, to faza ta reprezentuje przesunięcie fazowe sygnału przy przejściu przez układ. Czas tego przejścia można oszacować za pomocą następującej wyrażenia:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid124&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\tau = \frac{\phi _{xy}(f)}{2\pi f}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Podobnie jak w przypadku funkcji autokorelacji i korelacji wzajemnej, funkcję wzajemnej gęstości mocy widmowej można znormalizować:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid125&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
C_{xy}(f) = \frac{S_{xy}(f)}{\sqrt{S_x(f)S_y(f)}}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Znormalizowaną postać funkcji wzajemnej gęstości mocy widmowej nazywamy funkcją ''koherencji''. &lt;br /&gt;
Koherencja jest wielkością zespoloną. Faza koherencji odzwierciedla różnicę faz pomiędzy dwoma sygnałami. Moduł koherencji reprezentuje stopień synchronizacji sygnałów i zawiera się w przedziale od 0.0 do 1.0. Moduł tej funkcji zawiera się w przedziale od 0 do 1. Wartości 0 odpowiada brak synchronizacji pomiędzy sygnałami, zaś wartości 1 pełna synchronizacja dwóch przebiegów czasowych. Należy również zwrócić uwagę na nazewnictwo - często sam moduł koherencji określany jest jako koherencja, w literaturze anglojęzycznej moduł koherencji posiada jednak odrębną nazwę: Magnitude Square Coherence (MSC). Istotny jest również sposób estymacji modułu koherencji, który wyprowadzono w następnym rozdziale, zaś sam estymator reprezentuje wzór (36).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadanie 5===&lt;br /&gt;
Zaimplementuj funkcję obliczającą wzajemną gęstość widmową dla pary kanałów. &lt;br /&gt;
&amp;lt;!--Niech argumentami tej funkcji będą dwa wektory zawierające sygnały, zakres częstości, częstość próbkowania. --&amp;gt;&lt;br /&gt;
Oblicz i narysuj macierz gęstości widmowych (własnych i wzajemnych) dla kolejnych par kanałów (tych samych co w zadaniu 3). Wyniki zaprezentuj w postaci kwadratowej macierzy rysunków. Ponieważ są to funkcje zespolone, dobrze jest zaprezentować osobno ich wartość i fazę. Uzyskane wartości bezwzględne narysuj nad przekątną tej macierzy, a fazę pod przekątną.&lt;br /&gt;
&lt;br /&gt;
===Zadanie 6===&lt;br /&gt;
Przygotuj sygnał dwukanałowy, w którym jako pierwszy sygnał wybierz fragment sygnału EEG (z danych zebranych wcześniej) o długości 2000 próbek, a jako drugiego sygnału użyj tego samego fragmentu EEG, ale opóźnionego o wybraną liczbę (1 - 5) próbek. Oblicz widma wzajemne tych sygnałów i zaprezentuj ich fazy na rysunku. Na podstawie tych widm znajdź wartość przesunięcia czasowego tych sygnałów.&lt;br /&gt;
&lt;br /&gt;
Obliczenia powtórz w przypadku, gdy do drugiego sygnału dodany będzie szum o wariancji równej 0,25 wariancji oryginalnego sygnału.&lt;/div&gt;</summary>
		<author><name>Maciek</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG_2/EEG_wlasno%C5%9Bci_EEG_spoczynkowego&amp;diff=11202</id>
		<title>Pracownia EEG 2/EEG wlasności EEG spoczynkowego</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG_2/EEG_wlasno%C5%9Bci_EEG_spoczynkowego&amp;diff=11202"/>
		<updated>2024-11-27T12:27:52Z</updated>

		<summary type="html">&lt;p&gt;Maciek: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Pracownia EEG 2|Pracownia EEG 2]] / Własności EEG spoczynkowego: funkcja autokorelacji i widmo&lt;br /&gt;
&lt;br /&gt;
=Estymacja funkcji autokowariancji, autokorelacji i koherencji sygnału.=&lt;br /&gt;
==Wstęp==&lt;br /&gt;
Z funkcjami tymi spotkaliśmy się już na zajęciach z [[Ćwiczenia_4|analizy sygnałów]].&lt;br /&gt;
&lt;br /&gt;
Funkcja autokowariancji sygnału charakteryzuje liniową zależność wartości tego sygnału w danej określonej chwili czasu od wartości (tego samego sygnału) w innej chwili.&lt;br /&gt;
W przypadku [[Nieparametryczne_widmo_mocy#Sygna.C5.82y_stochastyczne  | stacjonarnych procesów stochastycznych]], przebieg tej funkcji nie zależy od czasu. &lt;br /&gt;
Oznacza to, że obliczając funkcję autokorelacji sygnału pomiędzy chwilą czasu &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;x(t+\tau )&amp;lt;/math&amp;gt; otrzymamy tę samą wartość, jak dla przypadku obliczania funkcji autokorelacji pomiędzy momentami &amp;lt;math&amp;gt;x(t + T)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;x(t + T+\tau )&amp;lt;/math&amp;gt;, gdzie &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; to dowolny przedział czasu. Innymi słowy, funkcja autokorelacji procesu stacjonarnego zależy tylko od odstępu czasu pomiędzy próbkami &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt;, dla którego jest wyznaczana, a nie od konkretnej chwili czasu. Odrębną klasę sygnałów stanowią procesy niestacjonarne, w przypadku których funkcja autokorelacji będzie zależeć od czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; w którym jest obliczana. Estymator funkcji autokowariancji uzyskuje się poprzez obliczanie iloczynów wartości sygnału &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; w chwilach czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; czyli &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; i wartości sygnału &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; w chwili czasu ''t''+&amp;amp;tau; czyli &amp;lt;math&amp;gt;x(t+\tau)&amp;lt;/math&amp;gt; i uśredniając wartości iloczynów po czasie &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid79&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma (\tau) = \mathrm{cov}(x(t),x(t-\tau ))=\mathrm{E}[(x(t)-\mu )(x(t-\tau )-\mu )]&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(1)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid80&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\mu = \mathrm{E}[x(t)]&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(2)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W przypadku sygnałów ciągłych estymatę tę można zapisać w poniższy sposób:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid81&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma (\tau ) = \frac{1}{T}\int _0^{T}(x(t)-\mu )(x(t-\tau )-\mu )dt&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(3)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
natomiast dla sygnałów dyskretnych jako:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid82&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma (k) = \frac{1}{N-1}\sum _{i=1}^{N-|k|}(x(i+k)-x_s)(x(i)-x_s)&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(4)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid83&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
x_s = \frac{\sum _{i=1}^{N}x(i)}{N}&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(5)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcja autokowariancji może osiągać dowolne wartości, dlatego aby można było porównać przebieg tej funkcji np. pomiędzy dwoma sygnałami, wprowadzono wersję znormalizowaną tej funkcji &amp;amp;mdash; ''funkcję autokorelacji''. Normalizacja ta wygląda następująco:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid84&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\rho (k) = \frac{\gamma (\tau )}{\sigma^2}&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(6)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid85&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\sigma ^2 = \mathrm{E}[(x(t)-\mu )^2]&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(7)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wariancję sygnału (&amp;lt;math&amp;gt;\gamma (0)=\sigma ^2&amp;lt;/math&amp;gt;) można wyrazić przez funkcję autokowariancji dla przesunięcia &amp;lt;math&amp;gt;\tau =0&amp;lt;/math&amp;gt;.  Wynika z tego, że funkcja korelacji przyjmuje wartości z zakresu [&amp;amp;minus;1,&amp;amp;nbsp;1]. Ostatecznie estymator funkcji autokorelacji można zapisać jak poniżej:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid86&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\rho(k) = \frac{\gamma (k)}{\gamma (0)}&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(8)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcję autokorelacji estymuje się w celu określenia, w jakim stopniu wartości sygnału w danej chwili czasu wpływają na wartości sygnału w kolejnych chwilach czasu. Ma to kluczowe znaczenie przy rozpoznawaniu rodzaju procesów fizycznych odpowiedzialnego za generowanie sygnału. Funkcja ta zawsze mam maksimum dla przesunięcia &amp;lt;math&amp;gt;\tau =0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cechą charakterystyczną funkcji autokorelacji jest to, iż w przypadku sygnałów harmonicznych, przebieg funkcji ma charakter okresowy, z okresem takim samym jak okres badanego sygnału. W przypadku szumu, funkcja autokorelacji ma kształt funkcji delta Diraca.&lt;br /&gt;
&lt;br /&gt;
==Polecenie:==&lt;br /&gt;
Do policzenia funkcji autokorelacji posłużymy się funkcją biblioteczną &amp;lt;tt&amp;gt;numpy.correlate&amp;lt;/tt&amp;gt;. Funkcja ta, wbrew nazwie, oblicza wyłącznie splot swoich dwóch pierwszych argumentów wywołania. Musimy je więc przystosować do obliczenia wielkości zgodnie ze wzorem (4).&lt;br /&gt;
&lt;br /&gt;
Zaimplementuj funkcję do obliczania funkcji korelacji zgodnie ze wzorem &amp;lt;xr id=&amp;quot;uid82&amp;quot;&amp;gt;(%i)&amp;lt;/xr&amp;gt;. Funkcja powinna przyjmować jako parametry dwa wektory&amp;lt;!--i maksymalne przesunięcie wzajemne tych wektorów--&amp;gt;, a zwracać wektor zawierający ich funkcję autokorelacji. &lt;br /&gt;
&lt;br /&gt;
Wywołanie przykładowe:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
print(koreluj(a,a))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
powinno dać wynik:&lt;br /&gt;
 [-0.5  0.   1.   0.  -0.5]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
# Średnia&lt;br /&gt;
mean = numpy.mean(data)&lt;br /&gt;
mean2 = numpy.mean(data2)&lt;br /&gt;
&lt;br /&gt;
# Wariancja&lt;br /&gt;
var = numpy.var(data)  # uwaga: domyślnie ddof=0 &lt;br /&gt;
var2 = numpy.var(data2)&lt;br /&gt;
&lt;br /&gt;
# Dane po odjęciu średnich&lt;br /&gt;
ndata = data - mean&lt;br /&gt;
ndata2 = data2 - mean2&lt;br /&gt;
&lt;br /&gt;
# Splot&lt;br /&gt;
acorr = numpy.correlate(ndata, ndata2, 'full')&lt;br /&gt;
&lt;br /&gt;
# Normalizacja kowariancji do korelacji i przez 1/N&lt;br /&gt;
acorr = acorr / numpy.sqrt(var*var2) / len(ndata)   # len(ndata) bez -1, bo ddof=0 w var&lt;br /&gt;
&lt;br /&gt;
print(acorr)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{{hidden begin|title=Przykładowe rozwiązanie:}}--&amp;gt;&lt;br /&gt;
 &amp;lt;!-- &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
def koreluj_pol(x,y,max_tau):&lt;br /&gt;
    x = x - np.mean(x)&lt;br /&gt;
    y = y - np.mean(y)&lt;br /&gt;
    N= len(x)&lt;br /&gt;
    cor = np.zeros(max_tau+1)&lt;br /&gt;
    cor[0] = np.sum(x[:]*y[:]) &lt;br /&gt;
    for i in range(1,max_tau+1):&lt;br /&gt;
        cor[i] = np.sum(x[i:]*y[:-i])&lt;br /&gt;
        &lt;br /&gt;
    cor = cor /(N-1)&lt;br /&gt;
    return cor&lt;br /&gt;
&lt;br /&gt;
def koreluj(x,y,max_tau):&lt;br /&gt;
    cor = np.zeros(2*max_tau+1)    &lt;br /&gt;
    cor[max_tau:] = koreluj_pol(x,y,max_tau)&lt;br /&gt;
    tmp = koreluj_pol(y,x,max_tau)&lt;br /&gt;
    cor[:max_tau+1] = tmp[-1::-1]&lt;br /&gt;
    return cor    &lt;br /&gt;
    &lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    print koreluj(a,a,i)&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
b = np.array([-1,-2,-3])&lt;br /&gt;
&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    print koreluj(a,b,i)&lt;br /&gt;
    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zadanie 1: Pomiar sygnału EEG ==&lt;br /&gt;
&lt;br /&gt;
Zarejestruj 10 minut sygnału EEG, w trakcie których badana osoba będzie siedziała z otwartymi oczami oraz kolejne 10 minut w stanie czuwania z zamkniętymi oczami. Rejestrację należy wykonać na pełnym czepku 10-20 z częstością próbkowania 128 Hz. &lt;br /&gt;
&lt;br /&gt;
==Zadanie 2:  Funkcje autokowariancji i autokorelacji==&lt;br /&gt;
W tym zadaniu posłużymy się sygnałami zarejestrowanymi w punkcie 3. poprzedniego ćwiczenia. Zaobserwuj, na którym kanale rytm alfa osiąga najwyższą wartość. Następnie zaimplementuj w Pythonie następujące kroki:&lt;br /&gt;
&lt;br /&gt;
#	Wczytaj dane z wybranego kanału.&lt;br /&gt;
#	Oblicz funkcję autokorelacji dla sygnału zarejestrowanego w warunkach, gdy osoba badana siedziała z otwartymi oczami. Narysuj autokorelogram, to jest wykres wartości funkcji autokorelacji względem przesunięcia &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt;. Oś &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; wyskaluj w sekundach.&lt;br /&gt;
#	Powtórz krok 2, tym razem dla sygnału zebranego w warunkach czuwania z zamkniętymi oczami.&lt;br /&gt;
#	Porównaj autokorelogramy.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Funkcja kowariancji (wzajemnej)==&lt;br /&gt;
&lt;br /&gt;
W celu scharakteryzowania zależności wzajemnej dwóch sygnałów losowych, stosuje się funkcję kowariancji, zdefiniowaną w następujący sposób:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid98&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy} (\tau ) = \mathrm{cov}(x(t),y(t-\tau ))=\mathrm{E}[(x(t)-\mu _x)(y(t-\tau )-\mu _y)]&amp;lt;/math&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(10)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid99&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\mu _x = \mathrm{E}[x(t)]\\&lt;br /&gt;
\mu _y = \mathrm{E}[y(t)]\\ \end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W przypadku sygnałów ciągłych estymatę tę można zapisać w poniższy sposób:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid100&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy} (\tau ) = \frac{1}{T}\int _0^{T}(x(t)-\mu_x)(y(t-\tau)-\mu_y)dt&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
natomiast dla sygnałów dyskretnych jako:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid101&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy}(k) = \frac{1}{N-1}\sum _{i=0}^{N-k}(x(i+k)-x_s)(y(i)-y_s)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W odróżnieniu od funkcji autokowariancji, funkcja kowariancji nie musi mieć maksimum dla przesunięcia &amp;lt;math&amp;gt;\tau =0&amp;lt;/math&amp;gt;. Ponadto posiada ona następującą cechę:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid102&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy}(-\tau ) = \gamma _{yx}(\tau )&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcję kowariancji można znormalizować:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid103&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\rho (\tau) = \frac{\mathrm{E}[(x(t)-\mu _x)(y(t-\tau )-\mu _y)]}{\sqrt{\mathrm{E}[(x(t)-\mu _x)^2]\mathrm{E}[(y(t)-\mu _y)^2]}} = \frac{\gamma _{xy}}{\sigma_x\sigma_y}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
Otrzymaną funkcję nazywamy funkcją korelacji.&lt;br /&gt;
Jednym z zastosowań funkcji korelacji jest wyznaczanie czasu przejścia sygnału przez dany układ liniowy. Funkcja korelacji pomiędzy sygnałem na wejściu układu i sygnałem na jego wyjściu osiągnie wartość maksymalną dla przesunięcia &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; równego czasowi, jaki potrzebował sygnał na pokonanie danego układu. Niestety, taka metoda wyznaczania opóźnienia obarczona jest pewną wadą &amp;amp;mdash; w przypadku gdy prędkość sygnału bądź jego droga zależą od częstości, wtedy na wykresie funkcji korelacji nie uzyskamy wyraźnego maksimum.&lt;br /&gt;
&lt;br /&gt;
=====Polecenie =====&lt;br /&gt;
Zaimplementuj funkcję obliczającą funkcję kowariancji dla różnych sygnałów ''x'' i ''y'' (równanie &amp;lt;xr id=&amp;quot;uid98&amp;quot;&amp;gt;(%i)&amp;lt;/xr&amp;gt;)&amp;lt;!-- skorzystaj przy tym z własności opisanej równaniem &amp;lt;xr id=&amp;quot;uid98&amp;quot;&amp;gt;(%i)&amp;lt;/xr&amp;gt;--&amp;gt;. &lt;br /&gt;
Przykładowe wywołanie:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
b = np.array([-1,-2,-3])&lt;br /&gt;
&lt;br /&gt;
print(koreluj(a,b))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
powinno dać w wyniku:&lt;br /&gt;
 [ 0.5 0.  -1.   0.   0.5]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
{{hidden begin|title=Przykładowe rozwiązanie:}}&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import pylab as py&lt;br /&gt;
&lt;br /&gt;
def koreluj(x,y,max_tau):&lt;br /&gt;
    x = x - np.mean(x)&lt;br /&gt;
    y = y - np.mean(y)&lt;br /&gt;
    cor = np.zeros(2*max_tau+1)&lt;br /&gt;
    cor[max_tau] = np.sum(x[:]*y[:]) &lt;br /&gt;
    for i in range(1,max_tau+1):&lt;br /&gt;
        cor[max_tau+i] = np.sum(x[i:]*y[:-i])&lt;br /&gt;
        cor[max_tau-i] = np.sum(y[i:]*x[:-i])&lt;br /&gt;
    N= len(x)&lt;br /&gt;
    cor = cor /(N-1)&lt;br /&gt;
    return cor&lt;br /&gt;
&lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
b = np.array([-1,-2,-3])&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    print koreluj(a,b,i)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}} --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadanie 4===&lt;br /&gt;
Z danych zarejestrowanych w trakcie czuwania z zamkniętymi oczami wybierz sygnały z następujących kanałów: Fp1, P3, Pz, P4, Fp2, O1, O2.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Dla każdego kanału oblicz funkcję autokorelacji, zaś  dla każdej pary kanałów oblicz funkcję korelacji wzajemnej. Wyniki zaprezentuj w formie kwadratowej macierzy wykresów (za pomocą funkcji subplot, tak jak na przykładowym rys. (rys. &amp;lt;xr id=&amp;quot;uid9&amp;quot;&amp;gt; %i&amp;lt;/xr&amp;gt;)). Na przekątnej macierzy narysuj funkcję autokorelacji odpowiednich kanałów, poza przekątną &amp;amp;mdash; funkcję korelacji wzajemnej. Wskaż kanały, które są najbardziej skorelowane ze sobą. Czy możliwe jest wyznaczenie opóźnienia sygnału pomiędzy tymi kanałami?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Powtórz punkt 1, tym razem jednak funkcję autokorelacji i korelacji wzajemnej oblicz na sygnałach przefiltrowanych filtrem wąskopasmowym w paśmie alfa charakterystycznym dla badanej osoby. ([[%C4%86wiczenia_7#Funkcje_do_projektowania_filtr.C3.B3w_IIR_dost.C4.99pne_w_module_scipy.signal|przypomnienie konstrukcji filtrów]])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Oszacuj istotność statystyczną zależności między parami kanałów. Twoją hipotezą zerową jest brak istotnej korelacji pomiędzy sygnałami zarejestrowanymi przez dwie różne elektrody EEG. Hipoteza alternatywna to występowanie zależności pomiędzy tymi sygnałami. Podanie estymatorów wariancji funkcji korelacji jest bardzo trudne, dlatego jednym ze sposobów oszacowania progu powyżej którego wartość funkcji korelacji można byłoby uznać za istotną statystycznie, jest zastosowanie metody ''bootstrap''. Teoretycznie, funkcja korelacji policzona dla dwóch rzeczywistych, nieskorelowanych sygnałów, powinna wynosić 0 dla każdego przesunięcia &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt;. Tak jest jednak w przypadku sygnałów nieskończonych; w analizie sygnałów takowych nie spotkamy.&lt;br /&gt;
&lt;br /&gt;
Dokonując losowej zamiany kolejności próbek, możemy doprowadzić do wytworzenia sygnałów zależnych losowo, które jednak ze względu na skończony czas trwania, dadzą niezerową funkcję korelacji. Poziom losowych fluktuacji tej funkcji oszacujemy wykonując następujące kroki:&lt;br /&gt;
&amp;lt;ol type=&amp;quot;A&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Losowa zamiana kolejności próbek w analizowanych sygnałach. Jeżeli pomiędzy dwoma sygnałami istnieją jakieś zależności, losowa zamiana próbek doprowadzi do zniszczenia tych związków. W ten sposób uzyskujemy sygnały, które teoretycznie są nieskorelowane.&lt;br /&gt;
&amp;lt;li&amp;gt; Obliczenie funkcji  korelacji wzajemnej dla sygnałów policzonych w punkcie A.&lt;br /&gt;
&amp;lt;li&amp;gt; Powtórzenie kroków A i B wiele (np. 1000) razy.&lt;br /&gt;
&amp;lt;li&amp;gt; Oszacowanie 95% przedziału ufności dla wartości średniej funkcji korelacji wzajemnej dla danego przesunięcia &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; korzystając z otrzymanego w kroku C empirycznego rozkładu wartości tych funkcji dla sygnałów niezależnych.  &lt;br /&gt;
&amp;lt;li&amp;gt; Powtórzenie kroków A-D dla kolejnych przesunięć &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;li&amp;gt; Sprawdzenie, dla których przesunięć &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; funkcje autokorelacji i korelacji obliczone dla oryginalnych sygnałów uzyskały wartości wyższe niż wartości progowe oszacowane dla sygnałów o losowych zależnościach.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Procedura opisana powyżej ma jednak '''zasadniczą wadę'''. Staramy się w niej oszacować poziom przypadkowych korelacji pomiędzy dwoma sygnałami dla kolejnych przesunięć &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt;, co jest niczym innym jak wielokrotnym powtórzeniem pewnego testu. Obserwowanie korelacji dla wielu par kanałów równocześnie również prowadzi do zwiększenia szansy na zaobserwowanie ekstremalnie dużych fluktuacji.&lt;br /&gt;
Występuje tu zatem ''problem wielokrotnych porównań''.&lt;br /&gt;
Przypominamy, iż może to doprowadzić do przypadkowego uznania wyników jako &amp;amp;bdquo;istotnych&amp;amp;rdquo; statystycznie. Np. jeśli pojedynczy test wykonujemy na poziomie istotności 5% to dopuszczamy odrzucenie w 1 przypadku na 20 hipotezy zerowej pomimo, iż jest ona prawdziwa. Z drugiej jednak strony, jeśli powtórzymy wykonywany test 20 razy, to oczekujemy uzyskania 1 przypadku, w którym poziom ''p'' będzie mniejszy od 5% co jest przesłanką za odrzuceniem hipotezy zerowej. &lt;br /&gt;
&lt;br /&gt;
W przypadku wykonywania serii testów należałoby więc zastosować odpowiednie poprawki, np. [http://www.bmj.com/content/310/6973/170.full korektę Bonferroniego] czy [http://en.wikipedia.org/wiki/False_discovery_rate false discovery rate (FDR)]. Innym rozwiązaniem w analizowanym przez nas problemie jest zastosowanie tzw. statystyk wartości ekstremalnych, które prowadzą do następujących zmian w procedurze:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol type=&amp;quot;A&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;	Losowa zmiana kolejności próbek w analizowanych sygnałach (we wszystkich analizowanych kanałach). Jeżeli pomiędzy dwoma sygnałami istnieją jakieś zależności, losowa zamiana próbek doprowadzi do zniszczenia tych związków. W ten sposób uzyskujemy sygnały, które teoretycznie są nieskorelowane.&lt;br /&gt;
&amp;lt;li&amp;gt;	Obliczenie funkcji korelacji dla sygnałów otrzymanych w punkcie A.&lt;br /&gt;
&amp;lt;li&amp;gt;    Zapamiętanie maksymalnej wartości bezwzględnej funkcji korelacji z punktu B (maksimum bierzemy po wszystkich przesunięciach i po wszystkich parach kanałów; dla funkcji autokorelacji, ze względu na jej normalizację do 1 dla zerowego przesunięcia, tam maksymalnych wartości poszukujemy dla przesunięć innych niż 0).&lt;br /&gt;
&amp;lt;li&amp;gt;	Powtórzenie kroków A-C 1000 razy. Uzyskamy w ten sposób rozkład maksymalnych wartości funkcji korelacji możliwych do zaobserwowania dla sygnałów niezależnych.&lt;br /&gt;
&amp;lt;li&amp;gt;    Wyznaczenie 95 centyla rozkładu wartości maksymalnych.&lt;br /&gt;
&amp;lt;li&amp;gt;	Nałożenie na rysunki funkcji korelacji uzyskane w Zadaniu 2 poziomych linii symbolizujących poziom zależności dwóch sygnałów o losowych zależnościach i sprawdzenie, dla których przesunięć &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; wartości funkcji korelacji przekraczają estymowane progi istotności statystycznej.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Plik:Korelacje_wzajemne.png|700px|center|thumb|&amp;lt;figure id=&amp;quot;uid9&amp;quot; /&amp;gt;Przykład wyniku analizy korelacji wzajemnych dla sygnału niefiltrowanego z naniesionymi granicami możliwych fluktuacji.]]&lt;br /&gt;
&lt;br /&gt;
=Związek autokorelacji z widmem sygnału=&lt;br /&gt;
==Wstęp==&lt;br /&gt;
Zgodnie z twierdzeniem Chinczyna, z którym zapoznaliśmy się na wykładzie z [[Twierdzenie_Wienera-Chinczyna|Analizy Sygnałów]], widmową gęstość mocy sygnału można policzyć jako transformatę Fouriera funkcji autokowariancji:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid93&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
S(f) = \int _{-\infty }^{\infty }\gamma (\tau )e^{-2\pi i f \tau}d\tau &amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(9)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	&amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; &amp;amp;mdash; częstość&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	&amp;lt;math&amp;gt;S(f)&amp;lt;/math&amp;gt; &amp;amp;mdash;  gęstość widmowa mocy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Poniższy kod ilustruje to twierdzenie:&lt;br /&gt;
&amp;lt;source lang = py&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
from numpy.fft import rfft,fft,fftfreq,fftshift&lt;br /&gt;
 &lt;br /&gt;
def widmo_mocy(s, Fs):&lt;br /&gt;
    '''Funkcja licąca widmo mocy metodą periodogramu,&lt;br /&gt;
	pobiera sygnał i częstość próbkowania&lt;br /&gt;
	zwraca widmo mocy i oś częstości&lt;br /&gt;
    '''&lt;br /&gt;
    S = fft(s)/np.sqrt(len(s))&lt;br /&gt;
    S_moc = S*S.conj()&lt;br /&gt;
    S_moc = S_moc.real&lt;br /&gt;
    F = fftfreq(len(s), 1/Fs)&lt;br /&gt;
    return (fftshift(S_moc),fftshift(F))&lt;br /&gt;
 &lt;br /&gt;
def sin(f = 1, T = 1, Fs = 128, phi =0 ):&lt;br /&gt;
    '''sin o zadanej częstości (w Hz), długości, fazie i częstości próbkowania&lt;br /&gt;
    Domyślnie wytwarzany jest sygnał reprezentujący &lt;br /&gt;
    1 sekundę sinusa o częstości 1Hz i zerowej fazie próbkowanego 128 Hz&lt;br /&gt;
    '''&lt;br /&gt;
    dt = 1.0/Fs&lt;br /&gt;
    t = np.arange(0,T,dt)&lt;br /&gt;
    s = np.sin(2*np.pi*f*t + phi)&lt;br /&gt;
    return (s,t)&lt;br /&gt;
 &lt;br /&gt;
# sygnał próbny będzie próbkowany z częstością FS&lt;br /&gt;
FS = 100.0&lt;br /&gt;
# sygnałem próbnym będzie sinusoida o częstości f &lt;br /&gt;
(s,t) = sin(f=10.5,Fs=FS)&lt;br /&gt;
# obliczamy moc i energię sygnału w dziedzinie czasu&lt;br /&gt;
moc_w_czasie = s**2&lt;br /&gt;
energia_w_czasie = np.sum(moc_w_czasie)&lt;br /&gt;
print 'energia w czasie: ', energia_w_czasie&lt;br /&gt;
 &lt;br /&gt;
# obliczamy widmo mocy sygnału i jego energię estymowaną w dziedzinie częstości&lt;br /&gt;
(moc_w_czestosci, F) = widmo_mocy(s, Fs=FS)&lt;br /&gt;
energia_w_czestosci = np.sum(moc_w_czestosci)&lt;br /&gt;
print 'energia w czestosci: ', energia_w_czestosci&lt;br /&gt;
 &lt;br /&gt;
# estymujemy funkcję autokorelacji sygnału&lt;br /&gt;
ak = 1./(2*len(s)-1)*np.correlate(s,s,'full')&lt;br /&gt;
&lt;br /&gt;
# estymujemy widmo mocy i energię sygnału z twierdzenia Chinczyna korzystając z funkcji fft:&lt;br /&gt;
moc_chi = np.abs(fft(ak))&lt;br /&gt;
energia_chin = sum(moc_chi)&lt;br /&gt;
print 'energia z tw. Chinczyna przez fft: ', energia_chin&lt;br /&gt;
 &lt;br /&gt;
# estymujemy widmo mocy i energię sygnału z twierdzenia Chinczyna korzystając z jawnej postaci transformaty Fouriera:&lt;br /&gt;
FF = np.linspace(-FS/2,FS/2,1000)&lt;br /&gt;
M = np.zeros(len(FF),dtype='complex')&lt;br /&gt;
 &lt;br /&gt;
for i,f in enumerate( FF):&lt;br /&gt;
    for tau in range(len(ak)):&lt;br /&gt;
        M[i] += ak[tau]*np.exp(2*np.pi*1j*f*(len(ak)-tau)/FS) &lt;br /&gt;
M = np.abs(M)&lt;br /&gt;
energia_chin_sum = np.sum(M)* (len(ak)/len(FF))&lt;br /&gt;
print 'energia z tw. Chinczyna przez sumowanie: ', energia_chin_sum&lt;br /&gt;
&lt;br /&gt;
# Rysunki&lt;br /&gt;
py.figure(1)&lt;br /&gt;
py.subplot(3,1,1)&lt;br /&gt;
py.plot(t,s)&lt;br /&gt;
py.title(u'Sygnal')&lt;br /&gt;
py.subplot(3,1,2)&lt;br /&gt;
py.plot(t,moc_w_czasie)&lt;br /&gt;
py.title(u'moc w czasie')&lt;br /&gt;
py.subplot(3,1,3)&lt;br /&gt;
py.plot(F,moc_w_czestosci)&lt;br /&gt;
py.title(u'moc w czestosci')&lt;br /&gt;
 &lt;br /&gt;
py.figure(2)&lt;br /&gt;
py.subplot(3,1,1)&lt;br /&gt;
py.title('f. autokowariancji')&lt;br /&gt;
py.plot(np.arange(-len(ak)/2,len(ak)/2,1)/FS ,ak)&lt;br /&gt;
py.subplot(3,1,2)&lt;br /&gt;
py.plot(fftshift(fftfreq(len(moc_chi),1./FS)),fftshift(moc_chi))&lt;br /&gt;
py.title('widmo mocy z Tw. Chinczyna przez fft')&lt;br /&gt;
py.subplot(3,1,3)&lt;br /&gt;
py.plot(FF,M)&lt;br /&gt;
py.title('widmo mocy z Tw. Chinczyna przez sumowanie')&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W wyniku powinniśmy zobaczyć w terminalu:&lt;br /&gt;
 energia w czasie:  50.0&lt;br /&gt;
 energia w czestosci:  50.0&lt;br /&gt;
 energia z tw. Chinczyna przez fft:  50.0&lt;br /&gt;
 energia z tw. Chinczyna przez sumowanie:  49.9501172217&lt;br /&gt;
&lt;br /&gt;
oraz powinny pojawić się rysunki:&lt;br /&gt;
[[Plik:Fig_chinczyn1.png|thumb 200 px|center]]&lt;br /&gt;
[[Plik:Fig_chinczyn2.png|thumb 200 px|center]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Polecenie ==&lt;br /&gt;
Zaimplementuj funkcję obliczającą transformację Fouriera dyskretyzując wzór (9) dla zadanego wektora częstości &amp;lt;tt&amp;gt;f&amp;lt;/tt&amp;gt; i zadanej częstości próbkowania sygnału (tutaj: 10).&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Wywołanie przykładowe:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
t= np.arange(0,1,0.1)&lt;br /&gt;
x = np.sin(2*np.pi*2*t)&lt;br /&gt;
f = np.arange(-5,5,1)&lt;br /&gt;
X,f = fourier(x,f,10.0)&lt;br /&gt;
print X&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Natomiast wywołanie:&lt;br /&gt;
&amp;lt;source lang ='python'&amp;gt;&lt;br /&gt;
t= np.arange(0,1,0.1)&lt;br /&gt;
x = np.sin(2*np.pi*2*t)&lt;br /&gt;
f = np.arange(-5,5,0.01)&lt;br /&gt;
X = fourier(x,f,10.0)&lt;br /&gt;
py.plot(f,np.abs(X))&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Powinno wytworzyć rysunek:&lt;br /&gt;
&lt;br /&gt;
[[Plik:Fourier_test.png]] &lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
import numpy as np&lt;br /&gt;
import pylab as py&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def koreluj_pol(x,y,max_tau):&lt;br /&gt;
    x = x - np.mean(x)&lt;br /&gt;
    y = y - np.mean(y)&lt;br /&gt;
    N= len(x)&lt;br /&gt;
    cor = np.zeros(max_tau+1)&lt;br /&gt;
    cor[0] = np.sum(x[:]*y[:]) &lt;br /&gt;
    for i in range(1,max_tau+1):&lt;br /&gt;
        cor[i] = np.sum(x[i:]*y[:-i])&lt;br /&gt;
        &lt;br /&gt;
    cor = cor /(N)&lt;br /&gt;
    return cor&lt;br /&gt;
&lt;br /&gt;
def koreluj(x,y,max_tau):&lt;br /&gt;
    cor = np.zeros(2*max_tau+1)    &lt;br /&gt;
    cor[max_tau:] = koreluj_pol(x,y,max_tau)&lt;br /&gt;
    tmp = koreluj_pol(y,x,max_tau)&lt;br /&gt;
    cor[:max_tau+1] = tmp[-1::-1]&lt;br /&gt;
    return cor  &lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
def fourier_chin(x, FF, FS):&lt;br /&gt;
    ak = koreluj(x,x,len(x)-1)&lt;br /&gt;
    M = np.zeros(len(FF),dtype='complex') &lt;br /&gt;
    for i,f in enumerate( FF):&lt;br /&gt;
        for tau in range(len(ak)):&lt;br /&gt;
	    M[i] += ak[tau]*np.exp(-2*np.pi*1j*f*( tau- len(x))/FS)&lt;br /&gt;
    #M/=np.sqrt(len(ak))&lt;br /&gt;
    return M&lt;br /&gt;
    &lt;br /&gt;
def fourier(ak, FF, FS):&lt;br /&gt;
   &lt;br /&gt;
    M = np.zeros(len(FF),dtype='complex') &lt;br /&gt;
    for i,f in enumerate( FF):&lt;br /&gt;
        for tau in range(len(ak)):&lt;br /&gt;
	    M[i] += ak[tau]*np.exp(-2*np.pi*1j*f*( tau)/FS)&lt;br /&gt;
    M/=np.sqrt(len(ak))&lt;br /&gt;
    return M&lt;br /&gt;
t= np.arange(0,1,0.05)&lt;br /&gt;
x = np.sin(2*np.pi*2*t)&lt;br /&gt;
f = np.arange(-5,5,0.01)&lt;br /&gt;
&lt;br /&gt;
X = fourier_chin(x,f,10.0)&lt;br /&gt;
Xf = fourier(x,f,10.0)&lt;br /&gt;
print X&lt;br /&gt;
py.plot(f,np.abs(X), f,np.abs(Xf)**2)&lt;br /&gt;
py.show()&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zadanie 3: Związek autokorelacji z widmem sygnału==&lt;br /&gt;
Oblicz gęstość widmową mocy sygnału zarejestrowanego w trakcie czuwania z zamkniętymi oczami, korzystając z twierdzenia Chinczyna oraz [[Nieparametryczne_widmo_mocy#Metoda_Welcha | metodą Welcha]].&lt;br /&gt;
Znajdź częstość rytmu &amp;amp;alpha; dla osoby, która była badana.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Wzajemna gęstość widmowa sygnałów==&lt;br /&gt;
&lt;br /&gt;
Podobnie jak w przypadku twierdzenia Chinczyna dla pojedynczego sygnału, możliwe jest policzenie transformaty Fouriera funkcji kowariancji. Uzyskana w ten sposób wielkość nazywa się funkcją wzajemnej gęstości mocy widmowej sygnału:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid122&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
S_{xy}(f) = \int _{-\infty }^{\infty }\gamma_{xy}(\tau )e^{-2\pi i f \tau}d\tau &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W celu dalszego omówienia własności funkcji wzajemnej mocy widmowej sygnałów funkcję tę zapiszemy w postaci:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid123&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
S_{xy}(f) = |S_{xy}(f)|e^{i\phi _{xy}(f)}\\&lt;br /&gt;
\\&lt;br /&gt;
\phi _{xy} = \arg(S_{xy}) &lt;br /&gt;
\end{array} &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&amp;lt;!-- \mathrm{arc\,tg}\left[\frac{\mathrm{Im}(S_{xy}(f))}{\mathrm{Re}(S_{xy}(f))}\right]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wartość bezwzględna funkcji wzajemnej gęstości mocy widmowej osiąga największą wartość dla '''częstości''', w których sygnały &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;y(t)&amp;lt;/math&amp;gt; są ze sobą skorelowane. Funkcja wzajemnej mocy widmowej sygnałów pozbawiona jest zatem wady, która charakteryzowała funkcję korelacji, to jest problemu z wyznaczeniem czasu transmisji sygnału, w przypadku gdy czas ten zależał od częstości. Przy pomocy funkcji wzajemnej mocy widmowej, czas ten można oszacować przy pomocy fazy tej funkcji &amp;amp;mdash; &amp;lt;math&amp;gt;\phi _{xy}(f)&amp;lt;/math&amp;gt;. Jeśli funkcja wzajemnej mocy widmowej została wyznaczona pomiędzy sygnałami na wejściu i wyjściu układu liniowego, to faza ta reprezentuje przesunięcie fazowe sygnału przy przejściu przez układ. Czas tego przejścia można oszacować za pomocą następującej wyrażenia:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid124&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\tau = \frac{\phi _{xy}(f)}{2\pi f}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Podobnie jak w przypadku funkcji autokorelacji i korelacji wzajemnej, funkcję wzajemnej gęstości mocy widmowej można znormalizować:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid125&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
C_{xy}(f) = \frac{S_{xy}(f)}{\sqrt{S_x(f)S_y(f)}}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Znormalizowaną postać funkcji wzajemnej gęstości mocy widmowej nazywamy funkcją ''koherencji''. &lt;br /&gt;
Koherencja jest wielkością zespoloną. Faza koherencji odzwierciedla różnicę faz pomiędzy dwoma sygnałami. Moduł koherencji reprezentuje stopień synchronizacji sygnałów i zawiera się w przedziale od 0.0 do 1.0. Moduł tej funkcji zawiera się w przedziale od 0 do 1. Wartości 0 odpowiada brak synchronizacji pomiędzy sygnałami, zaś wartości 1 pełna synchronizacja dwóch przebiegów czasowych. Należy również zwrócić uwagę na nazewnictwo - często sam moduł koherencji określany jest jako koherencja, w literaturze anglojęzycznej moduł koherencji posiada jednak odrębną nazwę: Magnitude Square Coherence (MSC). Istotny jest również sposób estymacji modułu koherencji, który wyprowadzono w następnym rozdziale, zaś sam estymator reprezentuje wzór (36).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadanie 5===&lt;br /&gt;
Zaimplementuj funkcję obliczającą wzajemną gęstość widmową dla pary kanałów. &lt;br /&gt;
&amp;lt;!--Niech argumentami tej funkcji będą dwa wektory zawierające sygnały, zakres częstości, częstość próbkowania. --&amp;gt;&lt;br /&gt;
Oblicz i narysuj macierz gęstości widmowych (własnych i wzajemnych) dla kolejnych par kanałów (tych samych co w zadaniu 3). Wyniki zaprezentuj w postaci kwadratowej macierzy rysunków. Ponieważ są to funkcje zespolone, dobrze jest zaprezentować osobno ich wartość i fazę. Uzyskane wartości bezwzględne narysuj nad przekątną tej macierzy, a fazę pod przekątną.&lt;br /&gt;
&lt;br /&gt;
===Zadanie 6===&lt;br /&gt;
Przygotuj sygnał dwukanałowy, w którym jako pierwszy sygnał wybierz fragment sygnału EEG (z danych zebranych wcześniej) o długości 2000 próbek, a jako drugiego sygnału użyj tego samego fragmentu EEG, ale opóźnionego o wybraną liczbę (1 - 5) próbek. Oblicz widma wzajemne tych sygnałów i zaprezentuj ich fazy na rysunku. Na podstawie tych widm znajdź wartość przesunięcia czasowego tych sygnałów.&lt;br /&gt;
&lt;br /&gt;
Obliczenia powtórz w przypadku, gdy do drugiego sygnału dodany będzie szum o wariancji równej 0,25 wariancji oryginalnego sygnału.&lt;/div&gt;</summary>
		<author><name>Maciek</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG_2/EEG_wlasno%C5%9Bci_EEG_spoczynkowego&amp;diff=11199</id>
		<title>Pracownia EEG 2/EEG wlasności EEG spoczynkowego</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG_2/EEG_wlasno%C5%9Bci_EEG_spoczynkowego&amp;diff=11199"/>
		<updated>2024-11-23T22:02:27Z</updated>

		<summary type="html">&lt;p&gt;Maciek: /* Polecenie: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Pracownia EEG 2|Pracownia EEG 2]] / Własności EEG spoczynkowego: funkcja autokorelacji i widmo&lt;br /&gt;
&lt;br /&gt;
=Estymacja funkcji autokowariancji, autokorelacji i koherencji sygnału.=&lt;br /&gt;
==Wstęp==&lt;br /&gt;
Z funkcjami tymi spotkaliśmy się już na zajęciach z [[Ćwiczenia_4|analizy sygnałów]].&lt;br /&gt;
&lt;br /&gt;
Funkcja autokowariancji sygnału charakteryzuje liniową zależność wartości tego sygnału w danej określonej chwili czasu od wartości (tego samego sygnału) w innej chwili.&lt;br /&gt;
W przypadku [[Nieparametryczne_widmo_mocy#Sygna.C5.82y_stochastyczne  | stacjonarnych procesów stochastycznych]], przebieg tej funkcji nie zależy od czasu. &lt;br /&gt;
Oznacza to, że obliczając funkcję autokorelacji sygnału pomiędzy chwilą czasu &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;x(t+\tau )&amp;lt;/math&amp;gt; otrzymamy tę samą wartość, jak dla przypadku obliczania funkcji autokorelacji pomiędzy momentami &amp;lt;math&amp;gt;x(t + T)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;x(t + T+\tau )&amp;lt;/math&amp;gt;, gdzie &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; to dowolny przedział czasu. Innymi słowy, funkcja autokorelacji procesu stacjonarnego zależy tylko od odstępu czasu pomiędzy próbkami &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt;, dla którego jest wyznaczana, a nie od konkretnej chwili czasu. Odrębną klasę sygnałów stanowią procesy niestacjonarne, w przypadku których funkcja autokorelacji będzie zależeć od czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; w którym jest obliczana. Estymator funkcji autokowariancji uzyskuje się poprzez obliczanie iloczynów wartości sygnału &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; w chwilach czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; czyli &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; i wartości sygnału &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; w chwili czasu ''t''+&amp;amp;tau; czyli &amp;lt;math&amp;gt;x(t+\tau)&amp;lt;/math&amp;gt; i uśredniając wartości iloczynów po czasie &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid79&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma (\tau) = \mathrm{cov}(x(t),x(t-\tau ))=\mathrm{E}[(x(t)-\mu )(x(t-\tau )-\mu )]&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(1)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid80&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\mu = \mathrm{E}[x(t)]&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(2)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W przypadku sygnałów ciągłych estymatę tę można zapisać w poniższy sposób:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid81&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma (\tau ) = \frac{1}{T}\int _0^{T}(x(t)-\mu )(x(t-\tau )-\mu )dt&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(3)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
natomiast dla sygnałów dyskretnych jako:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid82&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma (k) = \frac{1}{N-1}\sum _{i=1}^{N-|k|}(x(i+k)-x_s)(x(i)-x_s)&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(4)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid83&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
x_s = \frac{\sum _{i=1}^{N}x(i)}{N}&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(5)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcja autokowariancji może osiągać dowolne wartości, dlatego aby można było porównać przebieg tej funkcji np. pomiędzy dwoma sygnałami, wprowadzono wersję znormalizowaną tej funkcji &amp;amp;mdash; ''funkcję autokorelacji''. Normalizacja ta wygląda następująco:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid84&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\rho (k) = \frac{\gamma (\tau )}{\sigma^2}&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(6)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid85&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\sigma ^2 = \mathrm{E}[(x(t)-\mu )^2]&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(7)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wariancję sygnału (&amp;lt;math&amp;gt;\gamma (0)=\sigma ^2&amp;lt;/math&amp;gt;) można wyrazić przez funkcję autokowariancji dla przesunięcia &amp;lt;math&amp;gt;\tau =0&amp;lt;/math&amp;gt;.  Wynika z tego, że funkcja korelacji przyjmuje wartości z zakresu [&amp;amp;minus;1,&amp;amp;nbsp;1]. Ostatecznie estymator funkcji autokorelacji można zapisać jak poniżej:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid86&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\rho(k) = \frac{\gamma (k)}{\gamma (0)}&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(8)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcję autokorelacji estymuje się w celu określenia, w jakim stopniu wartości sygnału w danej chwili czasu wpływają na wartości sygnału w kolejnych chwilach czasu. Ma to kluczowe znaczenie przy rozpoznawaniu rodzaju procesów fizycznych odpowiedzialnego za generowanie sygnału. Funkcja ta zawsze mam maksimum dla przesunięcia &amp;lt;math&amp;gt;\tau =0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cechą charakterystyczną funkcji autokorelacji jest to, iż w przypadku sygnałów harmonicznych, przebieg funkcji ma charakter okresowy, z okresem takim samym jak okres badanego sygnału. W przypadku szumu, funkcja autokorelacji ma kształt funkcji delta Diraca.&lt;br /&gt;
&lt;br /&gt;
==Polecenie:==&lt;br /&gt;
Do policzenia funkcji autokorelacji posłużymy się funkcją biblioteczną &amp;lt;tt&amp;gt;numpy.correlate&amp;lt;/tt&amp;gt;. Funkcja ta, wbrew nazwie, oblicza wyłącznie splot swoich dwóch pierwszych argumentów wywołania. Musimy je więc przystosować do obliczenia wielkości zgodnie ze wzorem (4).&lt;br /&gt;
&lt;br /&gt;
Zaimplementuj funkcję do obliczania funkcji korelacji zgodnie ze wzorem &amp;lt;xr id=&amp;quot;uid82&amp;quot;&amp;gt;(%i)&amp;lt;/xr&amp;gt;. Funkcja powinna przyjmować jako parametry dwa wektory&amp;lt;!--i maksymalne przesunięcie wzajemne tych wektorów--&amp;gt;, a zwracać wektor zawierający ich funkcję autokorelacji. &lt;br /&gt;
&lt;br /&gt;
Wywołanie przykładowe:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
print(koreluj(a,a))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
powinno dać wynik:&lt;br /&gt;
 [-0.5  0.   1.   0.  -0.5]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
# Średnia&lt;br /&gt;
mean = numpy.mean(data)&lt;br /&gt;
mean2 = numpy.mean(data2)&lt;br /&gt;
&lt;br /&gt;
# Wariancja&lt;br /&gt;
var = numpy.var(data)  # uwaga: domyślnie ddof=0 &lt;br /&gt;
var2 = numpy.var(data2)&lt;br /&gt;
&lt;br /&gt;
# Dane po odjęciu średnich&lt;br /&gt;
ndata = data - mean&lt;br /&gt;
ndata2 = data2 - mean2&lt;br /&gt;
&lt;br /&gt;
# Splot&lt;br /&gt;
acorr = numpy.correlate(ndata, ndata2, 'full')&lt;br /&gt;
&lt;br /&gt;
# Normalizacja kowariancji do korelacji i przez 1/N&lt;br /&gt;
acorr = acorr / numpy.sqrt(var*var2) / len(ndata)   # len(ndata) bez -1, bo ddof=0 w var&lt;br /&gt;
&lt;br /&gt;
print(acorr)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{{hidden begin|title=Przykładowe rozwiązanie:}}--&amp;gt;&lt;br /&gt;
 &amp;lt;!-- &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
def koreluj_pol(x,y,max_tau):&lt;br /&gt;
    x = x - np.mean(x)&lt;br /&gt;
    y = y - np.mean(y)&lt;br /&gt;
    N= len(x)&lt;br /&gt;
    cor = np.zeros(max_tau+1)&lt;br /&gt;
    cor[0] = np.sum(x[:]*y[:]) &lt;br /&gt;
    for i in range(1,max_tau+1):&lt;br /&gt;
        cor[i] = np.sum(x[i:]*y[:-i])&lt;br /&gt;
        &lt;br /&gt;
    cor = cor /(N-1)&lt;br /&gt;
    return cor&lt;br /&gt;
&lt;br /&gt;
def koreluj(x,y,max_tau):&lt;br /&gt;
    cor = np.zeros(2*max_tau+1)    &lt;br /&gt;
    cor[max_tau:] = koreluj_pol(x,y,max_tau)&lt;br /&gt;
    tmp = koreluj_pol(y,x,max_tau)&lt;br /&gt;
    cor[:max_tau+1] = tmp[-1::-1]&lt;br /&gt;
    return cor    &lt;br /&gt;
    &lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    print koreluj(a,a,i)&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
b = np.array([-1,-2,-3])&lt;br /&gt;
&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    print koreluj(a,b,i)&lt;br /&gt;
    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zadanie 1: Pomiar sygnału EEG ==&lt;br /&gt;
&lt;br /&gt;
Zarejestruj 10 minut sygnału EEG, w trakcie których badana osoba będzie siedziała z otwartymi oczami oraz kolejne 10 minut w stanie czuwania z zamkniętymi oczami. Rejestrację należy wykonać na pełnym czepku 10-20 z częstością próbkowania 128 Hz. &lt;br /&gt;
&lt;br /&gt;
==Zadanie 2:  Funkcje autokowariancji i autokorelacji==&lt;br /&gt;
W tym zadaniu posłużymy się sygnałami zarejestrowanymi w punkcie 3. poprzedniego ćwiczenia. Zaobserwuj, na którym kanale rytm alfa osiąga najwyższą wartość. Następnie zaimplementuj w Pythonie następujące kroki:&lt;br /&gt;
&lt;br /&gt;
#	Wczytaj dane z wybranego kanału.&lt;br /&gt;
#	Oblicz funkcję autokorelacji dla sygnału zarejestrowanego w warunkach, gdy osoba badana siedziała z otwartymi oczami. Narysuj autokorelogram, to jest wykres wartości funkcji autokorelacji względem przesunięcia &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt;. Oś &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; wyskaluj w sekundach.&lt;br /&gt;
#	Powtórz krok 2, tym razem dla sygnału zebranego w warunkach czuwania z zamkniętymi oczami.&lt;br /&gt;
#	Porównaj autokorelogramy.&lt;br /&gt;
&lt;br /&gt;
=Związek autokorelacji z widmem sygnału=&lt;br /&gt;
==Wstęp==&lt;br /&gt;
Zgodnie z twierdzeniem Chinczyna, z którym zapoznaliśmy się na wykładzie z [[Twierdzenie_Wienera-Chinczyna|Analizy Sygnałów]], widmową gęstość mocy sygnału można policzyć jako transformatę Fouriera funkcji autokowariancji:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid93&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
S(f) = \int _{-\infty }^{\infty }\gamma (\tau )e^{-2\pi i f \tau}d\tau &amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(9)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	&amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; &amp;amp;mdash; częstość&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	&amp;lt;math&amp;gt;S(f)&amp;lt;/math&amp;gt; &amp;amp;mdash;  gęstość widmowa mocy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Poniższy kod ilustruje to twierdzenie:&lt;br /&gt;
&amp;lt;source lang = py&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
from numpy.fft import rfft,fft,fftfreq,fftshift&lt;br /&gt;
 &lt;br /&gt;
def widmo_mocy(s, Fs):&lt;br /&gt;
    '''Funkcja licąca widmo mocy metodą periodogramu,&lt;br /&gt;
	pobiera sygnał i częstość próbkowania&lt;br /&gt;
	zwraca widmo mocy i oś częstości&lt;br /&gt;
    '''&lt;br /&gt;
    S = fft(s)/np.sqrt(len(s))&lt;br /&gt;
    S_moc = S*S.conj()&lt;br /&gt;
    S_moc = S_moc.real&lt;br /&gt;
    F = fftfreq(len(s), 1/Fs)&lt;br /&gt;
    return (fftshift(S_moc),fftshift(F))&lt;br /&gt;
 &lt;br /&gt;
def sin(f = 1, T = 1, Fs = 128, phi =0 ):&lt;br /&gt;
    '''sin o zadanej częstości (w Hz), długości, fazie i częstości próbkowania&lt;br /&gt;
    Domyślnie wytwarzany jest sygnał reprezentujący &lt;br /&gt;
    1 sekundę sinusa o częstości 1Hz i zerowej fazie próbkowanego 128 Hz&lt;br /&gt;
    '''&lt;br /&gt;
    dt = 1.0/Fs&lt;br /&gt;
    t = np.arange(0,T,dt)&lt;br /&gt;
    s = np.sin(2*np.pi*f*t + phi)&lt;br /&gt;
    return (s,t)&lt;br /&gt;
 &lt;br /&gt;
# sygnał próbny będzie próbkowany z częstością FS&lt;br /&gt;
FS = 100.0&lt;br /&gt;
# sygnałem próbnym będzie sinusoida o częstości f &lt;br /&gt;
(s,t) = sin(f=10.5,Fs=FS)&lt;br /&gt;
# obliczamy moc i energię sygnału w dziedzinie czasu&lt;br /&gt;
moc_w_czasie = s**2&lt;br /&gt;
energia_w_czasie = np.sum(moc_w_czasie)&lt;br /&gt;
print 'energia w czasie: ', energia_w_czasie&lt;br /&gt;
 &lt;br /&gt;
# obliczamy widmo mocy sygnału i jego energię estymowaną w dziedzinie częstości&lt;br /&gt;
(moc_w_czestosci, F) = widmo_mocy(s, Fs=FS)&lt;br /&gt;
energia_w_czestosci = np.sum(moc_w_czestosci)&lt;br /&gt;
print 'energia w czestosci: ', energia_w_czestosci&lt;br /&gt;
 &lt;br /&gt;
# estymujemy funkcję autokorelacji sygnału&lt;br /&gt;
ak = 1./(2*len(s)-1)*np.correlate(s,s,'full')&lt;br /&gt;
&lt;br /&gt;
# estymujemy widmo mocy i energię sygnału z twierdzenia Chinczyna korzystając z funkcji fft:&lt;br /&gt;
moc_chi = np.abs(fft(ak))&lt;br /&gt;
energia_chin = sum(moc_chi)&lt;br /&gt;
print 'energia z tw. Chinczyna przez fft: ', energia_chin&lt;br /&gt;
 &lt;br /&gt;
# estymujemy widmo mocy i energię sygnału z twierdzenia Chinczyna korzystając z jawnej postaci transformaty Fouriera:&lt;br /&gt;
FF = np.linspace(-FS/2,FS/2,1000)&lt;br /&gt;
M = np.zeros(len(FF),dtype='complex')&lt;br /&gt;
 &lt;br /&gt;
for i,f in enumerate( FF):&lt;br /&gt;
    for tau in range(len(ak)):&lt;br /&gt;
        M[i] += ak[tau]*np.exp(2*np.pi*1j*f*(len(ak)-tau)/FS) &lt;br /&gt;
M = np.abs(M)&lt;br /&gt;
energia_chin_sum = np.sum(M)* (len(ak)/len(FF))&lt;br /&gt;
print 'energia z tw. Chinczyna przez sumowanie: ', energia_chin_sum&lt;br /&gt;
&lt;br /&gt;
# Rysunki&lt;br /&gt;
py.figure(1)&lt;br /&gt;
py.subplot(3,1,1)&lt;br /&gt;
py.plot(t,s)&lt;br /&gt;
py.title(u'Sygnal')&lt;br /&gt;
py.subplot(3,1,2)&lt;br /&gt;
py.plot(t,moc_w_czasie)&lt;br /&gt;
py.title(u'moc w czasie')&lt;br /&gt;
py.subplot(3,1,3)&lt;br /&gt;
py.plot(F,moc_w_czestosci)&lt;br /&gt;
py.title(u'moc w czestosci')&lt;br /&gt;
 &lt;br /&gt;
py.figure(2)&lt;br /&gt;
py.subplot(3,1,1)&lt;br /&gt;
py.title('f. autokowariancji')&lt;br /&gt;
py.plot(np.arange(-len(ak)/2,len(ak)/2,1)/FS ,ak)&lt;br /&gt;
py.subplot(3,1,2)&lt;br /&gt;
py.plot(fftshift(fftfreq(len(moc_chi),1./FS)),fftshift(moc_chi))&lt;br /&gt;
py.title('widmo mocy z Tw. Chinczyna przez fft')&lt;br /&gt;
py.subplot(3,1,3)&lt;br /&gt;
py.plot(FF,M)&lt;br /&gt;
py.title('widmo mocy z Tw. Chinczyna przez sumowanie')&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W wyniku powinniśmy zobaczyć w terminalu:&lt;br /&gt;
 energia w czasie:  50.0&lt;br /&gt;
 energia w czestosci:  50.0&lt;br /&gt;
 energia z tw. Chinczyna przez fft:  50.0&lt;br /&gt;
 energia z tw. Chinczyna przez sumowanie:  49.9501172217&lt;br /&gt;
&lt;br /&gt;
oraz powinny pojawić się rysunki:&lt;br /&gt;
[[Plik:Fig_chinczyn1.png|thumb 200 px|center]]&lt;br /&gt;
[[Plik:Fig_chinczyn2.png|thumb 200 px|center]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Polecenie ==&lt;br /&gt;
Zaimplementuj funkcję obliczającą transformację Fouriera dyskretyzując wzór (9) dla zadanego wektora częstości &amp;lt;tt&amp;gt;f&amp;lt;/tt&amp;gt; i zadanej częstości próbkowania sygnału (tutaj: 10).&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Wywołanie przykładowe:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
t= np.arange(0,1,0.1)&lt;br /&gt;
x = np.sin(2*np.pi*2*t)&lt;br /&gt;
f = np.arange(-5,5,1)&lt;br /&gt;
X,f = fourier(x,f,10.0)&lt;br /&gt;
print X&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Natomiast wywołanie:&lt;br /&gt;
&amp;lt;source lang ='python'&amp;gt;&lt;br /&gt;
t= np.arange(0,1,0.1)&lt;br /&gt;
x = np.sin(2*np.pi*2*t)&lt;br /&gt;
f = np.arange(-5,5,0.01)&lt;br /&gt;
X = fourier(x,f,10.0)&lt;br /&gt;
py.plot(f,np.abs(X))&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Powinno wytworzyć rysunek:&lt;br /&gt;
&lt;br /&gt;
[[Plik:Fourier_test.png]] &lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
import numpy as np&lt;br /&gt;
import pylab as py&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def koreluj_pol(x,y,max_tau):&lt;br /&gt;
    x = x - np.mean(x)&lt;br /&gt;
    y = y - np.mean(y)&lt;br /&gt;
    N= len(x)&lt;br /&gt;
    cor = np.zeros(max_tau+1)&lt;br /&gt;
    cor[0] = np.sum(x[:]*y[:]) &lt;br /&gt;
    for i in range(1,max_tau+1):&lt;br /&gt;
        cor[i] = np.sum(x[i:]*y[:-i])&lt;br /&gt;
        &lt;br /&gt;
    cor = cor /(N)&lt;br /&gt;
    return cor&lt;br /&gt;
&lt;br /&gt;
def koreluj(x,y,max_tau):&lt;br /&gt;
    cor = np.zeros(2*max_tau+1)    &lt;br /&gt;
    cor[max_tau:] = koreluj_pol(x,y,max_tau)&lt;br /&gt;
    tmp = koreluj_pol(y,x,max_tau)&lt;br /&gt;
    cor[:max_tau+1] = tmp[-1::-1]&lt;br /&gt;
    return cor  &lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
def fourier_chin(x, FF, FS):&lt;br /&gt;
    ak = koreluj(x,x,len(x)-1)&lt;br /&gt;
    M = np.zeros(len(FF),dtype='complex') &lt;br /&gt;
    for i,f in enumerate( FF):&lt;br /&gt;
        for tau in range(len(ak)):&lt;br /&gt;
	    M[i] += ak[tau]*np.exp(-2*np.pi*1j*f*( tau- len(x))/FS)&lt;br /&gt;
    #M/=np.sqrt(len(ak))&lt;br /&gt;
    return M&lt;br /&gt;
    &lt;br /&gt;
def fourier(ak, FF, FS):&lt;br /&gt;
   &lt;br /&gt;
    M = np.zeros(len(FF),dtype='complex') &lt;br /&gt;
    for i,f in enumerate( FF):&lt;br /&gt;
        for tau in range(len(ak)):&lt;br /&gt;
	    M[i] += ak[tau]*np.exp(-2*np.pi*1j*f*( tau)/FS)&lt;br /&gt;
    M/=np.sqrt(len(ak))&lt;br /&gt;
    return M&lt;br /&gt;
t= np.arange(0,1,0.05)&lt;br /&gt;
x = np.sin(2*np.pi*2*t)&lt;br /&gt;
f = np.arange(-5,5,0.01)&lt;br /&gt;
&lt;br /&gt;
X = fourier_chin(x,f,10.0)&lt;br /&gt;
Xf = fourier(x,f,10.0)&lt;br /&gt;
print X&lt;br /&gt;
py.plot(f,np.abs(X), f,np.abs(Xf)**2)&lt;br /&gt;
py.show()&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zadanie 3: Związek autokorelacji z widmem sygnału==&lt;br /&gt;
Oblicz gęstość widmową mocy sygnału zarejestrowanego w trakcie czuwania z zamkniętymi oczami, korzystając z twierdzenia Chinczyna oraz [[Nieparametryczne_widmo_mocy#Metoda_Welcha | metodą Welcha]].&lt;br /&gt;
Znajdź częstość rytmu &amp;amp;alpha; dla osoby, która była badana.&lt;br /&gt;
&lt;br /&gt;
==Funkcja kowariancji (wzajemnej)==&lt;br /&gt;
&lt;br /&gt;
W celu scharakteryzowania zależności wzajemnej dwóch sygnałów losowych, stosuje się funkcję kowariancji, zdefiniowaną w następujący sposób:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid98&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy} (\tau ) = \mathrm{cov}(x(t),y(t-\tau ))=\mathrm{E}[(x(t)-\mu _x)(y(t-\tau )-\mu _y)]&amp;lt;/math&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(10)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid99&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\mu _x = \mathrm{E}[x(t)]\\&lt;br /&gt;
\mu _y = \mathrm{E}[y(t)]\\ \end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W przypadku sygnałów ciągłych estymatę tę można zapisać w poniższy sposób:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid100&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy} (\tau ) = \frac{1}{T}\int _0^{T}(x(t)-\mu_x)(y(t-\tau)-\mu_y)dt&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
natomiast dla sygnałów dyskretnych jako:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid101&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy}(k) = \frac{1}{N-1}\sum _{i=0}^{N-k}(x(i+k)-x_s)(y(i)-y_s)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W odróżnieniu od funkcji autokowariancji, funkcja kowariancji nie musi mieć maksimum dla przesunięcia &amp;lt;math&amp;gt;\tau =0&amp;lt;/math&amp;gt;. Ponadto posiada ona następującą cechę:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid102&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy}(-\tau ) = \gamma _{yx}(\tau )&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcję kowariancji można znormalizować:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid103&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\rho (\tau) = \frac{\mathrm{E}[(x(t)-\mu _x)(y(t-\tau )-\mu _y)]}{\sqrt{\mathrm{E}[(x(t)-\mu _x)^2]\mathrm{E}[(y(t)-\mu _y)^2]}} = \frac{\gamma _{xy}}{\sigma_x\sigma_y}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
Otrzymaną funkcję nazywamy funkcją korelacji.&lt;br /&gt;
Jednym z zastosowań funkcji korelacji jest wyznaczanie czasu przejścia sygnału przez dany układ liniowy. Funkcja korelacji pomiędzy sygnałem na wejściu układu i sygnałem na jego wyjściu osiągnie wartość maksymalną dla przesunięcia &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; równego czasowi, jaki potrzebował sygnał na pokonanie danego układu. Niestety, taka metoda wyznaczania opóźnienia obarczona jest pewną wadą &amp;amp;mdash; w przypadku gdy prędkość sygnału bądź jego droga zależą od częstości, wtedy na wykresie funkcji korelacji nie uzyskamy wyraźnego maksimum.&lt;br /&gt;
&lt;br /&gt;
=====Polecenie =====&lt;br /&gt;
Zaimplementuj funkcję obliczającą funkcję kowariancji dla różnych sygnałów ''x'' i ''y'' (równanie &amp;lt;xr id=&amp;quot;uid98&amp;quot;&amp;gt;(%i)&amp;lt;/xr&amp;gt;)&amp;lt;!-- skorzystaj przy tym z własności opisanej równaniem &amp;lt;xr id=&amp;quot;uid98&amp;quot;&amp;gt;(%i)&amp;lt;/xr&amp;gt;--&amp;gt;. &lt;br /&gt;
Przykładowe wywołanie:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
b = np.array([-1,-2,-3])&lt;br /&gt;
&lt;br /&gt;
print(koreluj(a,b))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
powinno dać w wyniku:&lt;br /&gt;
 [ 0.5 0.  -1.   0.   0.5]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
{{hidden begin|title=Przykładowe rozwiązanie:}}&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import pylab as py&lt;br /&gt;
&lt;br /&gt;
def koreluj(x,y,max_tau):&lt;br /&gt;
    x = x - np.mean(x)&lt;br /&gt;
    y = y - np.mean(y)&lt;br /&gt;
    cor = np.zeros(2*max_tau+1)&lt;br /&gt;
    cor[max_tau] = np.sum(x[:]*y[:]) &lt;br /&gt;
    for i in range(1,max_tau+1):&lt;br /&gt;
        cor[max_tau+i] = np.sum(x[i:]*y[:-i])&lt;br /&gt;
        cor[max_tau-i] = np.sum(y[i:]*x[:-i])&lt;br /&gt;
    N= len(x)&lt;br /&gt;
    cor = cor /(N-1)&lt;br /&gt;
    return cor&lt;br /&gt;
&lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
b = np.array([-1,-2,-3])&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    print koreluj(a,b,i)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}} --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadanie 4===&lt;br /&gt;
Z danych zarejestrowanych w trakcie czuwania z zamkniętymi oczami wybierz sygnały z następujących kanałów: Fp1, P3, Pz, P4, Fp2, O1, O2.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Dla każdego kanału oblicz funkcję autokorelacji, zaś  dla każdej pary kanałów oblicz funkcję korelacji wzajemnej. Wyniki zaprezentuj w formie kwadratowej macierzy wykresów (za pomocą funkcji subplot, tak jak na przykładowym rys. (rys. &amp;lt;xr id=&amp;quot;uid9&amp;quot;&amp;gt; %i&amp;lt;/xr&amp;gt;)). Na przekątnej macierzy narysuj funkcję autokorelacji odpowiednich kanałów, poza przekątną &amp;amp;mdash; funkcję korelacji wzajemnej. Wskaż kanały, które są najbardziej skorelowane ze sobą. Czy możliwe jest wyznaczenie opóźnienia sygnału pomiędzy tymi kanałami?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Powtórz punkt 1, tym razem jednak funkcję autokorelacji i korelacji wzajemnej oblicz na sygnałach przefiltrowanych filtrem wąskopasmowym w paśmie alfa charakterystycznym dla badanej osoby. ([[%C4%86wiczenia_7#Funkcje_do_projektowania_filtr.C3.B3w_IIR_dost.C4.99pne_w_module_scipy.signal|przypomnienie konstrukcji filtrów]])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Oszacuj istotność statystyczną zależności między parami kanałów. Twoją hipotezą zerową jest brak istotnej korelacji pomiędzy sygnałami zarejestrowanymi przez dwie różne elektrody EEG. Hipoteza alternatywna to występowanie zależności pomiędzy tymi sygnałami. Podanie estymatorów wariancji funkcji korelacji jest bardzo trudne, dlatego jednym ze sposobów oszacowania progu powyżej którego wartość funkcji korelacji można byłoby uznać za istotną statystycznie, jest zastosowanie metody ''bootstrap''. Teoretycznie, funkcja korelacji policzona dla dwóch rzeczywistych, nieskorelowanych sygnałów, powinna wynosić 0 dla każdego przesunięcia &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt;. Tak jest jednak w przypadku sygnałów nieskończonych; w analizie sygnałów takowych nie spotkamy.&lt;br /&gt;
&lt;br /&gt;
Dokonując losowej zamiany kolejności próbek, możemy doprowadzić do wytworzenia sygnałów zależnych losowo, które jednak ze względu na skończony czas trwania, dadzą niezerową funkcję korelacji. Poziom losowych fluktuacji tej funkcji oszacujemy wykonując następujące kroki:&lt;br /&gt;
&amp;lt;ol type=&amp;quot;A&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Losowa zamiana kolejności próbek w analizowanych sygnałach. Jeżeli pomiędzy dwoma sygnałami istnieją jakieś zależności, losowa zamiana próbek doprowadzi do zniszczenia tych związków. W ten sposób uzyskujemy sygnały, które teoretycznie są nieskorelowane.&lt;br /&gt;
&amp;lt;li&amp;gt; Obliczenie funkcji  korelacji wzajemnej dla sygnałów policzonych w punkcie A.&lt;br /&gt;
&amp;lt;li&amp;gt; Powtórzenie kroków A i B wiele (np. 1000) razy.&lt;br /&gt;
&amp;lt;li&amp;gt; Oszacowanie 95% przedziału ufności dla wartości średniej funkcji korelacji wzajemnej dla danego przesunięcia &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; korzystając z otrzymanego w kroku C empirycznego rozkładu wartości tych funkcji dla sygnałów niezależnych.  &lt;br /&gt;
&amp;lt;li&amp;gt; Powtórzenie kroków A-D dla kolejnych przesunięć &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;li&amp;gt; Sprawdzenie, dla których przesunięć &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; funkcje autokorelacji i korelacji obliczone dla oryginalnych sygnałów uzyskały wartości wyższe niż wartości progowe oszacowane dla sygnałów o losowych zależnościach.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Procedura opisana powyżej ma jednak '''zasadniczą wadę'''. Staramy się w niej oszacować poziom przypadkowych korelacji pomiędzy dwoma sygnałami dla kolejnych przesunięć &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt;, co jest niczym innym jak wielokrotnym powtórzeniem pewnego testu. Obserwowanie korelacji dla wielu par kanałów równocześnie również prowadzi do zwiększenia szansy na zaobserwowanie ekstremalnie dużych fluktuacji.&lt;br /&gt;
Występuje tu zatem ''problem wielokrotnych porównań''.&lt;br /&gt;
Przypominamy, iż może to doprowadzić do przypadkowego uznania wyników jako &amp;amp;bdquo;istotnych&amp;amp;rdquo; statystycznie. Np. jeśli pojedynczy test wykonujemy na poziomie istotności 5% to dopuszczamy odrzucenie w 1 przypadku na 20 hipotezy zerowej pomimo, iż jest ona prawdziwa. Z drugiej jednak strony, jeśli powtórzymy wykonywany test 20 razy, to oczekujemy uzyskania 1 przypadku, w którym poziom ''p'' będzie mniejszy od 5% co jest przesłanką za odrzuceniem hipotezy zerowej. &lt;br /&gt;
&lt;br /&gt;
W przypadku wykonywania serii testów należałoby więc zastosować odpowiednie poprawki, np. [http://www.bmj.com/content/310/6973/170.full korektę Bonferroniego] czy [http://en.wikipedia.org/wiki/False_discovery_rate false discovery rate (FDR)]. Innym rozwiązaniem w analizowanym przez nas problemie jest zastosowanie tzw. statystyk wartości ekstremalnych, które prowadzą do następujących zmian w procedurze:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol type=&amp;quot;A&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;	Losowa zmiana kolejności próbek w analizowanych sygnałach (we wszystkich analizowanych kanałach). Jeżeli pomiędzy dwoma sygnałami istnieją jakieś zależności, losowa zamiana próbek doprowadzi do zniszczenia tych związków. W ten sposób uzyskujemy sygnały, które teoretycznie są nieskorelowane.&lt;br /&gt;
&amp;lt;li&amp;gt;	Obliczenie funkcji korelacji dla sygnałów otrzymanych w punkcie A.&lt;br /&gt;
&amp;lt;li&amp;gt;    Zapamiętanie maksymalnej wartości bezwzględnej funkcji korelacji z punktu B (maksimum bierzemy po wszystkich przesunięciach i po wszystkich parach kanałów; dla funkcji autokorelacji, ze względu na jej normalizację do 1 dla zerowego przesunięcia, tam maksymalnych wartości poszukujemy dla przesunięć innych niż 0).&lt;br /&gt;
&amp;lt;li&amp;gt;	Powtórzenie kroków A-C 1000 razy. Uzyskamy w ten sposób rozkład maksymalnych wartości funkcji korelacji możliwych do zaobserwowania dla sygnałów niezależnych.&lt;br /&gt;
&amp;lt;li&amp;gt;    Wyznaczenie 95 centyla rozkładu wartości maksymalnych.&lt;br /&gt;
&amp;lt;li&amp;gt;	Nałożenie na rysunki funkcji korelacji uzyskane w Zadaniu 2 poziomych linii symbolizujących poziom zależności dwóch sygnałów o losowych zależnościach i sprawdzenie, dla których przesunięć &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; wartości funkcji korelacji przekraczają estymowane progi istotności statystycznej.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Plik:Korelacje_wzajemne.png|700px|center|thumb|&amp;lt;figure id=&amp;quot;uid9&amp;quot; /&amp;gt;Przykład wyniku analizy korelacji wzajemnych dla sygnału niefiltrowanego z naniesionymi granicami możliwych fluktuacji.]]&lt;br /&gt;
&lt;br /&gt;
==Wzajemna gęstość widmowa sygnałów==&lt;br /&gt;
&lt;br /&gt;
Podobnie jak w przypadku twierdzenia Chinczyna dla pojedynczego sygnału, możliwe jest policzenie transformaty Fouriera funkcji kowariancji. Uzyskana w ten sposób wielkość nazywa się funkcją wzajemnej gęstości mocy widmowej sygnału:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid122&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
S_{xy}(f) = \int _{-\infty }^{\infty }\gamma_{xy}(\tau )e^{-2\pi i f \tau}d\tau &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W celu dalszego omówienia własności funkcji wzajemnej mocy widmowej sygnałów funkcję tę zapiszemy w postaci:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid123&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
S_{xy}(f) = |S_{xy}(f)|e^{i\phi _{xy}(f)}\\&lt;br /&gt;
\\&lt;br /&gt;
\phi _{xy} = \arg(S_{xy}) &lt;br /&gt;
\end{array} &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&amp;lt;!-- \mathrm{arc\,tg}\left[\frac{\mathrm{Im}(S_{xy}(f))}{\mathrm{Re}(S_{xy}(f))}\right]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wartość bezwzględna funkcji wzajemnej gęstości mocy widmowej osiąga największą wartość dla '''częstości''', w których sygnały &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;y(t)&amp;lt;/math&amp;gt; są ze sobą skorelowane. Funkcja wzajemnej mocy widmowej sygnałów pozbawiona jest zatem wady, która charakteryzowała funkcję korelacji, to jest problemu z wyznaczeniem czasu transmisji sygnału, w przypadku gdy czas ten zależał od częstości. Przy pomocy funkcji wzajemnej mocy widmowej, czas ten można oszacować przy pomocy fazy tej funkcji &amp;amp;mdash; &amp;lt;math&amp;gt;\phi _{xy}(f)&amp;lt;/math&amp;gt;. Jeśli funkcja wzajemnej mocy widmowej została wyznaczona pomiędzy sygnałami na wejściu i wyjściu układu liniowego, to faza ta reprezentuje przesunięcie fazowe sygnału przy przejściu przez układ. Czas tego przejścia można oszacować za pomocą następującej wyrażenia:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid124&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\tau = \frac{\phi _{xy}(f)}{2\pi f}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Podobnie jak w przypadku funkcji autokorelacji i korelacji wzajemnej, funkcję wzajemnej gęstości mocy widmowej można znormalizować:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid125&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
C_{xy}(f) = \frac{S_{xy}(f)}{\sqrt{S_x(f)S_y(f)}}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Znormalizowaną postać funkcji wzajemnej gęstości mocy widmowej nazywamy funkcją ''koherencji''. &lt;br /&gt;
Koherencja jest wielkością zespoloną. Faza koherencji odzwierciedla różnicę faz pomiędzy dwoma sygnałami. Moduł koherencji reprezentuje stopień synchronizacji sygnałów i zawiera się w przedziale od 0.0 do 1.0. Moduł tej funkcji zawiera się w przedziale od 0 do 1. Wartości 0 odpowiada brak synchronizacji pomiędzy sygnałami, zaś wartości 1 pełna synchronizacja dwóch przebiegów czasowych. Należy również zwrócić uwagę na nazewnictwo - często sam moduł koherencji określany jest jako koherencja, w literaturze anglojęzycznej moduł koherencji posiada jednak odrębną nazwę: Magnitude Square Coherence (MSC). Istotny jest również sposób estymacji modułu koherencji, który wyprowadzono w następnym rozdziale, zaś sam estymator reprezentuje wzór (36).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadanie 5===&lt;br /&gt;
Zaimplementuj funkcję obliczającą wzajemną gęstość widmową dla pary kanałów. &lt;br /&gt;
&amp;lt;!--Niech argumentami tej funkcji będą dwa wektory zawierające sygnały, zakres częstości, częstość próbkowania. --&amp;gt;&lt;br /&gt;
Oblicz i narysuj macierz gęstości widmowych (własnych i wzajemnych) dla kolejnych par kanałów (tych samych co w zadaniu 3). Wyniki zaprezentuj w postaci kwadratowej macierzy rysunków. Ponieważ są to funkcje zespolone, dobrze jest zaprezentować osobno ich wartość i fazę. Uzyskane wartości bezwzględne narysuj nad przekątną tej macierzy, a fazę pod przekątną.&lt;br /&gt;
&lt;br /&gt;
===Zadanie 6===&lt;br /&gt;
Przygotuj sygnał dwukanałowy, w którym jako pierwszy sygnał wybierz fragment sygnału EEG (z danych zebranych wcześniej) o długości 2000 próbek, a jako drugiego sygnału użyj tego samego fragmentu EEG, ale opóźnionego o wybraną liczbę (1 - 5) próbek. Oblicz widma wzajemne tych sygnałów i zaprezentuj ich fazy na rysunku. Na podstawie tych widm znajdź wartość przesunięcia czasowego tych sygnałów.&lt;br /&gt;
&lt;br /&gt;
Obliczenia powtórz w przypadku, gdy do drugiego sygnału dodany będzie szum o wariancji równej 0,25 wariancji oryginalnego sygnału.&lt;/div&gt;</summary>
		<author><name>Maciek</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG_2/EEG_wlasno%C5%9Bci_EEG_spoczynkowego&amp;diff=11198</id>
		<title>Pracownia EEG 2/EEG wlasności EEG spoczynkowego</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG_2/EEG_wlasno%C5%9Bci_EEG_spoczynkowego&amp;diff=11198"/>
		<updated>2024-11-23T21:58:26Z</updated>

		<summary type="html">&lt;p&gt;Maciek: /* Polecenie: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Pracownia EEG 2|Pracownia EEG 2]] / Własności EEG spoczynkowego: funkcja autokorelacji i widmo&lt;br /&gt;
&lt;br /&gt;
=Estymacja funkcji autokowariancji, autokorelacji i koherencji sygnału.=&lt;br /&gt;
==Wstęp==&lt;br /&gt;
Z funkcjami tymi spotkaliśmy się już na zajęciach z [[Ćwiczenia_4|analizy sygnałów]].&lt;br /&gt;
&lt;br /&gt;
Funkcja autokowariancji sygnału charakteryzuje liniową zależność wartości tego sygnału w danej określonej chwili czasu od wartości (tego samego sygnału) w innej chwili.&lt;br /&gt;
W przypadku [[Nieparametryczne_widmo_mocy#Sygna.C5.82y_stochastyczne  | stacjonarnych procesów stochastycznych]], przebieg tej funkcji nie zależy od czasu. &lt;br /&gt;
Oznacza to, że obliczając funkcję autokorelacji sygnału pomiędzy chwilą czasu &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;x(t+\tau )&amp;lt;/math&amp;gt; otrzymamy tę samą wartość, jak dla przypadku obliczania funkcji autokorelacji pomiędzy momentami &amp;lt;math&amp;gt;x(t + T)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;x(t + T+\tau )&amp;lt;/math&amp;gt;, gdzie &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; to dowolny przedział czasu. Innymi słowy, funkcja autokorelacji procesu stacjonarnego zależy tylko od odstępu czasu pomiędzy próbkami &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt;, dla którego jest wyznaczana, a nie od konkretnej chwili czasu. Odrębną klasę sygnałów stanowią procesy niestacjonarne, w przypadku których funkcja autokorelacji będzie zależeć od czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; w którym jest obliczana. Estymator funkcji autokowariancji uzyskuje się poprzez obliczanie iloczynów wartości sygnału &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; w chwilach czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; czyli &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; i wartości sygnału &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; w chwili czasu ''t''+&amp;amp;tau; czyli &amp;lt;math&amp;gt;x(t+\tau)&amp;lt;/math&amp;gt; i uśredniając wartości iloczynów po czasie &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid79&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma (\tau) = \mathrm{cov}(x(t),x(t-\tau ))=\mathrm{E}[(x(t)-\mu )(x(t-\tau )-\mu )]&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(1)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid80&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\mu = \mathrm{E}[x(t)]&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(2)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W przypadku sygnałów ciągłych estymatę tę można zapisać w poniższy sposób:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid81&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma (\tau ) = \frac{1}{T}\int _0^{T}(x(t)-\mu )(x(t-\tau )-\mu )dt&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(3)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
natomiast dla sygnałów dyskretnych jako:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid82&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma (k) = \frac{1}{N-1}\sum _{i=1}^{N-|k|}(x(i+k)-x_s)(x(i)-x_s)&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(4)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid83&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
x_s = \frac{\sum _{i=1}^{N}x(i)}{N}&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(5)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcja autokowariancji może osiągać dowolne wartości, dlatego aby można było porównać przebieg tej funkcji np. pomiędzy dwoma sygnałami, wprowadzono wersję znormalizowaną tej funkcji &amp;amp;mdash; ''funkcję autokorelacji''. Normalizacja ta wygląda następująco:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid84&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\rho (k) = \frac{\gamma (\tau )}{\sigma^2}&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(6)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid85&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\sigma ^2 = \mathrm{E}[(x(t)-\mu )^2]&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(7)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wariancję sygnału (&amp;lt;math&amp;gt;\gamma (0)=\sigma ^2&amp;lt;/math&amp;gt;) można wyrazić przez funkcję autokowariancji dla przesunięcia &amp;lt;math&amp;gt;\tau =0&amp;lt;/math&amp;gt;.  Wynika z tego, że funkcja korelacji przyjmuje wartości z zakresu [&amp;amp;minus;1,&amp;amp;nbsp;1]. Ostatecznie estymator funkcji autokorelacji można zapisać jak poniżej:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid86&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\rho(k) = \frac{\gamma (k)}{\gamma (0)}&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(8)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcję autokorelacji estymuje się w celu określenia, w jakim stopniu wartości sygnału w danej chwili czasu wpływają na wartości sygnału w kolejnych chwilach czasu. Ma to kluczowe znaczenie przy rozpoznawaniu rodzaju procesów fizycznych odpowiedzialnego za generowanie sygnału. Funkcja ta zawsze mam maksimum dla przesunięcia &amp;lt;math&amp;gt;\tau =0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cechą charakterystyczną funkcji autokorelacji jest to, iż w przypadku sygnałów harmonicznych, przebieg funkcji ma charakter okresowy, z okresem takim samym jak okres badanego sygnału. W przypadku szumu, funkcja autokorelacji ma kształt funkcji delta Diraca.&lt;br /&gt;
&lt;br /&gt;
==Polecenie:==&lt;br /&gt;
Do policzenia funkcji autokorelacji posłużymy się funkcją biblioteczną &amp;lt;tt&amp;gt;numpy.correlate&amp;lt;/tt&amp;gt;. Funkcja ta, wbrew nazwie, oblicza wyłącznie splot swoich dwóch pierwszych argumentów wywołania. Musimy je więc przystosować do obliczenia wielkości zgodnie ze wzorem (4).&lt;br /&gt;
&lt;br /&gt;
Zaimplementuj funkcję do obliczania funkcji korelacji zgodnie ze wzorem &amp;lt;xr id=&amp;quot;uid82&amp;quot;&amp;gt;(%i)&amp;lt;/xr&amp;gt;. Funkcja powinna przyjmować jako parametry dwa wektory&amp;lt;!--i maksymalne przesunięcie wzajemne tych wektorów--&amp;gt;, a zwracać wektor zawierający ich funkcję autokorelacji. &lt;br /&gt;
&lt;br /&gt;
Wywołanie przykładowe:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
print(koreluj(a,a))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
powinno dać wynik:&lt;br /&gt;
 [-0.5  0.   1.   0.  -0.5]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
# Średnia&lt;br /&gt;
mean = numpy.mean(data)&lt;br /&gt;
mean2 = numpy.mean(data2)&lt;br /&gt;
&lt;br /&gt;
# Wariancja&lt;br /&gt;
var = numpy.var(data)&lt;br /&gt;
var2 = numpy.var(data2)&lt;br /&gt;
&lt;br /&gt;
# Dane po odjęciu średnich&lt;br /&gt;
ndata = data - mean&lt;br /&gt;
ndata2 = data2 - mean2&lt;br /&gt;
&lt;br /&gt;
# Splot&lt;br /&gt;
acorr = numpy.correlate(ndata, ndata2, 'full')&lt;br /&gt;
&lt;br /&gt;
# Normalizacja kowariancji do korelacji i przez 1/N&lt;br /&gt;
acorr = acorr / numpy.sqrt(var*var2) / len(ndata)&lt;br /&gt;
&lt;br /&gt;
print(acorr)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{{hidden begin|title=Przykładowe rozwiązanie:}}--&amp;gt;&lt;br /&gt;
 &amp;lt;!-- &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
def koreluj_pol(x,y,max_tau):&lt;br /&gt;
    x = x - np.mean(x)&lt;br /&gt;
    y = y - np.mean(y)&lt;br /&gt;
    N= len(x)&lt;br /&gt;
    cor = np.zeros(max_tau+1)&lt;br /&gt;
    cor[0] = np.sum(x[:]*y[:]) &lt;br /&gt;
    for i in range(1,max_tau+1):&lt;br /&gt;
        cor[i] = np.sum(x[i:]*y[:-i])&lt;br /&gt;
        &lt;br /&gt;
    cor = cor /(N-1)&lt;br /&gt;
    return cor&lt;br /&gt;
&lt;br /&gt;
def koreluj(x,y,max_tau):&lt;br /&gt;
    cor = np.zeros(2*max_tau+1)    &lt;br /&gt;
    cor[max_tau:] = koreluj_pol(x,y,max_tau)&lt;br /&gt;
    tmp = koreluj_pol(y,x,max_tau)&lt;br /&gt;
    cor[:max_tau+1] = tmp[-1::-1]&lt;br /&gt;
    return cor    &lt;br /&gt;
    &lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    print koreluj(a,a,i)&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
b = np.array([-1,-2,-3])&lt;br /&gt;
&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    print koreluj(a,b,i)&lt;br /&gt;
    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zadanie 1: Pomiar sygnału EEG ==&lt;br /&gt;
&lt;br /&gt;
Zarejestruj 10 minut sygnału EEG, w trakcie których badana osoba będzie siedziała z otwartymi oczami oraz kolejne 10 minut w stanie czuwania z zamkniętymi oczami. Rejestrację należy wykonać na pełnym czepku 10-20 z częstością próbkowania 128 Hz. &lt;br /&gt;
&lt;br /&gt;
==Zadanie 2:  Funkcje autokowariancji i autokorelacji==&lt;br /&gt;
W tym zadaniu posłużymy się sygnałami zarejestrowanymi w punkcie 3. poprzedniego ćwiczenia. Zaobserwuj, na którym kanale rytm alfa osiąga najwyższą wartość. Następnie zaimplementuj w Pythonie następujące kroki:&lt;br /&gt;
&lt;br /&gt;
#	Wczytaj dane z wybranego kanału.&lt;br /&gt;
#	Oblicz funkcję autokorelacji dla sygnału zarejestrowanego w warunkach, gdy osoba badana siedziała z otwartymi oczami. Narysuj autokorelogram, to jest wykres wartości funkcji autokorelacji względem przesunięcia &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt;. Oś &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; wyskaluj w sekundach.&lt;br /&gt;
#	Powtórz krok 2, tym razem dla sygnału zebranego w warunkach czuwania z zamkniętymi oczami.&lt;br /&gt;
#	Porównaj autokorelogramy.&lt;br /&gt;
&lt;br /&gt;
=Związek autokorelacji z widmem sygnału=&lt;br /&gt;
==Wstęp==&lt;br /&gt;
Zgodnie z twierdzeniem Chinczyna, z którym zapoznaliśmy się na wykładzie z [[Twierdzenie_Wienera-Chinczyna|Analizy Sygnałów]], widmową gęstość mocy sygnału można policzyć jako transformatę Fouriera funkcji autokowariancji:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid93&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
S(f) = \int _{-\infty }^{\infty }\gamma (\tau )e^{-2\pi i f \tau}d\tau &amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(9)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	&amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; &amp;amp;mdash; częstość&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	&amp;lt;math&amp;gt;S(f)&amp;lt;/math&amp;gt; &amp;amp;mdash;  gęstość widmowa mocy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Poniższy kod ilustruje to twierdzenie:&lt;br /&gt;
&amp;lt;source lang = py&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
from numpy.fft import rfft,fft,fftfreq,fftshift&lt;br /&gt;
 &lt;br /&gt;
def widmo_mocy(s, Fs):&lt;br /&gt;
    '''Funkcja licąca widmo mocy metodą periodogramu,&lt;br /&gt;
	pobiera sygnał i częstość próbkowania&lt;br /&gt;
	zwraca widmo mocy i oś częstości&lt;br /&gt;
    '''&lt;br /&gt;
    S = fft(s)/np.sqrt(len(s))&lt;br /&gt;
    S_moc = S*S.conj()&lt;br /&gt;
    S_moc = S_moc.real&lt;br /&gt;
    F = fftfreq(len(s), 1/Fs)&lt;br /&gt;
    return (fftshift(S_moc),fftshift(F))&lt;br /&gt;
 &lt;br /&gt;
def sin(f = 1, T = 1, Fs = 128, phi =0 ):&lt;br /&gt;
    '''sin o zadanej częstości (w Hz), długości, fazie i częstości próbkowania&lt;br /&gt;
    Domyślnie wytwarzany jest sygnał reprezentujący &lt;br /&gt;
    1 sekundę sinusa o częstości 1Hz i zerowej fazie próbkowanego 128 Hz&lt;br /&gt;
    '''&lt;br /&gt;
    dt = 1.0/Fs&lt;br /&gt;
    t = np.arange(0,T,dt)&lt;br /&gt;
    s = np.sin(2*np.pi*f*t + phi)&lt;br /&gt;
    return (s,t)&lt;br /&gt;
 &lt;br /&gt;
# sygnał próbny będzie próbkowany z częstością FS&lt;br /&gt;
FS = 100.0&lt;br /&gt;
# sygnałem próbnym będzie sinusoida o częstości f &lt;br /&gt;
(s,t) = sin(f=10.5,Fs=FS)&lt;br /&gt;
# obliczamy moc i energię sygnału w dziedzinie czasu&lt;br /&gt;
moc_w_czasie = s**2&lt;br /&gt;
energia_w_czasie = np.sum(moc_w_czasie)&lt;br /&gt;
print 'energia w czasie: ', energia_w_czasie&lt;br /&gt;
 &lt;br /&gt;
# obliczamy widmo mocy sygnału i jego energię estymowaną w dziedzinie częstości&lt;br /&gt;
(moc_w_czestosci, F) = widmo_mocy(s, Fs=FS)&lt;br /&gt;
energia_w_czestosci = np.sum(moc_w_czestosci)&lt;br /&gt;
print 'energia w czestosci: ', energia_w_czestosci&lt;br /&gt;
 &lt;br /&gt;
# estymujemy funkcję autokorelacji sygnału&lt;br /&gt;
ak = 1./(2*len(s)-1)*np.correlate(s,s,'full')&lt;br /&gt;
&lt;br /&gt;
# estymujemy widmo mocy i energię sygnału z twierdzenia Chinczyna korzystając z funkcji fft:&lt;br /&gt;
moc_chi = np.abs(fft(ak))&lt;br /&gt;
energia_chin = sum(moc_chi)&lt;br /&gt;
print 'energia z tw. Chinczyna przez fft: ', energia_chin&lt;br /&gt;
 &lt;br /&gt;
# estymujemy widmo mocy i energię sygnału z twierdzenia Chinczyna korzystając z jawnej postaci transformaty Fouriera:&lt;br /&gt;
FF = np.linspace(-FS/2,FS/2,1000)&lt;br /&gt;
M = np.zeros(len(FF),dtype='complex')&lt;br /&gt;
 &lt;br /&gt;
for i,f in enumerate( FF):&lt;br /&gt;
    for tau in range(len(ak)):&lt;br /&gt;
        M[i] += ak[tau]*np.exp(2*np.pi*1j*f*(len(ak)-tau)/FS) &lt;br /&gt;
M = np.abs(M)&lt;br /&gt;
energia_chin_sum = np.sum(M)* (len(ak)/len(FF))&lt;br /&gt;
print 'energia z tw. Chinczyna przez sumowanie: ', energia_chin_sum&lt;br /&gt;
&lt;br /&gt;
# Rysunki&lt;br /&gt;
py.figure(1)&lt;br /&gt;
py.subplot(3,1,1)&lt;br /&gt;
py.plot(t,s)&lt;br /&gt;
py.title(u'Sygnal')&lt;br /&gt;
py.subplot(3,1,2)&lt;br /&gt;
py.plot(t,moc_w_czasie)&lt;br /&gt;
py.title(u'moc w czasie')&lt;br /&gt;
py.subplot(3,1,3)&lt;br /&gt;
py.plot(F,moc_w_czestosci)&lt;br /&gt;
py.title(u'moc w czestosci')&lt;br /&gt;
 &lt;br /&gt;
py.figure(2)&lt;br /&gt;
py.subplot(3,1,1)&lt;br /&gt;
py.title('f. autokowariancji')&lt;br /&gt;
py.plot(np.arange(-len(ak)/2,len(ak)/2,1)/FS ,ak)&lt;br /&gt;
py.subplot(3,1,2)&lt;br /&gt;
py.plot(fftshift(fftfreq(len(moc_chi),1./FS)),fftshift(moc_chi))&lt;br /&gt;
py.title('widmo mocy z Tw. Chinczyna przez fft')&lt;br /&gt;
py.subplot(3,1,3)&lt;br /&gt;
py.plot(FF,M)&lt;br /&gt;
py.title('widmo mocy z Tw. Chinczyna przez sumowanie')&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W wyniku powinniśmy zobaczyć w terminalu:&lt;br /&gt;
 energia w czasie:  50.0&lt;br /&gt;
 energia w czestosci:  50.0&lt;br /&gt;
 energia z tw. Chinczyna przez fft:  50.0&lt;br /&gt;
 energia z tw. Chinczyna przez sumowanie:  49.9501172217&lt;br /&gt;
&lt;br /&gt;
oraz powinny pojawić się rysunki:&lt;br /&gt;
[[Plik:Fig_chinczyn1.png|thumb 200 px|center]]&lt;br /&gt;
[[Plik:Fig_chinczyn2.png|thumb 200 px|center]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Polecenie ==&lt;br /&gt;
Zaimplementuj funkcję obliczającą transformację Fouriera dyskretyzując wzór (9) dla zadanego wektora częstości &amp;lt;tt&amp;gt;f&amp;lt;/tt&amp;gt; i zadanej częstości próbkowania sygnału (tutaj: 10).&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Wywołanie przykładowe:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
t= np.arange(0,1,0.1)&lt;br /&gt;
x = np.sin(2*np.pi*2*t)&lt;br /&gt;
f = np.arange(-5,5,1)&lt;br /&gt;
X,f = fourier(x,f,10.0)&lt;br /&gt;
print X&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Natomiast wywołanie:&lt;br /&gt;
&amp;lt;source lang ='python'&amp;gt;&lt;br /&gt;
t= np.arange(0,1,0.1)&lt;br /&gt;
x = np.sin(2*np.pi*2*t)&lt;br /&gt;
f = np.arange(-5,5,0.01)&lt;br /&gt;
X = fourier(x,f,10.0)&lt;br /&gt;
py.plot(f,np.abs(X))&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Powinno wytworzyć rysunek:&lt;br /&gt;
&lt;br /&gt;
[[Plik:Fourier_test.png]] &lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
import numpy as np&lt;br /&gt;
import pylab as py&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def koreluj_pol(x,y,max_tau):&lt;br /&gt;
    x = x - np.mean(x)&lt;br /&gt;
    y = y - np.mean(y)&lt;br /&gt;
    N= len(x)&lt;br /&gt;
    cor = np.zeros(max_tau+1)&lt;br /&gt;
    cor[0] = np.sum(x[:]*y[:]) &lt;br /&gt;
    for i in range(1,max_tau+1):&lt;br /&gt;
        cor[i] = np.sum(x[i:]*y[:-i])&lt;br /&gt;
        &lt;br /&gt;
    cor = cor /(N)&lt;br /&gt;
    return cor&lt;br /&gt;
&lt;br /&gt;
def koreluj(x,y,max_tau):&lt;br /&gt;
    cor = np.zeros(2*max_tau+1)    &lt;br /&gt;
    cor[max_tau:] = koreluj_pol(x,y,max_tau)&lt;br /&gt;
    tmp = koreluj_pol(y,x,max_tau)&lt;br /&gt;
    cor[:max_tau+1] = tmp[-1::-1]&lt;br /&gt;
    return cor  &lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
def fourier_chin(x, FF, FS):&lt;br /&gt;
    ak = koreluj(x,x,len(x)-1)&lt;br /&gt;
    M = np.zeros(len(FF),dtype='complex') &lt;br /&gt;
    for i,f in enumerate( FF):&lt;br /&gt;
        for tau in range(len(ak)):&lt;br /&gt;
	    M[i] += ak[tau]*np.exp(-2*np.pi*1j*f*( tau- len(x))/FS)&lt;br /&gt;
    #M/=np.sqrt(len(ak))&lt;br /&gt;
    return M&lt;br /&gt;
    &lt;br /&gt;
def fourier(ak, FF, FS):&lt;br /&gt;
   &lt;br /&gt;
    M = np.zeros(len(FF),dtype='complex') &lt;br /&gt;
    for i,f in enumerate( FF):&lt;br /&gt;
        for tau in range(len(ak)):&lt;br /&gt;
	    M[i] += ak[tau]*np.exp(-2*np.pi*1j*f*( tau)/FS)&lt;br /&gt;
    M/=np.sqrt(len(ak))&lt;br /&gt;
    return M&lt;br /&gt;
t= np.arange(0,1,0.05)&lt;br /&gt;
x = np.sin(2*np.pi*2*t)&lt;br /&gt;
f = np.arange(-5,5,0.01)&lt;br /&gt;
&lt;br /&gt;
X = fourier_chin(x,f,10.0)&lt;br /&gt;
Xf = fourier(x,f,10.0)&lt;br /&gt;
print X&lt;br /&gt;
py.plot(f,np.abs(X), f,np.abs(Xf)**2)&lt;br /&gt;
py.show()&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zadanie 3: Związek autokorelacji z widmem sygnału==&lt;br /&gt;
Oblicz gęstość widmową mocy sygnału zarejestrowanego w trakcie czuwania z zamkniętymi oczami, korzystając z twierdzenia Chinczyna oraz [[Nieparametryczne_widmo_mocy#Metoda_Welcha | metodą Welcha]].&lt;br /&gt;
Znajdź częstość rytmu &amp;amp;alpha; dla osoby, która była badana.&lt;br /&gt;
&lt;br /&gt;
==Funkcja kowariancji (wzajemnej)==&lt;br /&gt;
&lt;br /&gt;
W celu scharakteryzowania zależności wzajemnej dwóch sygnałów losowych, stosuje się funkcję kowariancji, zdefiniowaną w następujący sposób:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid98&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy} (\tau ) = \mathrm{cov}(x(t),y(t-\tau ))=\mathrm{E}[(x(t)-\mu _x)(y(t-\tau )-\mu _y)]&amp;lt;/math&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(10)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid99&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\mu _x = \mathrm{E}[x(t)]\\&lt;br /&gt;
\mu _y = \mathrm{E}[y(t)]\\ \end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W przypadku sygnałów ciągłych estymatę tę można zapisać w poniższy sposób:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid100&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy} (\tau ) = \frac{1}{T}\int _0^{T}(x(t)-\mu_x)(y(t-\tau)-\mu_y)dt&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
natomiast dla sygnałów dyskretnych jako:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid101&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy}(k) = \frac{1}{N-1}\sum _{i=0}^{N-k}(x(i+k)-x_s)(y(i)-y_s)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W odróżnieniu od funkcji autokowariancji, funkcja kowariancji nie musi mieć maksimum dla przesunięcia &amp;lt;math&amp;gt;\tau =0&amp;lt;/math&amp;gt;. Ponadto posiada ona następującą cechę:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid102&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy}(-\tau ) = \gamma _{yx}(\tau )&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcję kowariancji można znormalizować:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid103&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\rho (\tau) = \frac{\mathrm{E}[(x(t)-\mu _x)(y(t-\tau )-\mu _y)]}{\sqrt{\mathrm{E}[(x(t)-\mu _x)^2]\mathrm{E}[(y(t)-\mu _y)^2]}} = \frac{\gamma _{xy}}{\sigma_x\sigma_y}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
Otrzymaną funkcję nazywamy funkcją korelacji.&lt;br /&gt;
Jednym z zastosowań funkcji korelacji jest wyznaczanie czasu przejścia sygnału przez dany układ liniowy. Funkcja korelacji pomiędzy sygnałem na wejściu układu i sygnałem na jego wyjściu osiągnie wartość maksymalną dla przesunięcia &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; równego czasowi, jaki potrzebował sygnał na pokonanie danego układu. Niestety, taka metoda wyznaczania opóźnienia obarczona jest pewną wadą &amp;amp;mdash; w przypadku gdy prędkość sygnału bądź jego droga zależą od częstości, wtedy na wykresie funkcji korelacji nie uzyskamy wyraźnego maksimum.&lt;br /&gt;
&lt;br /&gt;
=====Polecenie =====&lt;br /&gt;
Zaimplementuj funkcję obliczającą funkcję kowariancji dla różnych sygnałów ''x'' i ''y'' (równanie &amp;lt;xr id=&amp;quot;uid98&amp;quot;&amp;gt;(%i)&amp;lt;/xr&amp;gt;)&amp;lt;!-- skorzystaj przy tym z własności opisanej równaniem &amp;lt;xr id=&amp;quot;uid98&amp;quot;&amp;gt;(%i)&amp;lt;/xr&amp;gt;--&amp;gt;. &lt;br /&gt;
Przykładowe wywołanie:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
b = np.array([-1,-2,-3])&lt;br /&gt;
&lt;br /&gt;
print(koreluj(a,b))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
powinno dać w wyniku:&lt;br /&gt;
 [ 0.5 0.  -1.   0.   0.5]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
{{hidden begin|title=Przykładowe rozwiązanie:}}&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import pylab as py&lt;br /&gt;
&lt;br /&gt;
def koreluj(x,y,max_tau):&lt;br /&gt;
    x = x - np.mean(x)&lt;br /&gt;
    y = y - np.mean(y)&lt;br /&gt;
    cor = np.zeros(2*max_tau+1)&lt;br /&gt;
    cor[max_tau] = np.sum(x[:]*y[:]) &lt;br /&gt;
    for i in range(1,max_tau+1):&lt;br /&gt;
        cor[max_tau+i] = np.sum(x[i:]*y[:-i])&lt;br /&gt;
        cor[max_tau-i] = np.sum(y[i:]*x[:-i])&lt;br /&gt;
    N= len(x)&lt;br /&gt;
    cor = cor /(N-1)&lt;br /&gt;
    return cor&lt;br /&gt;
&lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
b = np.array([-1,-2,-3])&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    print koreluj(a,b,i)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}} --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadanie 4===&lt;br /&gt;
Z danych zarejestrowanych w trakcie czuwania z zamkniętymi oczami wybierz sygnały z następujących kanałów: Fp1, P3, Pz, P4, Fp2, O1, O2.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Dla każdego kanału oblicz funkcję autokorelacji, zaś  dla każdej pary kanałów oblicz funkcję korelacji wzajemnej. Wyniki zaprezentuj w formie kwadratowej macierzy wykresów (za pomocą funkcji subplot, tak jak na przykładowym rys. (rys. &amp;lt;xr id=&amp;quot;uid9&amp;quot;&amp;gt; %i&amp;lt;/xr&amp;gt;)). Na przekątnej macierzy narysuj funkcję autokorelacji odpowiednich kanałów, poza przekątną &amp;amp;mdash; funkcję korelacji wzajemnej. Wskaż kanały, które są najbardziej skorelowane ze sobą. Czy możliwe jest wyznaczenie opóźnienia sygnału pomiędzy tymi kanałami?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Powtórz punkt 1, tym razem jednak funkcję autokorelacji i korelacji wzajemnej oblicz na sygnałach przefiltrowanych filtrem wąskopasmowym w paśmie alfa charakterystycznym dla badanej osoby. ([[%C4%86wiczenia_7#Funkcje_do_projektowania_filtr.C3.B3w_IIR_dost.C4.99pne_w_module_scipy.signal|przypomnienie konstrukcji filtrów]])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Oszacuj istotność statystyczną zależności między parami kanałów. Twoją hipotezą zerową jest brak istotnej korelacji pomiędzy sygnałami zarejestrowanymi przez dwie różne elektrody EEG. Hipoteza alternatywna to występowanie zależności pomiędzy tymi sygnałami. Podanie estymatorów wariancji funkcji korelacji jest bardzo trudne, dlatego jednym ze sposobów oszacowania progu powyżej którego wartość funkcji korelacji można byłoby uznać za istotną statystycznie, jest zastosowanie metody ''bootstrap''. Teoretycznie, funkcja korelacji policzona dla dwóch rzeczywistych, nieskorelowanych sygnałów, powinna wynosić 0 dla każdego przesunięcia &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt;. Tak jest jednak w przypadku sygnałów nieskończonych; w analizie sygnałów takowych nie spotkamy.&lt;br /&gt;
&lt;br /&gt;
Dokonując losowej zamiany kolejności próbek, możemy doprowadzić do wytworzenia sygnałów zależnych losowo, które jednak ze względu na skończony czas trwania, dadzą niezerową funkcję korelacji. Poziom losowych fluktuacji tej funkcji oszacujemy wykonując następujące kroki:&lt;br /&gt;
&amp;lt;ol type=&amp;quot;A&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Losowa zamiana kolejności próbek w analizowanych sygnałach. Jeżeli pomiędzy dwoma sygnałami istnieją jakieś zależności, losowa zamiana próbek doprowadzi do zniszczenia tych związków. W ten sposób uzyskujemy sygnały, które teoretycznie są nieskorelowane.&lt;br /&gt;
&amp;lt;li&amp;gt; Obliczenie funkcji  korelacji wzajemnej dla sygnałów policzonych w punkcie A.&lt;br /&gt;
&amp;lt;li&amp;gt; Powtórzenie kroków A i B wiele (np. 1000) razy.&lt;br /&gt;
&amp;lt;li&amp;gt; Oszacowanie 95% przedziału ufności dla wartości średniej funkcji korelacji wzajemnej dla danego przesunięcia &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; korzystając z otrzymanego w kroku C empirycznego rozkładu wartości tych funkcji dla sygnałów niezależnych.  &lt;br /&gt;
&amp;lt;li&amp;gt; Powtórzenie kroków A-D dla kolejnych przesunięć &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;li&amp;gt; Sprawdzenie, dla których przesunięć &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; funkcje autokorelacji i korelacji obliczone dla oryginalnych sygnałów uzyskały wartości wyższe niż wartości progowe oszacowane dla sygnałów o losowych zależnościach.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Procedura opisana powyżej ma jednak '''zasadniczą wadę'''. Staramy się w niej oszacować poziom przypadkowych korelacji pomiędzy dwoma sygnałami dla kolejnych przesunięć &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt;, co jest niczym innym jak wielokrotnym powtórzeniem pewnego testu. Obserwowanie korelacji dla wielu par kanałów równocześnie również prowadzi do zwiększenia szansy na zaobserwowanie ekstremalnie dużych fluktuacji.&lt;br /&gt;
Występuje tu zatem ''problem wielokrotnych porównań''.&lt;br /&gt;
Przypominamy, iż może to doprowadzić do przypadkowego uznania wyników jako &amp;amp;bdquo;istotnych&amp;amp;rdquo; statystycznie. Np. jeśli pojedynczy test wykonujemy na poziomie istotności 5% to dopuszczamy odrzucenie w 1 przypadku na 20 hipotezy zerowej pomimo, iż jest ona prawdziwa. Z drugiej jednak strony, jeśli powtórzymy wykonywany test 20 razy, to oczekujemy uzyskania 1 przypadku, w którym poziom ''p'' będzie mniejszy od 5% co jest przesłanką za odrzuceniem hipotezy zerowej. &lt;br /&gt;
&lt;br /&gt;
W przypadku wykonywania serii testów należałoby więc zastosować odpowiednie poprawki, np. [http://www.bmj.com/content/310/6973/170.full korektę Bonferroniego] czy [http://en.wikipedia.org/wiki/False_discovery_rate false discovery rate (FDR)]. Innym rozwiązaniem w analizowanym przez nas problemie jest zastosowanie tzw. statystyk wartości ekstremalnych, które prowadzą do następujących zmian w procedurze:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol type=&amp;quot;A&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;	Losowa zmiana kolejności próbek w analizowanych sygnałach (we wszystkich analizowanych kanałach). Jeżeli pomiędzy dwoma sygnałami istnieją jakieś zależności, losowa zamiana próbek doprowadzi do zniszczenia tych związków. W ten sposób uzyskujemy sygnały, które teoretycznie są nieskorelowane.&lt;br /&gt;
&amp;lt;li&amp;gt;	Obliczenie funkcji korelacji dla sygnałów otrzymanych w punkcie A.&lt;br /&gt;
&amp;lt;li&amp;gt;    Zapamiętanie maksymalnej wartości bezwzględnej funkcji korelacji z punktu B (maksimum bierzemy po wszystkich przesunięciach i po wszystkich parach kanałów; dla funkcji autokorelacji, ze względu na jej normalizację do 1 dla zerowego przesunięcia, tam maksymalnych wartości poszukujemy dla przesunięć innych niż 0).&lt;br /&gt;
&amp;lt;li&amp;gt;	Powtórzenie kroków A-C 1000 razy. Uzyskamy w ten sposób rozkład maksymalnych wartości funkcji korelacji możliwych do zaobserwowania dla sygnałów niezależnych.&lt;br /&gt;
&amp;lt;li&amp;gt;    Wyznaczenie 95 centyla rozkładu wartości maksymalnych.&lt;br /&gt;
&amp;lt;li&amp;gt;	Nałożenie na rysunki funkcji korelacji uzyskane w Zadaniu 2 poziomych linii symbolizujących poziom zależności dwóch sygnałów o losowych zależnościach i sprawdzenie, dla których przesunięć &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; wartości funkcji korelacji przekraczają estymowane progi istotności statystycznej.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Plik:Korelacje_wzajemne.png|700px|center|thumb|&amp;lt;figure id=&amp;quot;uid9&amp;quot; /&amp;gt;Przykład wyniku analizy korelacji wzajemnych dla sygnału niefiltrowanego z naniesionymi granicami możliwych fluktuacji.]]&lt;br /&gt;
&lt;br /&gt;
==Wzajemna gęstość widmowa sygnałów==&lt;br /&gt;
&lt;br /&gt;
Podobnie jak w przypadku twierdzenia Chinczyna dla pojedynczego sygnału, możliwe jest policzenie transformaty Fouriera funkcji kowariancji. Uzyskana w ten sposób wielkość nazywa się funkcją wzajemnej gęstości mocy widmowej sygnału:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid122&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
S_{xy}(f) = \int _{-\infty }^{\infty }\gamma_{xy}(\tau )e^{-2\pi i f \tau}d\tau &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W celu dalszego omówienia własności funkcji wzajemnej mocy widmowej sygnałów funkcję tę zapiszemy w postaci:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid123&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
S_{xy}(f) = |S_{xy}(f)|e^{i\phi _{xy}(f)}\\&lt;br /&gt;
\\&lt;br /&gt;
\phi _{xy} = \arg(S_{xy}) &lt;br /&gt;
\end{array} &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&amp;lt;!-- \mathrm{arc\,tg}\left[\frac{\mathrm{Im}(S_{xy}(f))}{\mathrm{Re}(S_{xy}(f))}\right]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wartość bezwzględna funkcji wzajemnej gęstości mocy widmowej osiąga największą wartość dla '''częstości''', w których sygnały &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;y(t)&amp;lt;/math&amp;gt; są ze sobą skorelowane. Funkcja wzajemnej mocy widmowej sygnałów pozbawiona jest zatem wady, która charakteryzowała funkcję korelacji, to jest problemu z wyznaczeniem czasu transmisji sygnału, w przypadku gdy czas ten zależał od częstości. Przy pomocy funkcji wzajemnej mocy widmowej, czas ten można oszacować przy pomocy fazy tej funkcji &amp;amp;mdash; &amp;lt;math&amp;gt;\phi _{xy}(f)&amp;lt;/math&amp;gt;. Jeśli funkcja wzajemnej mocy widmowej została wyznaczona pomiędzy sygnałami na wejściu i wyjściu układu liniowego, to faza ta reprezentuje przesunięcie fazowe sygnału przy przejściu przez układ. Czas tego przejścia można oszacować za pomocą następującej wyrażenia:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid124&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\tau = \frac{\phi _{xy}(f)}{2\pi f}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Podobnie jak w przypadku funkcji autokorelacji i korelacji wzajemnej, funkcję wzajemnej gęstości mocy widmowej można znormalizować:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid125&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
C_{xy}(f) = \frac{S_{xy}(f)}{\sqrt{S_x(f)S_y(f)}}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Znormalizowaną postać funkcji wzajemnej gęstości mocy widmowej nazywamy funkcją ''koherencji''. &lt;br /&gt;
Koherencja jest wielkością zespoloną. Faza koherencji odzwierciedla różnicę faz pomiędzy dwoma sygnałami. Moduł koherencji reprezentuje stopień synchronizacji sygnałów i zawiera się w przedziale od 0.0 do 1.0. Moduł tej funkcji zawiera się w przedziale od 0 do 1. Wartości 0 odpowiada brak synchronizacji pomiędzy sygnałami, zaś wartości 1 pełna synchronizacja dwóch przebiegów czasowych. Należy również zwrócić uwagę na nazewnictwo - często sam moduł koherencji określany jest jako koherencja, w literaturze anglojęzycznej moduł koherencji posiada jednak odrębną nazwę: Magnitude Square Coherence (MSC). Istotny jest również sposób estymacji modułu koherencji, który wyprowadzono w następnym rozdziale, zaś sam estymator reprezentuje wzór (36).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadanie 5===&lt;br /&gt;
Zaimplementuj funkcję obliczającą wzajemną gęstość widmową dla pary kanałów. &lt;br /&gt;
&amp;lt;!--Niech argumentami tej funkcji będą dwa wektory zawierające sygnały, zakres częstości, częstość próbkowania. --&amp;gt;&lt;br /&gt;
Oblicz i narysuj macierz gęstości widmowych (własnych i wzajemnych) dla kolejnych par kanałów (tych samych co w zadaniu 3). Wyniki zaprezentuj w postaci kwadratowej macierzy rysunków. Ponieważ są to funkcje zespolone, dobrze jest zaprezentować osobno ich wartość i fazę. Uzyskane wartości bezwzględne narysuj nad przekątną tej macierzy, a fazę pod przekątną.&lt;br /&gt;
&lt;br /&gt;
===Zadanie 6===&lt;br /&gt;
Przygotuj sygnał dwukanałowy, w którym jako pierwszy sygnał wybierz fragment sygnału EEG (z danych zebranych wcześniej) o długości 2000 próbek, a jako drugiego sygnału użyj tego samego fragmentu EEG, ale opóźnionego o wybraną liczbę (1 - 5) próbek. Oblicz widma wzajemne tych sygnałów i zaprezentuj ich fazy na rysunku. Na podstawie tych widm znajdź wartość przesunięcia czasowego tych sygnałów.&lt;br /&gt;
&lt;br /&gt;
Obliczenia powtórz w przypadku, gdy do drugiego sygnału dodany będzie szum o wariancji równej 0,25 wariancji oryginalnego sygnału.&lt;/div&gt;</summary>
		<author><name>Maciek</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG_2/EEG_wlasno%C5%9Bci_EEG_spoczynkowego&amp;diff=11197</id>
		<title>Pracownia EEG 2/EEG wlasności EEG spoczynkowego</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG_2/EEG_wlasno%C5%9Bci_EEG_spoczynkowego&amp;diff=11197"/>
		<updated>2024-11-23T21:57:59Z</updated>

		<summary type="html">&lt;p&gt;Maciek: /* Polecenie */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Pracownia EEG 2|Pracownia EEG 2]] / Własności EEG spoczynkowego: funkcja autokorelacji i widmo&lt;br /&gt;
&lt;br /&gt;
=Estymacja funkcji autokowariancji, autokorelacji i koherencji sygnału.=&lt;br /&gt;
==Wstęp==&lt;br /&gt;
Z funkcjami tymi spotkaliśmy się już na zajęciach z [[Ćwiczenia_4|analizy sygnałów]].&lt;br /&gt;
&lt;br /&gt;
Funkcja autokowariancji sygnału charakteryzuje liniową zależność wartości tego sygnału w danej określonej chwili czasu od wartości (tego samego sygnału) w innej chwili.&lt;br /&gt;
W przypadku [[Nieparametryczne_widmo_mocy#Sygna.C5.82y_stochastyczne  | stacjonarnych procesów stochastycznych]], przebieg tej funkcji nie zależy od czasu. &lt;br /&gt;
Oznacza to, że obliczając funkcję autokorelacji sygnału pomiędzy chwilą czasu &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;x(t+\tau )&amp;lt;/math&amp;gt; otrzymamy tę samą wartość, jak dla przypadku obliczania funkcji autokorelacji pomiędzy momentami &amp;lt;math&amp;gt;x(t + T)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;x(t + T+\tau )&amp;lt;/math&amp;gt;, gdzie &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; to dowolny przedział czasu. Innymi słowy, funkcja autokorelacji procesu stacjonarnego zależy tylko od odstępu czasu pomiędzy próbkami &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt;, dla którego jest wyznaczana, a nie od konkretnej chwili czasu. Odrębną klasę sygnałów stanowią procesy niestacjonarne, w przypadku których funkcja autokorelacji będzie zależeć od czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; w którym jest obliczana. Estymator funkcji autokowariancji uzyskuje się poprzez obliczanie iloczynów wartości sygnału &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; w chwilach czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; czyli &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; i wartości sygnału &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; w chwili czasu ''t''+&amp;amp;tau; czyli &amp;lt;math&amp;gt;x(t+\tau)&amp;lt;/math&amp;gt; i uśredniając wartości iloczynów po czasie &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid79&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma (\tau) = \mathrm{cov}(x(t),x(t-\tau ))=\mathrm{E}[(x(t)-\mu )(x(t-\tau )-\mu )]&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(1)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid80&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\mu = \mathrm{E}[x(t)]&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(2)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W przypadku sygnałów ciągłych estymatę tę można zapisać w poniższy sposób:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid81&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma (\tau ) = \frac{1}{T}\int _0^{T}(x(t)-\mu )(x(t-\tau )-\mu )dt&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(3)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
natomiast dla sygnałów dyskretnych jako:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid82&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma (k) = \frac{1}{N-1}\sum _{i=1}^{N-|k|}(x(i+k)-x_s)(x(i)-x_s)&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(4)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid83&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
x_s = \frac{\sum _{i=1}^{N}x(i)}{N}&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(5)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcja autokowariancji może osiągać dowolne wartości, dlatego aby można było porównać przebieg tej funkcji np. pomiędzy dwoma sygnałami, wprowadzono wersję znormalizowaną tej funkcji &amp;amp;mdash; ''funkcję autokorelacji''. Normalizacja ta wygląda następująco:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid84&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\rho (k) = \frac{\gamma (\tau )}{\sigma^2}&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(6)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid85&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\sigma ^2 = \mathrm{E}[(x(t)-\mu )^2]&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(7)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wariancję sygnału (&amp;lt;math&amp;gt;\gamma (0)=\sigma ^2&amp;lt;/math&amp;gt;) można wyrazić przez funkcję autokowariancji dla przesunięcia &amp;lt;math&amp;gt;\tau =0&amp;lt;/math&amp;gt;.  Wynika z tego, że funkcja korelacji przyjmuje wartości z zakresu [&amp;amp;minus;1,&amp;amp;nbsp;1]. Ostatecznie estymator funkcji autokorelacji można zapisać jak poniżej:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid86&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\rho(k) = \frac{\gamma (k)}{\gamma (0)}&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(8)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcję autokorelacji estymuje się w celu określenia, w jakim stopniu wartości sygnału w danej chwili czasu wpływają na wartości sygnału w kolejnych chwilach czasu. Ma to kluczowe znaczenie przy rozpoznawaniu rodzaju procesów fizycznych odpowiedzialnego za generowanie sygnału. Funkcja ta zawsze mam maksimum dla przesunięcia &amp;lt;math&amp;gt;\tau =0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cechą charakterystyczną funkcji autokorelacji jest to, iż w przypadku sygnałów harmonicznych, przebieg funkcji ma charakter okresowy, z okresem takim samym jak okres badanego sygnału. W przypadku szumu, funkcja autokorelacji ma kształt funkcji delta Diraca.&lt;br /&gt;
&lt;br /&gt;
==Polecenie:==&lt;br /&gt;
Do policzenia funkcji autokorelacji posłużymy się funkcją biblioteczną &amp;lt;tt&amp;gt;numpy.correlate&amp;lt;/tt&amp;gt;. Funkcja ta, wbrew nazwie, oblicza wyłącznie splot swoich dwóch pierwszych argumentów wywołania. Musimy je więc przystosować do obliczenia wielkości zgodnie ze wzorem (4).&lt;br /&gt;
&lt;br /&gt;
Zaimplementuj funkcję do obliczania funkcji korelacji zgodnie ze wzorem &amp;lt;xr id=&amp;quot;uid82&amp;quot;&amp;gt;(%i)&amp;lt;/xr&amp;gt;. Funkcja powinna przyjmować jako parametry dwa wektory&amp;lt;!--i maksymalne przesunięcie wzajemne tych wektorów--&amp;gt;, a zwracać wektor zawierający ich funkcję autokorelacji. &lt;br /&gt;
&lt;br /&gt;
Wywołanie przykładowe:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
print koreluj(a,a)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
powinno dać wynik:&lt;br /&gt;
 [-0.5  0.   1.   0.  -0.5]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
# Średnia&lt;br /&gt;
mean = numpy.mean(data)&lt;br /&gt;
mean2 = numpy.mean(data2)&lt;br /&gt;
&lt;br /&gt;
# Wariancja&lt;br /&gt;
var = numpy.var(data)&lt;br /&gt;
var2 = numpy.var(data2)&lt;br /&gt;
&lt;br /&gt;
# Dane po odjęciu średnich&lt;br /&gt;
ndata = data - mean&lt;br /&gt;
ndata2 = data2 - mean2&lt;br /&gt;
&lt;br /&gt;
# Splot&lt;br /&gt;
acorr = numpy.correlate(ndata, ndata2, 'full')&lt;br /&gt;
&lt;br /&gt;
# Normalizacja kowariancji do korelacji i przez 1/N&lt;br /&gt;
acorr = acorr / numpy.sqrt(var*var2) / len(ndata)&lt;br /&gt;
&lt;br /&gt;
print(acorr)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{{hidden begin|title=Przykładowe rozwiązanie:}}--&amp;gt;&lt;br /&gt;
 &amp;lt;!-- &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
def koreluj_pol(x,y,max_tau):&lt;br /&gt;
    x = x - np.mean(x)&lt;br /&gt;
    y = y - np.mean(y)&lt;br /&gt;
    N= len(x)&lt;br /&gt;
    cor = np.zeros(max_tau+1)&lt;br /&gt;
    cor[0] = np.sum(x[:]*y[:]) &lt;br /&gt;
    for i in range(1,max_tau+1):&lt;br /&gt;
        cor[i] = np.sum(x[i:]*y[:-i])&lt;br /&gt;
        &lt;br /&gt;
    cor = cor /(N-1)&lt;br /&gt;
    return cor&lt;br /&gt;
&lt;br /&gt;
def koreluj(x,y,max_tau):&lt;br /&gt;
    cor = np.zeros(2*max_tau+1)    &lt;br /&gt;
    cor[max_tau:] = koreluj_pol(x,y,max_tau)&lt;br /&gt;
    tmp = koreluj_pol(y,x,max_tau)&lt;br /&gt;
    cor[:max_tau+1] = tmp[-1::-1]&lt;br /&gt;
    return cor    &lt;br /&gt;
    &lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    print koreluj(a,a,i)&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
b = np.array([-1,-2,-3])&lt;br /&gt;
&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    print koreluj(a,b,i)&lt;br /&gt;
    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zadanie 1: Pomiar sygnału EEG ==&lt;br /&gt;
&lt;br /&gt;
Zarejestruj 10 minut sygnału EEG, w trakcie których badana osoba będzie siedziała z otwartymi oczami oraz kolejne 10 minut w stanie czuwania z zamkniętymi oczami. Rejestrację należy wykonać na pełnym czepku 10-20 z częstością próbkowania 128 Hz. &lt;br /&gt;
&lt;br /&gt;
==Zadanie 2:  Funkcje autokowariancji i autokorelacji==&lt;br /&gt;
W tym zadaniu posłużymy się sygnałami zarejestrowanymi w punkcie 3. poprzedniego ćwiczenia. Zaobserwuj, na którym kanale rytm alfa osiąga najwyższą wartość. Następnie zaimplementuj w Pythonie następujące kroki:&lt;br /&gt;
&lt;br /&gt;
#	Wczytaj dane z wybranego kanału.&lt;br /&gt;
#	Oblicz funkcję autokorelacji dla sygnału zarejestrowanego w warunkach, gdy osoba badana siedziała z otwartymi oczami. Narysuj autokorelogram, to jest wykres wartości funkcji autokorelacji względem przesunięcia &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt;. Oś &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; wyskaluj w sekundach.&lt;br /&gt;
#	Powtórz krok 2, tym razem dla sygnału zebranego w warunkach czuwania z zamkniętymi oczami.&lt;br /&gt;
#	Porównaj autokorelogramy.&lt;br /&gt;
&lt;br /&gt;
=Związek autokorelacji z widmem sygnału=&lt;br /&gt;
==Wstęp==&lt;br /&gt;
Zgodnie z twierdzeniem Chinczyna, z którym zapoznaliśmy się na wykładzie z [[Twierdzenie_Wienera-Chinczyna|Analizy Sygnałów]], widmową gęstość mocy sygnału można policzyć jako transformatę Fouriera funkcji autokowariancji:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid93&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
S(f) = \int _{-\infty }^{\infty }\gamma (\tau )e^{-2\pi i f \tau}d\tau &amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(9)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	&amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; &amp;amp;mdash; częstość&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	&amp;lt;math&amp;gt;S(f)&amp;lt;/math&amp;gt; &amp;amp;mdash;  gęstość widmowa mocy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Poniższy kod ilustruje to twierdzenie:&lt;br /&gt;
&amp;lt;source lang = py&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
from numpy.fft import rfft,fft,fftfreq,fftshift&lt;br /&gt;
 &lt;br /&gt;
def widmo_mocy(s, Fs):&lt;br /&gt;
    '''Funkcja licąca widmo mocy metodą periodogramu,&lt;br /&gt;
	pobiera sygnał i częstość próbkowania&lt;br /&gt;
	zwraca widmo mocy i oś częstości&lt;br /&gt;
    '''&lt;br /&gt;
    S = fft(s)/np.sqrt(len(s))&lt;br /&gt;
    S_moc = S*S.conj()&lt;br /&gt;
    S_moc = S_moc.real&lt;br /&gt;
    F = fftfreq(len(s), 1/Fs)&lt;br /&gt;
    return (fftshift(S_moc),fftshift(F))&lt;br /&gt;
 &lt;br /&gt;
def sin(f = 1, T = 1, Fs = 128, phi =0 ):&lt;br /&gt;
    '''sin o zadanej częstości (w Hz), długości, fazie i częstości próbkowania&lt;br /&gt;
    Domyślnie wytwarzany jest sygnał reprezentujący &lt;br /&gt;
    1 sekundę sinusa o częstości 1Hz i zerowej fazie próbkowanego 128 Hz&lt;br /&gt;
    '''&lt;br /&gt;
    dt = 1.0/Fs&lt;br /&gt;
    t = np.arange(0,T,dt)&lt;br /&gt;
    s = np.sin(2*np.pi*f*t + phi)&lt;br /&gt;
    return (s,t)&lt;br /&gt;
 &lt;br /&gt;
# sygnał próbny będzie próbkowany z częstością FS&lt;br /&gt;
FS = 100.0&lt;br /&gt;
# sygnałem próbnym będzie sinusoida o częstości f &lt;br /&gt;
(s,t) = sin(f=10.5,Fs=FS)&lt;br /&gt;
# obliczamy moc i energię sygnału w dziedzinie czasu&lt;br /&gt;
moc_w_czasie = s**2&lt;br /&gt;
energia_w_czasie = np.sum(moc_w_czasie)&lt;br /&gt;
print 'energia w czasie: ', energia_w_czasie&lt;br /&gt;
 &lt;br /&gt;
# obliczamy widmo mocy sygnału i jego energię estymowaną w dziedzinie częstości&lt;br /&gt;
(moc_w_czestosci, F) = widmo_mocy(s, Fs=FS)&lt;br /&gt;
energia_w_czestosci = np.sum(moc_w_czestosci)&lt;br /&gt;
print 'energia w czestosci: ', energia_w_czestosci&lt;br /&gt;
 &lt;br /&gt;
# estymujemy funkcję autokorelacji sygnału&lt;br /&gt;
ak = 1./(2*len(s)-1)*np.correlate(s,s,'full')&lt;br /&gt;
&lt;br /&gt;
# estymujemy widmo mocy i energię sygnału z twierdzenia Chinczyna korzystając z funkcji fft:&lt;br /&gt;
moc_chi = np.abs(fft(ak))&lt;br /&gt;
energia_chin = sum(moc_chi)&lt;br /&gt;
print 'energia z tw. Chinczyna przez fft: ', energia_chin&lt;br /&gt;
 &lt;br /&gt;
# estymujemy widmo mocy i energię sygnału z twierdzenia Chinczyna korzystając z jawnej postaci transformaty Fouriera:&lt;br /&gt;
FF = np.linspace(-FS/2,FS/2,1000)&lt;br /&gt;
M = np.zeros(len(FF),dtype='complex')&lt;br /&gt;
 &lt;br /&gt;
for i,f in enumerate( FF):&lt;br /&gt;
    for tau in range(len(ak)):&lt;br /&gt;
        M[i] += ak[tau]*np.exp(2*np.pi*1j*f*(len(ak)-tau)/FS) &lt;br /&gt;
M = np.abs(M)&lt;br /&gt;
energia_chin_sum = np.sum(M)* (len(ak)/len(FF))&lt;br /&gt;
print 'energia z tw. Chinczyna przez sumowanie: ', energia_chin_sum&lt;br /&gt;
&lt;br /&gt;
# Rysunki&lt;br /&gt;
py.figure(1)&lt;br /&gt;
py.subplot(3,1,1)&lt;br /&gt;
py.plot(t,s)&lt;br /&gt;
py.title(u'Sygnal')&lt;br /&gt;
py.subplot(3,1,2)&lt;br /&gt;
py.plot(t,moc_w_czasie)&lt;br /&gt;
py.title(u'moc w czasie')&lt;br /&gt;
py.subplot(3,1,3)&lt;br /&gt;
py.plot(F,moc_w_czestosci)&lt;br /&gt;
py.title(u'moc w czestosci')&lt;br /&gt;
 &lt;br /&gt;
py.figure(2)&lt;br /&gt;
py.subplot(3,1,1)&lt;br /&gt;
py.title('f. autokowariancji')&lt;br /&gt;
py.plot(np.arange(-len(ak)/2,len(ak)/2,1)/FS ,ak)&lt;br /&gt;
py.subplot(3,1,2)&lt;br /&gt;
py.plot(fftshift(fftfreq(len(moc_chi),1./FS)),fftshift(moc_chi))&lt;br /&gt;
py.title('widmo mocy z Tw. Chinczyna przez fft')&lt;br /&gt;
py.subplot(3,1,3)&lt;br /&gt;
py.plot(FF,M)&lt;br /&gt;
py.title('widmo mocy z Tw. Chinczyna przez sumowanie')&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W wyniku powinniśmy zobaczyć w terminalu:&lt;br /&gt;
 energia w czasie:  50.0&lt;br /&gt;
 energia w czestosci:  50.0&lt;br /&gt;
 energia z tw. Chinczyna przez fft:  50.0&lt;br /&gt;
 energia z tw. Chinczyna przez sumowanie:  49.9501172217&lt;br /&gt;
&lt;br /&gt;
oraz powinny pojawić się rysunki:&lt;br /&gt;
[[Plik:Fig_chinczyn1.png|thumb 200 px|center]]&lt;br /&gt;
[[Plik:Fig_chinczyn2.png|thumb 200 px|center]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Polecenie ==&lt;br /&gt;
Zaimplementuj funkcję obliczającą transformację Fouriera dyskretyzując wzór (9) dla zadanego wektora częstości &amp;lt;tt&amp;gt;f&amp;lt;/tt&amp;gt; i zadanej częstości próbkowania sygnału (tutaj: 10).&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Wywołanie przykładowe:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
t= np.arange(0,1,0.1)&lt;br /&gt;
x = np.sin(2*np.pi*2*t)&lt;br /&gt;
f = np.arange(-5,5,1)&lt;br /&gt;
X,f = fourier(x,f,10.0)&lt;br /&gt;
print X&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Natomiast wywołanie:&lt;br /&gt;
&amp;lt;source lang ='python'&amp;gt;&lt;br /&gt;
t= np.arange(0,1,0.1)&lt;br /&gt;
x = np.sin(2*np.pi*2*t)&lt;br /&gt;
f = np.arange(-5,5,0.01)&lt;br /&gt;
X = fourier(x,f,10.0)&lt;br /&gt;
py.plot(f,np.abs(X))&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Powinno wytworzyć rysunek:&lt;br /&gt;
&lt;br /&gt;
[[Plik:Fourier_test.png]] &lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
import numpy as np&lt;br /&gt;
import pylab as py&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def koreluj_pol(x,y,max_tau):&lt;br /&gt;
    x = x - np.mean(x)&lt;br /&gt;
    y = y - np.mean(y)&lt;br /&gt;
    N= len(x)&lt;br /&gt;
    cor = np.zeros(max_tau+1)&lt;br /&gt;
    cor[0] = np.sum(x[:]*y[:]) &lt;br /&gt;
    for i in range(1,max_tau+1):&lt;br /&gt;
        cor[i] = np.sum(x[i:]*y[:-i])&lt;br /&gt;
        &lt;br /&gt;
    cor = cor /(N)&lt;br /&gt;
    return cor&lt;br /&gt;
&lt;br /&gt;
def koreluj(x,y,max_tau):&lt;br /&gt;
    cor = np.zeros(2*max_tau+1)    &lt;br /&gt;
    cor[max_tau:] = koreluj_pol(x,y,max_tau)&lt;br /&gt;
    tmp = koreluj_pol(y,x,max_tau)&lt;br /&gt;
    cor[:max_tau+1] = tmp[-1::-1]&lt;br /&gt;
    return cor  &lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
def fourier_chin(x, FF, FS):&lt;br /&gt;
    ak = koreluj(x,x,len(x)-1)&lt;br /&gt;
    M = np.zeros(len(FF),dtype='complex') &lt;br /&gt;
    for i,f in enumerate( FF):&lt;br /&gt;
        for tau in range(len(ak)):&lt;br /&gt;
	    M[i] += ak[tau]*np.exp(-2*np.pi*1j*f*( tau- len(x))/FS)&lt;br /&gt;
    #M/=np.sqrt(len(ak))&lt;br /&gt;
    return M&lt;br /&gt;
    &lt;br /&gt;
def fourier(ak, FF, FS):&lt;br /&gt;
   &lt;br /&gt;
    M = np.zeros(len(FF),dtype='complex') &lt;br /&gt;
    for i,f in enumerate( FF):&lt;br /&gt;
        for tau in range(len(ak)):&lt;br /&gt;
	    M[i] += ak[tau]*np.exp(-2*np.pi*1j*f*( tau)/FS)&lt;br /&gt;
    M/=np.sqrt(len(ak))&lt;br /&gt;
    return M&lt;br /&gt;
t= np.arange(0,1,0.05)&lt;br /&gt;
x = np.sin(2*np.pi*2*t)&lt;br /&gt;
f = np.arange(-5,5,0.01)&lt;br /&gt;
&lt;br /&gt;
X = fourier_chin(x,f,10.0)&lt;br /&gt;
Xf = fourier(x,f,10.0)&lt;br /&gt;
print X&lt;br /&gt;
py.plot(f,np.abs(X), f,np.abs(Xf)**2)&lt;br /&gt;
py.show()&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zadanie 3: Związek autokorelacji z widmem sygnału==&lt;br /&gt;
Oblicz gęstość widmową mocy sygnału zarejestrowanego w trakcie czuwania z zamkniętymi oczami, korzystając z twierdzenia Chinczyna oraz [[Nieparametryczne_widmo_mocy#Metoda_Welcha | metodą Welcha]].&lt;br /&gt;
Znajdź częstość rytmu &amp;amp;alpha; dla osoby, która była badana.&lt;br /&gt;
&lt;br /&gt;
==Funkcja kowariancji (wzajemnej)==&lt;br /&gt;
&lt;br /&gt;
W celu scharakteryzowania zależności wzajemnej dwóch sygnałów losowych, stosuje się funkcję kowariancji, zdefiniowaną w następujący sposób:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid98&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy} (\tau ) = \mathrm{cov}(x(t),y(t-\tau ))=\mathrm{E}[(x(t)-\mu _x)(y(t-\tau )-\mu _y)]&amp;lt;/math&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(10)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid99&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\mu _x = \mathrm{E}[x(t)]\\&lt;br /&gt;
\mu _y = \mathrm{E}[y(t)]\\ \end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W przypadku sygnałów ciągłych estymatę tę można zapisać w poniższy sposób:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid100&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy} (\tau ) = \frac{1}{T}\int _0^{T}(x(t)-\mu_x)(y(t-\tau)-\mu_y)dt&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
natomiast dla sygnałów dyskretnych jako:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid101&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy}(k) = \frac{1}{N-1}\sum _{i=0}^{N-k}(x(i+k)-x_s)(y(i)-y_s)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W odróżnieniu od funkcji autokowariancji, funkcja kowariancji nie musi mieć maksimum dla przesunięcia &amp;lt;math&amp;gt;\tau =0&amp;lt;/math&amp;gt;. Ponadto posiada ona następującą cechę:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid102&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy}(-\tau ) = \gamma _{yx}(\tau )&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcję kowariancji można znormalizować:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid103&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\rho (\tau) = \frac{\mathrm{E}[(x(t)-\mu _x)(y(t-\tau )-\mu _y)]}{\sqrt{\mathrm{E}[(x(t)-\mu _x)^2]\mathrm{E}[(y(t)-\mu _y)^2]}} = \frac{\gamma _{xy}}{\sigma_x\sigma_y}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
Otrzymaną funkcję nazywamy funkcją korelacji.&lt;br /&gt;
Jednym z zastosowań funkcji korelacji jest wyznaczanie czasu przejścia sygnału przez dany układ liniowy. Funkcja korelacji pomiędzy sygnałem na wejściu układu i sygnałem na jego wyjściu osiągnie wartość maksymalną dla przesunięcia &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; równego czasowi, jaki potrzebował sygnał na pokonanie danego układu. Niestety, taka metoda wyznaczania opóźnienia obarczona jest pewną wadą &amp;amp;mdash; w przypadku gdy prędkość sygnału bądź jego droga zależą od częstości, wtedy na wykresie funkcji korelacji nie uzyskamy wyraźnego maksimum.&lt;br /&gt;
&lt;br /&gt;
=====Polecenie =====&lt;br /&gt;
Zaimplementuj funkcję obliczającą funkcję kowariancji dla różnych sygnałów ''x'' i ''y'' (równanie &amp;lt;xr id=&amp;quot;uid98&amp;quot;&amp;gt;(%i)&amp;lt;/xr&amp;gt;)&amp;lt;!-- skorzystaj przy tym z własności opisanej równaniem &amp;lt;xr id=&amp;quot;uid98&amp;quot;&amp;gt;(%i)&amp;lt;/xr&amp;gt;--&amp;gt;. &lt;br /&gt;
Przykładowe wywołanie:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
b = np.array([-1,-2,-3])&lt;br /&gt;
&lt;br /&gt;
print(koreluj(a,b))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
powinno dać w wyniku:&lt;br /&gt;
 [ 0.5 0.  -1.   0.   0.5]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
{{hidden begin|title=Przykładowe rozwiązanie:}}&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import pylab as py&lt;br /&gt;
&lt;br /&gt;
def koreluj(x,y,max_tau):&lt;br /&gt;
    x = x - np.mean(x)&lt;br /&gt;
    y = y - np.mean(y)&lt;br /&gt;
    cor = np.zeros(2*max_tau+1)&lt;br /&gt;
    cor[max_tau] = np.sum(x[:]*y[:]) &lt;br /&gt;
    for i in range(1,max_tau+1):&lt;br /&gt;
        cor[max_tau+i] = np.sum(x[i:]*y[:-i])&lt;br /&gt;
        cor[max_tau-i] = np.sum(y[i:]*x[:-i])&lt;br /&gt;
    N= len(x)&lt;br /&gt;
    cor = cor /(N-1)&lt;br /&gt;
    return cor&lt;br /&gt;
&lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
b = np.array([-1,-2,-3])&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    print koreluj(a,b,i)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}} --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadanie 4===&lt;br /&gt;
Z danych zarejestrowanych w trakcie czuwania z zamkniętymi oczami wybierz sygnały z następujących kanałów: Fp1, P3, Pz, P4, Fp2, O1, O2.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Dla każdego kanału oblicz funkcję autokorelacji, zaś  dla każdej pary kanałów oblicz funkcję korelacji wzajemnej. Wyniki zaprezentuj w formie kwadratowej macierzy wykresów (za pomocą funkcji subplot, tak jak na przykładowym rys. (rys. &amp;lt;xr id=&amp;quot;uid9&amp;quot;&amp;gt; %i&amp;lt;/xr&amp;gt;)). Na przekątnej macierzy narysuj funkcję autokorelacji odpowiednich kanałów, poza przekątną &amp;amp;mdash; funkcję korelacji wzajemnej. Wskaż kanały, które są najbardziej skorelowane ze sobą. Czy możliwe jest wyznaczenie opóźnienia sygnału pomiędzy tymi kanałami?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Powtórz punkt 1, tym razem jednak funkcję autokorelacji i korelacji wzajemnej oblicz na sygnałach przefiltrowanych filtrem wąskopasmowym w paśmie alfa charakterystycznym dla badanej osoby. ([[%C4%86wiczenia_7#Funkcje_do_projektowania_filtr.C3.B3w_IIR_dost.C4.99pne_w_module_scipy.signal|przypomnienie konstrukcji filtrów]])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Oszacuj istotność statystyczną zależności między parami kanałów. Twoją hipotezą zerową jest brak istotnej korelacji pomiędzy sygnałami zarejestrowanymi przez dwie różne elektrody EEG. Hipoteza alternatywna to występowanie zależności pomiędzy tymi sygnałami. Podanie estymatorów wariancji funkcji korelacji jest bardzo trudne, dlatego jednym ze sposobów oszacowania progu powyżej którego wartość funkcji korelacji można byłoby uznać za istotną statystycznie, jest zastosowanie metody ''bootstrap''. Teoretycznie, funkcja korelacji policzona dla dwóch rzeczywistych, nieskorelowanych sygnałów, powinna wynosić 0 dla każdego przesunięcia &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt;. Tak jest jednak w przypadku sygnałów nieskończonych; w analizie sygnałów takowych nie spotkamy.&lt;br /&gt;
&lt;br /&gt;
Dokonując losowej zamiany kolejności próbek, możemy doprowadzić do wytworzenia sygnałów zależnych losowo, które jednak ze względu na skończony czas trwania, dadzą niezerową funkcję korelacji. Poziom losowych fluktuacji tej funkcji oszacujemy wykonując następujące kroki:&lt;br /&gt;
&amp;lt;ol type=&amp;quot;A&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Losowa zamiana kolejności próbek w analizowanych sygnałach. Jeżeli pomiędzy dwoma sygnałami istnieją jakieś zależności, losowa zamiana próbek doprowadzi do zniszczenia tych związków. W ten sposób uzyskujemy sygnały, które teoretycznie są nieskorelowane.&lt;br /&gt;
&amp;lt;li&amp;gt; Obliczenie funkcji  korelacji wzajemnej dla sygnałów policzonych w punkcie A.&lt;br /&gt;
&amp;lt;li&amp;gt; Powtórzenie kroków A i B wiele (np. 1000) razy.&lt;br /&gt;
&amp;lt;li&amp;gt; Oszacowanie 95% przedziału ufności dla wartości średniej funkcji korelacji wzajemnej dla danego przesunięcia &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; korzystając z otrzymanego w kroku C empirycznego rozkładu wartości tych funkcji dla sygnałów niezależnych.  &lt;br /&gt;
&amp;lt;li&amp;gt; Powtórzenie kroków A-D dla kolejnych przesunięć &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;li&amp;gt; Sprawdzenie, dla których przesunięć &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; funkcje autokorelacji i korelacji obliczone dla oryginalnych sygnałów uzyskały wartości wyższe niż wartości progowe oszacowane dla sygnałów o losowych zależnościach.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Procedura opisana powyżej ma jednak '''zasadniczą wadę'''. Staramy się w niej oszacować poziom przypadkowych korelacji pomiędzy dwoma sygnałami dla kolejnych przesunięć &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt;, co jest niczym innym jak wielokrotnym powtórzeniem pewnego testu. Obserwowanie korelacji dla wielu par kanałów równocześnie również prowadzi do zwiększenia szansy na zaobserwowanie ekstremalnie dużych fluktuacji.&lt;br /&gt;
Występuje tu zatem ''problem wielokrotnych porównań''.&lt;br /&gt;
Przypominamy, iż może to doprowadzić do przypadkowego uznania wyników jako &amp;amp;bdquo;istotnych&amp;amp;rdquo; statystycznie. Np. jeśli pojedynczy test wykonujemy na poziomie istotności 5% to dopuszczamy odrzucenie w 1 przypadku na 20 hipotezy zerowej pomimo, iż jest ona prawdziwa. Z drugiej jednak strony, jeśli powtórzymy wykonywany test 20 razy, to oczekujemy uzyskania 1 przypadku, w którym poziom ''p'' będzie mniejszy od 5% co jest przesłanką za odrzuceniem hipotezy zerowej. &lt;br /&gt;
&lt;br /&gt;
W przypadku wykonywania serii testów należałoby więc zastosować odpowiednie poprawki, np. [http://www.bmj.com/content/310/6973/170.full korektę Bonferroniego] czy [http://en.wikipedia.org/wiki/False_discovery_rate false discovery rate (FDR)]. Innym rozwiązaniem w analizowanym przez nas problemie jest zastosowanie tzw. statystyk wartości ekstremalnych, które prowadzą do następujących zmian w procedurze:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol type=&amp;quot;A&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;	Losowa zmiana kolejności próbek w analizowanych sygnałach (we wszystkich analizowanych kanałach). Jeżeli pomiędzy dwoma sygnałami istnieją jakieś zależności, losowa zamiana próbek doprowadzi do zniszczenia tych związków. W ten sposób uzyskujemy sygnały, które teoretycznie są nieskorelowane.&lt;br /&gt;
&amp;lt;li&amp;gt;	Obliczenie funkcji korelacji dla sygnałów otrzymanych w punkcie A.&lt;br /&gt;
&amp;lt;li&amp;gt;    Zapamiętanie maksymalnej wartości bezwzględnej funkcji korelacji z punktu B (maksimum bierzemy po wszystkich przesunięciach i po wszystkich parach kanałów; dla funkcji autokorelacji, ze względu na jej normalizację do 1 dla zerowego przesunięcia, tam maksymalnych wartości poszukujemy dla przesunięć innych niż 0).&lt;br /&gt;
&amp;lt;li&amp;gt;	Powtórzenie kroków A-C 1000 razy. Uzyskamy w ten sposób rozkład maksymalnych wartości funkcji korelacji możliwych do zaobserwowania dla sygnałów niezależnych.&lt;br /&gt;
&amp;lt;li&amp;gt;    Wyznaczenie 95 centyla rozkładu wartości maksymalnych.&lt;br /&gt;
&amp;lt;li&amp;gt;	Nałożenie na rysunki funkcji korelacji uzyskane w Zadaniu 2 poziomych linii symbolizujących poziom zależności dwóch sygnałów o losowych zależnościach i sprawdzenie, dla których przesunięć &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; wartości funkcji korelacji przekraczają estymowane progi istotności statystycznej.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Plik:Korelacje_wzajemne.png|700px|center|thumb|&amp;lt;figure id=&amp;quot;uid9&amp;quot; /&amp;gt;Przykład wyniku analizy korelacji wzajemnych dla sygnału niefiltrowanego z naniesionymi granicami możliwych fluktuacji.]]&lt;br /&gt;
&lt;br /&gt;
==Wzajemna gęstość widmowa sygnałów==&lt;br /&gt;
&lt;br /&gt;
Podobnie jak w przypadku twierdzenia Chinczyna dla pojedynczego sygnału, możliwe jest policzenie transformaty Fouriera funkcji kowariancji. Uzyskana w ten sposób wielkość nazywa się funkcją wzajemnej gęstości mocy widmowej sygnału:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid122&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
S_{xy}(f) = \int _{-\infty }^{\infty }\gamma_{xy}(\tau )e^{-2\pi i f \tau}d\tau &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W celu dalszego omówienia własności funkcji wzajemnej mocy widmowej sygnałów funkcję tę zapiszemy w postaci:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid123&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
S_{xy}(f) = |S_{xy}(f)|e^{i\phi _{xy}(f)}\\&lt;br /&gt;
\\&lt;br /&gt;
\phi _{xy} = \arg(S_{xy}) &lt;br /&gt;
\end{array} &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&amp;lt;!-- \mathrm{arc\,tg}\left[\frac{\mathrm{Im}(S_{xy}(f))}{\mathrm{Re}(S_{xy}(f))}\right]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wartość bezwzględna funkcji wzajemnej gęstości mocy widmowej osiąga największą wartość dla '''częstości''', w których sygnały &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;y(t)&amp;lt;/math&amp;gt; są ze sobą skorelowane. Funkcja wzajemnej mocy widmowej sygnałów pozbawiona jest zatem wady, która charakteryzowała funkcję korelacji, to jest problemu z wyznaczeniem czasu transmisji sygnału, w przypadku gdy czas ten zależał od częstości. Przy pomocy funkcji wzajemnej mocy widmowej, czas ten można oszacować przy pomocy fazy tej funkcji &amp;amp;mdash; &amp;lt;math&amp;gt;\phi _{xy}(f)&amp;lt;/math&amp;gt;. Jeśli funkcja wzajemnej mocy widmowej została wyznaczona pomiędzy sygnałami na wejściu i wyjściu układu liniowego, to faza ta reprezentuje przesunięcie fazowe sygnału przy przejściu przez układ. Czas tego przejścia można oszacować za pomocą następującej wyrażenia:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid124&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\tau = \frac{\phi _{xy}(f)}{2\pi f}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Podobnie jak w przypadku funkcji autokorelacji i korelacji wzajemnej, funkcję wzajemnej gęstości mocy widmowej można znormalizować:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid125&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
C_{xy}(f) = \frac{S_{xy}(f)}{\sqrt{S_x(f)S_y(f)}}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Znormalizowaną postać funkcji wzajemnej gęstości mocy widmowej nazywamy funkcją ''koherencji''. &lt;br /&gt;
Koherencja jest wielkością zespoloną. Faza koherencji odzwierciedla różnicę faz pomiędzy dwoma sygnałami. Moduł koherencji reprezentuje stopień synchronizacji sygnałów i zawiera się w przedziale od 0.0 do 1.0. Moduł tej funkcji zawiera się w przedziale od 0 do 1. Wartości 0 odpowiada brak synchronizacji pomiędzy sygnałami, zaś wartości 1 pełna synchronizacja dwóch przebiegów czasowych. Należy również zwrócić uwagę na nazewnictwo - często sam moduł koherencji określany jest jako koherencja, w literaturze anglojęzycznej moduł koherencji posiada jednak odrębną nazwę: Magnitude Square Coherence (MSC). Istotny jest również sposób estymacji modułu koherencji, który wyprowadzono w następnym rozdziale, zaś sam estymator reprezentuje wzór (36).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadanie 5===&lt;br /&gt;
Zaimplementuj funkcję obliczającą wzajemną gęstość widmową dla pary kanałów. &lt;br /&gt;
&amp;lt;!--Niech argumentami tej funkcji będą dwa wektory zawierające sygnały, zakres częstości, częstość próbkowania. --&amp;gt;&lt;br /&gt;
Oblicz i narysuj macierz gęstości widmowych (własnych i wzajemnych) dla kolejnych par kanałów (tych samych co w zadaniu 3). Wyniki zaprezentuj w postaci kwadratowej macierzy rysunków. Ponieważ są to funkcje zespolone, dobrze jest zaprezentować osobno ich wartość i fazę. Uzyskane wartości bezwzględne narysuj nad przekątną tej macierzy, a fazę pod przekątną.&lt;br /&gt;
&lt;br /&gt;
===Zadanie 6===&lt;br /&gt;
Przygotuj sygnał dwukanałowy, w którym jako pierwszy sygnał wybierz fragment sygnału EEG (z danych zebranych wcześniej) o długości 2000 próbek, a jako drugiego sygnału użyj tego samego fragmentu EEG, ale opóźnionego o wybraną liczbę (1 - 5) próbek. Oblicz widma wzajemne tych sygnałów i zaprezentuj ich fazy na rysunku. Na podstawie tych widm znajdź wartość przesunięcia czasowego tych sygnałów.&lt;br /&gt;
&lt;br /&gt;
Obliczenia powtórz w przypadku, gdy do drugiego sygnału dodany będzie szum o wariancji równej 0,25 wariancji oryginalnego sygnału.&lt;/div&gt;</summary>
		<author><name>Maciek</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG_2/EEG_wlasno%C5%9Bci_EEG_spoczynkowego&amp;diff=11196</id>
		<title>Pracownia EEG 2/EEG wlasności EEG spoczynkowego</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG_2/EEG_wlasno%C5%9Bci_EEG_spoczynkowego&amp;diff=11196"/>
		<updated>2024-11-22T21:30:36Z</updated>

		<summary type="html">&lt;p&gt;Maciek: /* Funkcja kowariancji (wzajemnej) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Pracownia EEG 2|Pracownia EEG 2]] / Własności EEG spoczynkowego: funkcja autokorelacji i widmo&lt;br /&gt;
&lt;br /&gt;
=Estymacja funkcji autokowariancji, autokorelacji i koherencji sygnału.=&lt;br /&gt;
==Wstęp==&lt;br /&gt;
Z funkcjami tymi spotkaliśmy się już na zajęciach z [[Ćwiczenia_4|analizy sygnałów]].&lt;br /&gt;
&lt;br /&gt;
Funkcja autokowariancji sygnału charakteryzuje liniową zależność wartości tego sygnału w danej określonej chwili czasu od wartości (tego samego sygnału) w innej chwili.&lt;br /&gt;
W przypadku [[Nieparametryczne_widmo_mocy#Sygna.C5.82y_stochastyczne  | stacjonarnych procesów stochastycznych]], przebieg tej funkcji nie zależy od czasu. &lt;br /&gt;
Oznacza to, że obliczając funkcję autokorelacji sygnału pomiędzy chwilą czasu &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;x(t+\tau )&amp;lt;/math&amp;gt; otrzymamy tę samą wartość, jak dla przypadku obliczania funkcji autokorelacji pomiędzy momentami &amp;lt;math&amp;gt;x(t + T)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;x(t + T+\tau )&amp;lt;/math&amp;gt;, gdzie &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; to dowolny przedział czasu. Innymi słowy, funkcja autokorelacji procesu stacjonarnego zależy tylko od odstępu czasu pomiędzy próbkami &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt;, dla którego jest wyznaczana, a nie od konkretnej chwili czasu. Odrębną klasę sygnałów stanowią procesy niestacjonarne, w przypadku których funkcja autokorelacji będzie zależeć od czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; w którym jest obliczana. Estymator funkcji autokowariancji uzyskuje się poprzez obliczanie iloczynów wartości sygnału &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; w chwilach czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; czyli &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; i wartości sygnału &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; w chwili czasu ''t''+&amp;amp;tau; czyli &amp;lt;math&amp;gt;x(t+\tau)&amp;lt;/math&amp;gt; i uśredniając wartości iloczynów po czasie &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid79&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma (\tau) = \mathrm{cov}(x(t),x(t-\tau ))=\mathrm{E}[(x(t)-\mu )(x(t-\tau )-\mu )]&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(1)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid80&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\mu = \mathrm{E}[x(t)]&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(2)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W przypadku sygnałów ciągłych estymatę tę można zapisać w poniższy sposób:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid81&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma (\tau ) = \frac{1}{T}\int _0^{T}(x(t)-\mu )(x(t-\tau )-\mu )dt&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(3)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
natomiast dla sygnałów dyskretnych jako:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid82&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma (k) = \frac{1}{N-1}\sum _{i=1}^{N-|k|}(x(i+k)-x_s)(x(i)-x_s)&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(4)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid83&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
x_s = \frac{\sum _{i=1}^{N}x(i)}{N}&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(5)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcja autokowariancji może osiągać dowolne wartości, dlatego aby można było porównać przebieg tej funkcji np. pomiędzy dwoma sygnałami, wprowadzono wersję znormalizowaną tej funkcji &amp;amp;mdash; ''funkcję autokorelacji''. Normalizacja ta wygląda następująco:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid84&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\rho (k) = \frac{\gamma (\tau )}{\sigma^2}&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(6)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid85&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\sigma ^2 = \mathrm{E}[(x(t)-\mu )^2]&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(7)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wariancję sygnału (&amp;lt;math&amp;gt;\gamma (0)=\sigma ^2&amp;lt;/math&amp;gt;) można wyrazić przez funkcję autokowariancji dla przesunięcia &amp;lt;math&amp;gt;\tau =0&amp;lt;/math&amp;gt;.  Wynika z tego, że funkcja korelacji przyjmuje wartości z zakresu [&amp;amp;minus;1,&amp;amp;nbsp;1]. Ostatecznie estymator funkcji autokorelacji można zapisać jak poniżej:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid86&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\rho(k) = \frac{\gamma (k)}{\gamma (0)}&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(8)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcję autokorelacji estymuje się w celu określenia, w jakim stopniu wartości sygnału w danej chwili czasu wpływają na wartości sygnału w kolejnych chwilach czasu. Ma to kluczowe znaczenie przy rozpoznawaniu rodzaju procesów fizycznych odpowiedzialnego za generowanie sygnału. Funkcja ta zawsze mam maksimum dla przesunięcia &amp;lt;math&amp;gt;\tau =0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cechą charakterystyczną funkcji autokorelacji jest to, iż w przypadku sygnałów harmonicznych, przebieg funkcji ma charakter okresowy, z okresem takim samym jak okres badanego sygnału. W przypadku szumu, funkcja autokorelacji ma kształt funkcji delta Diraca.&lt;br /&gt;
&lt;br /&gt;
==Polecenie:==&lt;br /&gt;
Do policzenia funkcji autokorelacji posłużymy się funkcją biblioteczną &amp;lt;tt&amp;gt;numpy.correlate&amp;lt;/tt&amp;gt;. Funkcja ta, wbrew nazwie, oblicza wyłącznie splot swoich dwóch pierwszych argumentów wywołania. Musimy je więc przystosować do obliczenia wielkości zgodnie ze wzorem (4).&lt;br /&gt;
&lt;br /&gt;
Zaimplementuj funkcję do obliczania funkcji korelacji zgodnie ze wzorem &amp;lt;xr id=&amp;quot;uid82&amp;quot;&amp;gt;(%i)&amp;lt;/xr&amp;gt;. Funkcja powinna przyjmować jako parametry dwa wektory&amp;lt;!--i maksymalne przesunięcie wzajemne tych wektorów--&amp;gt;, a zwracać wektor zawierający ich funkcję autokorelacji. &lt;br /&gt;
&lt;br /&gt;
Wywołanie przykładowe:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
print koreluj(a,a)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
powinno dać wynik:&lt;br /&gt;
 [-0.5  0.   1.   0.  -0.5]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
# Średnia&lt;br /&gt;
mean = numpy.mean(data)&lt;br /&gt;
mean2 = numpy.mean(data2)&lt;br /&gt;
&lt;br /&gt;
# Wariancja&lt;br /&gt;
var = numpy.var(data)&lt;br /&gt;
var2 = numpy.var(data2)&lt;br /&gt;
&lt;br /&gt;
# Dane po odjęciu średnich&lt;br /&gt;
ndata = data - mean&lt;br /&gt;
ndata2 = data2 - mean2&lt;br /&gt;
&lt;br /&gt;
# Splot&lt;br /&gt;
acorr = numpy.correlate(ndata, ndata2, 'full')&lt;br /&gt;
&lt;br /&gt;
# Normalizacja kowariancji do korelacji i przez 1/N&lt;br /&gt;
acorr = acorr / numpy.sqrt(var*var2) / len(ndata)&lt;br /&gt;
&lt;br /&gt;
print(acorr)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{{hidden begin|title=Przykładowe rozwiązanie:}}--&amp;gt;&lt;br /&gt;
 &amp;lt;!-- &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
def koreluj_pol(x,y,max_tau):&lt;br /&gt;
    x = x - np.mean(x)&lt;br /&gt;
    y = y - np.mean(y)&lt;br /&gt;
    N= len(x)&lt;br /&gt;
    cor = np.zeros(max_tau+1)&lt;br /&gt;
    cor[0] = np.sum(x[:]*y[:]) &lt;br /&gt;
    for i in range(1,max_tau+1):&lt;br /&gt;
        cor[i] = np.sum(x[i:]*y[:-i])&lt;br /&gt;
        &lt;br /&gt;
    cor = cor /(N-1)&lt;br /&gt;
    return cor&lt;br /&gt;
&lt;br /&gt;
def koreluj(x,y,max_tau):&lt;br /&gt;
    cor = np.zeros(2*max_tau+1)    &lt;br /&gt;
    cor[max_tau:] = koreluj_pol(x,y,max_tau)&lt;br /&gt;
    tmp = koreluj_pol(y,x,max_tau)&lt;br /&gt;
    cor[:max_tau+1] = tmp[-1::-1]&lt;br /&gt;
    return cor    &lt;br /&gt;
    &lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    print koreluj(a,a,i)&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
b = np.array([-1,-2,-3])&lt;br /&gt;
&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    print koreluj(a,b,i)&lt;br /&gt;
    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zadanie 1: Pomiar sygnału EEG ==&lt;br /&gt;
&lt;br /&gt;
Zarejestruj 10 minut sygnału EEG, w trakcie których badana osoba będzie siedziała z otwartymi oczami oraz kolejne 10 minut w stanie czuwania z zamkniętymi oczami. Rejestrację należy wykonać na pełnym czepku 10-20 z częstością próbkowania 128 Hz. &lt;br /&gt;
&lt;br /&gt;
==Zadanie 2:  Funkcje autokowariancji i autokorelacji==&lt;br /&gt;
W tym zadaniu posłużymy się sygnałami zarejestrowanymi w punkcie 3. poprzedniego ćwiczenia. Zaobserwuj, na którym kanale rytm alfa osiąga najwyższą wartość. Następnie zaimplementuj w Pythonie następujące kroki:&lt;br /&gt;
&lt;br /&gt;
#	Wczytaj dane z wybranego kanału.&lt;br /&gt;
#	Oblicz funkcję autokorelacji dla sygnału zarejestrowanego w warunkach, gdy osoba badana siedziała z otwartymi oczami. Narysuj autokorelogram, to jest wykres wartości funkcji autokorelacji względem przesunięcia &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt;. Oś &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; wyskaluj w sekundach.&lt;br /&gt;
#	Powtórz krok 2, tym razem dla sygnału zebranego w warunkach czuwania z zamkniętymi oczami.&lt;br /&gt;
#	Porównaj autokorelogramy.&lt;br /&gt;
&lt;br /&gt;
=Związek autokorelacji z widmem sygnału=&lt;br /&gt;
==Wstęp==&lt;br /&gt;
Zgodnie z twierdzeniem Chinczyna, z którym zapoznaliśmy się na wykładzie z [[Twierdzenie_Wienera-Chinczyna|Analizy Sygnałów]], widmową gęstość mocy sygnału można policzyć jako transformatę Fouriera funkcji autokowariancji:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid93&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
S(f) = \int _{-\infty }^{\infty }\gamma (\tau )e^{-2\pi i f \tau}d\tau &amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(9)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	&amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; &amp;amp;mdash; częstość&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	&amp;lt;math&amp;gt;S(f)&amp;lt;/math&amp;gt; &amp;amp;mdash;  gęstość widmowa mocy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Poniższy kod ilustruje to twierdzenie:&lt;br /&gt;
&amp;lt;source lang = py&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
from numpy.fft import rfft,fft,fftfreq,fftshift&lt;br /&gt;
 &lt;br /&gt;
def widmo_mocy(s, Fs):&lt;br /&gt;
    '''Funkcja licąca widmo mocy metodą periodogramu,&lt;br /&gt;
	pobiera sygnał i częstość próbkowania&lt;br /&gt;
	zwraca widmo mocy i oś częstości&lt;br /&gt;
    '''&lt;br /&gt;
    S = fft(s)/np.sqrt(len(s))&lt;br /&gt;
    S_moc = S*S.conj()&lt;br /&gt;
    S_moc = S_moc.real&lt;br /&gt;
    F = fftfreq(len(s), 1/Fs)&lt;br /&gt;
    return (fftshift(S_moc),fftshift(F))&lt;br /&gt;
 &lt;br /&gt;
def sin(f = 1, T = 1, Fs = 128, phi =0 ):&lt;br /&gt;
    '''sin o zadanej częstości (w Hz), długości, fazie i częstości próbkowania&lt;br /&gt;
    Domyślnie wytwarzany jest sygnał reprezentujący &lt;br /&gt;
    1 sekundę sinusa o częstości 1Hz i zerowej fazie próbkowanego 128 Hz&lt;br /&gt;
    '''&lt;br /&gt;
    dt = 1.0/Fs&lt;br /&gt;
    t = np.arange(0,T,dt)&lt;br /&gt;
    s = np.sin(2*np.pi*f*t + phi)&lt;br /&gt;
    return (s,t)&lt;br /&gt;
 &lt;br /&gt;
# sygnał próbny będzie próbkowany z częstością FS&lt;br /&gt;
FS = 100.0&lt;br /&gt;
# sygnałem próbnym będzie sinusoida o częstości f &lt;br /&gt;
(s,t) = sin(f=10.5,Fs=FS)&lt;br /&gt;
# obliczamy moc i energię sygnału w dziedzinie czasu&lt;br /&gt;
moc_w_czasie = s**2&lt;br /&gt;
energia_w_czasie = np.sum(moc_w_czasie)&lt;br /&gt;
print 'energia w czasie: ', energia_w_czasie&lt;br /&gt;
 &lt;br /&gt;
# obliczamy widmo mocy sygnału i jego energię estymowaną w dziedzinie częstości&lt;br /&gt;
(moc_w_czestosci, F) = widmo_mocy(s, Fs=FS)&lt;br /&gt;
energia_w_czestosci = np.sum(moc_w_czestosci)&lt;br /&gt;
print 'energia w czestosci: ', energia_w_czestosci&lt;br /&gt;
 &lt;br /&gt;
# estymujemy funkcję autokorelacji sygnału&lt;br /&gt;
ak = 1./(2*len(s)-1)*np.correlate(s,s,'full')&lt;br /&gt;
&lt;br /&gt;
# estymujemy widmo mocy i energię sygnału z twierdzenia Chinczyna korzystając z funkcji fft:&lt;br /&gt;
moc_chi = np.abs(fft(ak))&lt;br /&gt;
energia_chin = sum(moc_chi)&lt;br /&gt;
print 'energia z tw. Chinczyna przez fft: ', energia_chin&lt;br /&gt;
 &lt;br /&gt;
# estymujemy widmo mocy i energię sygnału z twierdzenia Chinczyna korzystając z jawnej postaci transformaty Fouriera:&lt;br /&gt;
FF = np.linspace(-FS/2,FS/2,1000)&lt;br /&gt;
M = np.zeros(len(FF),dtype='complex')&lt;br /&gt;
 &lt;br /&gt;
for i,f in enumerate( FF):&lt;br /&gt;
    for tau in range(len(ak)):&lt;br /&gt;
        M[i] += ak[tau]*np.exp(2*np.pi*1j*f*(len(ak)-tau)/FS) &lt;br /&gt;
M = np.abs(M)&lt;br /&gt;
energia_chin_sum = np.sum(M)* (len(ak)/len(FF))&lt;br /&gt;
print 'energia z tw. Chinczyna przez sumowanie: ', energia_chin_sum&lt;br /&gt;
&lt;br /&gt;
# Rysunki&lt;br /&gt;
py.figure(1)&lt;br /&gt;
py.subplot(3,1,1)&lt;br /&gt;
py.plot(t,s)&lt;br /&gt;
py.title(u'Sygnal')&lt;br /&gt;
py.subplot(3,1,2)&lt;br /&gt;
py.plot(t,moc_w_czasie)&lt;br /&gt;
py.title(u'moc w czasie')&lt;br /&gt;
py.subplot(3,1,3)&lt;br /&gt;
py.plot(F,moc_w_czestosci)&lt;br /&gt;
py.title(u'moc w czestosci')&lt;br /&gt;
 &lt;br /&gt;
py.figure(2)&lt;br /&gt;
py.subplot(3,1,1)&lt;br /&gt;
py.title('f. autokowariancji')&lt;br /&gt;
py.plot(np.arange(-len(ak)/2,len(ak)/2,1)/FS ,ak)&lt;br /&gt;
py.subplot(3,1,2)&lt;br /&gt;
py.plot(fftshift(fftfreq(len(moc_chi),1./FS)),fftshift(moc_chi))&lt;br /&gt;
py.title('widmo mocy z Tw. Chinczyna przez fft')&lt;br /&gt;
py.subplot(3,1,3)&lt;br /&gt;
py.plot(FF,M)&lt;br /&gt;
py.title('widmo mocy z Tw. Chinczyna przez sumowanie')&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W wyniku powinniśmy zobaczyć w terminalu:&lt;br /&gt;
 energia w czasie:  50.0&lt;br /&gt;
 energia w czestosci:  50.0&lt;br /&gt;
 energia z tw. Chinczyna przez fft:  50.0&lt;br /&gt;
 energia z tw. Chinczyna przez sumowanie:  49.9501172217&lt;br /&gt;
&lt;br /&gt;
oraz powinny pojawić się rysunki:&lt;br /&gt;
[[Plik:Fig_chinczyn1.png|thumb 200 px|center]]&lt;br /&gt;
[[Plik:Fig_chinczyn2.png|thumb 200 px|center]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Polecenie ==&lt;br /&gt;
Zaimplementuj funkcję obliczającą transformację Fouriera dyskretyzując wzór (9) dla zadanego wektora częstości &amp;lt;tt&amp;gt;f&amp;lt;/tt&amp;gt; i zadanej częstości próbkowania sygnału (tutaj: 10).&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Wywołanie przykładowe:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
t= np.arange(0,1,0.1)&lt;br /&gt;
x = np.sin(2*np.pi*2*t)&lt;br /&gt;
f = np.arange(-5,5,1)&lt;br /&gt;
X,f = fourier(x,f,10.0)&lt;br /&gt;
print X&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Natomiast wywołanie:&lt;br /&gt;
&amp;lt;source lang ='python'&amp;gt;&lt;br /&gt;
t= np.arange(0,1,0.1)&lt;br /&gt;
x = np.sin(2*np.pi*2*t)&lt;br /&gt;
f = np.arange(-5,5,0.01)&lt;br /&gt;
X = fourier(x,f,10.0)&lt;br /&gt;
py.plot(f,np.abs(X))&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Powinno wytworzyć rysunek:&lt;br /&gt;
&lt;br /&gt;
[[Plik:Fourier_test.png]] &lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
import numpy as np&lt;br /&gt;
import pylab as py&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def koreluj_pol(x,y,max_tau):&lt;br /&gt;
    x = x - np.mean(x)&lt;br /&gt;
    y = y - np.mean(y)&lt;br /&gt;
    N= len(x)&lt;br /&gt;
    cor = np.zeros(max_tau+1)&lt;br /&gt;
    cor[0] = np.sum(x[:]*y[:]) &lt;br /&gt;
    for i in range(1,max_tau+1):&lt;br /&gt;
        cor[i] = np.sum(x[i:]*y[:-i])&lt;br /&gt;
        &lt;br /&gt;
    cor = cor /(N)&lt;br /&gt;
    return cor&lt;br /&gt;
&lt;br /&gt;
def koreluj(x,y,max_tau):&lt;br /&gt;
    cor = np.zeros(2*max_tau+1)    &lt;br /&gt;
    cor[max_tau:] = koreluj_pol(x,y,max_tau)&lt;br /&gt;
    tmp = koreluj_pol(y,x,max_tau)&lt;br /&gt;
    cor[:max_tau+1] = tmp[-1::-1]&lt;br /&gt;
    return cor  &lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
def fourier_chin(x, FF, FS):&lt;br /&gt;
    ak = koreluj(x,x,len(x)-1)&lt;br /&gt;
    M = np.zeros(len(FF),dtype='complex') &lt;br /&gt;
    for i,f in enumerate( FF):&lt;br /&gt;
        for tau in range(len(ak)):&lt;br /&gt;
	    M[i] += ak[tau]*np.exp(-2*np.pi*1j*f*( tau- len(x))/FS)&lt;br /&gt;
    #M/=np.sqrt(len(ak))&lt;br /&gt;
    return M&lt;br /&gt;
    &lt;br /&gt;
def fourier(ak, FF, FS):&lt;br /&gt;
   &lt;br /&gt;
    M = np.zeros(len(FF),dtype='complex') &lt;br /&gt;
    for i,f in enumerate( FF):&lt;br /&gt;
        for tau in range(len(ak)):&lt;br /&gt;
	    M[i] += ak[tau]*np.exp(-2*np.pi*1j*f*( tau)/FS)&lt;br /&gt;
    M/=np.sqrt(len(ak))&lt;br /&gt;
    return M&lt;br /&gt;
t= np.arange(0,1,0.05)&lt;br /&gt;
x = np.sin(2*np.pi*2*t)&lt;br /&gt;
f = np.arange(-5,5,0.01)&lt;br /&gt;
&lt;br /&gt;
X = fourier_chin(x,f,10.0)&lt;br /&gt;
Xf = fourier(x,f,10.0)&lt;br /&gt;
print X&lt;br /&gt;
py.plot(f,np.abs(X), f,np.abs(Xf)**2)&lt;br /&gt;
py.show()&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zadanie 3: Związek autokorelacji z widmem sygnału==&lt;br /&gt;
Oblicz gęstość widmową mocy sygnału zarejestrowanego w trakcie czuwania z zamkniętymi oczami, korzystając z twierdzenia Chinczyna oraz [[Nieparametryczne_widmo_mocy#Metoda_Welcha | metodą Welcha]].&lt;br /&gt;
Znajdź częstość rytmu &amp;amp;alpha; dla osoby, która była badana.&lt;br /&gt;
&lt;br /&gt;
==Funkcja kowariancji (wzajemnej)==&lt;br /&gt;
&lt;br /&gt;
W celu scharakteryzowania zależności wzajemnej dwóch sygnałów losowych, stosuje się funkcję kowariancji, zdefiniowaną w następujący sposób:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid98&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy} (\tau ) = \mathrm{cov}(x(t),y(t-\tau ))=\mathrm{E}[(x(t)-\mu _x)(y(t-\tau )-\mu _y)]&amp;lt;/math&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(10)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid99&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\mu _x = \mathrm{E}[x(t)]\\&lt;br /&gt;
\mu _y = \mathrm{E}[y(t)]\\ \end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W przypadku sygnałów ciągłych estymatę tę można zapisać w poniższy sposób:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid100&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy} (\tau ) = \frac{1}{T}\int _0^{T}(x(t)-\mu_x)(y(t-\tau)-\mu_y)dt&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
natomiast dla sygnałów dyskretnych jako:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid101&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy}(k) = \frac{1}{N-1}\sum _{i=0}^{N-k}(x(i+k)-x_s)(y(i)-y_s)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W odróżnieniu od funkcji autokowariancji, funkcja kowariancji nie musi mieć maksimum dla przesunięcia &amp;lt;math&amp;gt;\tau =0&amp;lt;/math&amp;gt;. Ponadto posiada ona następującą cechę:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid102&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy}(-\tau ) = \gamma _{yx}(\tau )&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcję kowariancji można znormalizować:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid103&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\rho (\tau) = \frac{\mathrm{E}[(x(t)-\mu _x)(y(t-\tau )-\mu _y)]}{\sqrt{\mathrm{E}[(x(t)-\mu _x)^2]\mathrm{E}[(y(t)-\mu _y)^2]}} = \frac{\gamma _{xy}}{\sigma_x\sigma_y}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
Otrzymaną funkcję nazywamy funkcją korelacji.&lt;br /&gt;
Jednym z zastosowań funkcji korelacji jest wyznaczanie czasu przejścia sygnału przez dany układ liniowy. Funkcja korelacji pomiędzy sygnałem na wejściu układu i sygnałem na jego wyjściu osiągnie wartość maksymalną dla przesunięcia &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; równego czasowi, jaki potrzebował sygnał na pokonanie danego układu. Niestety, taka metoda wyznaczania opóźnienia obarczona jest pewną wadą &amp;amp;mdash; w przypadku gdy prędkość sygnału bądź jego droga zależą od częstości, wtedy na wykresie funkcji korelacji nie uzyskamy wyraźnego maksimum.&lt;br /&gt;
&lt;br /&gt;
=====Polecenie =====&lt;br /&gt;
Zaimplementuj funkcję obliczającą funkcję kowariancji dla różnych sygnałów ''x'' i ''y'' (równanie &amp;lt;xr id=&amp;quot;uid98&amp;quot;&amp;gt;(%i)&amp;lt;/xr&amp;gt;)&amp;lt;!-- skorzystaj przy tym z własności opisanej równaniem &amp;lt;xr id=&amp;quot;uid98&amp;quot;&amp;gt;(%i)&amp;lt;/xr&amp;gt;--&amp;gt;. &lt;br /&gt;
Przykładowe wywołanie:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
b = np.array([-1,-2,-3])&lt;br /&gt;
&lt;br /&gt;
print koreluj(a,b)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
powinno dać w wyniku:&lt;br /&gt;
 [ 0.5 0.  -1.   0.   0.5]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
{{hidden begin|title=Przykładowe rozwiązanie:}}&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import pylab as py&lt;br /&gt;
&lt;br /&gt;
def koreluj(x,y,max_tau):&lt;br /&gt;
    x = x - np.mean(x)&lt;br /&gt;
    y = y - np.mean(y)&lt;br /&gt;
    cor = np.zeros(2*max_tau+1)&lt;br /&gt;
    cor[max_tau] = np.sum(x[:]*y[:]) &lt;br /&gt;
    for i in range(1,max_tau+1):&lt;br /&gt;
        cor[max_tau+i] = np.sum(x[i:]*y[:-i])&lt;br /&gt;
        cor[max_tau-i] = np.sum(y[i:]*x[:-i])&lt;br /&gt;
    N= len(x)&lt;br /&gt;
    cor = cor /(N-1)&lt;br /&gt;
    return cor&lt;br /&gt;
&lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
b = np.array([-1,-2,-3])&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    print koreluj(a,b,i)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}} --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadanie 4===&lt;br /&gt;
Z danych zarejestrowanych w trakcie czuwania z zamkniętymi oczami wybierz sygnały z następujących kanałów: Fp1, P3, Pz, P4, Fp2, O1, O2.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Dla każdego kanału oblicz funkcję autokorelacji, zaś  dla każdej pary kanałów oblicz funkcję korelacji wzajemnej. Wyniki zaprezentuj w formie kwadratowej macierzy wykresów (za pomocą funkcji subplot, tak jak na przykładowym rys. (rys. &amp;lt;xr id=&amp;quot;uid9&amp;quot;&amp;gt; %i&amp;lt;/xr&amp;gt;)). Na przekątnej macierzy narysuj funkcję autokorelacji odpowiednich kanałów, poza przekątną &amp;amp;mdash; funkcję korelacji wzajemnej. Wskaż kanały, które są najbardziej skorelowane ze sobą. Czy możliwe jest wyznaczenie opóźnienia sygnału pomiędzy tymi kanałami?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Powtórz punkt 1, tym razem jednak funkcję autokorelacji i korelacji wzajemnej oblicz na sygnałach przefiltrowanych filtrem wąskopasmowym w paśmie alfa charakterystycznym dla badanej osoby. ([[%C4%86wiczenia_7#Funkcje_do_projektowania_filtr.C3.B3w_IIR_dost.C4.99pne_w_module_scipy.signal|przypomnienie konstrukcji filtrów]])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Oszacuj istotność statystyczną zależności między parami kanałów. Twoją hipotezą zerową jest brak istotnej korelacji pomiędzy sygnałami zarejestrowanymi przez dwie różne elektrody EEG. Hipoteza alternatywna to występowanie zależności pomiędzy tymi sygnałami. Podanie estymatorów wariancji funkcji korelacji jest bardzo trudne, dlatego jednym ze sposobów oszacowania progu powyżej którego wartość funkcji korelacji można byłoby uznać za istotną statystycznie, jest zastosowanie metody ''bootstrap''. Teoretycznie, funkcja korelacji policzona dla dwóch rzeczywistych, nieskorelowanych sygnałów, powinna wynosić 0 dla każdego przesunięcia &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt;. Tak jest jednak w przypadku sygnałów nieskończonych; w analizie sygnałów takowych nie spotkamy.&lt;br /&gt;
&lt;br /&gt;
Dokonując losowej zamiany kolejności próbek, możemy doprowadzić do wytworzenia sygnałów zależnych losowo, które jednak ze względu na skończony czas trwania, dadzą niezerową funkcję korelacji. Poziom losowych fluktuacji tej funkcji oszacujemy wykonując następujące kroki:&lt;br /&gt;
&amp;lt;ol type=&amp;quot;A&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Losowa zamiana kolejności próbek w analizowanych sygnałach. Jeżeli pomiędzy dwoma sygnałami istnieją jakieś zależności, losowa zamiana próbek doprowadzi do zniszczenia tych związków. W ten sposób uzyskujemy sygnały, które teoretycznie są nieskorelowane.&lt;br /&gt;
&amp;lt;li&amp;gt; Obliczenie funkcji  korelacji wzajemnej dla sygnałów policzonych w punkcie A.&lt;br /&gt;
&amp;lt;li&amp;gt; Powtórzenie kroków A i B wiele (np. 1000) razy.&lt;br /&gt;
&amp;lt;li&amp;gt; Oszacowanie 95% przedziału ufności dla wartości średniej funkcji korelacji wzajemnej dla danego przesunięcia &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; korzystając z otrzymanego w kroku C empirycznego rozkładu wartości tych funkcji dla sygnałów niezależnych.  &lt;br /&gt;
&amp;lt;li&amp;gt; Powtórzenie kroków A-D dla kolejnych przesunięć &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;li&amp;gt; Sprawdzenie, dla których przesunięć &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; funkcje autokorelacji i korelacji obliczone dla oryginalnych sygnałów uzyskały wartości wyższe niż wartości progowe oszacowane dla sygnałów o losowych zależnościach.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Procedura opisana powyżej ma jednak '''zasadniczą wadę'''. Staramy się w niej oszacować poziom przypadkowych korelacji pomiędzy dwoma sygnałami dla kolejnych przesunięć &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt;, co jest niczym innym jak wielokrotnym powtórzeniem pewnego testu. Obserwowanie korelacji dla wielu par kanałów równocześnie również prowadzi do zwiększenia szansy na zaobserwowanie ekstremalnie dużych fluktuacji.&lt;br /&gt;
Występuje tu zatem ''problem wielokrotnych porównań''.&lt;br /&gt;
Przypominamy, iż może to doprowadzić do przypadkowego uznania wyników jako &amp;amp;bdquo;istotnych&amp;amp;rdquo; statystycznie. Np. jeśli pojedynczy test wykonujemy na poziomie istotności 5% to dopuszczamy odrzucenie w 1 przypadku na 20 hipotezy zerowej pomimo, iż jest ona prawdziwa. Z drugiej jednak strony, jeśli powtórzymy wykonywany test 20 razy, to oczekujemy uzyskania 1 przypadku, w którym poziom ''p'' będzie mniejszy od 5% co jest przesłanką za odrzuceniem hipotezy zerowej. &lt;br /&gt;
&lt;br /&gt;
W przypadku wykonywania serii testów należałoby więc zastosować odpowiednie poprawki, np. [http://www.bmj.com/content/310/6973/170.full korektę Bonferroniego] czy [http://en.wikipedia.org/wiki/False_discovery_rate false discovery rate (FDR)]. Innym rozwiązaniem w analizowanym przez nas problemie jest zastosowanie tzw. statystyk wartości ekstremalnych, które prowadzą do następujących zmian w procedurze:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol type=&amp;quot;A&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;	Losowa zmiana kolejności próbek w analizowanych sygnałach (we wszystkich analizowanych kanałach). Jeżeli pomiędzy dwoma sygnałami istnieją jakieś zależności, losowa zamiana próbek doprowadzi do zniszczenia tych związków. W ten sposób uzyskujemy sygnały, które teoretycznie są nieskorelowane.&lt;br /&gt;
&amp;lt;li&amp;gt;	Obliczenie funkcji korelacji dla sygnałów otrzymanych w punkcie A.&lt;br /&gt;
&amp;lt;li&amp;gt;    Zapamiętanie maksymalnej wartości bezwzględnej funkcji korelacji z punktu B (maksimum bierzemy po wszystkich przesunięciach i po wszystkich parach kanałów; dla funkcji autokorelacji, ze względu na jej normalizację do 1 dla zerowego przesunięcia, tam maksymalnych wartości poszukujemy dla przesunięć innych niż 0).&lt;br /&gt;
&amp;lt;li&amp;gt;	Powtórzenie kroków A-C 1000 razy. Uzyskamy w ten sposób rozkład maksymalnych wartości funkcji korelacji możliwych do zaobserwowania dla sygnałów niezależnych.&lt;br /&gt;
&amp;lt;li&amp;gt;    Wyznaczenie 95 centyla rozkładu wartości maksymalnych.&lt;br /&gt;
&amp;lt;li&amp;gt;	Nałożenie na rysunki funkcji korelacji uzyskane w Zadaniu 2 poziomych linii symbolizujących poziom zależności dwóch sygnałów o losowych zależnościach i sprawdzenie, dla których przesunięć &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; wartości funkcji korelacji przekraczają estymowane progi istotności statystycznej.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Plik:Korelacje_wzajemne.png|700px|center|thumb|&amp;lt;figure id=&amp;quot;uid9&amp;quot; /&amp;gt;Przykład wyniku analizy korelacji wzajemnych dla sygnału niefiltrowanego z naniesionymi granicami możliwych fluktuacji.]]&lt;br /&gt;
&lt;br /&gt;
==Wzajemna gęstość widmowa sygnałów==&lt;br /&gt;
&lt;br /&gt;
Podobnie jak w przypadku twierdzenia Chinczyna dla pojedynczego sygnału, możliwe jest policzenie transformaty Fouriera funkcji kowariancji. Uzyskana w ten sposób wielkość nazywa się funkcją wzajemnej gęstości mocy widmowej sygnału:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid122&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
S_{xy}(f) = \int _{-\infty }^{\infty }\gamma_{xy}(\tau )e^{-2\pi i f \tau}d\tau &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W celu dalszego omówienia własności funkcji wzajemnej mocy widmowej sygnałów funkcję tę zapiszemy w postaci:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid123&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
S_{xy}(f) = |S_{xy}(f)|e^{i\phi _{xy}(f)}\\&lt;br /&gt;
\\&lt;br /&gt;
\phi _{xy} = \arg(S_{xy}) &lt;br /&gt;
\end{array} &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&amp;lt;!-- \mathrm{arc\,tg}\left[\frac{\mathrm{Im}(S_{xy}(f))}{\mathrm{Re}(S_{xy}(f))}\right]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wartość bezwzględna funkcji wzajemnej gęstości mocy widmowej osiąga największą wartość dla '''częstości''', w których sygnały &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;y(t)&amp;lt;/math&amp;gt; są ze sobą skorelowane. Funkcja wzajemnej mocy widmowej sygnałów pozbawiona jest zatem wady, która charakteryzowała funkcję korelacji, to jest problemu z wyznaczeniem czasu transmisji sygnału, w przypadku gdy czas ten zależał od częstości. Przy pomocy funkcji wzajemnej mocy widmowej, czas ten można oszacować przy pomocy fazy tej funkcji &amp;amp;mdash; &amp;lt;math&amp;gt;\phi _{xy}(f)&amp;lt;/math&amp;gt;. Jeśli funkcja wzajemnej mocy widmowej została wyznaczona pomiędzy sygnałami na wejściu i wyjściu układu liniowego, to faza ta reprezentuje przesunięcie fazowe sygnału przy przejściu przez układ. Czas tego przejścia można oszacować za pomocą następującej wyrażenia:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid124&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\tau = \frac{\phi _{xy}(f)}{2\pi f}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Podobnie jak w przypadku funkcji autokorelacji i korelacji wzajemnej, funkcję wzajemnej gęstości mocy widmowej można znormalizować:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid125&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
C_{xy}(f) = \frac{S_{xy}(f)}{\sqrt{S_x(f)S_y(f)}}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Znormalizowaną postać funkcji wzajemnej gęstości mocy widmowej nazywamy funkcją ''koherencji''. &lt;br /&gt;
Koherencja jest wielkością zespoloną. Faza koherencji odzwierciedla różnicę faz pomiędzy dwoma sygnałami. Moduł koherencji reprezentuje stopień synchronizacji sygnałów i zawiera się w przedziale od 0.0 do 1.0. Moduł tej funkcji zawiera się w przedziale od 0 do 1. Wartości 0 odpowiada brak synchronizacji pomiędzy sygnałami, zaś wartości 1 pełna synchronizacja dwóch przebiegów czasowych. Należy również zwrócić uwagę na nazewnictwo - często sam moduł koherencji określany jest jako koherencja, w literaturze anglojęzycznej moduł koherencji posiada jednak odrębną nazwę: Magnitude Square Coherence (MSC). Istotny jest również sposób estymacji modułu koherencji, który wyprowadzono w następnym rozdziale, zaś sam estymator reprezentuje wzór (36).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadanie 5===&lt;br /&gt;
Zaimplementuj funkcję obliczającą wzajemną gęstość widmową dla pary kanałów. &lt;br /&gt;
&amp;lt;!--Niech argumentami tej funkcji będą dwa wektory zawierające sygnały, zakres częstości, częstość próbkowania. --&amp;gt;&lt;br /&gt;
Oblicz i narysuj macierz gęstości widmowych (własnych i wzajemnych) dla kolejnych par kanałów (tych samych co w zadaniu 3). Wyniki zaprezentuj w postaci kwadratowej macierzy rysunków. Ponieważ są to funkcje zespolone, dobrze jest zaprezentować osobno ich wartość i fazę. Uzyskane wartości bezwzględne narysuj nad przekątną tej macierzy, a fazę pod przekątną.&lt;br /&gt;
&lt;br /&gt;
===Zadanie 6===&lt;br /&gt;
Przygotuj sygnał dwukanałowy, w którym jako pierwszy sygnał wybierz fragment sygnału EEG (z danych zebranych wcześniej) o długości 2000 próbek, a jako drugiego sygnału użyj tego samego fragmentu EEG, ale opóźnionego o wybraną liczbę (1 - 5) próbek. Oblicz widma wzajemne tych sygnałów i zaprezentuj ich fazy na rysunku. Na podstawie tych widm znajdź wartość przesunięcia czasowego tych sygnałów.&lt;br /&gt;
&lt;br /&gt;
Obliczenia powtórz w przypadku, gdy do drugiego sygnału dodany będzie szum o wariancji równej 0,25 wariancji oryginalnego sygnału.&lt;/div&gt;</summary>
		<author><name>Maciek</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG_2/EEG_wlasno%C5%9Bci_EEG_spoczynkowego&amp;diff=11195</id>
		<title>Pracownia EEG 2/EEG wlasności EEG spoczynkowego</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG_2/EEG_wlasno%C5%9Bci_EEG_spoczynkowego&amp;diff=11195"/>
		<updated>2024-11-22T16:46:21Z</updated>

		<summary type="html">&lt;p&gt;Maciek: /* Polecenie */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Pracownia EEG 2|Pracownia EEG 2]] / Własności EEG spoczynkowego: funkcja autokorelacji i widmo&lt;br /&gt;
&lt;br /&gt;
=Estymacja funkcji autokowariancji, autokorelacji i koherencji sygnału.=&lt;br /&gt;
==Wstęp==&lt;br /&gt;
Z funkcjami tymi spotkaliśmy się już na zajęciach z [[Ćwiczenia_4|analizy sygnałów]].&lt;br /&gt;
&lt;br /&gt;
Funkcja autokowariancji sygnału charakteryzuje liniową zależność wartości tego sygnału w danej określonej chwili czasu od wartości (tego samego sygnału) w innej chwili.&lt;br /&gt;
W przypadku [[Nieparametryczne_widmo_mocy#Sygna.C5.82y_stochastyczne  | stacjonarnych procesów stochastycznych]], przebieg tej funkcji nie zależy od czasu. &lt;br /&gt;
Oznacza to, że obliczając funkcję autokorelacji sygnału pomiędzy chwilą czasu &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;x(t+\tau )&amp;lt;/math&amp;gt; otrzymamy tę samą wartość, jak dla przypadku obliczania funkcji autokorelacji pomiędzy momentami &amp;lt;math&amp;gt;x(t + T)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;x(t + T+\tau )&amp;lt;/math&amp;gt;, gdzie &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; to dowolny przedział czasu. Innymi słowy, funkcja autokorelacji procesu stacjonarnego zależy tylko od odstępu czasu pomiędzy próbkami &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt;, dla którego jest wyznaczana, a nie od konkretnej chwili czasu. Odrębną klasę sygnałów stanowią procesy niestacjonarne, w przypadku których funkcja autokorelacji będzie zależeć od czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; w którym jest obliczana. Estymator funkcji autokowariancji uzyskuje się poprzez obliczanie iloczynów wartości sygnału &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; w chwilach czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; czyli &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; i wartości sygnału &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; w chwili czasu ''t''+&amp;amp;tau; czyli &amp;lt;math&amp;gt;x(t+\tau)&amp;lt;/math&amp;gt; i uśredniając wartości iloczynów po czasie &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid79&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma (\tau) = \mathrm{cov}(x(t),x(t-\tau ))=\mathrm{E}[(x(t)-\mu )(x(t-\tau )-\mu )]&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(1)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid80&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\mu = \mathrm{E}[x(t)]&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(2)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W przypadku sygnałów ciągłych estymatę tę można zapisać w poniższy sposób:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid81&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma (\tau ) = \frac{1}{T}\int _0^{T}(x(t)-\mu )(x(t-\tau )-\mu )dt&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(3)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
natomiast dla sygnałów dyskretnych jako:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid82&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma (k) = \frac{1}{N-1}\sum _{i=1}^{N-|k|}(x(i+k)-x_s)(x(i)-x_s)&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(4)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid83&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
x_s = \frac{\sum _{i=1}^{N}x(i)}{N}&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(5)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcja autokowariancji może osiągać dowolne wartości, dlatego aby można było porównać przebieg tej funkcji np. pomiędzy dwoma sygnałami, wprowadzono wersję znormalizowaną tej funkcji &amp;amp;mdash; ''funkcję autokorelacji''. Normalizacja ta wygląda następująco:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid84&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\rho (k) = \frac{\gamma (\tau )}{\sigma^2}&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(6)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid85&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\sigma ^2 = \mathrm{E}[(x(t)-\mu )^2]&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(7)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wariancję sygnału (&amp;lt;math&amp;gt;\gamma (0)=\sigma ^2&amp;lt;/math&amp;gt;) można wyrazić przez funkcję autokowariancji dla przesunięcia &amp;lt;math&amp;gt;\tau =0&amp;lt;/math&amp;gt;.  Wynika z tego, że funkcja korelacji przyjmuje wartości z zakresu [&amp;amp;minus;1,&amp;amp;nbsp;1]. Ostatecznie estymator funkcji autokorelacji można zapisać jak poniżej:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid86&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\rho(k) = \frac{\gamma (k)}{\gamma (0)}&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(8)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcję autokorelacji estymuje się w celu określenia, w jakim stopniu wartości sygnału w danej chwili czasu wpływają na wartości sygnału w kolejnych chwilach czasu. Ma to kluczowe znaczenie przy rozpoznawaniu rodzaju procesów fizycznych odpowiedzialnego za generowanie sygnału. Funkcja ta zawsze mam maksimum dla przesunięcia &amp;lt;math&amp;gt;\tau =0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cechą charakterystyczną funkcji autokorelacji jest to, iż w przypadku sygnałów harmonicznych, przebieg funkcji ma charakter okresowy, z okresem takim samym jak okres badanego sygnału. W przypadku szumu, funkcja autokorelacji ma kształt funkcji delta Diraca.&lt;br /&gt;
&lt;br /&gt;
==Polecenie:==&lt;br /&gt;
Do policzenia funkcji autokorelacji posłużymy się funkcją biblioteczną &amp;lt;tt&amp;gt;numpy.correlate&amp;lt;/tt&amp;gt;. Funkcja ta, wbrew nazwie, oblicza wyłącznie splot swoich dwóch pierwszych argumentów wywołania. Musimy je więc przystosować do obliczenia wielkości zgodnie ze wzorem (4).&lt;br /&gt;
&lt;br /&gt;
Zaimplementuj funkcję do obliczania funkcji korelacji zgodnie ze wzorem &amp;lt;xr id=&amp;quot;uid82&amp;quot;&amp;gt;(%i)&amp;lt;/xr&amp;gt;. Funkcja powinna przyjmować jako parametry dwa wektory&amp;lt;!--i maksymalne przesunięcie wzajemne tych wektorów--&amp;gt;, a zwracać wektor zawierający ich funkcję autokorelacji. &lt;br /&gt;
&lt;br /&gt;
Wywołanie przykładowe:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
print koreluj(a,a)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
powinno dać wynik:&lt;br /&gt;
 [-0.5  0.   1.   0.  -0.5]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
# Średnia&lt;br /&gt;
mean = numpy.mean(data)&lt;br /&gt;
mean2 = numpy.mean(data2)&lt;br /&gt;
&lt;br /&gt;
# Wariancja&lt;br /&gt;
var = numpy.var(data)&lt;br /&gt;
var2 = numpy.var(data2)&lt;br /&gt;
&lt;br /&gt;
# Dane po odjęciu średnich&lt;br /&gt;
ndata = data - mean&lt;br /&gt;
ndata2 = data2 - mean2&lt;br /&gt;
&lt;br /&gt;
# Splot&lt;br /&gt;
acorr = numpy.correlate(ndata, ndata2, 'full')&lt;br /&gt;
&lt;br /&gt;
# Normalizacja kowariancji do korelacji i przez 1/N&lt;br /&gt;
acorr = acorr / numpy.sqrt(var*var2) / len(ndata)&lt;br /&gt;
&lt;br /&gt;
print(acorr)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{{hidden begin|title=Przykładowe rozwiązanie:}}--&amp;gt;&lt;br /&gt;
 &amp;lt;!-- &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
def koreluj_pol(x,y,max_tau):&lt;br /&gt;
    x = x - np.mean(x)&lt;br /&gt;
    y = y - np.mean(y)&lt;br /&gt;
    N= len(x)&lt;br /&gt;
    cor = np.zeros(max_tau+1)&lt;br /&gt;
    cor[0] = np.sum(x[:]*y[:]) &lt;br /&gt;
    for i in range(1,max_tau+1):&lt;br /&gt;
        cor[i] = np.sum(x[i:]*y[:-i])&lt;br /&gt;
        &lt;br /&gt;
    cor = cor /(N-1)&lt;br /&gt;
    return cor&lt;br /&gt;
&lt;br /&gt;
def koreluj(x,y,max_tau):&lt;br /&gt;
    cor = np.zeros(2*max_tau+1)    &lt;br /&gt;
    cor[max_tau:] = koreluj_pol(x,y,max_tau)&lt;br /&gt;
    tmp = koreluj_pol(y,x,max_tau)&lt;br /&gt;
    cor[:max_tau+1] = tmp[-1::-1]&lt;br /&gt;
    return cor    &lt;br /&gt;
    &lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    print koreluj(a,a,i)&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
b = np.array([-1,-2,-3])&lt;br /&gt;
&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    print koreluj(a,b,i)&lt;br /&gt;
    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zadanie 1: Pomiar sygnału EEG ==&lt;br /&gt;
&lt;br /&gt;
Zarejestruj 10 minut sygnału EEG, w trakcie których badana osoba będzie siedziała z otwartymi oczami oraz kolejne 10 minut w stanie czuwania z zamkniętymi oczami. Rejestrację należy wykonać na pełnym czepku 10-20 z częstością próbkowania 128 Hz. &lt;br /&gt;
&lt;br /&gt;
==Zadanie 2:  Funkcje autokowariancji i autokorelacji==&lt;br /&gt;
W tym zadaniu posłużymy się sygnałami zarejestrowanymi w punkcie 3. poprzedniego ćwiczenia. Zaobserwuj, na którym kanale rytm alfa osiąga najwyższą wartość. Następnie zaimplementuj w Pythonie następujące kroki:&lt;br /&gt;
&lt;br /&gt;
#	Wczytaj dane z wybranego kanału.&lt;br /&gt;
#	Oblicz funkcję autokorelacji dla sygnału zarejestrowanego w warunkach, gdy osoba badana siedziała z otwartymi oczami. Narysuj autokorelogram, to jest wykres wartości funkcji autokorelacji względem przesunięcia &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt;. Oś &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; wyskaluj w sekundach.&lt;br /&gt;
#	Powtórz krok 2, tym razem dla sygnału zebranego w warunkach czuwania z zamkniętymi oczami.&lt;br /&gt;
#	Porównaj autokorelogramy.&lt;br /&gt;
&lt;br /&gt;
=Związek autokorelacji z widmem sygnału=&lt;br /&gt;
==Wstęp==&lt;br /&gt;
Zgodnie z twierdzeniem Chinczyna, z którym zapoznaliśmy się na wykładzie z [[Twierdzenie_Wienera-Chinczyna|Analizy Sygnałów]], widmową gęstość mocy sygnału można policzyć jako transformatę Fouriera funkcji autokowariancji:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid93&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
S(f) = \int _{-\infty }^{\infty }\gamma (\tau )e^{-2\pi i f \tau}d\tau &amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(9)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	&amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; &amp;amp;mdash; częstość&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	&amp;lt;math&amp;gt;S(f)&amp;lt;/math&amp;gt; &amp;amp;mdash;  gęstość widmowa mocy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Poniższy kod ilustruje to twierdzenie:&lt;br /&gt;
&amp;lt;source lang = py&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
from numpy.fft import rfft,fft,fftfreq,fftshift&lt;br /&gt;
 &lt;br /&gt;
def widmo_mocy(s, Fs):&lt;br /&gt;
    '''Funkcja licąca widmo mocy metodą periodogramu,&lt;br /&gt;
	pobiera sygnał i częstość próbkowania&lt;br /&gt;
	zwraca widmo mocy i oś częstości&lt;br /&gt;
    '''&lt;br /&gt;
    S = fft(s)/np.sqrt(len(s))&lt;br /&gt;
    S_moc = S*S.conj()&lt;br /&gt;
    S_moc = S_moc.real&lt;br /&gt;
    F = fftfreq(len(s), 1/Fs)&lt;br /&gt;
    return (fftshift(S_moc),fftshift(F))&lt;br /&gt;
 &lt;br /&gt;
def sin(f = 1, T = 1, Fs = 128, phi =0 ):&lt;br /&gt;
    '''sin o zadanej częstości (w Hz), długości, fazie i częstości próbkowania&lt;br /&gt;
    Domyślnie wytwarzany jest sygnał reprezentujący &lt;br /&gt;
    1 sekundę sinusa o częstości 1Hz i zerowej fazie próbkowanego 128 Hz&lt;br /&gt;
    '''&lt;br /&gt;
    dt = 1.0/Fs&lt;br /&gt;
    t = np.arange(0,T,dt)&lt;br /&gt;
    s = np.sin(2*np.pi*f*t + phi)&lt;br /&gt;
    return (s,t)&lt;br /&gt;
 &lt;br /&gt;
# sygnał próbny będzie próbkowany z częstością FS&lt;br /&gt;
FS = 100.0&lt;br /&gt;
# sygnałem próbnym będzie sinusoida o częstości f &lt;br /&gt;
(s,t) = sin(f=10.5,Fs=FS)&lt;br /&gt;
# obliczamy moc i energię sygnału w dziedzinie czasu&lt;br /&gt;
moc_w_czasie = s**2&lt;br /&gt;
energia_w_czasie = np.sum(moc_w_czasie)&lt;br /&gt;
print 'energia w czasie: ', energia_w_czasie&lt;br /&gt;
 &lt;br /&gt;
# obliczamy widmo mocy sygnału i jego energię estymowaną w dziedzinie częstości&lt;br /&gt;
(moc_w_czestosci, F) = widmo_mocy(s, Fs=FS)&lt;br /&gt;
energia_w_czestosci = np.sum(moc_w_czestosci)&lt;br /&gt;
print 'energia w czestosci: ', energia_w_czestosci&lt;br /&gt;
 &lt;br /&gt;
# estymujemy funkcję autokorelacji sygnału&lt;br /&gt;
ak = 1./(2*len(s)-1)*np.correlate(s,s,'full')&lt;br /&gt;
&lt;br /&gt;
# estymujemy widmo mocy i energię sygnału z twierdzenia Chinczyna korzystając z funkcji fft:&lt;br /&gt;
moc_chi = np.abs(fft(ak))&lt;br /&gt;
energia_chin = sum(moc_chi)&lt;br /&gt;
print 'energia z tw. Chinczyna przez fft: ', energia_chin&lt;br /&gt;
 &lt;br /&gt;
# estymujemy widmo mocy i energię sygnału z twierdzenia Chinczyna korzystając z jawnej postaci transformaty Fouriera:&lt;br /&gt;
FF = np.linspace(-FS/2,FS/2,1000)&lt;br /&gt;
M = np.zeros(len(FF),dtype='complex')&lt;br /&gt;
 &lt;br /&gt;
for i,f in enumerate( FF):&lt;br /&gt;
    for tau in range(len(ak)):&lt;br /&gt;
        M[i] += ak[tau]*np.exp(2*np.pi*1j*f*(len(ak)-tau)/FS) &lt;br /&gt;
M = np.abs(M)&lt;br /&gt;
energia_chin_sum = np.sum(M)* (len(ak)/len(FF))&lt;br /&gt;
print 'energia z tw. Chinczyna przez sumowanie: ', energia_chin_sum&lt;br /&gt;
&lt;br /&gt;
# Rysunki&lt;br /&gt;
py.figure(1)&lt;br /&gt;
py.subplot(3,1,1)&lt;br /&gt;
py.plot(t,s)&lt;br /&gt;
py.title(u'Sygnal')&lt;br /&gt;
py.subplot(3,1,2)&lt;br /&gt;
py.plot(t,moc_w_czasie)&lt;br /&gt;
py.title(u'moc w czasie')&lt;br /&gt;
py.subplot(3,1,3)&lt;br /&gt;
py.plot(F,moc_w_czestosci)&lt;br /&gt;
py.title(u'moc w czestosci')&lt;br /&gt;
 &lt;br /&gt;
py.figure(2)&lt;br /&gt;
py.subplot(3,1,1)&lt;br /&gt;
py.title('f. autokowariancji')&lt;br /&gt;
py.plot(np.arange(-len(ak)/2,len(ak)/2,1)/FS ,ak)&lt;br /&gt;
py.subplot(3,1,2)&lt;br /&gt;
py.plot(fftshift(fftfreq(len(moc_chi),1./FS)),fftshift(moc_chi))&lt;br /&gt;
py.title('widmo mocy z Tw. Chinczyna przez fft')&lt;br /&gt;
py.subplot(3,1,3)&lt;br /&gt;
py.plot(FF,M)&lt;br /&gt;
py.title('widmo mocy z Tw. Chinczyna przez sumowanie')&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W wyniku powinniśmy zobaczyć w terminalu:&lt;br /&gt;
 energia w czasie:  50.0&lt;br /&gt;
 energia w czestosci:  50.0&lt;br /&gt;
 energia z tw. Chinczyna przez fft:  50.0&lt;br /&gt;
 energia z tw. Chinczyna przez sumowanie:  49.9501172217&lt;br /&gt;
&lt;br /&gt;
oraz powinny pojawić się rysunki:&lt;br /&gt;
[[Plik:Fig_chinczyn1.png|thumb 200 px|center]]&lt;br /&gt;
[[Plik:Fig_chinczyn2.png|thumb 200 px|center]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Polecenie ==&lt;br /&gt;
Zaimplementuj funkcję obliczającą transformację Fouriera dyskretyzując wzór (9) dla zadanego wektora częstości &amp;lt;tt&amp;gt;f&amp;lt;/tt&amp;gt; i zadanej częstości próbkowania sygnału (tutaj: 10).&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Wywołanie przykładowe:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
t= np.arange(0,1,0.1)&lt;br /&gt;
x = np.sin(2*np.pi*2*t)&lt;br /&gt;
f = np.arange(-5,5,1)&lt;br /&gt;
X,f = fourier(x,f,10.0)&lt;br /&gt;
print X&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Natomiast wywołanie:&lt;br /&gt;
&amp;lt;source lang ='python'&amp;gt;&lt;br /&gt;
t= np.arange(0,1,0.1)&lt;br /&gt;
x = np.sin(2*np.pi*2*t)&lt;br /&gt;
f = np.arange(-5,5,0.01)&lt;br /&gt;
X = fourier(x,f,10.0)&lt;br /&gt;
py.plot(f,np.abs(X))&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Powinno wytworzyć rysunek:&lt;br /&gt;
&lt;br /&gt;
[[Plik:Fourier_test.png]] &lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
import numpy as np&lt;br /&gt;
import pylab as py&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def koreluj_pol(x,y,max_tau):&lt;br /&gt;
    x = x - np.mean(x)&lt;br /&gt;
    y = y - np.mean(y)&lt;br /&gt;
    N= len(x)&lt;br /&gt;
    cor = np.zeros(max_tau+1)&lt;br /&gt;
    cor[0] = np.sum(x[:]*y[:]) &lt;br /&gt;
    for i in range(1,max_tau+1):&lt;br /&gt;
        cor[i] = np.sum(x[i:]*y[:-i])&lt;br /&gt;
        &lt;br /&gt;
    cor = cor /(N)&lt;br /&gt;
    return cor&lt;br /&gt;
&lt;br /&gt;
def koreluj(x,y,max_tau):&lt;br /&gt;
    cor = np.zeros(2*max_tau+1)    &lt;br /&gt;
    cor[max_tau:] = koreluj_pol(x,y,max_tau)&lt;br /&gt;
    tmp = koreluj_pol(y,x,max_tau)&lt;br /&gt;
    cor[:max_tau+1] = tmp[-1::-1]&lt;br /&gt;
    return cor  &lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
def fourier_chin(x, FF, FS):&lt;br /&gt;
    ak = koreluj(x,x,len(x)-1)&lt;br /&gt;
    M = np.zeros(len(FF),dtype='complex') &lt;br /&gt;
    for i,f in enumerate( FF):&lt;br /&gt;
        for tau in range(len(ak)):&lt;br /&gt;
	    M[i] += ak[tau]*np.exp(-2*np.pi*1j*f*( tau- len(x))/FS)&lt;br /&gt;
    #M/=np.sqrt(len(ak))&lt;br /&gt;
    return M&lt;br /&gt;
    &lt;br /&gt;
def fourier(ak, FF, FS):&lt;br /&gt;
   &lt;br /&gt;
    M = np.zeros(len(FF),dtype='complex') &lt;br /&gt;
    for i,f in enumerate( FF):&lt;br /&gt;
        for tau in range(len(ak)):&lt;br /&gt;
	    M[i] += ak[tau]*np.exp(-2*np.pi*1j*f*( tau)/FS)&lt;br /&gt;
    M/=np.sqrt(len(ak))&lt;br /&gt;
    return M&lt;br /&gt;
t= np.arange(0,1,0.05)&lt;br /&gt;
x = np.sin(2*np.pi*2*t)&lt;br /&gt;
f = np.arange(-5,5,0.01)&lt;br /&gt;
&lt;br /&gt;
X = fourier_chin(x,f,10.0)&lt;br /&gt;
Xf = fourier(x,f,10.0)&lt;br /&gt;
print X&lt;br /&gt;
py.plot(f,np.abs(X), f,np.abs(Xf)**2)&lt;br /&gt;
py.show()&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zadanie 3: Związek autokorelacji z widmem sygnału==&lt;br /&gt;
Oblicz gęstość widmową mocy sygnału zarejestrowanego w trakcie czuwania z zamkniętymi oczami, korzystając z twierdzenia Chinczyna oraz [[Nieparametryczne_widmo_mocy#Metoda_Welcha | metodą Welcha]].&lt;br /&gt;
Znajdź częstość rytmu &amp;amp;alpha; dla osoby, która była badana.&lt;br /&gt;
&lt;br /&gt;
==Funkcja kowariancji (wzajemnej)==&lt;br /&gt;
&lt;br /&gt;
W celu scharakteryzowania zależności wzajemnej dwóch sygnałów losowych, stosuje się funkcję kowariancji, zdefiniowaną w następujący sposób:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid98&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy} (\tau ) = \mathrm{cov}(x(t),y(t-\tau ))=\mathrm{E}[(x(t)-\mu _x)(y(t-\tau )-\mu _y)]&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid99&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\mu _x = \mathrm{E}[x(t)]\\&lt;br /&gt;
\mu _y = \mathrm{E}[y(t)]\\ \end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W przypadku sygnałów ciągłych estymatę tę można zapisać w poniższy sposób:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid100&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy} (\tau ) = \frac{1}{T}\int _0^{T}(x(t)-\mu_x)(y(t-\tau)-\mu_y)dt&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
natomiast dla sygnałów dyskretnych jako:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid101&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy}(k) = \frac{1}{N-1}\sum _{i=0}^{N-k}(x(i+k)-x_s)(y(i)-y_s)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W odróżnieniu od funkcji autokowariancji, funkcja kowariancji nie musi mieć maksimum dla przesunięcia &amp;lt;math&amp;gt;\tau =0&amp;lt;/math&amp;gt;. Ponadto posiada ona następującą cechę:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid102&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy}(-\tau ) = \gamma _{yx}(\tau )&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcję kowariancji można znormalizować:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid103&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\rho (\tau) = \frac{\mathrm{E}[(x(t)-\mu _x)(y(t-\tau )-\mu _y)]}{\sqrt{\mathrm{E}[(x(t)-\mu _x)^2]\mathrm{E}[(y(t)-\mu _y)^2]}} = \frac{\gamma _{xy}}{\sigma_x\sigma_y}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
Otrzymaną funkcję nazywamy funkcją korelacji.&lt;br /&gt;
Jednym z zastosowań funkcji korelacji jest wyznaczanie czasu przejścia sygnału przez dany układ liniowy. Funkcja korelacji pomiędzy sygnałem na wejściu układu i sygnałem na jego wyjściu osiągnie wartość maksymalną dla przesunięcia &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; równego czasowi, jaki potrzebował sygnał na pokonanie danego układu. Niestety, taka metoda wyznaczania opóźnienia obarczona jest pewną wadą &amp;amp;mdash; w przypadku gdy prędkość sygnału bądź jego droga zależą od częstości, wtedy na wykresie funkcji korelacji nie uzyskamy wyraźnego maksimum.&lt;br /&gt;
&lt;br /&gt;
=====Polecenie =====&lt;br /&gt;
Zaimplementuj funkcję obliczającą funkcję kowariancji dla różnych sygnałów ''x'' i ''y'' (równanie &amp;lt;xr id=&amp;quot;uid98&amp;quot;&amp;gt;(%i)&amp;lt;/xr&amp;gt;)&amp;lt;!-- skorzystaj przy tym z własności opisanej równaniem &amp;lt;xr id=&amp;quot;uid98&amp;quot;&amp;gt;(%i)&amp;lt;/xr&amp;gt;--&amp;gt;. &lt;br /&gt;
Przykładowe wywołanie:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
b = np.array([-1,-2,-3])&lt;br /&gt;
&lt;br /&gt;
print koreluj(a,b)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
powinno dać w wyniku:&lt;br /&gt;
 [ 0.5 0.  -1.   0.   0.5]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
{{hidden begin|title=Przykładowe rozwiązanie:}}&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import pylab as py&lt;br /&gt;
&lt;br /&gt;
def koreluj(x,y,max_tau):&lt;br /&gt;
    x = x - np.mean(x)&lt;br /&gt;
    y = y - np.mean(y)&lt;br /&gt;
    cor = np.zeros(2*max_tau+1)&lt;br /&gt;
    cor[max_tau] = np.sum(x[:]*y[:]) &lt;br /&gt;
    for i in range(1,max_tau+1):&lt;br /&gt;
        cor[max_tau+i] = np.sum(x[i:]*y[:-i])&lt;br /&gt;
        cor[max_tau-i] = np.sum(y[i:]*x[:-i])&lt;br /&gt;
    N= len(x)&lt;br /&gt;
    cor = cor /(N-1)&lt;br /&gt;
    return cor&lt;br /&gt;
&lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
b = np.array([-1,-2,-3])&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    print koreluj(a,b,i)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}} --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadanie 4===&lt;br /&gt;
Z danych zarejestrowanych w trakcie czuwania z zamkniętymi oczami wybierz sygnały z następujących kanałów: Fp1, P3, Pz, P4, Fp2, O1, O2.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Dla każdego kanału oblicz funkcję autokorelacji, zaś  dla każdej pary kanałów oblicz funkcję korelacji wzajemnej. Wyniki zaprezentuj w formie kwadratowej macierzy wykresów (za pomocą funkcji subplot, tak jak na przykładowym rys. (rys. &amp;lt;xr id=&amp;quot;uid9&amp;quot;&amp;gt; %i&amp;lt;/xr&amp;gt;)). Na przekątnej macierzy narysuj funkcję autokorelacji odpowiednich kanałów, poza przekątną &amp;amp;mdash; funkcję korelacji wzajemnej. Wskaż kanały, które są najbardziej skorelowane ze sobą. Czy możliwe jest wyznaczenie opóźnienia sygnału pomiędzy tymi kanałami?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Powtórz punkt 1, tym razem jednak funkcję autokorelacji i korelacji wzajemnej oblicz na sygnałach przefiltrowanych filtrem wąskopasmowym w paśmie alfa charakterystycznym dla badanej osoby. ([[%C4%86wiczenia_7#Funkcje_do_projektowania_filtr.C3.B3w_IIR_dost.C4.99pne_w_module_scipy.signal|przypomnienie konstrukcji filtrów]])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Oszacuj istotność statystyczną zależności między parami kanałów. Twoją hipotezą zerową jest brak istotnej korelacji pomiędzy sygnałami zarejestrowanymi przez dwie różne elektrody EEG. Hipoteza alternatywna to występowanie zależności pomiędzy tymi sygnałami. Podanie estymatorów wariancji funkcji korelacji jest bardzo trudne, dlatego jednym ze sposobów oszacowania progu powyżej którego wartość funkcji korelacji można byłoby uznać za istotną statystycznie, jest zastosowanie metody ''bootstrap''. Teoretycznie, funkcja korelacji policzona dla dwóch rzeczywistych, nieskorelowanych sygnałów, powinna wynosić 0 dla każdego przesunięcia &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt;. Tak jest jednak w przypadku sygnałów nieskończonych; w analizie sygnałów takowych nie spotkamy.&lt;br /&gt;
&lt;br /&gt;
Dokonując losowej zamiany kolejności próbek, możemy doprowadzić do wytworzenia sygnałów zależnych losowo, które jednak ze względu na skończony czas trwania, dadzą niezerową funkcję korelacji. Poziom losowych fluktuacji tej funkcji oszacujemy wykonując następujące kroki:&lt;br /&gt;
&amp;lt;ol type=&amp;quot;A&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Losowa zamiana kolejności próbek w analizowanych sygnałach. Jeżeli pomiędzy dwoma sygnałami istnieją jakieś zależności, losowa zamiana próbek doprowadzi do zniszczenia tych związków. W ten sposób uzyskujemy sygnały, które teoretycznie są nieskorelowane.&lt;br /&gt;
&amp;lt;li&amp;gt; Obliczenie funkcji  korelacji wzajemnej dla sygnałów policzonych w punkcie A.&lt;br /&gt;
&amp;lt;li&amp;gt; Powtórzenie kroków A i B wiele (np. 1000) razy.&lt;br /&gt;
&amp;lt;li&amp;gt; Oszacowanie 95% przedziału ufności dla wartości średniej funkcji korelacji wzajemnej dla danego przesunięcia &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; korzystając z otrzymanego w kroku C empirycznego rozkładu wartości tych funkcji dla sygnałów niezależnych.  &lt;br /&gt;
&amp;lt;li&amp;gt; Powtórzenie kroków A-D dla kolejnych przesunięć &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;li&amp;gt; Sprawdzenie, dla których przesunięć &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; funkcje autokorelacji i korelacji obliczone dla oryginalnych sygnałów uzyskały wartości wyższe niż wartości progowe oszacowane dla sygnałów o losowych zależnościach.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Procedura opisana powyżej ma jednak '''zasadniczą wadę'''. Staramy się w niej oszacować poziom przypadkowych korelacji pomiędzy dwoma sygnałami dla kolejnych przesunięć &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt;, co jest niczym innym jak wielokrotnym powtórzeniem pewnego testu. Obserwowanie korelacji dla wielu par kanałów równocześnie również prowadzi do zwiększenia szansy na zaobserwowanie ekstremalnie dużych fluktuacji.&lt;br /&gt;
Występuje tu zatem ''problem wielokrotnych porównań''.&lt;br /&gt;
Przypominamy, iż może to doprowadzić do przypadkowego uznania wyników jako &amp;amp;bdquo;istotnych&amp;amp;rdquo; statystycznie. Np. jeśli pojedynczy test wykonujemy na poziomie istotności 5% to dopuszczamy odrzucenie w 1 przypadku na 20 hipotezy zerowej pomimo, iż jest ona prawdziwa. Z drugiej jednak strony, jeśli powtórzymy wykonywany test 20 razy, to oczekujemy uzyskania 1 przypadku, w którym poziom ''p'' będzie mniejszy od 5% co jest przesłanką za odrzuceniem hipotezy zerowej. &lt;br /&gt;
&lt;br /&gt;
W przypadku wykonywania serii testów należałoby więc zastosować odpowiednie poprawki, np. [http://www.bmj.com/content/310/6973/170.full korektę Bonferroniego] czy [http://en.wikipedia.org/wiki/False_discovery_rate false discovery rate (FDR)]. Innym rozwiązaniem w analizowanym przez nas problemie jest zastosowanie tzw. statystyk wartości ekstremalnych, które prowadzą do następujących zmian w procedurze:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol type=&amp;quot;A&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;	Losowa zmiana kolejności próbek w analizowanych sygnałach (we wszystkich analizowanych kanałach). Jeżeli pomiędzy dwoma sygnałami istnieją jakieś zależności, losowa zamiana próbek doprowadzi do zniszczenia tych związków. W ten sposób uzyskujemy sygnały, które teoretycznie są nieskorelowane.&lt;br /&gt;
&amp;lt;li&amp;gt;	Obliczenie funkcji korelacji dla sygnałów otrzymanych w punkcie A.&lt;br /&gt;
&amp;lt;li&amp;gt;    Zapamiętanie maksymalnej wartości bezwzględnej funkcji korelacji z punktu B (maksimum bierzemy po wszystkich przesunięciach i po wszystkich parach kanałów; dla funkcji autokorelacji, ze względu na jej normalizację do 1 dla zerowego przesunięcia, tam maksymalnych wartości poszukujemy dla przesunięć innych niż 0).&lt;br /&gt;
&amp;lt;li&amp;gt;	Powtórzenie kroków A-C 1000 razy. Uzyskamy w ten sposób rozkład maksymalnych wartości funkcji korelacji możliwych do zaobserwowania dla sygnałów niezależnych.&lt;br /&gt;
&amp;lt;li&amp;gt;    Wyznaczenie 95 centyla rozkładu wartości maksymalnych.&lt;br /&gt;
&amp;lt;li&amp;gt;	Nałożenie na rysunki funkcji korelacji uzyskane w Zadaniu 2 poziomych linii symbolizujących poziom zależności dwóch sygnałów o losowych zależnościach i sprawdzenie, dla których przesunięć &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; wartości funkcji korelacji przekraczają estymowane progi istotności statystycznej.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Plik:Korelacje_wzajemne.png|700px|center|thumb|&amp;lt;figure id=&amp;quot;uid9&amp;quot; /&amp;gt;Przykład wyniku analizy korelacji wzajemnych dla sygnału niefiltrowanego z naniesionymi granicami możliwych fluktuacji.]]&lt;br /&gt;
&lt;br /&gt;
==Wzajemna gęstość widmowa sygnałów==&lt;br /&gt;
&lt;br /&gt;
Podobnie jak w przypadku twierdzenia Chinczyna dla pojedynczego sygnału, możliwe jest policzenie transformaty Fouriera funkcji kowariancji. Uzyskana w ten sposób wielkość nazywa się funkcją wzajemnej gęstości mocy widmowej sygnału:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid122&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
S_{xy}(f) = \int _{-\infty }^{\infty }\gamma_{xy}(\tau )e^{-2\pi i f \tau}d\tau &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W celu dalszego omówienia własności funkcji wzajemnej mocy widmowej sygnałów funkcję tę zapiszemy w postaci:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid123&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
S_{xy}(f) = |S_{xy}(f)|e^{i\phi _{xy}(f)}\\&lt;br /&gt;
\\&lt;br /&gt;
\phi _{xy} = \arg(S_{xy}) &lt;br /&gt;
\end{array} &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&amp;lt;!-- \mathrm{arc\,tg}\left[\frac{\mathrm{Im}(S_{xy}(f))}{\mathrm{Re}(S_{xy}(f))}\right]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wartość bezwzględna funkcji wzajemnej gęstości mocy widmowej osiąga największą wartość dla '''częstości''', w których sygnały &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;y(t)&amp;lt;/math&amp;gt; są ze sobą skorelowane. Funkcja wzajemnej mocy widmowej sygnałów pozbawiona jest zatem wady, która charakteryzowała funkcję korelacji, to jest problemu z wyznaczeniem czasu transmisji sygnału, w przypadku gdy czas ten zależał od częstości. Przy pomocy funkcji wzajemnej mocy widmowej, czas ten można oszacować przy pomocy fazy tej funkcji &amp;amp;mdash; &amp;lt;math&amp;gt;\phi _{xy}(f)&amp;lt;/math&amp;gt;. Jeśli funkcja wzajemnej mocy widmowej została wyznaczona pomiędzy sygnałami na wejściu i wyjściu układu liniowego, to faza ta reprezentuje przesunięcie fazowe sygnału przy przejściu przez układ. Czas tego przejścia można oszacować za pomocą następującej wyrażenia:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid124&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\tau = \frac{\phi _{xy}(f)}{2\pi f}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Podobnie jak w przypadku funkcji autokorelacji i korelacji wzajemnej, funkcję wzajemnej gęstości mocy widmowej można znormalizować:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid125&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
C_{xy}(f) = \frac{S_{xy}(f)}{\sqrt{S_x(f)S_y(f)}}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Znormalizowaną postać funkcji wzajemnej gęstości mocy widmowej nazywamy funkcją ''koherencji''. &lt;br /&gt;
Koherencja jest wielkością zespoloną. Faza koherencji odzwierciedla różnicę faz pomiędzy dwoma sygnałami. Moduł koherencji reprezentuje stopień synchronizacji sygnałów i zawiera się w przedziale od 0.0 do 1.0. Moduł tej funkcji zawiera się w przedziale od 0 do 1. Wartości 0 odpowiada brak synchronizacji pomiędzy sygnałami, zaś wartości 1 pełna synchronizacja dwóch przebiegów czasowych. Należy również zwrócić uwagę na nazewnictwo - często sam moduł koherencji określany jest jako koherencja, w literaturze anglojęzycznej moduł koherencji posiada jednak odrębną nazwę: Magnitude Square Coherence (MSC). Istotny jest również sposób estymacji modułu koherencji, który wyprowadzono w następnym rozdziale, zaś sam estymator reprezentuje wzór (36).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadanie 5===&lt;br /&gt;
Zaimplementuj funkcję obliczającą wzajemną gęstość widmową dla pary kanałów. &lt;br /&gt;
&amp;lt;!--Niech argumentami tej funkcji będą dwa wektory zawierające sygnały, zakres częstości, częstość próbkowania. --&amp;gt;&lt;br /&gt;
Oblicz i narysuj macierz gęstości widmowych (własnych i wzajemnych) dla kolejnych par kanałów (tych samych co w zadaniu 3). Wyniki zaprezentuj w postaci kwadratowej macierzy rysunków. Ponieważ są to funkcje zespolone, dobrze jest zaprezentować osobno ich wartość i fazę. Uzyskane wartości bezwzględne narysuj nad przekątną tej macierzy, a fazę pod przekątną.&lt;br /&gt;
&lt;br /&gt;
===Zadanie 6===&lt;br /&gt;
Przygotuj sygnał dwukanałowy, w którym jako pierwszy sygnał wybierz fragment sygnału EEG (z danych zebranych wcześniej) o długości 2000 próbek, a jako drugiego sygnału użyj tego samego fragmentu EEG, ale opóźnionego o wybraną liczbę (1 - 5) próbek. Oblicz widma wzajemne tych sygnałów i zaprezentuj ich fazy na rysunku. Na podstawie tych widm znajdź wartość przesunięcia czasowego tych sygnałów.&lt;br /&gt;
&lt;br /&gt;
Obliczenia powtórz w przypadku, gdy do drugiego sygnału dodany będzie szum o wariancji równej 0,25 wariancji oryginalnego sygnału.&lt;/div&gt;</summary>
		<author><name>Maciek</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG_2/EEG_wlasno%C5%9Bci_EEG_spoczynkowego&amp;diff=11194</id>
		<title>Pracownia EEG 2/EEG wlasności EEG spoczynkowego</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG_2/EEG_wlasno%C5%9Bci_EEG_spoczynkowego&amp;diff=11194"/>
		<updated>2024-11-22T16:45:59Z</updated>

		<summary type="html">&lt;p&gt;Maciek: /* Polecenie */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Pracownia EEG 2|Pracownia EEG 2]] / Własności EEG spoczynkowego: funkcja autokorelacji i widmo&lt;br /&gt;
&lt;br /&gt;
=Estymacja funkcji autokowariancji, autokorelacji i koherencji sygnału.=&lt;br /&gt;
==Wstęp==&lt;br /&gt;
Z funkcjami tymi spotkaliśmy się już na zajęciach z [[Ćwiczenia_4|analizy sygnałów]].&lt;br /&gt;
&lt;br /&gt;
Funkcja autokowariancji sygnału charakteryzuje liniową zależność wartości tego sygnału w danej określonej chwili czasu od wartości (tego samego sygnału) w innej chwili.&lt;br /&gt;
W przypadku [[Nieparametryczne_widmo_mocy#Sygna.C5.82y_stochastyczne  | stacjonarnych procesów stochastycznych]], przebieg tej funkcji nie zależy od czasu. &lt;br /&gt;
Oznacza to, że obliczając funkcję autokorelacji sygnału pomiędzy chwilą czasu &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;x(t+\tau )&amp;lt;/math&amp;gt; otrzymamy tę samą wartość, jak dla przypadku obliczania funkcji autokorelacji pomiędzy momentami &amp;lt;math&amp;gt;x(t + T)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;x(t + T+\tau )&amp;lt;/math&amp;gt;, gdzie &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; to dowolny przedział czasu. Innymi słowy, funkcja autokorelacji procesu stacjonarnego zależy tylko od odstępu czasu pomiędzy próbkami &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt;, dla którego jest wyznaczana, a nie od konkretnej chwili czasu. Odrębną klasę sygnałów stanowią procesy niestacjonarne, w przypadku których funkcja autokorelacji będzie zależeć od czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; w którym jest obliczana. Estymator funkcji autokowariancji uzyskuje się poprzez obliczanie iloczynów wartości sygnału &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; w chwilach czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; czyli &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; i wartości sygnału &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; w chwili czasu ''t''+&amp;amp;tau; czyli &amp;lt;math&amp;gt;x(t+\tau)&amp;lt;/math&amp;gt; i uśredniając wartości iloczynów po czasie &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid79&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma (\tau) = \mathrm{cov}(x(t),x(t-\tau ))=\mathrm{E}[(x(t)-\mu )(x(t-\tau )-\mu )]&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(1)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid80&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\mu = \mathrm{E}[x(t)]&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(2)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W przypadku sygnałów ciągłych estymatę tę można zapisać w poniższy sposób:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid81&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma (\tau ) = \frac{1}{T}\int _0^{T}(x(t)-\mu )(x(t-\tau )-\mu )dt&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(3)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
natomiast dla sygnałów dyskretnych jako:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid82&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma (k) = \frac{1}{N-1}\sum _{i=1}^{N-|k|}(x(i+k)-x_s)(x(i)-x_s)&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(4)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid83&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
x_s = \frac{\sum _{i=1}^{N}x(i)}{N}&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(5)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcja autokowariancji może osiągać dowolne wartości, dlatego aby można było porównać przebieg tej funkcji np. pomiędzy dwoma sygnałami, wprowadzono wersję znormalizowaną tej funkcji &amp;amp;mdash; ''funkcję autokorelacji''. Normalizacja ta wygląda następująco:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid84&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\rho (k) = \frac{\gamma (\tau )}{\sigma^2}&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(6)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid85&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\sigma ^2 = \mathrm{E}[(x(t)-\mu )^2]&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(7)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wariancję sygnału (&amp;lt;math&amp;gt;\gamma (0)=\sigma ^2&amp;lt;/math&amp;gt;) można wyrazić przez funkcję autokowariancji dla przesunięcia &amp;lt;math&amp;gt;\tau =0&amp;lt;/math&amp;gt;.  Wynika z tego, że funkcja korelacji przyjmuje wartości z zakresu [&amp;amp;minus;1,&amp;amp;nbsp;1]. Ostatecznie estymator funkcji autokorelacji można zapisać jak poniżej:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid86&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\rho(k) = \frac{\gamma (k)}{\gamma (0)}&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(8)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcję autokorelacji estymuje się w celu określenia, w jakim stopniu wartości sygnału w danej chwili czasu wpływają na wartości sygnału w kolejnych chwilach czasu. Ma to kluczowe znaczenie przy rozpoznawaniu rodzaju procesów fizycznych odpowiedzialnego za generowanie sygnału. Funkcja ta zawsze mam maksimum dla przesunięcia &amp;lt;math&amp;gt;\tau =0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cechą charakterystyczną funkcji autokorelacji jest to, iż w przypadku sygnałów harmonicznych, przebieg funkcji ma charakter okresowy, z okresem takim samym jak okres badanego sygnału. W przypadku szumu, funkcja autokorelacji ma kształt funkcji delta Diraca.&lt;br /&gt;
&lt;br /&gt;
==Polecenie:==&lt;br /&gt;
Do policzenia funkcji autokorelacji posłużymy się funkcją biblioteczną &amp;lt;tt&amp;gt;numpy.correlate&amp;lt;/tt&amp;gt;. Funkcja ta, wbrew nazwie, oblicza wyłącznie splot swoich dwóch pierwszych argumentów wywołania. Musimy je więc przystosować do obliczenia wielkości zgodnie ze wzorem (4).&lt;br /&gt;
&lt;br /&gt;
Zaimplementuj funkcję do obliczania funkcji korelacji zgodnie ze wzorem &amp;lt;xr id=&amp;quot;uid82&amp;quot;&amp;gt;(%i)&amp;lt;/xr&amp;gt;. Funkcja powinna przyjmować jako parametry dwa wektory&amp;lt;!--i maksymalne przesunięcie wzajemne tych wektorów--&amp;gt;, a zwracać wektor zawierający ich funkcję autokorelacji. &lt;br /&gt;
&lt;br /&gt;
Wywołanie przykładowe:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
print koreluj(a,a)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
powinno dać wynik:&lt;br /&gt;
 [-0.5  0.   1.   0.  -0.5]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
# Średnia&lt;br /&gt;
mean = numpy.mean(data)&lt;br /&gt;
mean2 = numpy.mean(data2)&lt;br /&gt;
&lt;br /&gt;
# Wariancja&lt;br /&gt;
var = numpy.var(data)&lt;br /&gt;
var2 = numpy.var(data2)&lt;br /&gt;
&lt;br /&gt;
# Dane po odjęciu średnich&lt;br /&gt;
ndata = data - mean&lt;br /&gt;
ndata2 = data2 - mean2&lt;br /&gt;
&lt;br /&gt;
# Splot&lt;br /&gt;
acorr = numpy.correlate(ndata, ndata2, 'full')&lt;br /&gt;
&lt;br /&gt;
# Normalizacja kowariancji do korelacji i przez 1/N&lt;br /&gt;
acorr = acorr / numpy.sqrt(var*var2) / len(ndata)&lt;br /&gt;
&lt;br /&gt;
print(acorr)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{{hidden begin|title=Przykładowe rozwiązanie:}}--&amp;gt;&lt;br /&gt;
 &amp;lt;!-- &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
def koreluj_pol(x,y,max_tau):&lt;br /&gt;
    x = x - np.mean(x)&lt;br /&gt;
    y = y - np.mean(y)&lt;br /&gt;
    N= len(x)&lt;br /&gt;
    cor = np.zeros(max_tau+1)&lt;br /&gt;
    cor[0] = np.sum(x[:]*y[:]) &lt;br /&gt;
    for i in range(1,max_tau+1):&lt;br /&gt;
        cor[i] = np.sum(x[i:]*y[:-i])&lt;br /&gt;
        &lt;br /&gt;
    cor = cor /(N-1)&lt;br /&gt;
    return cor&lt;br /&gt;
&lt;br /&gt;
def koreluj(x,y,max_tau):&lt;br /&gt;
    cor = np.zeros(2*max_tau+1)    &lt;br /&gt;
    cor[max_tau:] = koreluj_pol(x,y,max_tau)&lt;br /&gt;
    tmp = koreluj_pol(y,x,max_tau)&lt;br /&gt;
    cor[:max_tau+1] = tmp[-1::-1]&lt;br /&gt;
    return cor    &lt;br /&gt;
    &lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    print koreluj(a,a,i)&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
b = np.array([-1,-2,-3])&lt;br /&gt;
&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    print koreluj(a,b,i)&lt;br /&gt;
    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zadanie 1: Pomiar sygnału EEG ==&lt;br /&gt;
&lt;br /&gt;
Zarejestruj 10 minut sygnału EEG, w trakcie których badana osoba będzie siedziała z otwartymi oczami oraz kolejne 10 minut w stanie czuwania z zamkniętymi oczami. Rejestrację należy wykonać na pełnym czepku 10-20 z częstością próbkowania 128 Hz. &lt;br /&gt;
&lt;br /&gt;
==Zadanie 2:  Funkcje autokowariancji i autokorelacji==&lt;br /&gt;
W tym zadaniu posłużymy się sygnałami zarejestrowanymi w punkcie 3. poprzedniego ćwiczenia. Zaobserwuj, na którym kanale rytm alfa osiąga najwyższą wartość. Następnie zaimplementuj w Pythonie następujące kroki:&lt;br /&gt;
&lt;br /&gt;
#	Wczytaj dane z wybranego kanału.&lt;br /&gt;
#	Oblicz funkcję autokorelacji dla sygnału zarejestrowanego w warunkach, gdy osoba badana siedziała z otwartymi oczami. Narysuj autokorelogram, to jest wykres wartości funkcji autokorelacji względem przesunięcia &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt;. Oś &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; wyskaluj w sekundach.&lt;br /&gt;
#	Powtórz krok 2, tym razem dla sygnału zebranego w warunkach czuwania z zamkniętymi oczami.&lt;br /&gt;
#	Porównaj autokorelogramy.&lt;br /&gt;
&lt;br /&gt;
=Związek autokorelacji z widmem sygnału=&lt;br /&gt;
==Wstęp==&lt;br /&gt;
Zgodnie z twierdzeniem Chinczyna, z którym zapoznaliśmy się na wykładzie z [[Twierdzenie_Wienera-Chinczyna|Analizy Sygnałów]], widmową gęstość mocy sygnału można policzyć jako transformatę Fouriera funkcji autokowariancji:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid93&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
S(f) = \int _{-\infty }^{\infty }\gamma (\tau )e^{-2\pi i f \tau}d\tau &amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(9)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	&amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; &amp;amp;mdash; częstość&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	&amp;lt;math&amp;gt;S(f)&amp;lt;/math&amp;gt; &amp;amp;mdash;  gęstość widmowa mocy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Poniższy kod ilustruje to twierdzenie:&lt;br /&gt;
&amp;lt;source lang = py&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
from numpy.fft import rfft,fft,fftfreq,fftshift&lt;br /&gt;
 &lt;br /&gt;
def widmo_mocy(s, Fs):&lt;br /&gt;
    '''Funkcja licąca widmo mocy metodą periodogramu,&lt;br /&gt;
	pobiera sygnał i częstość próbkowania&lt;br /&gt;
	zwraca widmo mocy i oś częstości&lt;br /&gt;
    '''&lt;br /&gt;
    S = fft(s)/np.sqrt(len(s))&lt;br /&gt;
    S_moc = S*S.conj()&lt;br /&gt;
    S_moc = S_moc.real&lt;br /&gt;
    F = fftfreq(len(s), 1/Fs)&lt;br /&gt;
    return (fftshift(S_moc),fftshift(F))&lt;br /&gt;
 &lt;br /&gt;
def sin(f = 1, T = 1, Fs = 128, phi =0 ):&lt;br /&gt;
    '''sin o zadanej częstości (w Hz), długości, fazie i częstości próbkowania&lt;br /&gt;
    Domyślnie wytwarzany jest sygnał reprezentujący &lt;br /&gt;
    1 sekundę sinusa o częstości 1Hz i zerowej fazie próbkowanego 128 Hz&lt;br /&gt;
    '''&lt;br /&gt;
    dt = 1.0/Fs&lt;br /&gt;
    t = np.arange(0,T,dt)&lt;br /&gt;
    s = np.sin(2*np.pi*f*t + phi)&lt;br /&gt;
    return (s,t)&lt;br /&gt;
 &lt;br /&gt;
# sygnał próbny będzie próbkowany z częstością FS&lt;br /&gt;
FS = 100.0&lt;br /&gt;
# sygnałem próbnym będzie sinusoida o częstości f &lt;br /&gt;
(s,t) = sin(f=10.5,Fs=FS)&lt;br /&gt;
# obliczamy moc i energię sygnału w dziedzinie czasu&lt;br /&gt;
moc_w_czasie = s**2&lt;br /&gt;
energia_w_czasie = np.sum(moc_w_czasie)&lt;br /&gt;
print 'energia w czasie: ', energia_w_czasie&lt;br /&gt;
 &lt;br /&gt;
# obliczamy widmo mocy sygnału i jego energię estymowaną w dziedzinie częstości&lt;br /&gt;
(moc_w_czestosci, F) = widmo_mocy(s, Fs=FS)&lt;br /&gt;
energia_w_czestosci = np.sum(moc_w_czestosci)&lt;br /&gt;
print 'energia w czestosci: ', energia_w_czestosci&lt;br /&gt;
 &lt;br /&gt;
# estymujemy funkcję autokorelacji sygnału&lt;br /&gt;
ak = 1./(2*len(s)-1)*np.correlate(s,s,'full')&lt;br /&gt;
&lt;br /&gt;
# estymujemy widmo mocy i energię sygnału z twierdzenia Chinczyna korzystając z funkcji fft:&lt;br /&gt;
moc_chi = np.abs(fft(ak))&lt;br /&gt;
energia_chin = sum(moc_chi)&lt;br /&gt;
print 'energia z tw. Chinczyna przez fft: ', energia_chin&lt;br /&gt;
 &lt;br /&gt;
# estymujemy widmo mocy i energię sygnału z twierdzenia Chinczyna korzystając z jawnej postaci transformaty Fouriera:&lt;br /&gt;
FF = np.linspace(-FS/2,FS/2,1000)&lt;br /&gt;
M = np.zeros(len(FF),dtype='complex')&lt;br /&gt;
 &lt;br /&gt;
for i,f in enumerate( FF):&lt;br /&gt;
    for tau in range(len(ak)):&lt;br /&gt;
        M[i] += ak[tau]*np.exp(2*np.pi*1j*f*(len(ak)-tau)/FS) &lt;br /&gt;
M = np.abs(M)&lt;br /&gt;
energia_chin_sum = np.sum(M)* (len(ak)/len(FF))&lt;br /&gt;
print 'energia z tw. Chinczyna przez sumowanie: ', energia_chin_sum&lt;br /&gt;
&lt;br /&gt;
# Rysunki&lt;br /&gt;
py.figure(1)&lt;br /&gt;
py.subplot(3,1,1)&lt;br /&gt;
py.plot(t,s)&lt;br /&gt;
py.title(u'Sygnal')&lt;br /&gt;
py.subplot(3,1,2)&lt;br /&gt;
py.plot(t,moc_w_czasie)&lt;br /&gt;
py.title(u'moc w czasie')&lt;br /&gt;
py.subplot(3,1,3)&lt;br /&gt;
py.plot(F,moc_w_czestosci)&lt;br /&gt;
py.title(u'moc w czestosci')&lt;br /&gt;
 &lt;br /&gt;
py.figure(2)&lt;br /&gt;
py.subplot(3,1,1)&lt;br /&gt;
py.title('f. autokowariancji')&lt;br /&gt;
py.plot(np.arange(-len(ak)/2,len(ak)/2,1)/FS ,ak)&lt;br /&gt;
py.subplot(3,1,2)&lt;br /&gt;
py.plot(fftshift(fftfreq(len(moc_chi),1./FS)),fftshift(moc_chi))&lt;br /&gt;
py.title('widmo mocy z Tw. Chinczyna przez fft')&lt;br /&gt;
py.subplot(3,1,3)&lt;br /&gt;
py.plot(FF,M)&lt;br /&gt;
py.title('widmo mocy z Tw. Chinczyna przez sumowanie')&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W wyniku powinniśmy zobaczyć w terminalu:&lt;br /&gt;
 energia w czasie:  50.0&lt;br /&gt;
 energia w czestosci:  50.0&lt;br /&gt;
 energia z tw. Chinczyna przez fft:  50.0&lt;br /&gt;
 energia z tw. Chinczyna przez sumowanie:  49.9501172217&lt;br /&gt;
&lt;br /&gt;
oraz powinny pojawić się rysunki:&lt;br /&gt;
[[Plik:Fig_chinczyn1.png|thumb 200 px|center]]&lt;br /&gt;
[[Plik:Fig_chinczyn2.png|thumb 200 px|center]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Polecenie ==&lt;br /&gt;
Zaimplementuj funkcję obliczającą transformację Fouriera dyskretyzując wzór (9) dla zadanego wektora częstości &amp;lt;tt&amp;gt;f&amp;lt;/tt&amp;gt; i zadanej częstości próbkowania sygnału (tutaj: 10).&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Wywołanie przykładowe:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
t= np.arange(0,1,0.1)&lt;br /&gt;
x = np.sin(2*np.pi*2*t)&lt;br /&gt;
f = np.arange(-5,5,1)&lt;br /&gt;
X,f = fourier(x,f,10.0)&lt;br /&gt;
print X&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Natomiast wywołanie:&lt;br /&gt;
&amp;lt;source lang ='python'&amp;gt;&lt;br /&gt;
t= np.arange(0,1,0.1)&lt;br /&gt;
x = np.sin(2*np.pi*2*t)&lt;br /&gt;
f = np.arange(-5,5,0.01)&lt;br /&gt;
X = fourier(x,f,10.0)&lt;br /&gt;
py.plot(f,np.abs(X))&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Powinno wytworzyć rysunek:&lt;br /&gt;
&lt;br /&gt;
[[Plik:Fourier_test.png]] &lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
import numpy as np&lt;br /&gt;
import pylab as py&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def koreluj_pol(x,y,max_tau):&lt;br /&gt;
    x = x - np.mean(x)&lt;br /&gt;
    y = y - np.mean(y)&lt;br /&gt;
    N= len(x)&lt;br /&gt;
    cor = np.zeros(max_tau+1)&lt;br /&gt;
    cor[0] = np.sum(x[:]*y[:]) &lt;br /&gt;
    for i in range(1,max_tau+1):&lt;br /&gt;
        cor[i] = np.sum(x[i:]*y[:-i])&lt;br /&gt;
        &lt;br /&gt;
    cor = cor /(N)&lt;br /&gt;
    return cor&lt;br /&gt;
&lt;br /&gt;
def koreluj(x,y,max_tau):&lt;br /&gt;
    cor = np.zeros(2*max_tau+1)    &lt;br /&gt;
    cor[max_tau:] = koreluj_pol(x,y,max_tau)&lt;br /&gt;
    tmp = koreluj_pol(y,x,max_tau)&lt;br /&gt;
    cor[:max_tau+1] = tmp[-1::-1]&lt;br /&gt;
    return cor  &lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
def fourier_chin(x, FF, FS):&lt;br /&gt;
    ak = koreluj(x,x,len(x)-1)&lt;br /&gt;
    M = np.zeros(len(FF),dtype='complex') &lt;br /&gt;
    for i,f in enumerate( FF):&lt;br /&gt;
        for tau in range(len(ak)):&lt;br /&gt;
	    M[i] += ak[tau]*np.exp(-2*np.pi*1j*f*( tau- len(x))/FS)&lt;br /&gt;
    #M/=np.sqrt(len(ak))&lt;br /&gt;
    return M&lt;br /&gt;
    &lt;br /&gt;
def fourier(ak, FF, FS):&lt;br /&gt;
   &lt;br /&gt;
    M = np.zeros(len(FF),dtype='complex') &lt;br /&gt;
    for i,f in enumerate( FF):&lt;br /&gt;
        for tau in range(len(ak)):&lt;br /&gt;
	    M[i] += ak[tau]*np.exp(-2*np.pi*1j*f*( tau)/FS)&lt;br /&gt;
    M/=np.sqrt(len(ak))&lt;br /&gt;
    return M&lt;br /&gt;
t= np.arange(0,1,0.05)&lt;br /&gt;
x = np.sin(2*np.pi*2*t)&lt;br /&gt;
f = np.arange(-5,5,0.01)&lt;br /&gt;
&lt;br /&gt;
X = fourier_chin(x,f,10.0)&lt;br /&gt;
Xf = fourier(x,f,10.0)&lt;br /&gt;
print X&lt;br /&gt;
py.plot(f,np.abs(X), f,np.abs(Xf)**2)&lt;br /&gt;
py.show()&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zadanie 3: Związek autokorelacji z widmem sygnału==&lt;br /&gt;
Oblicz gęstość widmową mocy sygnału zarejestrowanego w trakcie czuwania z zamkniętymi oczami, korzystając z twierdzenia Chinczyna oraz [[Nieparametryczne_widmo_mocy#Metoda_Welcha | metodą Welcha]].&lt;br /&gt;
Znajdź częstość rytmu &amp;amp;alpha; dla osoby, która była badana.&lt;br /&gt;
&lt;br /&gt;
==Funkcja kowariancji (wzajemnej)==&lt;br /&gt;
&lt;br /&gt;
W celu scharakteryzowania zależności wzajemnej dwóch sygnałów losowych, stosuje się funkcję kowariancji, zdefiniowaną w następujący sposób:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid98&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy} (\tau ) = \mathrm{cov}(x(t),y(t-\tau ))=\mathrm{E}[(x(t)-\mu _x)(y(t-\tau )-\mu _y)]&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid99&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\mu _x = \mathrm{E}[x(t)]\\&lt;br /&gt;
\mu _y = \mathrm{E}[y(t)]\\ \end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W przypadku sygnałów ciągłych estymatę tę można zapisać w poniższy sposób:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid100&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy} (\tau ) = \frac{1}{T}\int _0^{T}(x(t)-\mu_x)(y(t-\tau)-\mu_y)dt&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
natomiast dla sygnałów dyskretnych jako:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid101&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy}(k) = \frac{1}{N-1}\sum _{i=0}^{N-k}(x(i+k)-x_s)(y(i)-y_s)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W odróżnieniu od funkcji autokowariancji, funkcja kowariancji nie musi mieć maksimum dla przesunięcia &amp;lt;math&amp;gt;\tau =0&amp;lt;/math&amp;gt;. Ponadto posiada ona następującą cechę:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid102&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy}(-\tau ) = \gamma _{yx}(\tau )&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcję kowariancji można znormalizować:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid103&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\rho (\tau) = \frac{\mathrm{E}[(x(t)-\mu _x)(y(t-\tau )-\mu _y)]}{\sqrt{\mathrm{E}[(x(t)-\mu _x)^2]\mathrm{E}[(y(t)-\mu _y)^2]}} = \frac{\gamma _{xy}}{\sigma_x\sigma_y}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
Otrzymaną funkcję nazywamy funkcją korelacji.&lt;br /&gt;
Jednym z zastosowań funkcji korelacji jest wyznaczanie czasu przejścia sygnału przez dany układ liniowy. Funkcja korelacji pomiędzy sygnałem na wejściu układu i sygnałem na jego wyjściu osiągnie wartość maksymalną dla przesunięcia &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; równego czasowi, jaki potrzebował sygnał na pokonanie danego układu. Niestety, taka metoda wyznaczania opóźnienia obarczona jest pewną wadą &amp;amp;mdash; w przypadku gdy prędkość sygnału bądź jego droga zależą od częstości, wtedy na wykresie funkcji korelacji nie uzyskamy wyraźnego maksimum.&lt;br /&gt;
&lt;br /&gt;
=====Polecenie =====&lt;br /&gt;
Zaimplementuj funkcję obliczającą funkcję kowariancji dla różnych sygnałów ''x'' i ''y'' (równanie &amp;lt;xr id=&amp;quot;uid98&amp;quot;&amp;gt; %i&amp;lt;/xr&amp;gt;)&amp;lt;!-- skorzystaj przy tym z własności opisanej równaniem &amp;lt;xr id=&amp;quot;uid98&amp;quot;&amp;gt;(%i)&amp;lt;/xr&amp;gt;--&amp;gt;. &lt;br /&gt;
Przykładowe wywołanie:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
b = np.array([-1,-2,-3])&lt;br /&gt;
&lt;br /&gt;
print koreluj(a,b)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
powinno dać w wyniku:&lt;br /&gt;
 [ 0.5 0.  -1.   0.   0.5]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
{{hidden begin|title=Przykładowe rozwiązanie:}}&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import pylab as py&lt;br /&gt;
&lt;br /&gt;
def koreluj(x,y,max_tau):&lt;br /&gt;
    x = x - np.mean(x)&lt;br /&gt;
    y = y - np.mean(y)&lt;br /&gt;
    cor = np.zeros(2*max_tau+1)&lt;br /&gt;
    cor[max_tau] = np.sum(x[:]*y[:]) &lt;br /&gt;
    for i in range(1,max_tau+1):&lt;br /&gt;
        cor[max_tau+i] = np.sum(x[i:]*y[:-i])&lt;br /&gt;
        cor[max_tau-i] = np.sum(y[i:]*x[:-i])&lt;br /&gt;
    N= len(x)&lt;br /&gt;
    cor = cor /(N-1)&lt;br /&gt;
    return cor&lt;br /&gt;
&lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
b = np.array([-1,-2,-3])&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    print koreluj(a,b,i)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}} --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadanie 4===&lt;br /&gt;
Z danych zarejestrowanych w trakcie czuwania z zamkniętymi oczami wybierz sygnały z następujących kanałów: Fp1, P3, Pz, P4, Fp2, O1, O2.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Dla każdego kanału oblicz funkcję autokorelacji, zaś  dla każdej pary kanałów oblicz funkcję korelacji wzajemnej. Wyniki zaprezentuj w formie kwadratowej macierzy wykresów (za pomocą funkcji subplot, tak jak na przykładowym rys. (rys. &amp;lt;xr id=&amp;quot;uid9&amp;quot;&amp;gt; %i&amp;lt;/xr&amp;gt;)). Na przekątnej macierzy narysuj funkcję autokorelacji odpowiednich kanałów, poza przekątną &amp;amp;mdash; funkcję korelacji wzajemnej. Wskaż kanały, które są najbardziej skorelowane ze sobą. Czy możliwe jest wyznaczenie opóźnienia sygnału pomiędzy tymi kanałami?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Powtórz punkt 1, tym razem jednak funkcję autokorelacji i korelacji wzajemnej oblicz na sygnałach przefiltrowanych filtrem wąskopasmowym w paśmie alfa charakterystycznym dla badanej osoby. ([[%C4%86wiczenia_7#Funkcje_do_projektowania_filtr.C3.B3w_IIR_dost.C4.99pne_w_module_scipy.signal|przypomnienie konstrukcji filtrów]])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Oszacuj istotność statystyczną zależności między parami kanałów. Twoją hipotezą zerową jest brak istotnej korelacji pomiędzy sygnałami zarejestrowanymi przez dwie różne elektrody EEG. Hipoteza alternatywna to występowanie zależności pomiędzy tymi sygnałami. Podanie estymatorów wariancji funkcji korelacji jest bardzo trudne, dlatego jednym ze sposobów oszacowania progu powyżej którego wartość funkcji korelacji można byłoby uznać za istotną statystycznie, jest zastosowanie metody ''bootstrap''. Teoretycznie, funkcja korelacji policzona dla dwóch rzeczywistych, nieskorelowanych sygnałów, powinna wynosić 0 dla każdego przesunięcia &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt;. Tak jest jednak w przypadku sygnałów nieskończonych; w analizie sygnałów takowych nie spotkamy.&lt;br /&gt;
&lt;br /&gt;
Dokonując losowej zamiany kolejności próbek, możemy doprowadzić do wytworzenia sygnałów zależnych losowo, które jednak ze względu na skończony czas trwania, dadzą niezerową funkcję korelacji. Poziom losowych fluktuacji tej funkcji oszacujemy wykonując następujące kroki:&lt;br /&gt;
&amp;lt;ol type=&amp;quot;A&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Losowa zamiana kolejności próbek w analizowanych sygnałach. Jeżeli pomiędzy dwoma sygnałami istnieją jakieś zależności, losowa zamiana próbek doprowadzi do zniszczenia tych związków. W ten sposób uzyskujemy sygnały, które teoretycznie są nieskorelowane.&lt;br /&gt;
&amp;lt;li&amp;gt; Obliczenie funkcji  korelacji wzajemnej dla sygnałów policzonych w punkcie A.&lt;br /&gt;
&amp;lt;li&amp;gt; Powtórzenie kroków A i B wiele (np. 1000) razy.&lt;br /&gt;
&amp;lt;li&amp;gt; Oszacowanie 95% przedziału ufności dla wartości średniej funkcji korelacji wzajemnej dla danego przesunięcia &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; korzystając z otrzymanego w kroku C empirycznego rozkładu wartości tych funkcji dla sygnałów niezależnych.  &lt;br /&gt;
&amp;lt;li&amp;gt; Powtórzenie kroków A-D dla kolejnych przesunięć &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;li&amp;gt; Sprawdzenie, dla których przesunięć &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; funkcje autokorelacji i korelacji obliczone dla oryginalnych sygnałów uzyskały wartości wyższe niż wartości progowe oszacowane dla sygnałów o losowych zależnościach.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Procedura opisana powyżej ma jednak '''zasadniczą wadę'''. Staramy się w niej oszacować poziom przypadkowych korelacji pomiędzy dwoma sygnałami dla kolejnych przesunięć &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt;, co jest niczym innym jak wielokrotnym powtórzeniem pewnego testu. Obserwowanie korelacji dla wielu par kanałów równocześnie również prowadzi do zwiększenia szansy na zaobserwowanie ekstremalnie dużych fluktuacji.&lt;br /&gt;
Występuje tu zatem ''problem wielokrotnych porównań''.&lt;br /&gt;
Przypominamy, iż może to doprowadzić do przypadkowego uznania wyników jako &amp;amp;bdquo;istotnych&amp;amp;rdquo; statystycznie. Np. jeśli pojedynczy test wykonujemy na poziomie istotności 5% to dopuszczamy odrzucenie w 1 przypadku na 20 hipotezy zerowej pomimo, iż jest ona prawdziwa. Z drugiej jednak strony, jeśli powtórzymy wykonywany test 20 razy, to oczekujemy uzyskania 1 przypadku, w którym poziom ''p'' będzie mniejszy od 5% co jest przesłanką za odrzuceniem hipotezy zerowej. &lt;br /&gt;
&lt;br /&gt;
W przypadku wykonywania serii testów należałoby więc zastosować odpowiednie poprawki, np. [http://www.bmj.com/content/310/6973/170.full korektę Bonferroniego] czy [http://en.wikipedia.org/wiki/False_discovery_rate false discovery rate (FDR)]. Innym rozwiązaniem w analizowanym przez nas problemie jest zastosowanie tzw. statystyk wartości ekstremalnych, które prowadzą do następujących zmian w procedurze:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol type=&amp;quot;A&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;	Losowa zmiana kolejności próbek w analizowanych sygnałach (we wszystkich analizowanych kanałach). Jeżeli pomiędzy dwoma sygnałami istnieją jakieś zależności, losowa zamiana próbek doprowadzi do zniszczenia tych związków. W ten sposób uzyskujemy sygnały, które teoretycznie są nieskorelowane.&lt;br /&gt;
&amp;lt;li&amp;gt;	Obliczenie funkcji korelacji dla sygnałów otrzymanych w punkcie A.&lt;br /&gt;
&amp;lt;li&amp;gt;    Zapamiętanie maksymalnej wartości bezwzględnej funkcji korelacji z punktu B (maksimum bierzemy po wszystkich przesunięciach i po wszystkich parach kanałów; dla funkcji autokorelacji, ze względu na jej normalizację do 1 dla zerowego przesunięcia, tam maksymalnych wartości poszukujemy dla przesunięć innych niż 0).&lt;br /&gt;
&amp;lt;li&amp;gt;	Powtórzenie kroków A-C 1000 razy. Uzyskamy w ten sposób rozkład maksymalnych wartości funkcji korelacji możliwych do zaobserwowania dla sygnałów niezależnych.&lt;br /&gt;
&amp;lt;li&amp;gt;    Wyznaczenie 95 centyla rozkładu wartości maksymalnych.&lt;br /&gt;
&amp;lt;li&amp;gt;	Nałożenie na rysunki funkcji korelacji uzyskane w Zadaniu 2 poziomych linii symbolizujących poziom zależności dwóch sygnałów o losowych zależnościach i sprawdzenie, dla których przesunięć &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; wartości funkcji korelacji przekraczają estymowane progi istotności statystycznej.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Plik:Korelacje_wzajemne.png|700px|center|thumb|&amp;lt;figure id=&amp;quot;uid9&amp;quot; /&amp;gt;Przykład wyniku analizy korelacji wzajemnych dla sygnału niefiltrowanego z naniesionymi granicami możliwych fluktuacji.]]&lt;br /&gt;
&lt;br /&gt;
==Wzajemna gęstość widmowa sygnałów==&lt;br /&gt;
&lt;br /&gt;
Podobnie jak w przypadku twierdzenia Chinczyna dla pojedynczego sygnału, możliwe jest policzenie transformaty Fouriera funkcji kowariancji. Uzyskana w ten sposób wielkość nazywa się funkcją wzajemnej gęstości mocy widmowej sygnału:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid122&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
S_{xy}(f) = \int _{-\infty }^{\infty }\gamma_{xy}(\tau )e^{-2\pi i f \tau}d\tau &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W celu dalszego omówienia własności funkcji wzajemnej mocy widmowej sygnałów funkcję tę zapiszemy w postaci:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid123&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
S_{xy}(f) = |S_{xy}(f)|e^{i\phi _{xy}(f)}\\&lt;br /&gt;
\\&lt;br /&gt;
\phi _{xy} = \arg(S_{xy}) &lt;br /&gt;
\end{array} &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&amp;lt;!-- \mathrm{arc\,tg}\left[\frac{\mathrm{Im}(S_{xy}(f))}{\mathrm{Re}(S_{xy}(f))}\right]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wartość bezwzględna funkcji wzajemnej gęstości mocy widmowej osiąga największą wartość dla '''częstości''', w których sygnały &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;y(t)&amp;lt;/math&amp;gt; są ze sobą skorelowane. Funkcja wzajemnej mocy widmowej sygnałów pozbawiona jest zatem wady, która charakteryzowała funkcję korelacji, to jest problemu z wyznaczeniem czasu transmisji sygnału, w przypadku gdy czas ten zależał od częstości. Przy pomocy funkcji wzajemnej mocy widmowej, czas ten można oszacować przy pomocy fazy tej funkcji &amp;amp;mdash; &amp;lt;math&amp;gt;\phi _{xy}(f)&amp;lt;/math&amp;gt;. Jeśli funkcja wzajemnej mocy widmowej została wyznaczona pomiędzy sygnałami na wejściu i wyjściu układu liniowego, to faza ta reprezentuje przesunięcie fazowe sygnału przy przejściu przez układ. Czas tego przejścia można oszacować za pomocą następującej wyrażenia:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid124&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\tau = \frac{\phi _{xy}(f)}{2\pi f}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Podobnie jak w przypadku funkcji autokorelacji i korelacji wzajemnej, funkcję wzajemnej gęstości mocy widmowej można znormalizować:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid125&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
C_{xy}(f) = \frac{S_{xy}(f)}{\sqrt{S_x(f)S_y(f)}}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Znormalizowaną postać funkcji wzajemnej gęstości mocy widmowej nazywamy funkcją ''koherencji''. &lt;br /&gt;
Koherencja jest wielkością zespoloną. Faza koherencji odzwierciedla różnicę faz pomiędzy dwoma sygnałami. Moduł koherencji reprezentuje stopień synchronizacji sygnałów i zawiera się w przedziale od 0.0 do 1.0. Moduł tej funkcji zawiera się w przedziale od 0 do 1. Wartości 0 odpowiada brak synchronizacji pomiędzy sygnałami, zaś wartości 1 pełna synchronizacja dwóch przebiegów czasowych. Należy również zwrócić uwagę na nazewnictwo - często sam moduł koherencji określany jest jako koherencja, w literaturze anglojęzycznej moduł koherencji posiada jednak odrębną nazwę: Magnitude Square Coherence (MSC). Istotny jest również sposób estymacji modułu koherencji, który wyprowadzono w następnym rozdziale, zaś sam estymator reprezentuje wzór (36).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadanie 5===&lt;br /&gt;
Zaimplementuj funkcję obliczającą wzajemną gęstość widmową dla pary kanałów. &lt;br /&gt;
&amp;lt;!--Niech argumentami tej funkcji będą dwa wektory zawierające sygnały, zakres częstości, częstość próbkowania. --&amp;gt;&lt;br /&gt;
Oblicz i narysuj macierz gęstości widmowych (własnych i wzajemnych) dla kolejnych par kanałów (tych samych co w zadaniu 3). Wyniki zaprezentuj w postaci kwadratowej macierzy rysunków. Ponieważ są to funkcje zespolone, dobrze jest zaprezentować osobno ich wartość i fazę. Uzyskane wartości bezwzględne narysuj nad przekątną tej macierzy, a fazę pod przekątną.&lt;br /&gt;
&lt;br /&gt;
===Zadanie 6===&lt;br /&gt;
Przygotuj sygnał dwukanałowy, w którym jako pierwszy sygnał wybierz fragment sygnału EEG (z danych zebranych wcześniej) o długości 2000 próbek, a jako drugiego sygnału użyj tego samego fragmentu EEG, ale opóźnionego o wybraną liczbę (1 - 5) próbek. Oblicz widma wzajemne tych sygnałów i zaprezentuj ich fazy na rysunku. Na podstawie tych widm znajdź wartość przesunięcia czasowego tych sygnałów.&lt;br /&gt;
&lt;br /&gt;
Obliczenia powtórz w przypadku, gdy do drugiego sygnału dodany będzie szum o wariancji równej 0,25 wariancji oryginalnego sygnału.&lt;/div&gt;</summary>
		<author><name>Maciek</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG_2/EEG_wlasno%C5%9Bci_EEG_spoczynkowego&amp;diff=11193</id>
		<title>Pracownia EEG 2/EEG wlasności EEG spoczynkowego</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG_2/EEG_wlasno%C5%9Bci_EEG_spoczynkowego&amp;diff=11193"/>
		<updated>2024-11-22T16:45:37Z</updated>

		<summary type="html">&lt;p&gt;Maciek: /* Polecenie */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Pracownia EEG 2|Pracownia EEG 2]] / Własności EEG spoczynkowego: funkcja autokorelacji i widmo&lt;br /&gt;
&lt;br /&gt;
=Estymacja funkcji autokowariancji, autokorelacji i koherencji sygnału.=&lt;br /&gt;
==Wstęp==&lt;br /&gt;
Z funkcjami tymi spotkaliśmy się już na zajęciach z [[Ćwiczenia_4|analizy sygnałów]].&lt;br /&gt;
&lt;br /&gt;
Funkcja autokowariancji sygnału charakteryzuje liniową zależność wartości tego sygnału w danej określonej chwili czasu od wartości (tego samego sygnału) w innej chwili.&lt;br /&gt;
W przypadku [[Nieparametryczne_widmo_mocy#Sygna.C5.82y_stochastyczne  | stacjonarnych procesów stochastycznych]], przebieg tej funkcji nie zależy od czasu. &lt;br /&gt;
Oznacza to, że obliczając funkcję autokorelacji sygnału pomiędzy chwilą czasu &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;x(t+\tau )&amp;lt;/math&amp;gt; otrzymamy tę samą wartość, jak dla przypadku obliczania funkcji autokorelacji pomiędzy momentami &amp;lt;math&amp;gt;x(t + T)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;x(t + T+\tau )&amp;lt;/math&amp;gt;, gdzie &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; to dowolny przedział czasu. Innymi słowy, funkcja autokorelacji procesu stacjonarnego zależy tylko od odstępu czasu pomiędzy próbkami &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt;, dla którego jest wyznaczana, a nie od konkretnej chwili czasu. Odrębną klasę sygnałów stanowią procesy niestacjonarne, w przypadku których funkcja autokorelacji będzie zależeć od czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; w którym jest obliczana. Estymator funkcji autokowariancji uzyskuje się poprzez obliczanie iloczynów wartości sygnału &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; w chwilach czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; czyli &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; i wartości sygnału &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; w chwili czasu ''t''+&amp;amp;tau; czyli &amp;lt;math&amp;gt;x(t+\tau)&amp;lt;/math&amp;gt; i uśredniając wartości iloczynów po czasie &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid79&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma (\tau) = \mathrm{cov}(x(t),x(t-\tau ))=\mathrm{E}[(x(t)-\mu )(x(t-\tau )-\mu )]&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(1)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid80&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\mu = \mathrm{E}[x(t)]&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(2)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W przypadku sygnałów ciągłych estymatę tę można zapisać w poniższy sposób:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid81&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma (\tau ) = \frac{1}{T}\int _0^{T}(x(t)-\mu )(x(t-\tau )-\mu )dt&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(3)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
natomiast dla sygnałów dyskretnych jako:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid82&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma (k) = \frac{1}{N-1}\sum _{i=1}^{N-|k|}(x(i+k)-x_s)(x(i)-x_s)&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(4)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid83&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
x_s = \frac{\sum _{i=1}^{N}x(i)}{N}&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(5)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcja autokowariancji może osiągać dowolne wartości, dlatego aby można było porównać przebieg tej funkcji np. pomiędzy dwoma sygnałami, wprowadzono wersję znormalizowaną tej funkcji &amp;amp;mdash; ''funkcję autokorelacji''. Normalizacja ta wygląda następująco:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid84&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\rho (k) = \frac{\gamma (\tau )}{\sigma^2}&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(6)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid85&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\sigma ^2 = \mathrm{E}[(x(t)-\mu )^2]&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(7)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wariancję sygnału (&amp;lt;math&amp;gt;\gamma (0)=\sigma ^2&amp;lt;/math&amp;gt;) można wyrazić przez funkcję autokowariancji dla przesunięcia &amp;lt;math&amp;gt;\tau =0&amp;lt;/math&amp;gt;.  Wynika z tego, że funkcja korelacji przyjmuje wartości z zakresu [&amp;amp;minus;1,&amp;amp;nbsp;1]. Ostatecznie estymator funkcji autokorelacji można zapisać jak poniżej:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid86&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\rho(k) = \frac{\gamma (k)}{\gamma (0)}&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(8)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcję autokorelacji estymuje się w celu określenia, w jakim stopniu wartości sygnału w danej chwili czasu wpływają na wartości sygnału w kolejnych chwilach czasu. Ma to kluczowe znaczenie przy rozpoznawaniu rodzaju procesów fizycznych odpowiedzialnego za generowanie sygnału. Funkcja ta zawsze mam maksimum dla przesunięcia &amp;lt;math&amp;gt;\tau =0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cechą charakterystyczną funkcji autokorelacji jest to, iż w przypadku sygnałów harmonicznych, przebieg funkcji ma charakter okresowy, z okresem takim samym jak okres badanego sygnału. W przypadku szumu, funkcja autokorelacji ma kształt funkcji delta Diraca.&lt;br /&gt;
&lt;br /&gt;
==Polecenie:==&lt;br /&gt;
Do policzenia funkcji autokorelacji posłużymy się funkcją biblioteczną &amp;lt;tt&amp;gt;numpy.correlate&amp;lt;/tt&amp;gt;. Funkcja ta, wbrew nazwie, oblicza wyłącznie splot swoich dwóch pierwszych argumentów wywołania. Musimy je więc przystosować do obliczenia wielkości zgodnie ze wzorem (4).&lt;br /&gt;
&lt;br /&gt;
Zaimplementuj funkcję do obliczania funkcji korelacji zgodnie ze wzorem &amp;lt;xr id=&amp;quot;uid82&amp;quot;&amp;gt;(%i)&amp;lt;/xr&amp;gt;. Funkcja powinna przyjmować jako parametry dwa wektory&amp;lt;!--i maksymalne przesunięcie wzajemne tych wektorów--&amp;gt;, a zwracać wektor zawierający ich funkcję autokorelacji. &lt;br /&gt;
&lt;br /&gt;
Wywołanie przykładowe:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
print koreluj(a,a)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
powinno dać wynik:&lt;br /&gt;
 [-0.5  0.   1.   0.  -0.5]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
# Średnia&lt;br /&gt;
mean = numpy.mean(data)&lt;br /&gt;
mean2 = numpy.mean(data2)&lt;br /&gt;
&lt;br /&gt;
# Wariancja&lt;br /&gt;
var = numpy.var(data)&lt;br /&gt;
var2 = numpy.var(data2)&lt;br /&gt;
&lt;br /&gt;
# Dane po odjęciu średnich&lt;br /&gt;
ndata = data - mean&lt;br /&gt;
ndata2 = data2 - mean2&lt;br /&gt;
&lt;br /&gt;
# Splot&lt;br /&gt;
acorr = numpy.correlate(ndata, ndata2, 'full')&lt;br /&gt;
&lt;br /&gt;
# Normalizacja kowariancji do korelacji i przez 1/N&lt;br /&gt;
acorr = acorr / numpy.sqrt(var*var2) / len(ndata)&lt;br /&gt;
&lt;br /&gt;
print(acorr)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{{hidden begin|title=Przykładowe rozwiązanie:}}--&amp;gt;&lt;br /&gt;
 &amp;lt;!-- &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
def koreluj_pol(x,y,max_tau):&lt;br /&gt;
    x = x - np.mean(x)&lt;br /&gt;
    y = y - np.mean(y)&lt;br /&gt;
    N= len(x)&lt;br /&gt;
    cor = np.zeros(max_tau+1)&lt;br /&gt;
    cor[0] = np.sum(x[:]*y[:]) &lt;br /&gt;
    for i in range(1,max_tau+1):&lt;br /&gt;
        cor[i] = np.sum(x[i:]*y[:-i])&lt;br /&gt;
        &lt;br /&gt;
    cor = cor /(N-1)&lt;br /&gt;
    return cor&lt;br /&gt;
&lt;br /&gt;
def koreluj(x,y,max_tau):&lt;br /&gt;
    cor = np.zeros(2*max_tau+1)    &lt;br /&gt;
    cor[max_tau:] = koreluj_pol(x,y,max_tau)&lt;br /&gt;
    tmp = koreluj_pol(y,x,max_tau)&lt;br /&gt;
    cor[:max_tau+1] = tmp[-1::-1]&lt;br /&gt;
    return cor    &lt;br /&gt;
    &lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    print koreluj(a,a,i)&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
b = np.array([-1,-2,-3])&lt;br /&gt;
&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    print koreluj(a,b,i)&lt;br /&gt;
    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zadanie 1: Pomiar sygnału EEG ==&lt;br /&gt;
&lt;br /&gt;
Zarejestruj 10 minut sygnału EEG, w trakcie których badana osoba będzie siedziała z otwartymi oczami oraz kolejne 10 minut w stanie czuwania z zamkniętymi oczami. Rejestrację należy wykonać na pełnym czepku 10-20 z częstością próbkowania 128 Hz. &lt;br /&gt;
&lt;br /&gt;
==Zadanie 2:  Funkcje autokowariancji i autokorelacji==&lt;br /&gt;
W tym zadaniu posłużymy się sygnałami zarejestrowanymi w punkcie 3. poprzedniego ćwiczenia. Zaobserwuj, na którym kanale rytm alfa osiąga najwyższą wartość. Następnie zaimplementuj w Pythonie następujące kroki:&lt;br /&gt;
&lt;br /&gt;
#	Wczytaj dane z wybranego kanału.&lt;br /&gt;
#	Oblicz funkcję autokorelacji dla sygnału zarejestrowanego w warunkach, gdy osoba badana siedziała z otwartymi oczami. Narysuj autokorelogram, to jest wykres wartości funkcji autokorelacji względem przesunięcia &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt;. Oś &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; wyskaluj w sekundach.&lt;br /&gt;
#	Powtórz krok 2, tym razem dla sygnału zebranego w warunkach czuwania z zamkniętymi oczami.&lt;br /&gt;
#	Porównaj autokorelogramy.&lt;br /&gt;
&lt;br /&gt;
=Związek autokorelacji z widmem sygnału=&lt;br /&gt;
==Wstęp==&lt;br /&gt;
Zgodnie z twierdzeniem Chinczyna, z którym zapoznaliśmy się na wykładzie z [[Twierdzenie_Wienera-Chinczyna|Analizy Sygnałów]], widmową gęstość mocy sygnału można policzyć jako transformatę Fouriera funkcji autokowariancji:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid93&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
S(f) = \int _{-\infty }^{\infty }\gamma (\tau )e^{-2\pi i f \tau}d\tau &amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(9)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	&amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; &amp;amp;mdash; częstość&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	&amp;lt;math&amp;gt;S(f)&amp;lt;/math&amp;gt; &amp;amp;mdash;  gęstość widmowa mocy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Poniższy kod ilustruje to twierdzenie:&lt;br /&gt;
&amp;lt;source lang = py&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
from numpy.fft import rfft,fft,fftfreq,fftshift&lt;br /&gt;
 &lt;br /&gt;
def widmo_mocy(s, Fs):&lt;br /&gt;
    '''Funkcja licąca widmo mocy metodą periodogramu,&lt;br /&gt;
	pobiera sygnał i częstość próbkowania&lt;br /&gt;
	zwraca widmo mocy i oś częstości&lt;br /&gt;
    '''&lt;br /&gt;
    S = fft(s)/np.sqrt(len(s))&lt;br /&gt;
    S_moc = S*S.conj()&lt;br /&gt;
    S_moc = S_moc.real&lt;br /&gt;
    F = fftfreq(len(s), 1/Fs)&lt;br /&gt;
    return (fftshift(S_moc),fftshift(F))&lt;br /&gt;
 &lt;br /&gt;
def sin(f = 1, T = 1, Fs = 128, phi =0 ):&lt;br /&gt;
    '''sin o zadanej częstości (w Hz), długości, fazie i częstości próbkowania&lt;br /&gt;
    Domyślnie wytwarzany jest sygnał reprezentujący &lt;br /&gt;
    1 sekundę sinusa o częstości 1Hz i zerowej fazie próbkowanego 128 Hz&lt;br /&gt;
    '''&lt;br /&gt;
    dt = 1.0/Fs&lt;br /&gt;
    t = np.arange(0,T,dt)&lt;br /&gt;
    s = np.sin(2*np.pi*f*t + phi)&lt;br /&gt;
    return (s,t)&lt;br /&gt;
 &lt;br /&gt;
# sygnał próbny będzie próbkowany z częstością FS&lt;br /&gt;
FS = 100.0&lt;br /&gt;
# sygnałem próbnym będzie sinusoida o częstości f &lt;br /&gt;
(s,t) = sin(f=10.5,Fs=FS)&lt;br /&gt;
# obliczamy moc i energię sygnału w dziedzinie czasu&lt;br /&gt;
moc_w_czasie = s**2&lt;br /&gt;
energia_w_czasie = np.sum(moc_w_czasie)&lt;br /&gt;
print 'energia w czasie: ', energia_w_czasie&lt;br /&gt;
 &lt;br /&gt;
# obliczamy widmo mocy sygnału i jego energię estymowaną w dziedzinie częstości&lt;br /&gt;
(moc_w_czestosci, F) = widmo_mocy(s, Fs=FS)&lt;br /&gt;
energia_w_czestosci = np.sum(moc_w_czestosci)&lt;br /&gt;
print 'energia w czestosci: ', energia_w_czestosci&lt;br /&gt;
 &lt;br /&gt;
# estymujemy funkcję autokorelacji sygnału&lt;br /&gt;
ak = 1./(2*len(s)-1)*np.correlate(s,s,'full')&lt;br /&gt;
&lt;br /&gt;
# estymujemy widmo mocy i energię sygnału z twierdzenia Chinczyna korzystając z funkcji fft:&lt;br /&gt;
moc_chi = np.abs(fft(ak))&lt;br /&gt;
energia_chin = sum(moc_chi)&lt;br /&gt;
print 'energia z tw. Chinczyna przez fft: ', energia_chin&lt;br /&gt;
 &lt;br /&gt;
# estymujemy widmo mocy i energię sygnału z twierdzenia Chinczyna korzystając z jawnej postaci transformaty Fouriera:&lt;br /&gt;
FF = np.linspace(-FS/2,FS/2,1000)&lt;br /&gt;
M = np.zeros(len(FF),dtype='complex')&lt;br /&gt;
 &lt;br /&gt;
for i,f in enumerate( FF):&lt;br /&gt;
    for tau in range(len(ak)):&lt;br /&gt;
        M[i] += ak[tau]*np.exp(2*np.pi*1j*f*(len(ak)-tau)/FS) &lt;br /&gt;
M = np.abs(M)&lt;br /&gt;
energia_chin_sum = np.sum(M)* (len(ak)/len(FF))&lt;br /&gt;
print 'energia z tw. Chinczyna przez sumowanie: ', energia_chin_sum&lt;br /&gt;
&lt;br /&gt;
# Rysunki&lt;br /&gt;
py.figure(1)&lt;br /&gt;
py.subplot(3,1,1)&lt;br /&gt;
py.plot(t,s)&lt;br /&gt;
py.title(u'Sygnal')&lt;br /&gt;
py.subplot(3,1,2)&lt;br /&gt;
py.plot(t,moc_w_czasie)&lt;br /&gt;
py.title(u'moc w czasie')&lt;br /&gt;
py.subplot(3,1,3)&lt;br /&gt;
py.plot(F,moc_w_czestosci)&lt;br /&gt;
py.title(u'moc w czestosci')&lt;br /&gt;
 &lt;br /&gt;
py.figure(2)&lt;br /&gt;
py.subplot(3,1,1)&lt;br /&gt;
py.title('f. autokowariancji')&lt;br /&gt;
py.plot(np.arange(-len(ak)/2,len(ak)/2,1)/FS ,ak)&lt;br /&gt;
py.subplot(3,1,2)&lt;br /&gt;
py.plot(fftshift(fftfreq(len(moc_chi),1./FS)),fftshift(moc_chi))&lt;br /&gt;
py.title('widmo mocy z Tw. Chinczyna przez fft')&lt;br /&gt;
py.subplot(3,1,3)&lt;br /&gt;
py.plot(FF,M)&lt;br /&gt;
py.title('widmo mocy z Tw. Chinczyna przez sumowanie')&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W wyniku powinniśmy zobaczyć w terminalu:&lt;br /&gt;
 energia w czasie:  50.0&lt;br /&gt;
 energia w czestosci:  50.0&lt;br /&gt;
 energia z tw. Chinczyna przez fft:  50.0&lt;br /&gt;
 energia z tw. Chinczyna przez sumowanie:  49.9501172217&lt;br /&gt;
&lt;br /&gt;
oraz powinny pojawić się rysunki:&lt;br /&gt;
[[Plik:Fig_chinczyn1.png|thumb 200 px|center]]&lt;br /&gt;
[[Plik:Fig_chinczyn2.png|thumb 200 px|center]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Polecenie ==&lt;br /&gt;
Zaimplementuj funkcję obliczającą transformację Fouriera dyskretyzując wzór (9) dla zadanego wektora częstości &amp;lt;tt&amp;gt;f&amp;lt;/tt&amp;gt; i zadanej częstości próbkowania sygnału (tutaj: 10).&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Wywołanie przykładowe:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
t= np.arange(0,1,0.1)&lt;br /&gt;
x = np.sin(2*np.pi*2*t)&lt;br /&gt;
f = np.arange(-5,5,1)&lt;br /&gt;
X,f = fourier(x,f,10.0)&lt;br /&gt;
print X&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Natomiast wywołanie:&lt;br /&gt;
&amp;lt;source lang ='python'&amp;gt;&lt;br /&gt;
t= np.arange(0,1,0.1)&lt;br /&gt;
x = np.sin(2*np.pi*2*t)&lt;br /&gt;
f = np.arange(-5,5,0.01)&lt;br /&gt;
X = fourier(x,f,10.0)&lt;br /&gt;
py.plot(f,np.abs(X))&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Powinno wytworzyć rysunek:&lt;br /&gt;
&lt;br /&gt;
[[Plik:Fourier_test.png]] &lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
import numpy as np&lt;br /&gt;
import pylab as py&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def koreluj_pol(x,y,max_tau):&lt;br /&gt;
    x = x - np.mean(x)&lt;br /&gt;
    y = y - np.mean(y)&lt;br /&gt;
    N= len(x)&lt;br /&gt;
    cor = np.zeros(max_tau+1)&lt;br /&gt;
    cor[0] = np.sum(x[:]*y[:]) &lt;br /&gt;
    for i in range(1,max_tau+1):&lt;br /&gt;
        cor[i] = np.sum(x[i:]*y[:-i])&lt;br /&gt;
        &lt;br /&gt;
    cor = cor /(N)&lt;br /&gt;
    return cor&lt;br /&gt;
&lt;br /&gt;
def koreluj(x,y,max_tau):&lt;br /&gt;
    cor = np.zeros(2*max_tau+1)    &lt;br /&gt;
    cor[max_tau:] = koreluj_pol(x,y,max_tau)&lt;br /&gt;
    tmp = koreluj_pol(y,x,max_tau)&lt;br /&gt;
    cor[:max_tau+1] = tmp[-1::-1]&lt;br /&gt;
    return cor  &lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
def fourier_chin(x, FF, FS):&lt;br /&gt;
    ak = koreluj(x,x,len(x)-1)&lt;br /&gt;
    M = np.zeros(len(FF),dtype='complex') &lt;br /&gt;
    for i,f in enumerate( FF):&lt;br /&gt;
        for tau in range(len(ak)):&lt;br /&gt;
	    M[i] += ak[tau]*np.exp(-2*np.pi*1j*f*( tau- len(x))/FS)&lt;br /&gt;
    #M/=np.sqrt(len(ak))&lt;br /&gt;
    return M&lt;br /&gt;
    &lt;br /&gt;
def fourier(ak, FF, FS):&lt;br /&gt;
   &lt;br /&gt;
    M = np.zeros(len(FF),dtype='complex') &lt;br /&gt;
    for i,f in enumerate( FF):&lt;br /&gt;
        for tau in range(len(ak)):&lt;br /&gt;
	    M[i] += ak[tau]*np.exp(-2*np.pi*1j*f*( tau)/FS)&lt;br /&gt;
    M/=np.sqrt(len(ak))&lt;br /&gt;
    return M&lt;br /&gt;
t= np.arange(0,1,0.05)&lt;br /&gt;
x = np.sin(2*np.pi*2*t)&lt;br /&gt;
f = np.arange(-5,5,0.01)&lt;br /&gt;
&lt;br /&gt;
X = fourier_chin(x,f,10.0)&lt;br /&gt;
Xf = fourier(x,f,10.0)&lt;br /&gt;
print X&lt;br /&gt;
py.plot(f,np.abs(X), f,np.abs(Xf)**2)&lt;br /&gt;
py.show()&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zadanie 3: Związek autokorelacji z widmem sygnału==&lt;br /&gt;
Oblicz gęstość widmową mocy sygnału zarejestrowanego w trakcie czuwania z zamkniętymi oczami, korzystając z twierdzenia Chinczyna oraz [[Nieparametryczne_widmo_mocy#Metoda_Welcha | metodą Welcha]].&lt;br /&gt;
Znajdź częstość rytmu &amp;amp;alpha; dla osoby, która była badana.&lt;br /&gt;
&lt;br /&gt;
==Funkcja kowariancji (wzajemnej)==&lt;br /&gt;
&lt;br /&gt;
W celu scharakteryzowania zależności wzajemnej dwóch sygnałów losowych, stosuje się funkcję kowariancji, zdefiniowaną w następujący sposób:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid98&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy} (\tau ) = \mathrm{cov}(x(t),y(t-\tau ))=\mathrm{E}[(x(t)-\mu _x)(y(t-\tau )-\mu _y)]&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid99&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\mu _x = \mathrm{E}[x(t)]\\&lt;br /&gt;
\mu _y = \mathrm{E}[y(t)]\\ \end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W przypadku sygnałów ciągłych estymatę tę można zapisać w poniższy sposób:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid100&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy} (\tau ) = \frac{1}{T}\int _0^{T}(x(t)-\mu_x)(y(t-\tau)-\mu_y)dt&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
natomiast dla sygnałów dyskretnych jako:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid101&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy}(k) = \frac{1}{N-1}\sum _{i=0}^{N-k}(x(i+k)-x_s)(y(i)-y_s)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W odróżnieniu od funkcji autokowariancji, funkcja kowariancji nie musi mieć maksimum dla przesunięcia &amp;lt;math&amp;gt;\tau =0&amp;lt;/math&amp;gt;. Ponadto posiada ona następującą cechę:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid102&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy}(-\tau ) = \gamma _{yx}(\tau )&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcję kowariancji można znormalizować:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid103&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\rho (\tau) = \frac{\mathrm{E}[(x(t)-\mu _x)(y(t-\tau )-\mu _y)]}{\sqrt{\mathrm{E}[(x(t)-\mu _x)^2]\mathrm{E}[(y(t)-\mu _y)^2]}} = \frac{\gamma _{xy}}{\sigma_x\sigma_y}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
Otrzymaną funkcję nazywamy funkcją korelacji.&lt;br /&gt;
Jednym z zastosowań funkcji korelacji jest wyznaczanie czasu przejścia sygnału przez dany układ liniowy. Funkcja korelacji pomiędzy sygnałem na wejściu układu i sygnałem na jego wyjściu osiągnie wartość maksymalną dla przesunięcia &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; równego czasowi, jaki potrzebował sygnał na pokonanie danego układu. Niestety, taka metoda wyznaczania opóźnienia obarczona jest pewną wadą &amp;amp;mdash; w przypadku gdy prędkość sygnału bądź jego droga zależą od częstości, wtedy na wykresie funkcji korelacji nie uzyskamy wyraźnego maksimum.&lt;br /&gt;
&lt;br /&gt;
=====Polecenie =====&lt;br /&gt;
Zaimplementuj funkcję obliczającą funkcję kowariancji dla różnych sygnałów ''x'' i ''y'' (równanie&amp;lt;xr id=&amp;quot;uid98&amp;quot;&amp;gt; %i&amp;lt;/xr&amp;gt;)&amp;lt;!-- skorzystaj przy tym z własności opisanej równaniem &amp;lt;xr id=&amp;quot;uid98&amp;quot;&amp;gt;(%i)&amp;lt;/xr&amp;gt;--&amp;gt;. &lt;br /&gt;
Przykładowe wywołanie:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
b = np.array([-1,-2,-3])&lt;br /&gt;
&lt;br /&gt;
print koreluj(a,b)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
powinno dać w wyniku:&lt;br /&gt;
 [ 0.5 0.  -1.   0.   0.5]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
{{hidden begin|title=Przykładowe rozwiązanie:}}&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import pylab as py&lt;br /&gt;
&lt;br /&gt;
def koreluj(x,y,max_tau):&lt;br /&gt;
    x = x - np.mean(x)&lt;br /&gt;
    y = y - np.mean(y)&lt;br /&gt;
    cor = np.zeros(2*max_tau+1)&lt;br /&gt;
    cor[max_tau] = np.sum(x[:]*y[:]) &lt;br /&gt;
    for i in range(1,max_tau+1):&lt;br /&gt;
        cor[max_tau+i] = np.sum(x[i:]*y[:-i])&lt;br /&gt;
        cor[max_tau-i] = np.sum(y[i:]*x[:-i])&lt;br /&gt;
    N= len(x)&lt;br /&gt;
    cor = cor /(N-1)&lt;br /&gt;
    return cor&lt;br /&gt;
&lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
b = np.array([-1,-2,-3])&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    print koreluj(a,b,i)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}} --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadanie 4===&lt;br /&gt;
Z danych zarejestrowanych w trakcie czuwania z zamkniętymi oczami wybierz sygnały z następujących kanałów: Fp1, P3, Pz, P4, Fp2, O1, O2.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Dla każdego kanału oblicz funkcję autokorelacji, zaś  dla każdej pary kanałów oblicz funkcję korelacji wzajemnej. Wyniki zaprezentuj w formie kwadratowej macierzy wykresów (za pomocą funkcji subplot, tak jak na przykładowym rys. (rys. &amp;lt;xr id=&amp;quot;uid9&amp;quot;&amp;gt; %i&amp;lt;/xr&amp;gt;)). Na przekątnej macierzy narysuj funkcję autokorelacji odpowiednich kanałów, poza przekątną &amp;amp;mdash; funkcję korelacji wzajemnej. Wskaż kanały, które są najbardziej skorelowane ze sobą. Czy możliwe jest wyznaczenie opóźnienia sygnału pomiędzy tymi kanałami?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Powtórz punkt 1, tym razem jednak funkcję autokorelacji i korelacji wzajemnej oblicz na sygnałach przefiltrowanych filtrem wąskopasmowym w paśmie alfa charakterystycznym dla badanej osoby. ([[%C4%86wiczenia_7#Funkcje_do_projektowania_filtr.C3.B3w_IIR_dost.C4.99pne_w_module_scipy.signal|przypomnienie konstrukcji filtrów]])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Oszacuj istotność statystyczną zależności między parami kanałów. Twoją hipotezą zerową jest brak istotnej korelacji pomiędzy sygnałami zarejestrowanymi przez dwie różne elektrody EEG. Hipoteza alternatywna to występowanie zależności pomiędzy tymi sygnałami. Podanie estymatorów wariancji funkcji korelacji jest bardzo trudne, dlatego jednym ze sposobów oszacowania progu powyżej którego wartość funkcji korelacji można byłoby uznać za istotną statystycznie, jest zastosowanie metody ''bootstrap''. Teoretycznie, funkcja korelacji policzona dla dwóch rzeczywistych, nieskorelowanych sygnałów, powinna wynosić 0 dla każdego przesunięcia &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt;. Tak jest jednak w przypadku sygnałów nieskończonych; w analizie sygnałów takowych nie spotkamy.&lt;br /&gt;
&lt;br /&gt;
Dokonując losowej zamiany kolejności próbek, możemy doprowadzić do wytworzenia sygnałów zależnych losowo, które jednak ze względu na skończony czas trwania, dadzą niezerową funkcję korelacji. Poziom losowych fluktuacji tej funkcji oszacujemy wykonując następujące kroki:&lt;br /&gt;
&amp;lt;ol type=&amp;quot;A&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Losowa zamiana kolejności próbek w analizowanych sygnałach. Jeżeli pomiędzy dwoma sygnałami istnieją jakieś zależności, losowa zamiana próbek doprowadzi do zniszczenia tych związków. W ten sposób uzyskujemy sygnały, które teoretycznie są nieskorelowane.&lt;br /&gt;
&amp;lt;li&amp;gt; Obliczenie funkcji  korelacji wzajemnej dla sygnałów policzonych w punkcie A.&lt;br /&gt;
&amp;lt;li&amp;gt; Powtórzenie kroków A i B wiele (np. 1000) razy.&lt;br /&gt;
&amp;lt;li&amp;gt; Oszacowanie 95% przedziału ufności dla wartości średniej funkcji korelacji wzajemnej dla danego przesunięcia &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; korzystając z otrzymanego w kroku C empirycznego rozkładu wartości tych funkcji dla sygnałów niezależnych.  &lt;br /&gt;
&amp;lt;li&amp;gt; Powtórzenie kroków A-D dla kolejnych przesunięć &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;li&amp;gt; Sprawdzenie, dla których przesunięć &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; funkcje autokorelacji i korelacji obliczone dla oryginalnych sygnałów uzyskały wartości wyższe niż wartości progowe oszacowane dla sygnałów o losowych zależnościach.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Procedura opisana powyżej ma jednak '''zasadniczą wadę'''. Staramy się w niej oszacować poziom przypadkowych korelacji pomiędzy dwoma sygnałami dla kolejnych przesunięć &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt;, co jest niczym innym jak wielokrotnym powtórzeniem pewnego testu. Obserwowanie korelacji dla wielu par kanałów równocześnie również prowadzi do zwiększenia szansy na zaobserwowanie ekstremalnie dużych fluktuacji.&lt;br /&gt;
Występuje tu zatem ''problem wielokrotnych porównań''.&lt;br /&gt;
Przypominamy, iż może to doprowadzić do przypadkowego uznania wyników jako &amp;amp;bdquo;istotnych&amp;amp;rdquo; statystycznie. Np. jeśli pojedynczy test wykonujemy na poziomie istotności 5% to dopuszczamy odrzucenie w 1 przypadku na 20 hipotezy zerowej pomimo, iż jest ona prawdziwa. Z drugiej jednak strony, jeśli powtórzymy wykonywany test 20 razy, to oczekujemy uzyskania 1 przypadku, w którym poziom ''p'' będzie mniejszy od 5% co jest przesłanką za odrzuceniem hipotezy zerowej. &lt;br /&gt;
&lt;br /&gt;
W przypadku wykonywania serii testów należałoby więc zastosować odpowiednie poprawki, np. [http://www.bmj.com/content/310/6973/170.full korektę Bonferroniego] czy [http://en.wikipedia.org/wiki/False_discovery_rate false discovery rate (FDR)]. Innym rozwiązaniem w analizowanym przez nas problemie jest zastosowanie tzw. statystyk wartości ekstremalnych, które prowadzą do następujących zmian w procedurze:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol type=&amp;quot;A&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;	Losowa zmiana kolejności próbek w analizowanych sygnałach (we wszystkich analizowanych kanałach). Jeżeli pomiędzy dwoma sygnałami istnieją jakieś zależności, losowa zamiana próbek doprowadzi do zniszczenia tych związków. W ten sposób uzyskujemy sygnały, które teoretycznie są nieskorelowane.&lt;br /&gt;
&amp;lt;li&amp;gt;	Obliczenie funkcji korelacji dla sygnałów otrzymanych w punkcie A.&lt;br /&gt;
&amp;lt;li&amp;gt;    Zapamiętanie maksymalnej wartości bezwzględnej funkcji korelacji z punktu B (maksimum bierzemy po wszystkich przesunięciach i po wszystkich parach kanałów; dla funkcji autokorelacji, ze względu na jej normalizację do 1 dla zerowego przesunięcia, tam maksymalnych wartości poszukujemy dla przesunięć innych niż 0).&lt;br /&gt;
&amp;lt;li&amp;gt;	Powtórzenie kroków A-C 1000 razy. Uzyskamy w ten sposób rozkład maksymalnych wartości funkcji korelacji możliwych do zaobserwowania dla sygnałów niezależnych.&lt;br /&gt;
&amp;lt;li&amp;gt;    Wyznaczenie 95 centyla rozkładu wartości maksymalnych.&lt;br /&gt;
&amp;lt;li&amp;gt;	Nałożenie na rysunki funkcji korelacji uzyskane w Zadaniu 2 poziomych linii symbolizujących poziom zależności dwóch sygnałów o losowych zależnościach i sprawdzenie, dla których przesunięć &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; wartości funkcji korelacji przekraczają estymowane progi istotności statystycznej.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Plik:Korelacje_wzajemne.png|700px|center|thumb|&amp;lt;figure id=&amp;quot;uid9&amp;quot; /&amp;gt;Przykład wyniku analizy korelacji wzajemnych dla sygnału niefiltrowanego z naniesionymi granicami możliwych fluktuacji.]]&lt;br /&gt;
&lt;br /&gt;
==Wzajemna gęstość widmowa sygnałów==&lt;br /&gt;
&lt;br /&gt;
Podobnie jak w przypadku twierdzenia Chinczyna dla pojedynczego sygnału, możliwe jest policzenie transformaty Fouriera funkcji kowariancji. Uzyskana w ten sposób wielkość nazywa się funkcją wzajemnej gęstości mocy widmowej sygnału:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid122&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
S_{xy}(f) = \int _{-\infty }^{\infty }\gamma_{xy}(\tau )e^{-2\pi i f \tau}d\tau &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W celu dalszego omówienia własności funkcji wzajemnej mocy widmowej sygnałów funkcję tę zapiszemy w postaci:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid123&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
S_{xy}(f) = |S_{xy}(f)|e^{i\phi _{xy}(f)}\\&lt;br /&gt;
\\&lt;br /&gt;
\phi _{xy} = \arg(S_{xy}) &lt;br /&gt;
\end{array} &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&amp;lt;!-- \mathrm{arc\,tg}\left[\frac{\mathrm{Im}(S_{xy}(f))}{\mathrm{Re}(S_{xy}(f))}\right]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wartość bezwzględna funkcji wzajemnej gęstości mocy widmowej osiąga największą wartość dla '''częstości''', w których sygnały &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;y(t)&amp;lt;/math&amp;gt; są ze sobą skorelowane. Funkcja wzajemnej mocy widmowej sygnałów pozbawiona jest zatem wady, która charakteryzowała funkcję korelacji, to jest problemu z wyznaczeniem czasu transmisji sygnału, w przypadku gdy czas ten zależał od częstości. Przy pomocy funkcji wzajemnej mocy widmowej, czas ten można oszacować przy pomocy fazy tej funkcji &amp;amp;mdash; &amp;lt;math&amp;gt;\phi _{xy}(f)&amp;lt;/math&amp;gt;. Jeśli funkcja wzajemnej mocy widmowej została wyznaczona pomiędzy sygnałami na wejściu i wyjściu układu liniowego, to faza ta reprezentuje przesunięcie fazowe sygnału przy przejściu przez układ. Czas tego przejścia można oszacować za pomocą następującej wyrażenia:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid124&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\tau = \frac{\phi _{xy}(f)}{2\pi f}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Podobnie jak w przypadku funkcji autokorelacji i korelacji wzajemnej, funkcję wzajemnej gęstości mocy widmowej można znormalizować:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid125&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
C_{xy}(f) = \frac{S_{xy}(f)}{\sqrt{S_x(f)S_y(f)}}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Znormalizowaną postać funkcji wzajemnej gęstości mocy widmowej nazywamy funkcją ''koherencji''. &lt;br /&gt;
Koherencja jest wielkością zespoloną. Faza koherencji odzwierciedla różnicę faz pomiędzy dwoma sygnałami. Moduł koherencji reprezentuje stopień synchronizacji sygnałów i zawiera się w przedziale od 0.0 do 1.0. Moduł tej funkcji zawiera się w przedziale od 0 do 1. Wartości 0 odpowiada brak synchronizacji pomiędzy sygnałami, zaś wartości 1 pełna synchronizacja dwóch przebiegów czasowych. Należy również zwrócić uwagę na nazewnictwo - często sam moduł koherencji określany jest jako koherencja, w literaturze anglojęzycznej moduł koherencji posiada jednak odrębną nazwę: Magnitude Square Coherence (MSC). Istotny jest również sposób estymacji modułu koherencji, który wyprowadzono w następnym rozdziale, zaś sam estymator reprezentuje wzór (36).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadanie 5===&lt;br /&gt;
Zaimplementuj funkcję obliczającą wzajemną gęstość widmową dla pary kanałów. &lt;br /&gt;
&amp;lt;!--Niech argumentami tej funkcji będą dwa wektory zawierające sygnały, zakres częstości, częstość próbkowania. --&amp;gt;&lt;br /&gt;
Oblicz i narysuj macierz gęstości widmowych (własnych i wzajemnych) dla kolejnych par kanałów (tych samych co w zadaniu 3). Wyniki zaprezentuj w postaci kwadratowej macierzy rysunków. Ponieważ są to funkcje zespolone, dobrze jest zaprezentować osobno ich wartość i fazę. Uzyskane wartości bezwzględne narysuj nad przekątną tej macierzy, a fazę pod przekątną.&lt;br /&gt;
&lt;br /&gt;
===Zadanie 6===&lt;br /&gt;
Przygotuj sygnał dwukanałowy, w którym jako pierwszy sygnał wybierz fragment sygnału EEG (z danych zebranych wcześniej) o długości 2000 próbek, a jako drugiego sygnału użyj tego samego fragmentu EEG, ale opóźnionego o wybraną liczbę (1 - 5) próbek. Oblicz widma wzajemne tych sygnałów i zaprezentuj ich fazy na rysunku. Na podstawie tych widm znajdź wartość przesunięcia czasowego tych sygnałów.&lt;br /&gt;
&lt;br /&gt;
Obliczenia powtórz w przypadku, gdy do drugiego sygnału dodany będzie szum o wariancji równej 0,25 wariancji oryginalnego sygnału.&lt;/div&gt;</summary>
		<author><name>Maciek</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG_2/EEG_wlasno%C5%9Bci_EEG_spoczynkowego&amp;diff=11192</id>
		<title>Pracownia EEG 2/EEG wlasności EEG spoczynkowego</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG_2/EEG_wlasno%C5%9Bci_EEG_spoczynkowego&amp;diff=11192"/>
		<updated>2024-11-22T16:44:41Z</updated>

		<summary type="html">&lt;p&gt;Maciek: /* Polecenie */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Pracownia EEG 2|Pracownia EEG 2]] / Własności EEG spoczynkowego: funkcja autokorelacji i widmo&lt;br /&gt;
&lt;br /&gt;
=Estymacja funkcji autokowariancji, autokorelacji i koherencji sygnału.=&lt;br /&gt;
==Wstęp==&lt;br /&gt;
Z funkcjami tymi spotkaliśmy się już na zajęciach z [[Ćwiczenia_4|analizy sygnałów]].&lt;br /&gt;
&lt;br /&gt;
Funkcja autokowariancji sygnału charakteryzuje liniową zależność wartości tego sygnału w danej określonej chwili czasu od wartości (tego samego sygnału) w innej chwili.&lt;br /&gt;
W przypadku [[Nieparametryczne_widmo_mocy#Sygna.C5.82y_stochastyczne  | stacjonarnych procesów stochastycznych]], przebieg tej funkcji nie zależy od czasu. &lt;br /&gt;
Oznacza to, że obliczając funkcję autokorelacji sygnału pomiędzy chwilą czasu &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;x(t+\tau )&amp;lt;/math&amp;gt; otrzymamy tę samą wartość, jak dla przypadku obliczania funkcji autokorelacji pomiędzy momentami &amp;lt;math&amp;gt;x(t + T)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;x(t + T+\tau )&amp;lt;/math&amp;gt;, gdzie &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; to dowolny przedział czasu. Innymi słowy, funkcja autokorelacji procesu stacjonarnego zależy tylko od odstępu czasu pomiędzy próbkami &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt;, dla którego jest wyznaczana, a nie od konkretnej chwili czasu. Odrębną klasę sygnałów stanowią procesy niestacjonarne, w przypadku których funkcja autokorelacji będzie zależeć od czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; w którym jest obliczana. Estymator funkcji autokowariancji uzyskuje się poprzez obliczanie iloczynów wartości sygnału &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; w chwilach czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; czyli &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; i wartości sygnału &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; w chwili czasu ''t''+&amp;amp;tau; czyli &amp;lt;math&amp;gt;x(t+\tau)&amp;lt;/math&amp;gt; i uśredniając wartości iloczynów po czasie &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid79&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma (\tau) = \mathrm{cov}(x(t),x(t-\tau ))=\mathrm{E}[(x(t)-\mu )(x(t-\tau )-\mu )]&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(1)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid80&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\mu = \mathrm{E}[x(t)]&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(2)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W przypadku sygnałów ciągłych estymatę tę można zapisać w poniższy sposób:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid81&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma (\tau ) = \frac{1}{T}\int _0^{T}(x(t)-\mu )(x(t-\tau )-\mu )dt&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(3)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
natomiast dla sygnałów dyskretnych jako:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid82&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma (k) = \frac{1}{N-1}\sum _{i=1}^{N-|k|}(x(i+k)-x_s)(x(i)-x_s)&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(4)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid83&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
x_s = \frac{\sum _{i=1}^{N}x(i)}{N}&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(5)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcja autokowariancji może osiągać dowolne wartości, dlatego aby można było porównać przebieg tej funkcji np. pomiędzy dwoma sygnałami, wprowadzono wersję znormalizowaną tej funkcji &amp;amp;mdash; ''funkcję autokorelacji''. Normalizacja ta wygląda następująco:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid84&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\rho (k) = \frac{\gamma (\tau )}{\sigma^2}&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(6)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid85&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\sigma ^2 = \mathrm{E}[(x(t)-\mu )^2]&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(7)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wariancję sygnału (&amp;lt;math&amp;gt;\gamma (0)=\sigma ^2&amp;lt;/math&amp;gt;) można wyrazić przez funkcję autokowariancji dla przesunięcia &amp;lt;math&amp;gt;\tau =0&amp;lt;/math&amp;gt;.  Wynika z tego, że funkcja korelacji przyjmuje wartości z zakresu [&amp;amp;minus;1,&amp;amp;nbsp;1]. Ostatecznie estymator funkcji autokorelacji można zapisać jak poniżej:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid86&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\rho(k) = \frac{\gamma (k)}{\gamma (0)}&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(8)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcję autokorelacji estymuje się w celu określenia, w jakim stopniu wartości sygnału w danej chwili czasu wpływają na wartości sygnału w kolejnych chwilach czasu. Ma to kluczowe znaczenie przy rozpoznawaniu rodzaju procesów fizycznych odpowiedzialnego za generowanie sygnału. Funkcja ta zawsze mam maksimum dla przesunięcia &amp;lt;math&amp;gt;\tau =0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cechą charakterystyczną funkcji autokorelacji jest to, iż w przypadku sygnałów harmonicznych, przebieg funkcji ma charakter okresowy, z okresem takim samym jak okres badanego sygnału. W przypadku szumu, funkcja autokorelacji ma kształt funkcji delta Diraca.&lt;br /&gt;
&lt;br /&gt;
==Polecenie:==&lt;br /&gt;
Do policzenia funkcji autokorelacji posłużymy się funkcją biblioteczną &amp;lt;tt&amp;gt;numpy.correlate&amp;lt;/tt&amp;gt;. Funkcja ta, wbrew nazwie, oblicza wyłącznie splot swoich dwóch pierwszych argumentów wywołania. Musimy je więc przystosować do obliczenia wielkości zgodnie ze wzorem (4).&lt;br /&gt;
&lt;br /&gt;
Zaimplementuj funkcję do obliczania funkcji korelacji zgodnie ze wzorem &amp;lt;xr id=&amp;quot;uid82&amp;quot;&amp;gt;(%i)&amp;lt;/xr&amp;gt;. Funkcja powinna przyjmować jako parametry dwa wektory&amp;lt;!--i maksymalne przesunięcie wzajemne tych wektorów--&amp;gt;, a zwracać wektor zawierający ich funkcję autokorelacji. &lt;br /&gt;
&lt;br /&gt;
Wywołanie przykładowe:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
print koreluj(a,a)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
powinno dać wynik:&lt;br /&gt;
 [-0.5  0.   1.   0.  -0.5]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
# Średnia&lt;br /&gt;
mean = numpy.mean(data)&lt;br /&gt;
mean2 = numpy.mean(data2)&lt;br /&gt;
&lt;br /&gt;
# Wariancja&lt;br /&gt;
var = numpy.var(data)&lt;br /&gt;
var2 = numpy.var(data2)&lt;br /&gt;
&lt;br /&gt;
# Dane po odjęciu średnich&lt;br /&gt;
ndata = data - mean&lt;br /&gt;
ndata2 = data2 - mean2&lt;br /&gt;
&lt;br /&gt;
# Splot&lt;br /&gt;
acorr = numpy.correlate(ndata, ndata2, 'full')&lt;br /&gt;
&lt;br /&gt;
# Normalizacja kowariancji do korelacji i przez 1/N&lt;br /&gt;
acorr = acorr / numpy.sqrt(var*var2) / len(ndata)&lt;br /&gt;
&lt;br /&gt;
print(acorr)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{{hidden begin|title=Przykładowe rozwiązanie:}}--&amp;gt;&lt;br /&gt;
 &amp;lt;!-- &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
def koreluj_pol(x,y,max_tau):&lt;br /&gt;
    x = x - np.mean(x)&lt;br /&gt;
    y = y - np.mean(y)&lt;br /&gt;
    N= len(x)&lt;br /&gt;
    cor = np.zeros(max_tau+1)&lt;br /&gt;
    cor[0] = np.sum(x[:]*y[:]) &lt;br /&gt;
    for i in range(1,max_tau+1):&lt;br /&gt;
        cor[i] = np.sum(x[i:]*y[:-i])&lt;br /&gt;
        &lt;br /&gt;
    cor = cor /(N-1)&lt;br /&gt;
    return cor&lt;br /&gt;
&lt;br /&gt;
def koreluj(x,y,max_tau):&lt;br /&gt;
    cor = np.zeros(2*max_tau+1)    &lt;br /&gt;
    cor[max_tau:] = koreluj_pol(x,y,max_tau)&lt;br /&gt;
    tmp = koreluj_pol(y,x,max_tau)&lt;br /&gt;
    cor[:max_tau+1] = tmp[-1::-1]&lt;br /&gt;
    return cor    &lt;br /&gt;
    &lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    print koreluj(a,a,i)&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
b = np.array([-1,-2,-3])&lt;br /&gt;
&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    print koreluj(a,b,i)&lt;br /&gt;
    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zadanie 1: Pomiar sygnału EEG ==&lt;br /&gt;
&lt;br /&gt;
Zarejestruj 10 minut sygnału EEG, w trakcie których badana osoba będzie siedziała z otwartymi oczami oraz kolejne 10 minut w stanie czuwania z zamkniętymi oczami. Rejestrację należy wykonać na pełnym czepku 10-20 z częstością próbkowania 128 Hz. &lt;br /&gt;
&lt;br /&gt;
==Zadanie 2:  Funkcje autokowariancji i autokorelacji==&lt;br /&gt;
W tym zadaniu posłużymy się sygnałami zarejestrowanymi w punkcie 3. poprzedniego ćwiczenia. Zaobserwuj, na którym kanale rytm alfa osiąga najwyższą wartość. Następnie zaimplementuj w Pythonie następujące kroki:&lt;br /&gt;
&lt;br /&gt;
#	Wczytaj dane z wybranego kanału.&lt;br /&gt;
#	Oblicz funkcję autokorelacji dla sygnału zarejestrowanego w warunkach, gdy osoba badana siedziała z otwartymi oczami. Narysuj autokorelogram, to jest wykres wartości funkcji autokorelacji względem przesunięcia &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt;. Oś &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; wyskaluj w sekundach.&lt;br /&gt;
#	Powtórz krok 2, tym razem dla sygnału zebranego w warunkach czuwania z zamkniętymi oczami.&lt;br /&gt;
#	Porównaj autokorelogramy.&lt;br /&gt;
&lt;br /&gt;
=Związek autokorelacji z widmem sygnału=&lt;br /&gt;
==Wstęp==&lt;br /&gt;
Zgodnie z twierdzeniem Chinczyna, z którym zapoznaliśmy się na wykładzie z [[Twierdzenie_Wienera-Chinczyna|Analizy Sygnałów]], widmową gęstość mocy sygnału można policzyć jako transformatę Fouriera funkcji autokowariancji:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid93&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
S(f) = \int _{-\infty }^{\infty }\gamma (\tau )e^{-2\pi i f \tau}d\tau &amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(9)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	&amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; &amp;amp;mdash; częstość&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	&amp;lt;math&amp;gt;S(f)&amp;lt;/math&amp;gt; &amp;amp;mdash;  gęstość widmowa mocy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Poniższy kod ilustruje to twierdzenie:&lt;br /&gt;
&amp;lt;source lang = py&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
from numpy.fft import rfft,fft,fftfreq,fftshift&lt;br /&gt;
 &lt;br /&gt;
def widmo_mocy(s, Fs):&lt;br /&gt;
    '''Funkcja licąca widmo mocy metodą periodogramu,&lt;br /&gt;
	pobiera sygnał i częstość próbkowania&lt;br /&gt;
	zwraca widmo mocy i oś częstości&lt;br /&gt;
    '''&lt;br /&gt;
    S = fft(s)/np.sqrt(len(s))&lt;br /&gt;
    S_moc = S*S.conj()&lt;br /&gt;
    S_moc = S_moc.real&lt;br /&gt;
    F = fftfreq(len(s), 1/Fs)&lt;br /&gt;
    return (fftshift(S_moc),fftshift(F))&lt;br /&gt;
 &lt;br /&gt;
def sin(f = 1, T = 1, Fs = 128, phi =0 ):&lt;br /&gt;
    '''sin o zadanej częstości (w Hz), długości, fazie i częstości próbkowania&lt;br /&gt;
    Domyślnie wytwarzany jest sygnał reprezentujący &lt;br /&gt;
    1 sekundę sinusa o częstości 1Hz i zerowej fazie próbkowanego 128 Hz&lt;br /&gt;
    '''&lt;br /&gt;
    dt = 1.0/Fs&lt;br /&gt;
    t = np.arange(0,T,dt)&lt;br /&gt;
    s = np.sin(2*np.pi*f*t + phi)&lt;br /&gt;
    return (s,t)&lt;br /&gt;
 &lt;br /&gt;
# sygnał próbny będzie próbkowany z częstością FS&lt;br /&gt;
FS = 100.0&lt;br /&gt;
# sygnałem próbnym będzie sinusoida o częstości f &lt;br /&gt;
(s,t) = sin(f=10.5,Fs=FS)&lt;br /&gt;
# obliczamy moc i energię sygnału w dziedzinie czasu&lt;br /&gt;
moc_w_czasie = s**2&lt;br /&gt;
energia_w_czasie = np.sum(moc_w_czasie)&lt;br /&gt;
print 'energia w czasie: ', energia_w_czasie&lt;br /&gt;
 &lt;br /&gt;
# obliczamy widmo mocy sygnału i jego energię estymowaną w dziedzinie częstości&lt;br /&gt;
(moc_w_czestosci, F) = widmo_mocy(s, Fs=FS)&lt;br /&gt;
energia_w_czestosci = np.sum(moc_w_czestosci)&lt;br /&gt;
print 'energia w czestosci: ', energia_w_czestosci&lt;br /&gt;
 &lt;br /&gt;
# estymujemy funkcję autokorelacji sygnału&lt;br /&gt;
ak = 1./(2*len(s)-1)*np.correlate(s,s,'full')&lt;br /&gt;
&lt;br /&gt;
# estymujemy widmo mocy i energię sygnału z twierdzenia Chinczyna korzystając z funkcji fft:&lt;br /&gt;
moc_chi = np.abs(fft(ak))&lt;br /&gt;
energia_chin = sum(moc_chi)&lt;br /&gt;
print 'energia z tw. Chinczyna przez fft: ', energia_chin&lt;br /&gt;
 &lt;br /&gt;
# estymujemy widmo mocy i energię sygnału z twierdzenia Chinczyna korzystając z jawnej postaci transformaty Fouriera:&lt;br /&gt;
FF = np.linspace(-FS/2,FS/2,1000)&lt;br /&gt;
M = np.zeros(len(FF),dtype='complex')&lt;br /&gt;
 &lt;br /&gt;
for i,f in enumerate( FF):&lt;br /&gt;
    for tau in range(len(ak)):&lt;br /&gt;
        M[i] += ak[tau]*np.exp(2*np.pi*1j*f*(len(ak)-tau)/FS) &lt;br /&gt;
M = np.abs(M)&lt;br /&gt;
energia_chin_sum = np.sum(M)* (len(ak)/len(FF))&lt;br /&gt;
print 'energia z tw. Chinczyna przez sumowanie: ', energia_chin_sum&lt;br /&gt;
&lt;br /&gt;
# Rysunki&lt;br /&gt;
py.figure(1)&lt;br /&gt;
py.subplot(3,1,1)&lt;br /&gt;
py.plot(t,s)&lt;br /&gt;
py.title(u'Sygnal')&lt;br /&gt;
py.subplot(3,1,2)&lt;br /&gt;
py.plot(t,moc_w_czasie)&lt;br /&gt;
py.title(u'moc w czasie')&lt;br /&gt;
py.subplot(3,1,3)&lt;br /&gt;
py.plot(F,moc_w_czestosci)&lt;br /&gt;
py.title(u'moc w czestosci')&lt;br /&gt;
 &lt;br /&gt;
py.figure(2)&lt;br /&gt;
py.subplot(3,1,1)&lt;br /&gt;
py.title('f. autokowariancji')&lt;br /&gt;
py.plot(np.arange(-len(ak)/2,len(ak)/2,1)/FS ,ak)&lt;br /&gt;
py.subplot(3,1,2)&lt;br /&gt;
py.plot(fftshift(fftfreq(len(moc_chi),1./FS)),fftshift(moc_chi))&lt;br /&gt;
py.title('widmo mocy z Tw. Chinczyna przez fft')&lt;br /&gt;
py.subplot(3,1,3)&lt;br /&gt;
py.plot(FF,M)&lt;br /&gt;
py.title('widmo mocy z Tw. Chinczyna przez sumowanie')&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W wyniku powinniśmy zobaczyć w terminalu:&lt;br /&gt;
 energia w czasie:  50.0&lt;br /&gt;
 energia w czestosci:  50.0&lt;br /&gt;
 energia z tw. Chinczyna przez fft:  50.0&lt;br /&gt;
 energia z tw. Chinczyna przez sumowanie:  49.9501172217&lt;br /&gt;
&lt;br /&gt;
oraz powinny pojawić się rysunki:&lt;br /&gt;
[[Plik:Fig_chinczyn1.png|thumb 200 px|center]]&lt;br /&gt;
[[Plik:Fig_chinczyn2.png|thumb 200 px|center]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Polecenie ==&lt;br /&gt;
Zaimplementuj funkcję obliczającą transformację Fouriera dyskretyzując wzór (9) dla zadanego wektora częstości &amp;lt;tt&amp;gt;f&amp;lt;/tt&amp;gt; i zadanej częstości próbkowania sygnału (tutaj: 10).&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Wywołanie przykładowe:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
t= np.arange(0,1,0.1)&lt;br /&gt;
x = np.sin(2*np.pi*2*t)&lt;br /&gt;
f = np.arange(-5,5,1)&lt;br /&gt;
X,f = fourier(x,f,10.0)&lt;br /&gt;
print X&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Natomiast wywołanie:&lt;br /&gt;
&amp;lt;source lang ='python'&amp;gt;&lt;br /&gt;
t= np.arange(0,1,0.1)&lt;br /&gt;
x = np.sin(2*np.pi*2*t)&lt;br /&gt;
f = np.arange(-5,5,0.01)&lt;br /&gt;
X = fourier(x,f,10.0)&lt;br /&gt;
py.plot(f,np.abs(X))&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Powinno wytworzyć rysunek:&lt;br /&gt;
&lt;br /&gt;
[[Plik:Fourier_test.png]] &lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
import numpy as np&lt;br /&gt;
import pylab as py&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def koreluj_pol(x,y,max_tau):&lt;br /&gt;
    x = x - np.mean(x)&lt;br /&gt;
    y = y - np.mean(y)&lt;br /&gt;
    N= len(x)&lt;br /&gt;
    cor = np.zeros(max_tau+1)&lt;br /&gt;
    cor[0] = np.sum(x[:]*y[:]) &lt;br /&gt;
    for i in range(1,max_tau+1):&lt;br /&gt;
        cor[i] = np.sum(x[i:]*y[:-i])&lt;br /&gt;
        &lt;br /&gt;
    cor = cor /(N)&lt;br /&gt;
    return cor&lt;br /&gt;
&lt;br /&gt;
def koreluj(x,y,max_tau):&lt;br /&gt;
    cor = np.zeros(2*max_tau+1)    &lt;br /&gt;
    cor[max_tau:] = koreluj_pol(x,y,max_tau)&lt;br /&gt;
    tmp = koreluj_pol(y,x,max_tau)&lt;br /&gt;
    cor[:max_tau+1] = tmp[-1::-1]&lt;br /&gt;
    return cor  &lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
def fourier_chin(x, FF, FS):&lt;br /&gt;
    ak = koreluj(x,x,len(x)-1)&lt;br /&gt;
    M = np.zeros(len(FF),dtype='complex') &lt;br /&gt;
    for i,f in enumerate( FF):&lt;br /&gt;
        for tau in range(len(ak)):&lt;br /&gt;
	    M[i] += ak[tau]*np.exp(-2*np.pi*1j*f*( tau- len(x))/FS)&lt;br /&gt;
    #M/=np.sqrt(len(ak))&lt;br /&gt;
    return M&lt;br /&gt;
    &lt;br /&gt;
def fourier(ak, FF, FS):&lt;br /&gt;
   &lt;br /&gt;
    M = np.zeros(len(FF),dtype='complex') &lt;br /&gt;
    for i,f in enumerate( FF):&lt;br /&gt;
        for tau in range(len(ak)):&lt;br /&gt;
	    M[i] += ak[tau]*np.exp(-2*np.pi*1j*f*( tau)/FS)&lt;br /&gt;
    M/=np.sqrt(len(ak))&lt;br /&gt;
    return M&lt;br /&gt;
t= np.arange(0,1,0.05)&lt;br /&gt;
x = np.sin(2*np.pi*2*t)&lt;br /&gt;
f = np.arange(-5,5,0.01)&lt;br /&gt;
&lt;br /&gt;
X = fourier_chin(x,f,10.0)&lt;br /&gt;
Xf = fourier(x,f,10.0)&lt;br /&gt;
print X&lt;br /&gt;
py.plot(f,np.abs(X), f,np.abs(Xf)**2)&lt;br /&gt;
py.show()&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zadanie 3: Związek autokorelacji z widmem sygnału==&lt;br /&gt;
Oblicz gęstość widmową mocy sygnału zarejestrowanego w trakcie czuwania z zamkniętymi oczami, korzystając z twierdzenia Chinczyna oraz [[Nieparametryczne_widmo_mocy#Metoda_Welcha | metodą Welcha]].&lt;br /&gt;
Znajdź częstość rytmu &amp;amp;alpha; dla osoby, która była badana.&lt;br /&gt;
&lt;br /&gt;
==Funkcja kowariancji (wzajemnej)==&lt;br /&gt;
&lt;br /&gt;
W celu scharakteryzowania zależności wzajemnej dwóch sygnałów losowych, stosuje się funkcję kowariancji, zdefiniowaną w następujący sposób:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid98&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy} (\tau ) = \mathrm{cov}(x(t),y(t-\tau ))=\mathrm{E}[(x(t)-\mu _x)(y(t-\tau )-\mu _y)]&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid99&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\mu _x = \mathrm{E}[x(t)]\\&lt;br /&gt;
\mu _y = \mathrm{E}[y(t)]\\ \end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W przypadku sygnałów ciągłych estymatę tę można zapisać w poniższy sposób:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid100&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy} (\tau ) = \frac{1}{T}\int _0^{T}(x(t)-\mu_x)(y(t-\tau)-\mu_y)dt&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
natomiast dla sygnałów dyskretnych jako:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid101&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy}(k) = \frac{1}{N-1}\sum _{i=0}^{N-k}(x(i+k)-x_s)(y(i)-y_s)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W odróżnieniu od funkcji autokowariancji, funkcja kowariancji nie musi mieć maksimum dla przesunięcia &amp;lt;math&amp;gt;\tau =0&amp;lt;/math&amp;gt;. Ponadto posiada ona następującą cechę:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid102&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy}(-\tau ) = \gamma _{yx}(\tau )&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcję kowariancji można znormalizować:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid103&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\rho (\tau) = \frac{\mathrm{E}[(x(t)-\mu _x)(y(t-\tau )-\mu _y)]}{\sqrt{\mathrm{E}[(x(t)-\mu _x)^2]\mathrm{E}[(y(t)-\mu _y)^2]}} = \frac{\gamma _{xy}}{\sigma_x\sigma_y}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
Otrzymaną funkcję nazywamy funkcją korelacji.&lt;br /&gt;
Jednym z zastosowań funkcji korelacji jest wyznaczanie czasu przejścia sygnału przez dany układ liniowy. Funkcja korelacji pomiędzy sygnałem na wejściu układu i sygnałem na jego wyjściu osiągnie wartość maksymalną dla przesunięcia &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; równego czasowi, jaki potrzebował sygnał na pokonanie danego układu. Niestety, taka metoda wyznaczania opóźnienia obarczona jest pewną wadą &amp;amp;mdash; w przypadku gdy prędkość sygnału bądź jego droga zależą od częstości, wtedy na wykresie funkcji korelacji nie uzyskamy wyraźnego maksimum.&lt;br /&gt;
&lt;br /&gt;
=====Polecenie =====&lt;br /&gt;
Zaimplementuj funkcję obliczającą funkcję kowariancji dla różnych sygnałów ''x'' i ''y'' (równanie &amp;lt;xr id=&amp;quot;uid98&amp;quot;&amp;gt;%i&amp;lt;/xr&amp;gt;)&amp;lt;!-- skorzystaj przy tym z własności opisanej równaniem &amp;lt;xr id=&amp;quot;uid98&amp;quot;&amp;gt;(%i)&amp;lt;/xr&amp;gt;--&amp;gt;. &lt;br /&gt;
Przykładowe wywołanie:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
b = np.array([-1,-2,-3])&lt;br /&gt;
&lt;br /&gt;
print koreluj(a,b)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
powinno dać w wyniku:&lt;br /&gt;
 [ 0.5 0.  -1.   0.   0.5]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
{{hidden begin|title=Przykładowe rozwiązanie:}}&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import pylab as py&lt;br /&gt;
&lt;br /&gt;
def koreluj(x,y,max_tau):&lt;br /&gt;
    x = x - np.mean(x)&lt;br /&gt;
    y = y - np.mean(y)&lt;br /&gt;
    cor = np.zeros(2*max_tau+1)&lt;br /&gt;
    cor[max_tau] = np.sum(x[:]*y[:]) &lt;br /&gt;
    for i in range(1,max_tau+1):&lt;br /&gt;
        cor[max_tau+i] = np.sum(x[i:]*y[:-i])&lt;br /&gt;
        cor[max_tau-i] = np.sum(y[i:]*x[:-i])&lt;br /&gt;
    N= len(x)&lt;br /&gt;
    cor = cor /(N-1)&lt;br /&gt;
    return cor&lt;br /&gt;
&lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
b = np.array([-1,-2,-3])&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    print koreluj(a,b,i)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}} --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadanie 4===&lt;br /&gt;
Z danych zarejestrowanych w trakcie czuwania z zamkniętymi oczami wybierz sygnały z następujących kanałów: Fp1, P3, Pz, P4, Fp2, O1, O2.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Dla każdego kanału oblicz funkcję autokorelacji, zaś  dla każdej pary kanałów oblicz funkcję korelacji wzajemnej. Wyniki zaprezentuj w formie kwadratowej macierzy wykresów (za pomocą funkcji subplot, tak jak na przykładowym rys. (rys. &amp;lt;xr id=&amp;quot;uid9&amp;quot;&amp;gt; %i&amp;lt;/xr&amp;gt;)). Na przekątnej macierzy narysuj funkcję autokorelacji odpowiednich kanałów, poza przekątną &amp;amp;mdash; funkcję korelacji wzajemnej. Wskaż kanały, które są najbardziej skorelowane ze sobą. Czy możliwe jest wyznaczenie opóźnienia sygnału pomiędzy tymi kanałami?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Powtórz punkt 1, tym razem jednak funkcję autokorelacji i korelacji wzajemnej oblicz na sygnałach przefiltrowanych filtrem wąskopasmowym w paśmie alfa charakterystycznym dla badanej osoby. ([[%C4%86wiczenia_7#Funkcje_do_projektowania_filtr.C3.B3w_IIR_dost.C4.99pne_w_module_scipy.signal|przypomnienie konstrukcji filtrów]])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Oszacuj istotność statystyczną zależności między parami kanałów. Twoją hipotezą zerową jest brak istotnej korelacji pomiędzy sygnałami zarejestrowanymi przez dwie różne elektrody EEG. Hipoteza alternatywna to występowanie zależności pomiędzy tymi sygnałami. Podanie estymatorów wariancji funkcji korelacji jest bardzo trudne, dlatego jednym ze sposobów oszacowania progu powyżej którego wartość funkcji korelacji można byłoby uznać za istotną statystycznie, jest zastosowanie metody ''bootstrap''. Teoretycznie, funkcja korelacji policzona dla dwóch rzeczywistych, nieskorelowanych sygnałów, powinna wynosić 0 dla każdego przesunięcia &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt;. Tak jest jednak w przypadku sygnałów nieskończonych; w analizie sygnałów takowych nie spotkamy.&lt;br /&gt;
&lt;br /&gt;
Dokonując losowej zamiany kolejności próbek, możemy doprowadzić do wytworzenia sygnałów zależnych losowo, które jednak ze względu na skończony czas trwania, dadzą niezerową funkcję korelacji. Poziom losowych fluktuacji tej funkcji oszacujemy wykonując następujące kroki:&lt;br /&gt;
&amp;lt;ol type=&amp;quot;A&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Losowa zamiana kolejności próbek w analizowanych sygnałach. Jeżeli pomiędzy dwoma sygnałami istnieją jakieś zależności, losowa zamiana próbek doprowadzi do zniszczenia tych związków. W ten sposób uzyskujemy sygnały, które teoretycznie są nieskorelowane.&lt;br /&gt;
&amp;lt;li&amp;gt; Obliczenie funkcji  korelacji wzajemnej dla sygnałów policzonych w punkcie A.&lt;br /&gt;
&amp;lt;li&amp;gt; Powtórzenie kroków A i B wiele (np. 1000) razy.&lt;br /&gt;
&amp;lt;li&amp;gt; Oszacowanie 95% przedziału ufności dla wartości średniej funkcji korelacji wzajemnej dla danego przesunięcia &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; korzystając z otrzymanego w kroku C empirycznego rozkładu wartości tych funkcji dla sygnałów niezależnych.  &lt;br /&gt;
&amp;lt;li&amp;gt; Powtórzenie kroków A-D dla kolejnych przesunięć &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;li&amp;gt; Sprawdzenie, dla których przesunięć &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; funkcje autokorelacji i korelacji obliczone dla oryginalnych sygnałów uzyskały wartości wyższe niż wartości progowe oszacowane dla sygnałów o losowych zależnościach.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Procedura opisana powyżej ma jednak '''zasadniczą wadę'''. Staramy się w niej oszacować poziom przypadkowych korelacji pomiędzy dwoma sygnałami dla kolejnych przesunięć &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt;, co jest niczym innym jak wielokrotnym powtórzeniem pewnego testu. Obserwowanie korelacji dla wielu par kanałów równocześnie również prowadzi do zwiększenia szansy na zaobserwowanie ekstremalnie dużych fluktuacji.&lt;br /&gt;
Występuje tu zatem ''problem wielokrotnych porównań''.&lt;br /&gt;
Przypominamy, iż może to doprowadzić do przypadkowego uznania wyników jako &amp;amp;bdquo;istotnych&amp;amp;rdquo; statystycznie. Np. jeśli pojedynczy test wykonujemy na poziomie istotności 5% to dopuszczamy odrzucenie w 1 przypadku na 20 hipotezy zerowej pomimo, iż jest ona prawdziwa. Z drugiej jednak strony, jeśli powtórzymy wykonywany test 20 razy, to oczekujemy uzyskania 1 przypadku, w którym poziom ''p'' będzie mniejszy od 5% co jest przesłanką za odrzuceniem hipotezy zerowej. &lt;br /&gt;
&lt;br /&gt;
W przypadku wykonywania serii testów należałoby więc zastosować odpowiednie poprawki, np. [http://www.bmj.com/content/310/6973/170.full korektę Bonferroniego] czy [http://en.wikipedia.org/wiki/False_discovery_rate false discovery rate (FDR)]. Innym rozwiązaniem w analizowanym przez nas problemie jest zastosowanie tzw. statystyk wartości ekstremalnych, które prowadzą do następujących zmian w procedurze:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol type=&amp;quot;A&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;	Losowa zmiana kolejności próbek w analizowanych sygnałach (we wszystkich analizowanych kanałach). Jeżeli pomiędzy dwoma sygnałami istnieją jakieś zależności, losowa zamiana próbek doprowadzi do zniszczenia tych związków. W ten sposób uzyskujemy sygnały, które teoretycznie są nieskorelowane.&lt;br /&gt;
&amp;lt;li&amp;gt;	Obliczenie funkcji korelacji dla sygnałów otrzymanych w punkcie A.&lt;br /&gt;
&amp;lt;li&amp;gt;    Zapamiętanie maksymalnej wartości bezwzględnej funkcji korelacji z punktu B (maksimum bierzemy po wszystkich przesunięciach i po wszystkich parach kanałów; dla funkcji autokorelacji, ze względu na jej normalizację do 1 dla zerowego przesunięcia, tam maksymalnych wartości poszukujemy dla przesunięć innych niż 0).&lt;br /&gt;
&amp;lt;li&amp;gt;	Powtórzenie kroków A-C 1000 razy. Uzyskamy w ten sposób rozkład maksymalnych wartości funkcji korelacji możliwych do zaobserwowania dla sygnałów niezależnych.&lt;br /&gt;
&amp;lt;li&amp;gt;    Wyznaczenie 95 centyla rozkładu wartości maksymalnych.&lt;br /&gt;
&amp;lt;li&amp;gt;	Nałożenie na rysunki funkcji korelacji uzyskane w Zadaniu 2 poziomych linii symbolizujących poziom zależności dwóch sygnałów o losowych zależnościach i sprawdzenie, dla których przesunięć &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; wartości funkcji korelacji przekraczają estymowane progi istotności statystycznej.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Plik:Korelacje_wzajemne.png|700px|center|thumb|&amp;lt;figure id=&amp;quot;uid9&amp;quot; /&amp;gt;Przykład wyniku analizy korelacji wzajemnych dla sygnału niefiltrowanego z naniesionymi granicami możliwych fluktuacji.]]&lt;br /&gt;
&lt;br /&gt;
==Wzajemna gęstość widmowa sygnałów==&lt;br /&gt;
&lt;br /&gt;
Podobnie jak w przypadku twierdzenia Chinczyna dla pojedynczego sygnału, możliwe jest policzenie transformaty Fouriera funkcji kowariancji. Uzyskana w ten sposób wielkość nazywa się funkcją wzajemnej gęstości mocy widmowej sygnału:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid122&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
S_{xy}(f) = \int _{-\infty }^{\infty }\gamma_{xy}(\tau )e^{-2\pi i f \tau}d\tau &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W celu dalszego omówienia własności funkcji wzajemnej mocy widmowej sygnałów funkcję tę zapiszemy w postaci:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid123&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
S_{xy}(f) = |S_{xy}(f)|e^{i\phi _{xy}(f)}\\&lt;br /&gt;
\\&lt;br /&gt;
\phi _{xy} = \arg(S_{xy}) &lt;br /&gt;
\end{array} &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&amp;lt;!-- \mathrm{arc\,tg}\left[\frac{\mathrm{Im}(S_{xy}(f))}{\mathrm{Re}(S_{xy}(f))}\right]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wartość bezwzględna funkcji wzajemnej gęstości mocy widmowej osiąga największą wartość dla '''częstości''', w których sygnały &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;y(t)&amp;lt;/math&amp;gt; są ze sobą skorelowane. Funkcja wzajemnej mocy widmowej sygnałów pozbawiona jest zatem wady, która charakteryzowała funkcję korelacji, to jest problemu z wyznaczeniem czasu transmisji sygnału, w przypadku gdy czas ten zależał od częstości. Przy pomocy funkcji wzajemnej mocy widmowej, czas ten można oszacować przy pomocy fazy tej funkcji &amp;amp;mdash; &amp;lt;math&amp;gt;\phi _{xy}(f)&amp;lt;/math&amp;gt;. Jeśli funkcja wzajemnej mocy widmowej została wyznaczona pomiędzy sygnałami na wejściu i wyjściu układu liniowego, to faza ta reprezentuje przesunięcie fazowe sygnału przy przejściu przez układ. Czas tego przejścia można oszacować za pomocą następującej wyrażenia:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid124&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\tau = \frac{\phi _{xy}(f)}{2\pi f}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Podobnie jak w przypadku funkcji autokorelacji i korelacji wzajemnej, funkcję wzajemnej gęstości mocy widmowej można znormalizować:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid125&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
C_{xy}(f) = \frac{S_{xy}(f)}{\sqrt{S_x(f)S_y(f)}}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Znormalizowaną postać funkcji wzajemnej gęstości mocy widmowej nazywamy funkcją ''koherencji''. &lt;br /&gt;
Koherencja jest wielkością zespoloną. Faza koherencji odzwierciedla różnicę faz pomiędzy dwoma sygnałami. Moduł koherencji reprezentuje stopień synchronizacji sygnałów i zawiera się w przedziale od 0.0 do 1.0. Moduł tej funkcji zawiera się w przedziale od 0 do 1. Wartości 0 odpowiada brak synchronizacji pomiędzy sygnałami, zaś wartości 1 pełna synchronizacja dwóch przebiegów czasowych. Należy również zwrócić uwagę na nazewnictwo - często sam moduł koherencji określany jest jako koherencja, w literaturze anglojęzycznej moduł koherencji posiada jednak odrębną nazwę: Magnitude Square Coherence (MSC). Istotny jest również sposób estymacji modułu koherencji, który wyprowadzono w następnym rozdziale, zaś sam estymator reprezentuje wzór (36).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadanie 5===&lt;br /&gt;
Zaimplementuj funkcję obliczającą wzajemną gęstość widmową dla pary kanałów. &lt;br /&gt;
&amp;lt;!--Niech argumentami tej funkcji będą dwa wektory zawierające sygnały, zakres częstości, częstość próbkowania. --&amp;gt;&lt;br /&gt;
Oblicz i narysuj macierz gęstości widmowych (własnych i wzajemnych) dla kolejnych par kanałów (tych samych co w zadaniu 3). Wyniki zaprezentuj w postaci kwadratowej macierzy rysunków. Ponieważ są to funkcje zespolone, dobrze jest zaprezentować osobno ich wartość i fazę. Uzyskane wartości bezwzględne narysuj nad przekątną tej macierzy, a fazę pod przekątną.&lt;br /&gt;
&lt;br /&gt;
===Zadanie 6===&lt;br /&gt;
Przygotuj sygnał dwukanałowy, w którym jako pierwszy sygnał wybierz fragment sygnału EEG (z danych zebranych wcześniej) o długości 2000 próbek, a jako drugiego sygnału użyj tego samego fragmentu EEG, ale opóźnionego o wybraną liczbę (1 - 5) próbek. Oblicz widma wzajemne tych sygnałów i zaprezentuj ich fazy na rysunku. Na podstawie tych widm znajdź wartość przesunięcia czasowego tych sygnałów.&lt;br /&gt;
&lt;br /&gt;
Obliczenia powtórz w przypadku, gdy do drugiego sygnału dodany będzie szum o wariancji równej 0,25 wariancji oryginalnego sygnału.&lt;/div&gt;</summary>
		<author><name>Maciek</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG_2/EEG_wlasno%C5%9Bci_EEG_spoczynkowego&amp;diff=11191</id>
		<title>Pracownia EEG 2/EEG wlasności EEG spoczynkowego</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG_2/EEG_wlasno%C5%9Bci_EEG_spoczynkowego&amp;diff=11191"/>
		<updated>2024-11-22T16:44:04Z</updated>

		<summary type="html">&lt;p&gt;Maciek: /* Polecenie */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Pracownia EEG 2|Pracownia EEG 2]] / Własności EEG spoczynkowego: funkcja autokorelacji i widmo&lt;br /&gt;
&lt;br /&gt;
=Estymacja funkcji autokowariancji, autokorelacji i koherencji sygnału.=&lt;br /&gt;
==Wstęp==&lt;br /&gt;
Z funkcjami tymi spotkaliśmy się już na zajęciach z [[Ćwiczenia_4|analizy sygnałów]].&lt;br /&gt;
&lt;br /&gt;
Funkcja autokowariancji sygnału charakteryzuje liniową zależność wartości tego sygnału w danej określonej chwili czasu od wartości (tego samego sygnału) w innej chwili.&lt;br /&gt;
W przypadku [[Nieparametryczne_widmo_mocy#Sygna.C5.82y_stochastyczne  | stacjonarnych procesów stochastycznych]], przebieg tej funkcji nie zależy od czasu. &lt;br /&gt;
Oznacza to, że obliczając funkcję autokorelacji sygnału pomiędzy chwilą czasu &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;x(t+\tau )&amp;lt;/math&amp;gt; otrzymamy tę samą wartość, jak dla przypadku obliczania funkcji autokorelacji pomiędzy momentami &amp;lt;math&amp;gt;x(t + T)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;x(t + T+\tau )&amp;lt;/math&amp;gt;, gdzie &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; to dowolny przedział czasu. Innymi słowy, funkcja autokorelacji procesu stacjonarnego zależy tylko od odstępu czasu pomiędzy próbkami &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt;, dla którego jest wyznaczana, a nie od konkretnej chwili czasu. Odrębną klasę sygnałów stanowią procesy niestacjonarne, w przypadku których funkcja autokorelacji będzie zależeć od czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; w którym jest obliczana. Estymator funkcji autokowariancji uzyskuje się poprzez obliczanie iloczynów wartości sygnału &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; w chwilach czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; czyli &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; i wartości sygnału &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; w chwili czasu ''t''+&amp;amp;tau; czyli &amp;lt;math&amp;gt;x(t+\tau)&amp;lt;/math&amp;gt; i uśredniając wartości iloczynów po czasie &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid79&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma (\tau) = \mathrm{cov}(x(t),x(t-\tau ))=\mathrm{E}[(x(t)-\mu )(x(t-\tau )-\mu )]&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(1)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid80&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\mu = \mathrm{E}[x(t)]&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(2)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W przypadku sygnałów ciągłych estymatę tę można zapisać w poniższy sposób:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid81&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma (\tau ) = \frac{1}{T}\int _0^{T}(x(t)-\mu )(x(t-\tau )-\mu )dt&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(3)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
natomiast dla sygnałów dyskretnych jako:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid82&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma (k) = \frac{1}{N-1}\sum _{i=1}^{N-|k|}(x(i+k)-x_s)(x(i)-x_s)&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(4)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid83&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
x_s = \frac{\sum _{i=1}^{N}x(i)}{N}&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(5)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcja autokowariancji może osiągać dowolne wartości, dlatego aby można było porównać przebieg tej funkcji np. pomiędzy dwoma sygnałami, wprowadzono wersję znormalizowaną tej funkcji &amp;amp;mdash; ''funkcję autokorelacji''. Normalizacja ta wygląda następująco:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid84&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\rho (k) = \frac{\gamma (\tau )}{\sigma^2}&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(6)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid85&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\sigma ^2 = \mathrm{E}[(x(t)-\mu )^2]&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(7)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wariancję sygnału (&amp;lt;math&amp;gt;\gamma (0)=\sigma ^2&amp;lt;/math&amp;gt;) można wyrazić przez funkcję autokowariancji dla przesunięcia &amp;lt;math&amp;gt;\tau =0&amp;lt;/math&amp;gt;.  Wynika z tego, że funkcja korelacji przyjmuje wartości z zakresu [&amp;amp;minus;1,&amp;amp;nbsp;1]. Ostatecznie estymator funkcji autokorelacji można zapisać jak poniżej:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid86&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\rho(k) = \frac{\gamma (k)}{\gamma (0)}&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(8)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcję autokorelacji estymuje się w celu określenia, w jakim stopniu wartości sygnału w danej chwili czasu wpływają na wartości sygnału w kolejnych chwilach czasu. Ma to kluczowe znaczenie przy rozpoznawaniu rodzaju procesów fizycznych odpowiedzialnego za generowanie sygnału. Funkcja ta zawsze mam maksimum dla przesunięcia &amp;lt;math&amp;gt;\tau =0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cechą charakterystyczną funkcji autokorelacji jest to, iż w przypadku sygnałów harmonicznych, przebieg funkcji ma charakter okresowy, z okresem takim samym jak okres badanego sygnału. W przypadku szumu, funkcja autokorelacji ma kształt funkcji delta Diraca.&lt;br /&gt;
&lt;br /&gt;
==Polecenie:==&lt;br /&gt;
Do policzenia funkcji autokorelacji posłużymy się funkcją biblioteczną &amp;lt;tt&amp;gt;numpy.correlate&amp;lt;/tt&amp;gt;. Funkcja ta, wbrew nazwie, oblicza wyłącznie splot swoich dwóch pierwszych argumentów wywołania. Musimy je więc przystosować do obliczenia wielkości zgodnie ze wzorem (4).&lt;br /&gt;
&lt;br /&gt;
Zaimplementuj funkcję do obliczania funkcji korelacji zgodnie ze wzorem &amp;lt;xr id=&amp;quot;uid82&amp;quot;&amp;gt;(%i)&amp;lt;/xr&amp;gt;. Funkcja powinna przyjmować jako parametry dwa wektory&amp;lt;!--i maksymalne przesunięcie wzajemne tych wektorów--&amp;gt;, a zwracać wektor zawierający ich funkcję autokorelacji. &lt;br /&gt;
&lt;br /&gt;
Wywołanie przykładowe:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
print koreluj(a,a)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
powinno dać wynik:&lt;br /&gt;
 [-0.5  0.   1.   0.  -0.5]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
# Średnia&lt;br /&gt;
mean = numpy.mean(data)&lt;br /&gt;
mean2 = numpy.mean(data2)&lt;br /&gt;
&lt;br /&gt;
# Wariancja&lt;br /&gt;
var = numpy.var(data)&lt;br /&gt;
var2 = numpy.var(data2)&lt;br /&gt;
&lt;br /&gt;
# Dane po odjęciu średnich&lt;br /&gt;
ndata = data - mean&lt;br /&gt;
ndata2 = data2 - mean2&lt;br /&gt;
&lt;br /&gt;
# Splot&lt;br /&gt;
acorr = numpy.correlate(ndata, ndata2, 'full')&lt;br /&gt;
&lt;br /&gt;
# Normalizacja kowariancji do korelacji i przez 1/N&lt;br /&gt;
acorr = acorr / numpy.sqrt(var*var2) / len(ndata)&lt;br /&gt;
&lt;br /&gt;
print(acorr)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{{hidden begin|title=Przykładowe rozwiązanie:}}--&amp;gt;&lt;br /&gt;
 &amp;lt;!-- &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
def koreluj_pol(x,y,max_tau):&lt;br /&gt;
    x = x - np.mean(x)&lt;br /&gt;
    y = y - np.mean(y)&lt;br /&gt;
    N= len(x)&lt;br /&gt;
    cor = np.zeros(max_tau+1)&lt;br /&gt;
    cor[0] = np.sum(x[:]*y[:]) &lt;br /&gt;
    for i in range(1,max_tau+1):&lt;br /&gt;
        cor[i] = np.sum(x[i:]*y[:-i])&lt;br /&gt;
        &lt;br /&gt;
    cor = cor /(N-1)&lt;br /&gt;
    return cor&lt;br /&gt;
&lt;br /&gt;
def koreluj(x,y,max_tau):&lt;br /&gt;
    cor = np.zeros(2*max_tau+1)    &lt;br /&gt;
    cor[max_tau:] = koreluj_pol(x,y,max_tau)&lt;br /&gt;
    tmp = koreluj_pol(y,x,max_tau)&lt;br /&gt;
    cor[:max_tau+1] = tmp[-1::-1]&lt;br /&gt;
    return cor    &lt;br /&gt;
    &lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    print koreluj(a,a,i)&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
b = np.array([-1,-2,-3])&lt;br /&gt;
&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    print koreluj(a,b,i)&lt;br /&gt;
    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zadanie 1: Pomiar sygnału EEG ==&lt;br /&gt;
&lt;br /&gt;
Zarejestruj 10 minut sygnału EEG, w trakcie których badana osoba będzie siedziała z otwartymi oczami oraz kolejne 10 minut w stanie czuwania z zamkniętymi oczami. Rejestrację należy wykonać na pełnym czepku 10-20 z częstością próbkowania 128 Hz. &lt;br /&gt;
&lt;br /&gt;
==Zadanie 2:  Funkcje autokowariancji i autokorelacji==&lt;br /&gt;
W tym zadaniu posłużymy się sygnałami zarejestrowanymi w punkcie 3. poprzedniego ćwiczenia. Zaobserwuj, na którym kanale rytm alfa osiąga najwyższą wartość. Następnie zaimplementuj w Pythonie następujące kroki:&lt;br /&gt;
&lt;br /&gt;
#	Wczytaj dane z wybranego kanału.&lt;br /&gt;
#	Oblicz funkcję autokorelacji dla sygnału zarejestrowanego w warunkach, gdy osoba badana siedziała z otwartymi oczami. Narysuj autokorelogram, to jest wykres wartości funkcji autokorelacji względem przesunięcia &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt;. Oś &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; wyskaluj w sekundach.&lt;br /&gt;
#	Powtórz krok 2, tym razem dla sygnału zebranego w warunkach czuwania z zamkniętymi oczami.&lt;br /&gt;
#	Porównaj autokorelogramy.&lt;br /&gt;
&lt;br /&gt;
=Związek autokorelacji z widmem sygnału=&lt;br /&gt;
==Wstęp==&lt;br /&gt;
Zgodnie z twierdzeniem Chinczyna, z którym zapoznaliśmy się na wykładzie z [[Twierdzenie_Wienera-Chinczyna|Analizy Sygnałów]], widmową gęstość mocy sygnału można policzyć jako transformatę Fouriera funkcji autokowariancji:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid93&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
S(f) = \int _{-\infty }^{\infty }\gamma (\tau )e^{-2\pi i f \tau}d\tau &amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(9)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	&amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; &amp;amp;mdash; częstość&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	&amp;lt;math&amp;gt;S(f)&amp;lt;/math&amp;gt; &amp;amp;mdash;  gęstość widmowa mocy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Poniższy kod ilustruje to twierdzenie:&lt;br /&gt;
&amp;lt;source lang = py&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
from numpy.fft import rfft,fft,fftfreq,fftshift&lt;br /&gt;
 &lt;br /&gt;
def widmo_mocy(s, Fs):&lt;br /&gt;
    '''Funkcja licąca widmo mocy metodą periodogramu,&lt;br /&gt;
	pobiera sygnał i częstość próbkowania&lt;br /&gt;
	zwraca widmo mocy i oś częstości&lt;br /&gt;
    '''&lt;br /&gt;
    S = fft(s)/np.sqrt(len(s))&lt;br /&gt;
    S_moc = S*S.conj()&lt;br /&gt;
    S_moc = S_moc.real&lt;br /&gt;
    F = fftfreq(len(s), 1/Fs)&lt;br /&gt;
    return (fftshift(S_moc),fftshift(F))&lt;br /&gt;
 &lt;br /&gt;
def sin(f = 1, T = 1, Fs = 128, phi =0 ):&lt;br /&gt;
    '''sin o zadanej częstości (w Hz), długości, fazie i częstości próbkowania&lt;br /&gt;
    Domyślnie wytwarzany jest sygnał reprezentujący &lt;br /&gt;
    1 sekundę sinusa o częstości 1Hz i zerowej fazie próbkowanego 128 Hz&lt;br /&gt;
    '''&lt;br /&gt;
    dt = 1.0/Fs&lt;br /&gt;
    t = np.arange(0,T,dt)&lt;br /&gt;
    s = np.sin(2*np.pi*f*t + phi)&lt;br /&gt;
    return (s,t)&lt;br /&gt;
 &lt;br /&gt;
# sygnał próbny będzie próbkowany z częstością FS&lt;br /&gt;
FS = 100.0&lt;br /&gt;
# sygnałem próbnym będzie sinusoida o częstości f &lt;br /&gt;
(s,t) = sin(f=10.5,Fs=FS)&lt;br /&gt;
# obliczamy moc i energię sygnału w dziedzinie czasu&lt;br /&gt;
moc_w_czasie = s**2&lt;br /&gt;
energia_w_czasie = np.sum(moc_w_czasie)&lt;br /&gt;
print 'energia w czasie: ', energia_w_czasie&lt;br /&gt;
 &lt;br /&gt;
# obliczamy widmo mocy sygnału i jego energię estymowaną w dziedzinie częstości&lt;br /&gt;
(moc_w_czestosci, F) = widmo_mocy(s, Fs=FS)&lt;br /&gt;
energia_w_czestosci = np.sum(moc_w_czestosci)&lt;br /&gt;
print 'energia w czestosci: ', energia_w_czestosci&lt;br /&gt;
 &lt;br /&gt;
# estymujemy funkcję autokorelacji sygnału&lt;br /&gt;
ak = 1./(2*len(s)-1)*np.correlate(s,s,'full')&lt;br /&gt;
&lt;br /&gt;
# estymujemy widmo mocy i energię sygnału z twierdzenia Chinczyna korzystając z funkcji fft:&lt;br /&gt;
moc_chi = np.abs(fft(ak))&lt;br /&gt;
energia_chin = sum(moc_chi)&lt;br /&gt;
print 'energia z tw. Chinczyna przez fft: ', energia_chin&lt;br /&gt;
 &lt;br /&gt;
# estymujemy widmo mocy i energię sygnału z twierdzenia Chinczyna korzystając z jawnej postaci transformaty Fouriera:&lt;br /&gt;
FF = np.linspace(-FS/2,FS/2,1000)&lt;br /&gt;
M = np.zeros(len(FF),dtype='complex')&lt;br /&gt;
 &lt;br /&gt;
for i,f in enumerate( FF):&lt;br /&gt;
    for tau in range(len(ak)):&lt;br /&gt;
        M[i] += ak[tau]*np.exp(2*np.pi*1j*f*(len(ak)-tau)/FS) &lt;br /&gt;
M = np.abs(M)&lt;br /&gt;
energia_chin_sum = np.sum(M)* (len(ak)/len(FF))&lt;br /&gt;
print 'energia z tw. Chinczyna przez sumowanie: ', energia_chin_sum&lt;br /&gt;
&lt;br /&gt;
# Rysunki&lt;br /&gt;
py.figure(1)&lt;br /&gt;
py.subplot(3,1,1)&lt;br /&gt;
py.plot(t,s)&lt;br /&gt;
py.title(u'Sygnal')&lt;br /&gt;
py.subplot(3,1,2)&lt;br /&gt;
py.plot(t,moc_w_czasie)&lt;br /&gt;
py.title(u'moc w czasie')&lt;br /&gt;
py.subplot(3,1,3)&lt;br /&gt;
py.plot(F,moc_w_czestosci)&lt;br /&gt;
py.title(u'moc w czestosci')&lt;br /&gt;
 &lt;br /&gt;
py.figure(2)&lt;br /&gt;
py.subplot(3,1,1)&lt;br /&gt;
py.title('f. autokowariancji')&lt;br /&gt;
py.plot(np.arange(-len(ak)/2,len(ak)/2,1)/FS ,ak)&lt;br /&gt;
py.subplot(3,1,2)&lt;br /&gt;
py.plot(fftshift(fftfreq(len(moc_chi),1./FS)),fftshift(moc_chi))&lt;br /&gt;
py.title('widmo mocy z Tw. Chinczyna przez fft')&lt;br /&gt;
py.subplot(3,1,3)&lt;br /&gt;
py.plot(FF,M)&lt;br /&gt;
py.title('widmo mocy z Tw. Chinczyna przez sumowanie')&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W wyniku powinniśmy zobaczyć w terminalu:&lt;br /&gt;
 energia w czasie:  50.0&lt;br /&gt;
 energia w czestosci:  50.0&lt;br /&gt;
 energia z tw. Chinczyna przez fft:  50.0&lt;br /&gt;
 energia z tw. Chinczyna przez sumowanie:  49.9501172217&lt;br /&gt;
&lt;br /&gt;
oraz powinny pojawić się rysunki:&lt;br /&gt;
[[Plik:Fig_chinczyn1.png|thumb 200 px|center]]&lt;br /&gt;
[[Plik:Fig_chinczyn2.png|thumb 200 px|center]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Polecenie ==&lt;br /&gt;
Zaimplementuj funkcję obliczającą transformację Fouriera dyskretyzując wzór (9) dla zadanego wektora częstości &amp;lt;tt&amp;gt;f&amp;lt;/tt&amp;gt; i zadanej częstości próbkowania sygnału (tutaj: 10).&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Wywołanie przykładowe:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
t= np.arange(0,1,0.1)&lt;br /&gt;
x = np.sin(2*np.pi*2*t)&lt;br /&gt;
f = np.arange(-5,5,1)&lt;br /&gt;
X,f = fourier(x,f,10.0)&lt;br /&gt;
print X&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Natomiast wywołanie:&lt;br /&gt;
&amp;lt;source lang ='python'&amp;gt;&lt;br /&gt;
t= np.arange(0,1,0.1)&lt;br /&gt;
x = np.sin(2*np.pi*2*t)&lt;br /&gt;
f = np.arange(-5,5,0.01)&lt;br /&gt;
X = fourier(x,f,10.0)&lt;br /&gt;
py.plot(f,np.abs(X))&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Powinno wytworzyć rysunek:&lt;br /&gt;
&lt;br /&gt;
[[Plik:Fourier_test.png]] &lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
import numpy as np&lt;br /&gt;
import pylab as py&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def koreluj_pol(x,y,max_tau):&lt;br /&gt;
    x = x - np.mean(x)&lt;br /&gt;
    y = y - np.mean(y)&lt;br /&gt;
    N= len(x)&lt;br /&gt;
    cor = np.zeros(max_tau+1)&lt;br /&gt;
    cor[0] = np.sum(x[:]*y[:]) &lt;br /&gt;
    for i in range(1,max_tau+1):&lt;br /&gt;
        cor[i] = np.sum(x[i:]*y[:-i])&lt;br /&gt;
        &lt;br /&gt;
    cor = cor /(N)&lt;br /&gt;
    return cor&lt;br /&gt;
&lt;br /&gt;
def koreluj(x,y,max_tau):&lt;br /&gt;
    cor = np.zeros(2*max_tau+1)    &lt;br /&gt;
    cor[max_tau:] = koreluj_pol(x,y,max_tau)&lt;br /&gt;
    tmp = koreluj_pol(y,x,max_tau)&lt;br /&gt;
    cor[:max_tau+1] = tmp[-1::-1]&lt;br /&gt;
    return cor  &lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
def fourier_chin(x, FF, FS):&lt;br /&gt;
    ak = koreluj(x,x,len(x)-1)&lt;br /&gt;
    M = np.zeros(len(FF),dtype='complex') &lt;br /&gt;
    for i,f in enumerate( FF):&lt;br /&gt;
        for tau in range(len(ak)):&lt;br /&gt;
	    M[i] += ak[tau]*np.exp(-2*np.pi*1j*f*( tau- len(x))/FS)&lt;br /&gt;
    #M/=np.sqrt(len(ak))&lt;br /&gt;
    return M&lt;br /&gt;
    &lt;br /&gt;
def fourier(ak, FF, FS):&lt;br /&gt;
   &lt;br /&gt;
    M = np.zeros(len(FF),dtype='complex') &lt;br /&gt;
    for i,f in enumerate( FF):&lt;br /&gt;
        for tau in range(len(ak)):&lt;br /&gt;
	    M[i] += ak[tau]*np.exp(-2*np.pi*1j*f*( tau)/FS)&lt;br /&gt;
    M/=np.sqrt(len(ak))&lt;br /&gt;
    return M&lt;br /&gt;
t= np.arange(0,1,0.05)&lt;br /&gt;
x = np.sin(2*np.pi*2*t)&lt;br /&gt;
f = np.arange(-5,5,0.01)&lt;br /&gt;
&lt;br /&gt;
X = fourier_chin(x,f,10.0)&lt;br /&gt;
Xf = fourier(x,f,10.0)&lt;br /&gt;
print X&lt;br /&gt;
py.plot(f,np.abs(X), f,np.abs(Xf)**2)&lt;br /&gt;
py.show()&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zadanie 3: Związek autokorelacji z widmem sygnału==&lt;br /&gt;
Oblicz gęstość widmową mocy sygnału zarejestrowanego w trakcie czuwania z zamkniętymi oczami, korzystając z twierdzenia Chinczyna oraz [[Nieparametryczne_widmo_mocy#Metoda_Welcha | metodą Welcha]].&lt;br /&gt;
Znajdź częstość rytmu &amp;amp;alpha; dla osoby, która była badana.&lt;br /&gt;
&lt;br /&gt;
==Funkcja kowariancji (wzajemnej)==&lt;br /&gt;
&lt;br /&gt;
W celu scharakteryzowania zależności wzajemnej dwóch sygnałów losowych, stosuje się funkcję kowariancji, zdefiniowaną w następujący sposób:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid98&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy} (\tau ) = \mathrm{cov}(x(t),y(t-\tau ))=\mathrm{E}[(x(t)-\mu _x)(y(t-\tau )-\mu _y)]&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid99&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\mu _x = \mathrm{E}[x(t)]\\&lt;br /&gt;
\mu _y = \mathrm{E}[y(t)]\\ \end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W przypadku sygnałów ciągłych estymatę tę można zapisać w poniższy sposób:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid100&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy} (\tau ) = \frac{1}{T}\int _0^{T}(x(t)-\mu_x)(y(t-\tau)-\mu_y)dt&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
natomiast dla sygnałów dyskretnych jako:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid101&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy}(k) = \frac{1}{N-1}\sum _{i=0}^{N-k}(x(i+k)-x_s)(y(i)-y_s)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W odróżnieniu od funkcji autokowariancji, funkcja kowariancji nie musi mieć maksimum dla przesunięcia &amp;lt;math&amp;gt;\tau =0&amp;lt;/math&amp;gt;. Ponadto posiada ona następującą cechę:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid102&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy}(-\tau ) = \gamma _{yx}(\tau )&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcję kowariancji można znormalizować:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid103&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\rho (\tau) = \frac{\mathrm{E}[(x(t)-\mu _x)(y(t-\tau )-\mu _y)]}{\sqrt{\mathrm{E}[(x(t)-\mu _x)^2]\mathrm{E}[(y(t)-\mu _y)^2]}} = \frac{\gamma _{xy}}{\sigma_x\sigma_y}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
Otrzymaną funkcję nazywamy funkcją korelacji.&lt;br /&gt;
Jednym z zastosowań funkcji korelacji jest wyznaczanie czasu przejścia sygnału przez dany układ liniowy. Funkcja korelacji pomiędzy sygnałem na wejściu układu i sygnałem na jego wyjściu osiągnie wartość maksymalną dla przesunięcia &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; równego czasowi, jaki potrzebował sygnał na pokonanie danego układu. Niestety, taka metoda wyznaczania opóźnienia obarczona jest pewną wadą &amp;amp;mdash; w przypadku gdy prędkość sygnału bądź jego droga zależą od częstości, wtedy na wykresie funkcji korelacji nie uzyskamy wyraźnego maksimum.&lt;br /&gt;
&lt;br /&gt;
=====Polecenie =====&lt;br /&gt;
Zaimplementuj funkcję obliczającą funkcję kowariancji dla różnych sygnałów ''x'' i ''y'' (równanie &amp;lt;xr id=&amp;quot;uid98&amp;quot;&amp;gt;%i&amp;lt;/xr&amp;gt;)&amp;lt;!-- skorzystaj przy tym z własności opisanej równaniem &amp;lt;xr id=&amp;quot;uid99&amp;quot;&amp;gt;(%i)&amp;lt;/xr&amp;gt;--&amp;gt;. &lt;br /&gt;
Przykładowe wywołanie:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
b = np.array([-1,-2,-3])&lt;br /&gt;
&lt;br /&gt;
print koreluj(a,b)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
powinno dać w wyniku:&lt;br /&gt;
 [ 0.5 0.  -1.   0.   0.5]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
{{hidden begin|title=Przykładowe rozwiązanie:}}&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import pylab as py&lt;br /&gt;
&lt;br /&gt;
def koreluj(x,y,max_tau):&lt;br /&gt;
    x = x - np.mean(x)&lt;br /&gt;
    y = y - np.mean(y)&lt;br /&gt;
    cor = np.zeros(2*max_tau+1)&lt;br /&gt;
    cor[max_tau] = np.sum(x[:]*y[:]) &lt;br /&gt;
    for i in range(1,max_tau+1):&lt;br /&gt;
        cor[max_tau+i] = np.sum(x[i:]*y[:-i])&lt;br /&gt;
        cor[max_tau-i] = np.sum(y[i:]*x[:-i])&lt;br /&gt;
    N= len(x)&lt;br /&gt;
    cor = cor /(N-1)&lt;br /&gt;
    return cor&lt;br /&gt;
&lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
b = np.array([-1,-2,-3])&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    print koreluj(a,b,i)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}} --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadanie 4===&lt;br /&gt;
Z danych zarejestrowanych w trakcie czuwania z zamkniętymi oczami wybierz sygnały z następujących kanałów: Fp1, P3, Pz, P4, Fp2, O1, O2.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Dla każdego kanału oblicz funkcję autokorelacji, zaś  dla każdej pary kanałów oblicz funkcję korelacji wzajemnej. Wyniki zaprezentuj w formie kwadratowej macierzy wykresów (za pomocą funkcji subplot, tak jak na przykładowym rys. (rys. &amp;lt;xr id=&amp;quot;uid9&amp;quot;&amp;gt; %i&amp;lt;/xr&amp;gt;)). Na przekątnej macierzy narysuj funkcję autokorelacji odpowiednich kanałów, poza przekątną &amp;amp;mdash; funkcję korelacji wzajemnej. Wskaż kanały, które są najbardziej skorelowane ze sobą. Czy możliwe jest wyznaczenie opóźnienia sygnału pomiędzy tymi kanałami?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Powtórz punkt 1, tym razem jednak funkcję autokorelacji i korelacji wzajemnej oblicz na sygnałach przefiltrowanych filtrem wąskopasmowym w paśmie alfa charakterystycznym dla badanej osoby. ([[%C4%86wiczenia_7#Funkcje_do_projektowania_filtr.C3.B3w_IIR_dost.C4.99pne_w_module_scipy.signal|przypomnienie konstrukcji filtrów]])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Oszacuj istotność statystyczną zależności między parami kanałów. Twoją hipotezą zerową jest brak istotnej korelacji pomiędzy sygnałami zarejestrowanymi przez dwie różne elektrody EEG. Hipoteza alternatywna to występowanie zależności pomiędzy tymi sygnałami. Podanie estymatorów wariancji funkcji korelacji jest bardzo trudne, dlatego jednym ze sposobów oszacowania progu powyżej którego wartość funkcji korelacji można byłoby uznać za istotną statystycznie, jest zastosowanie metody ''bootstrap''. Teoretycznie, funkcja korelacji policzona dla dwóch rzeczywistych, nieskorelowanych sygnałów, powinna wynosić 0 dla każdego przesunięcia &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt;. Tak jest jednak w przypadku sygnałów nieskończonych; w analizie sygnałów takowych nie spotkamy.&lt;br /&gt;
&lt;br /&gt;
Dokonując losowej zamiany kolejności próbek, możemy doprowadzić do wytworzenia sygnałów zależnych losowo, które jednak ze względu na skończony czas trwania, dadzą niezerową funkcję korelacji. Poziom losowych fluktuacji tej funkcji oszacujemy wykonując następujące kroki:&lt;br /&gt;
&amp;lt;ol type=&amp;quot;A&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Losowa zamiana kolejności próbek w analizowanych sygnałach. Jeżeli pomiędzy dwoma sygnałami istnieją jakieś zależności, losowa zamiana próbek doprowadzi do zniszczenia tych związków. W ten sposób uzyskujemy sygnały, które teoretycznie są nieskorelowane.&lt;br /&gt;
&amp;lt;li&amp;gt; Obliczenie funkcji  korelacji wzajemnej dla sygnałów policzonych w punkcie A.&lt;br /&gt;
&amp;lt;li&amp;gt; Powtórzenie kroków A i B wiele (np. 1000) razy.&lt;br /&gt;
&amp;lt;li&amp;gt; Oszacowanie 95% przedziału ufności dla wartości średniej funkcji korelacji wzajemnej dla danego przesunięcia &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; korzystając z otrzymanego w kroku C empirycznego rozkładu wartości tych funkcji dla sygnałów niezależnych.  &lt;br /&gt;
&amp;lt;li&amp;gt; Powtórzenie kroków A-D dla kolejnych przesunięć &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;li&amp;gt; Sprawdzenie, dla których przesunięć &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; funkcje autokorelacji i korelacji obliczone dla oryginalnych sygnałów uzyskały wartości wyższe niż wartości progowe oszacowane dla sygnałów o losowych zależnościach.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Procedura opisana powyżej ma jednak '''zasadniczą wadę'''. Staramy się w niej oszacować poziom przypadkowych korelacji pomiędzy dwoma sygnałami dla kolejnych przesunięć &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt;, co jest niczym innym jak wielokrotnym powtórzeniem pewnego testu. Obserwowanie korelacji dla wielu par kanałów równocześnie również prowadzi do zwiększenia szansy na zaobserwowanie ekstremalnie dużych fluktuacji.&lt;br /&gt;
Występuje tu zatem ''problem wielokrotnych porównań''.&lt;br /&gt;
Przypominamy, iż może to doprowadzić do przypadkowego uznania wyników jako &amp;amp;bdquo;istotnych&amp;amp;rdquo; statystycznie. Np. jeśli pojedynczy test wykonujemy na poziomie istotności 5% to dopuszczamy odrzucenie w 1 przypadku na 20 hipotezy zerowej pomimo, iż jest ona prawdziwa. Z drugiej jednak strony, jeśli powtórzymy wykonywany test 20 razy, to oczekujemy uzyskania 1 przypadku, w którym poziom ''p'' będzie mniejszy od 5% co jest przesłanką za odrzuceniem hipotezy zerowej. &lt;br /&gt;
&lt;br /&gt;
W przypadku wykonywania serii testów należałoby więc zastosować odpowiednie poprawki, np. [http://www.bmj.com/content/310/6973/170.full korektę Bonferroniego] czy [http://en.wikipedia.org/wiki/False_discovery_rate false discovery rate (FDR)]. Innym rozwiązaniem w analizowanym przez nas problemie jest zastosowanie tzw. statystyk wartości ekstremalnych, które prowadzą do następujących zmian w procedurze:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol type=&amp;quot;A&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;	Losowa zmiana kolejności próbek w analizowanych sygnałach (we wszystkich analizowanych kanałach). Jeżeli pomiędzy dwoma sygnałami istnieją jakieś zależności, losowa zamiana próbek doprowadzi do zniszczenia tych związków. W ten sposób uzyskujemy sygnały, które teoretycznie są nieskorelowane.&lt;br /&gt;
&amp;lt;li&amp;gt;	Obliczenie funkcji korelacji dla sygnałów otrzymanych w punkcie A.&lt;br /&gt;
&amp;lt;li&amp;gt;    Zapamiętanie maksymalnej wartości bezwzględnej funkcji korelacji z punktu B (maksimum bierzemy po wszystkich przesunięciach i po wszystkich parach kanałów; dla funkcji autokorelacji, ze względu na jej normalizację do 1 dla zerowego przesunięcia, tam maksymalnych wartości poszukujemy dla przesunięć innych niż 0).&lt;br /&gt;
&amp;lt;li&amp;gt;	Powtórzenie kroków A-C 1000 razy. Uzyskamy w ten sposób rozkład maksymalnych wartości funkcji korelacji możliwych do zaobserwowania dla sygnałów niezależnych.&lt;br /&gt;
&amp;lt;li&amp;gt;    Wyznaczenie 95 centyla rozkładu wartości maksymalnych.&lt;br /&gt;
&amp;lt;li&amp;gt;	Nałożenie na rysunki funkcji korelacji uzyskane w Zadaniu 2 poziomych linii symbolizujących poziom zależności dwóch sygnałów o losowych zależnościach i sprawdzenie, dla których przesunięć &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; wartości funkcji korelacji przekraczają estymowane progi istotności statystycznej.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Plik:Korelacje_wzajemne.png|700px|center|thumb|&amp;lt;figure id=&amp;quot;uid9&amp;quot; /&amp;gt;Przykład wyniku analizy korelacji wzajemnych dla sygnału niefiltrowanego z naniesionymi granicami możliwych fluktuacji.]]&lt;br /&gt;
&lt;br /&gt;
==Wzajemna gęstość widmowa sygnałów==&lt;br /&gt;
&lt;br /&gt;
Podobnie jak w przypadku twierdzenia Chinczyna dla pojedynczego sygnału, możliwe jest policzenie transformaty Fouriera funkcji kowariancji. Uzyskana w ten sposób wielkość nazywa się funkcją wzajemnej gęstości mocy widmowej sygnału:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid122&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
S_{xy}(f) = \int _{-\infty }^{\infty }\gamma_{xy}(\tau )e^{-2\pi i f \tau}d\tau &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W celu dalszego omówienia własności funkcji wzajemnej mocy widmowej sygnałów funkcję tę zapiszemy w postaci:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid123&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
S_{xy}(f) = |S_{xy}(f)|e^{i\phi _{xy}(f)}\\&lt;br /&gt;
\\&lt;br /&gt;
\phi _{xy} = \arg(S_{xy}) &lt;br /&gt;
\end{array} &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&amp;lt;!-- \mathrm{arc\,tg}\left[\frac{\mathrm{Im}(S_{xy}(f))}{\mathrm{Re}(S_{xy}(f))}\right]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wartość bezwzględna funkcji wzajemnej gęstości mocy widmowej osiąga największą wartość dla '''częstości''', w których sygnały &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;y(t)&amp;lt;/math&amp;gt; są ze sobą skorelowane. Funkcja wzajemnej mocy widmowej sygnałów pozbawiona jest zatem wady, która charakteryzowała funkcję korelacji, to jest problemu z wyznaczeniem czasu transmisji sygnału, w przypadku gdy czas ten zależał od częstości. Przy pomocy funkcji wzajemnej mocy widmowej, czas ten można oszacować przy pomocy fazy tej funkcji &amp;amp;mdash; &amp;lt;math&amp;gt;\phi _{xy}(f)&amp;lt;/math&amp;gt;. Jeśli funkcja wzajemnej mocy widmowej została wyznaczona pomiędzy sygnałami na wejściu i wyjściu układu liniowego, to faza ta reprezentuje przesunięcie fazowe sygnału przy przejściu przez układ. Czas tego przejścia można oszacować za pomocą następującej wyrażenia:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid124&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\tau = \frac{\phi _{xy}(f)}{2\pi f}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Podobnie jak w przypadku funkcji autokorelacji i korelacji wzajemnej, funkcję wzajemnej gęstości mocy widmowej można znormalizować:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid125&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
C_{xy}(f) = \frac{S_{xy}(f)}{\sqrt{S_x(f)S_y(f)}}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Znormalizowaną postać funkcji wzajemnej gęstości mocy widmowej nazywamy funkcją ''koherencji''. &lt;br /&gt;
Koherencja jest wielkością zespoloną. Faza koherencji odzwierciedla różnicę faz pomiędzy dwoma sygnałami. Moduł koherencji reprezentuje stopień synchronizacji sygnałów i zawiera się w przedziale od 0.0 do 1.0. Moduł tej funkcji zawiera się w przedziale od 0 do 1. Wartości 0 odpowiada brak synchronizacji pomiędzy sygnałami, zaś wartości 1 pełna synchronizacja dwóch przebiegów czasowych. Należy również zwrócić uwagę na nazewnictwo - często sam moduł koherencji określany jest jako koherencja, w literaturze anglojęzycznej moduł koherencji posiada jednak odrębną nazwę: Magnitude Square Coherence (MSC). Istotny jest również sposób estymacji modułu koherencji, który wyprowadzono w następnym rozdziale, zaś sam estymator reprezentuje wzór (36).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadanie 5===&lt;br /&gt;
Zaimplementuj funkcję obliczającą wzajemną gęstość widmową dla pary kanałów. &lt;br /&gt;
&amp;lt;!--Niech argumentami tej funkcji będą dwa wektory zawierające sygnały, zakres częstości, częstość próbkowania. --&amp;gt;&lt;br /&gt;
Oblicz i narysuj macierz gęstości widmowych (własnych i wzajemnych) dla kolejnych par kanałów (tych samych co w zadaniu 3). Wyniki zaprezentuj w postaci kwadratowej macierzy rysunków. Ponieważ są to funkcje zespolone, dobrze jest zaprezentować osobno ich wartość i fazę. Uzyskane wartości bezwzględne narysuj nad przekątną tej macierzy, a fazę pod przekątną.&lt;br /&gt;
&lt;br /&gt;
===Zadanie 6===&lt;br /&gt;
Przygotuj sygnał dwukanałowy, w którym jako pierwszy sygnał wybierz fragment sygnału EEG (z danych zebranych wcześniej) o długości 2000 próbek, a jako drugiego sygnału użyj tego samego fragmentu EEG, ale opóźnionego o wybraną liczbę (1 - 5) próbek. Oblicz widma wzajemne tych sygnałów i zaprezentuj ich fazy na rysunku. Na podstawie tych widm znajdź wartość przesunięcia czasowego tych sygnałów.&lt;br /&gt;
&lt;br /&gt;
Obliczenia powtórz w przypadku, gdy do drugiego sygnału dodany będzie szum o wariancji równej 0,25 wariancji oryginalnego sygnału.&lt;/div&gt;</summary>
		<author><name>Maciek</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG_2/EEG_wlasno%C5%9Bci_EEG_spoczynkowego&amp;diff=11190</id>
		<title>Pracownia EEG 2/EEG wlasności EEG spoczynkowego</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG_2/EEG_wlasno%C5%9Bci_EEG_spoczynkowego&amp;diff=11190"/>
		<updated>2024-11-22T16:43:09Z</updated>

		<summary type="html">&lt;p&gt;Maciek: /* Polecenie */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Pracownia EEG 2|Pracownia EEG 2]] / Własności EEG spoczynkowego: funkcja autokorelacji i widmo&lt;br /&gt;
&lt;br /&gt;
=Estymacja funkcji autokowariancji, autokorelacji i koherencji sygnału.=&lt;br /&gt;
==Wstęp==&lt;br /&gt;
Z funkcjami tymi spotkaliśmy się już na zajęciach z [[Ćwiczenia_4|analizy sygnałów]].&lt;br /&gt;
&lt;br /&gt;
Funkcja autokowariancji sygnału charakteryzuje liniową zależność wartości tego sygnału w danej określonej chwili czasu od wartości (tego samego sygnału) w innej chwili.&lt;br /&gt;
W przypadku [[Nieparametryczne_widmo_mocy#Sygna.C5.82y_stochastyczne  | stacjonarnych procesów stochastycznych]], przebieg tej funkcji nie zależy od czasu. &lt;br /&gt;
Oznacza to, że obliczając funkcję autokorelacji sygnału pomiędzy chwilą czasu &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;x(t+\tau )&amp;lt;/math&amp;gt; otrzymamy tę samą wartość, jak dla przypadku obliczania funkcji autokorelacji pomiędzy momentami &amp;lt;math&amp;gt;x(t + T)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;x(t + T+\tau )&amp;lt;/math&amp;gt;, gdzie &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; to dowolny przedział czasu. Innymi słowy, funkcja autokorelacji procesu stacjonarnego zależy tylko od odstępu czasu pomiędzy próbkami &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt;, dla którego jest wyznaczana, a nie od konkretnej chwili czasu. Odrębną klasę sygnałów stanowią procesy niestacjonarne, w przypadku których funkcja autokorelacji będzie zależeć od czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; w którym jest obliczana. Estymator funkcji autokowariancji uzyskuje się poprzez obliczanie iloczynów wartości sygnału &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; w chwilach czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; czyli &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; i wartości sygnału &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; w chwili czasu ''t''+&amp;amp;tau; czyli &amp;lt;math&amp;gt;x(t+\tau)&amp;lt;/math&amp;gt; i uśredniając wartości iloczynów po czasie &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid79&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma (\tau) = \mathrm{cov}(x(t),x(t-\tau ))=\mathrm{E}[(x(t)-\mu )(x(t-\tau )-\mu )]&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(1)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid80&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\mu = \mathrm{E}[x(t)]&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(2)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W przypadku sygnałów ciągłych estymatę tę można zapisać w poniższy sposób:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid81&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma (\tau ) = \frac{1}{T}\int _0^{T}(x(t)-\mu )(x(t-\tau )-\mu )dt&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(3)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
natomiast dla sygnałów dyskretnych jako:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid82&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma (k) = \frac{1}{N-1}\sum _{i=1}^{N-|k|}(x(i+k)-x_s)(x(i)-x_s)&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(4)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid83&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
x_s = \frac{\sum _{i=1}^{N}x(i)}{N}&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(5)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcja autokowariancji może osiągać dowolne wartości, dlatego aby można było porównać przebieg tej funkcji np. pomiędzy dwoma sygnałami, wprowadzono wersję znormalizowaną tej funkcji &amp;amp;mdash; ''funkcję autokorelacji''. Normalizacja ta wygląda następująco:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid84&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\rho (k) = \frac{\gamma (\tau )}{\sigma^2}&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(6)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid85&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\sigma ^2 = \mathrm{E}[(x(t)-\mu )^2]&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(7)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wariancję sygnału (&amp;lt;math&amp;gt;\gamma (0)=\sigma ^2&amp;lt;/math&amp;gt;) można wyrazić przez funkcję autokowariancji dla przesunięcia &amp;lt;math&amp;gt;\tau =0&amp;lt;/math&amp;gt;.  Wynika z tego, że funkcja korelacji przyjmuje wartości z zakresu [&amp;amp;minus;1,&amp;amp;nbsp;1]. Ostatecznie estymator funkcji autokorelacji można zapisać jak poniżej:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid86&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\rho(k) = \frac{\gamma (k)}{\gamma (0)}&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(8)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcję autokorelacji estymuje się w celu określenia, w jakim stopniu wartości sygnału w danej chwili czasu wpływają na wartości sygnału w kolejnych chwilach czasu. Ma to kluczowe znaczenie przy rozpoznawaniu rodzaju procesów fizycznych odpowiedzialnego za generowanie sygnału. Funkcja ta zawsze mam maksimum dla przesunięcia &amp;lt;math&amp;gt;\tau =0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cechą charakterystyczną funkcji autokorelacji jest to, iż w przypadku sygnałów harmonicznych, przebieg funkcji ma charakter okresowy, z okresem takim samym jak okres badanego sygnału. W przypadku szumu, funkcja autokorelacji ma kształt funkcji delta Diraca.&lt;br /&gt;
&lt;br /&gt;
==Polecenie:==&lt;br /&gt;
Do policzenia funkcji autokorelacji posłużymy się funkcją biblioteczną &amp;lt;tt&amp;gt;numpy.correlate&amp;lt;/tt&amp;gt;. Funkcja ta, wbrew nazwie, oblicza wyłącznie splot swoich dwóch pierwszych argumentów wywołania. Musimy je więc przystosować do obliczenia wielkości zgodnie ze wzorem (4).&lt;br /&gt;
&lt;br /&gt;
Zaimplementuj funkcję do obliczania funkcji korelacji zgodnie ze wzorem &amp;lt;xr id=&amp;quot;uid82&amp;quot;&amp;gt;(%i)&amp;lt;/xr&amp;gt;. Funkcja powinna przyjmować jako parametry dwa wektory&amp;lt;!--i maksymalne przesunięcie wzajemne tych wektorów--&amp;gt;, a zwracać wektor zawierający ich funkcję autokorelacji. &lt;br /&gt;
&lt;br /&gt;
Wywołanie przykładowe:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
print koreluj(a,a)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
powinno dać wynik:&lt;br /&gt;
 [-0.5  0.   1.   0.  -0.5]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
# Średnia&lt;br /&gt;
mean = numpy.mean(data)&lt;br /&gt;
mean2 = numpy.mean(data2)&lt;br /&gt;
&lt;br /&gt;
# Wariancja&lt;br /&gt;
var = numpy.var(data)&lt;br /&gt;
var2 = numpy.var(data2)&lt;br /&gt;
&lt;br /&gt;
# Dane po odjęciu średnich&lt;br /&gt;
ndata = data - mean&lt;br /&gt;
ndata2 = data2 - mean2&lt;br /&gt;
&lt;br /&gt;
# Splot&lt;br /&gt;
acorr = numpy.correlate(ndata, ndata2, 'full')&lt;br /&gt;
&lt;br /&gt;
# Normalizacja kowariancji do korelacji i przez 1/N&lt;br /&gt;
acorr = acorr / numpy.sqrt(var*var2) / len(ndata)&lt;br /&gt;
&lt;br /&gt;
print(acorr)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{{hidden begin|title=Przykładowe rozwiązanie:}}--&amp;gt;&lt;br /&gt;
 &amp;lt;!-- &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
def koreluj_pol(x,y,max_tau):&lt;br /&gt;
    x = x - np.mean(x)&lt;br /&gt;
    y = y - np.mean(y)&lt;br /&gt;
    N= len(x)&lt;br /&gt;
    cor = np.zeros(max_tau+1)&lt;br /&gt;
    cor[0] = np.sum(x[:]*y[:]) &lt;br /&gt;
    for i in range(1,max_tau+1):&lt;br /&gt;
        cor[i] = np.sum(x[i:]*y[:-i])&lt;br /&gt;
        &lt;br /&gt;
    cor = cor /(N-1)&lt;br /&gt;
    return cor&lt;br /&gt;
&lt;br /&gt;
def koreluj(x,y,max_tau):&lt;br /&gt;
    cor = np.zeros(2*max_tau+1)    &lt;br /&gt;
    cor[max_tau:] = koreluj_pol(x,y,max_tau)&lt;br /&gt;
    tmp = koreluj_pol(y,x,max_tau)&lt;br /&gt;
    cor[:max_tau+1] = tmp[-1::-1]&lt;br /&gt;
    return cor    &lt;br /&gt;
    &lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    print koreluj(a,a,i)&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
b = np.array([-1,-2,-3])&lt;br /&gt;
&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    print koreluj(a,b,i)&lt;br /&gt;
    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zadanie 1: Pomiar sygnału EEG ==&lt;br /&gt;
&lt;br /&gt;
Zarejestruj 10 minut sygnału EEG, w trakcie których badana osoba będzie siedziała z otwartymi oczami oraz kolejne 10 minut w stanie czuwania z zamkniętymi oczami. Rejestrację należy wykonać na pełnym czepku 10-20 z częstością próbkowania 128 Hz. &lt;br /&gt;
&lt;br /&gt;
==Zadanie 2:  Funkcje autokowariancji i autokorelacji==&lt;br /&gt;
W tym zadaniu posłużymy się sygnałami zarejestrowanymi w punkcie 3. poprzedniego ćwiczenia. Zaobserwuj, na którym kanale rytm alfa osiąga najwyższą wartość. Następnie zaimplementuj w Pythonie następujące kroki:&lt;br /&gt;
&lt;br /&gt;
#	Wczytaj dane z wybranego kanału.&lt;br /&gt;
#	Oblicz funkcję autokorelacji dla sygnału zarejestrowanego w warunkach, gdy osoba badana siedziała z otwartymi oczami. Narysuj autokorelogram, to jest wykres wartości funkcji autokorelacji względem przesunięcia &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt;. Oś &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; wyskaluj w sekundach.&lt;br /&gt;
#	Powtórz krok 2, tym razem dla sygnału zebranego w warunkach czuwania z zamkniętymi oczami.&lt;br /&gt;
#	Porównaj autokorelogramy.&lt;br /&gt;
&lt;br /&gt;
=Związek autokorelacji z widmem sygnału=&lt;br /&gt;
==Wstęp==&lt;br /&gt;
Zgodnie z twierdzeniem Chinczyna, z którym zapoznaliśmy się na wykładzie z [[Twierdzenie_Wienera-Chinczyna|Analizy Sygnałów]], widmową gęstość mocy sygnału można policzyć jako transformatę Fouriera funkcji autokowariancji:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid93&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
S(f) = \int _{-\infty }^{\infty }\gamma (\tau )e^{-2\pi i f \tau}d\tau &amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(9)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	&amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; &amp;amp;mdash; częstość&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	&amp;lt;math&amp;gt;S(f)&amp;lt;/math&amp;gt; &amp;amp;mdash;  gęstość widmowa mocy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Poniższy kod ilustruje to twierdzenie:&lt;br /&gt;
&amp;lt;source lang = py&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
from numpy.fft import rfft,fft,fftfreq,fftshift&lt;br /&gt;
 &lt;br /&gt;
def widmo_mocy(s, Fs):&lt;br /&gt;
    '''Funkcja licąca widmo mocy metodą periodogramu,&lt;br /&gt;
	pobiera sygnał i częstość próbkowania&lt;br /&gt;
	zwraca widmo mocy i oś częstości&lt;br /&gt;
    '''&lt;br /&gt;
    S = fft(s)/np.sqrt(len(s))&lt;br /&gt;
    S_moc = S*S.conj()&lt;br /&gt;
    S_moc = S_moc.real&lt;br /&gt;
    F = fftfreq(len(s), 1/Fs)&lt;br /&gt;
    return (fftshift(S_moc),fftshift(F))&lt;br /&gt;
 &lt;br /&gt;
def sin(f = 1, T = 1, Fs = 128, phi =0 ):&lt;br /&gt;
    '''sin o zadanej częstości (w Hz), długości, fazie i częstości próbkowania&lt;br /&gt;
    Domyślnie wytwarzany jest sygnał reprezentujący &lt;br /&gt;
    1 sekundę sinusa o częstości 1Hz i zerowej fazie próbkowanego 128 Hz&lt;br /&gt;
    '''&lt;br /&gt;
    dt = 1.0/Fs&lt;br /&gt;
    t = np.arange(0,T,dt)&lt;br /&gt;
    s = np.sin(2*np.pi*f*t + phi)&lt;br /&gt;
    return (s,t)&lt;br /&gt;
 &lt;br /&gt;
# sygnał próbny będzie próbkowany z częstością FS&lt;br /&gt;
FS = 100.0&lt;br /&gt;
# sygnałem próbnym będzie sinusoida o częstości f &lt;br /&gt;
(s,t) = sin(f=10.5,Fs=FS)&lt;br /&gt;
# obliczamy moc i energię sygnału w dziedzinie czasu&lt;br /&gt;
moc_w_czasie = s**2&lt;br /&gt;
energia_w_czasie = np.sum(moc_w_czasie)&lt;br /&gt;
print 'energia w czasie: ', energia_w_czasie&lt;br /&gt;
 &lt;br /&gt;
# obliczamy widmo mocy sygnału i jego energię estymowaną w dziedzinie częstości&lt;br /&gt;
(moc_w_czestosci, F) = widmo_mocy(s, Fs=FS)&lt;br /&gt;
energia_w_czestosci = np.sum(moc_w_czestosci)&lt;br /&gt;
print 'energia w czestosci: ', energia_w_czestosci&lt;br /&gt;
 &lt;br /&gt;
# estymujemy funkcję autokorelacji sygnału&lt;br /&gt;
ak = 1./(2*len(s)-1)*np.correlate(s,s,'full')&lt;br /&gt;
&lt;br /&gt;
# estymujemy widmo mocy i energię sygnału z twierdzenia Chinczyna korzystając z funkcji fft:&lt;br /&gt;
moc_chi = np.abs(fft(ak))&lt;br /&gt;
energia_chin = sum(moc_chi)&lt;br /&gt;
print 'energia z tw. Chinczyna przez fft: ', energia_chin&lt;br /&gt;
 &lt;br /&gt;
# estymujemy widmo mocy i energię sygnału z twierdzenia Chinczyna korzystając z jawnej postaci transformaty Fouriera:&lt;br /&gt;
FF = np.linspace(-FS/2,FS/2,1000)&lt;br /&gt;
M = np.zeros(len(FF),dtype='complex')&lt;br /&gt;
 &lt;br /&gt;
for i,f in enumerate( FF):&lt;br /&gt;
    for tau in range(len(ak)):&lt;br /&gt;
        M[i] += ak[tau]*np.exp(2*np.pi*1j*f*(len(ak)-tau)/FS) &lt;br /&gt;
M = np.abs(M)&lt;br /&gt;
energia_chin_sum = np.sum(M)* (len(ak)/len(FF))&lt;br /&gt;
print 'energia z tw. Chinczyna przez sumowanie: ', energia_chin_sum&lt;br /&gt;
&lt;br /&gt;
# Rysunki&lt;br /&gt;
py.figure(1)&lt;br /&gt;
py.subplot(3,1,1)&lt;br /&gt;
py.plot(t,s)&lt;br /&gt;
py.title(u'Sygnal')&lt;br /&gt;
py.subplot(3,1,2)&lt;br /&gt;
py.plot(t,moc_w_czasie)&lt;br /&gt;
py.title(u'moc w czasie')&lt;br /&gt;
py.subplot(3,1,3)&lt;br /&gt;
py.plot(F,moc_w_czestosci)&lt;br /&gt;
py.title(u'moc w czestosci')&lt;br /&gt;
 &lt;br /&gt;
py.figure(2)&lt;br /&gt;
py.subplot(3,1,1)&lt;br /&gt;
py.title('f. autokowariancji')&lt;br /&gt;
py.plot(np.arange(-len(ak)/2,len(ak)/2,1)/FS ,ak)&lt;br /&gt;
py.subplot(3,1,2)&lt;br /&gt;
py.plot(fftshift(fftfreq(len(moc_chi),1./FS)),fftshift(moc_chi))&lt;br /&gt;
py.title('widmo mocy z Tw. Chinczyna przez fft')&lt;br /&gt;
py.subplot(3,1,3)&lt;br /&gt;
py.plot(FF,M)&lt;br /&gt;
py.title('widmo mocy z Tw. Chinczyna przez sumowanie')&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W wyniku powinniśmy zobaczyć w terminalu:&lt;br /&gt;
 energia w czasie:  50.0&lt;br /&gt;
 energia w czestosci:  50.0&lt;br /&gt;
 energia z tw. Chinczyna przez fft:  50.0&lt;br /&gt;
 energia z tw. Chinczyna przez sumowanie:  49.9501172217&lt;br /&gt;
&lt;br /&gt;
oraz powinny pojawić się rysunki:&lt;br /&gt;
[[Plik:Fig_chinczyn1.png|thumb 200 px|center]]&lt;br /&gt;
[[Plik:Fig_chinczyn2.png|thumb 200 px|center]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Polecenie ==&lt;br /&gt;
Zaimplementuj funkcję obliczającą transformację Fouriera dyskretyzując wzór (9) dla zadanego wektora częstości &amp;lt;tt&amp;gt;f&amp;lt;/tt&amp;gt; i zadanej częstości próbkowania sygnału (tutaj: 10).&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Wywołanie przykładowe:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
t= np.arange(0,1,0.1)&lt;br /&gt;
x = np.sin(2*np.pi*2*t)&lt;br /&gt;
f = np.arange(-5,5,1)&lt;br /&gt;
X,f = fourier(x,f,10.0)&lt;br /&gt;
print X&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Natomiast wywołanie:&lt;br /&gt;
&amp;lt;source lang ='python'&amp;gt;&lt;br /&gt;
t= np.arange(0,1,0.1)&lt;br /&gt;
x = np.sin(2*np.pi*2*t)&lt;br /&gt;
f = np.arange(-5,5,0.01)&lt;br /&gt;
X = fourier(x,f,10.0)&lt;br /&gt;
py.plot(f,np.abs(X))&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Powinno wytworzyć rysunek:&lt;br /&gt;
&lt;br /&gt;
[[Plik:Fourier_test.png]] &lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
import numpy as np&lt;br /&gt;
import pylab as py&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def koreluj_pol(x,y,max_tau):&lt;br /&gt;
    x = x - np.mean(x)&lt;br /&gt;
    y = y - np.mean(y)&lt;br /&gt;
    N= len(x)&lt;br /&gt;
    cor = np.zeros(max_tau+1)&lt;br /&gt;
    cor[0] = np.sum(x[:]*y[:]) &lt;br /&gt;
    for i in range(1,max_tau+1):&lt;br /&gt;
        cor[i] = np.sum(x[i:]*y[:-i])&lt;br /&gt;
        &lt;br /&gt;
    cor = cor /(N)&lt;br /&gt;
    return cor&lt;br /&gt;
&lt;br /&gt;
def koreluj(x,y,max_tau):&lt;br /&gt;
    cor = np.zeros(2*max_tau+1)    &lt;br /&gt;
    cor[max_tau:] = koreluj_pol(x,y,max_tau)&lt;br /&gt;
    tmp = koreluj_pol(y,x,max_tau)&lt;br /&gt;
    cor[:max_tau+1] = tmp[-1::-1]&lt;br /&gt;
    return cor  &lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
def fourier_chin(x, FF, FS):&lt;br /&gt;
    ak = koreluj(x,x,len(x)-1)&lt;br /&gt;
    M = np.zeros(len(FF),dtype='complex') &lt;br /&gt;
    for i,f in enumerate( FF):&lt;br /&gt;
        for tau in range(len(ak)):&lt;br /&gt;
	    M[i] += ak[tau]*np.exp(-2*np.pi*1j*f*( tau- len(x))/FS)&lt;br /&gt;
    #M/=np.sqrt(len(ak))&lt;br /&gt;
    return M&lt;br /&gt;
    &lt;br /&gt;
def fourier(ak, FF, FS):&lt;br /&gt;
   &lt;br /&gt;
    M = np.zeros(len(FF),dtype='complex') &lt;br /&gt;
    for i,f in enumerate( FF):&lt;br /&gt;
        for tau in range(len(ak)):&lt;br /&gt;
	    M[i] += ak[tau]*np.exp(-2*np.pi*1j*f*( tau)/FS)&lt;br /&gt;
    M/=np.sqrt(len(ak))&lt;br /&gt;
    return M&lt;br /&gt;
t= np.arange(0,1,0.05)&lt;br /&gt;
x = np.sin(2*np.pi*2*t)&lt;br /&gt;
f = np.arange(-5,5,0.01)&lt;br /&gt;
&lt;br /&gt;
X = fourier_chin(x,f,10.0)&lt;br /&gt;
Xf = fourier(x,f,10.0)&lt;br /&gt;
print X&lt;br /&gt;
py.plot(f,np.abs(X), f,np.abs(Xf)**2)&lt;br /&gt;
py.show()&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zadanie 3: Związek autokorelacji z widmem sygnału==&lt;br /&gt;
Oblicz gęstość widmową mocy sygnału zarejestrowanego w trakcie czuwania z zamkniętymi oczami, korzystając z twierdzenia Chinczyna oraz [[Nieparametryczne_widmo_mocy#Metoda_Welcha | metodą Welcha]].&lt;br /&gt;
Znajdź częstość rytmu &amp;amp;alpha; dla osoby, która była badana.&lt;br /&gt;
&lt;br /&gt;
==Funkcja kowariancji (wzajemnej)==&lt;br /&gt;
&lt;br /&gt;
W celu scharakteryzowania zależności wzajemnej dwóch sygnałów losowych, stosuje się funkcję kowariancji, zdefiniowaną w następujący sposób:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid98&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy} (\tau ) = \mathrm{cov}(x(t),y(t-\tau ))=\mathrm{E}[(x(t)-\mu _x)(y(t-\tau )-\mu _y)]&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid99&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\mu _x = \mathrm{E}[x(t)]\\&lt;br /&gt;
\mu _y = \mathrm{E}[y(t)]\\ \end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W przypadku sygnałów ciągłych estymatę tę można zapisać w poniższy sposób:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid100&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy} (\tau ) = \frac{1}{T}\int _0^{T}(x(t)-\mu_x)(y(t-\tau)-\mu_y)dt&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
natomiast dla sygnałów dyskretnych jako:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid101&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy}(k) = \frac{1}{N-1}\sum _{i=0}^{N-k}(x(i+k)-x_s)(y(i)-y_s)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W odróżnieniu od funkcji autokowariancji, funkcja kowariancji nie musi mieć maksimum dla przesunięcia &amp;lt;math&amp;gt;\tau =0&amp;lt;/math&amp;gt;. Ponadto posiada ona następującą cechę:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid102&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy}(-\tau ) = \gamma _{yx}(\tau )&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcję kowariancji można znormalizować:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid103&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\rho (\tau) = \frac{\mathrm{E}[(x(t)-\mu _x)(y(t-\tau )-\mu _y)]}{\sqrt{\mathrm{E}[(x(t)-\mu _x)^2]\mathrm{E}[(y(t)-\mu _y)^2]}} = \frac{\gamma _{xy}}{\sigma_x\sigma_y}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
Otrzymaną funkcję nazywamy funkcją korelacji.&lt;br /&gt;
Jednym z zastosowań funkcji korelacji jest wyznaczanie czasu przejścia sygnału przez dany układ liniowy. Funkcja korelacji pomiędzy sygnałem na wejściu układu i sygnałem na jego wyjściu osiągnie wartość maksymalną dla przesunięcia &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; równego czasowi, jaki potrzebował sygnał na pokonanie danego układu. Niestety, taka metoda wyznaczania opóźnienia obarczona jest pewną wadą &amp;amp;mdash; w przypadku gdy prędkość sygnału bądź jego droga zależą od częstości, wtedy na wykresie funkcji korelacji nie uzyskamy wyraźnego maksimum.&lt;br /&gt;
&lt;br /&gt;
=====Polecenie =====&lt;br /&gt;
Zaimplementuj funkcję obliczającą funkcję kowariancji dla różnych sygnałów ''x'' i ''y'' (równanie &amp;lt;xr id=&amp;quot;uid82&amp;quot;&amp;gt;%i&amp;lt;/xr&amp;gt;)&amp;lt;!-- skorzystaj przy tym z własności opisanej równaniem &amp;lt;xr id=&amp;quot;uid82&amp;quot;&amp;gt;(%i)&amp;lt;/xr&amp;gt;--&amp;gt;. &lt;br /&gt;
Przykładowe wywołanie:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
b = np.array([-1,-2,-3])&lt;br /&gt;
&lt;br /&gt;
print koreluj(a,b)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
powinno dać w wyniku:&lt;br /&gt;
 [ 0.5 0.  -1.   0.   0.5]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
{{hidden begin|title=Przykładowe rozwiązanie:}}&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import pylab as py&lt;br /&gt;
&lt;br /&gt;
def koreluj(x,y,max_tau):&lt;br /&gt;
    x = x - np.mean(x)&lt;br /&gt;
    y = y - np.mean(y)&lt;br /&gt;
    cor = np.zeros(2*max_tau+1)&lt;br /&gt;
    cor[max_tau] = np.sum(x[:]*y[:]) &lt;br /&gt;
    for i in range(1,max_tau+1):&lt;br /&gt;
        cor[max_tau+i] = np.sum(x[i:]*y[:-i])&lt;br /&gt;
        cor[max_tau-i] = np.sum(y[i:]*x[:-i])&lt;br /&gt;
    N= len(x)&lt;br /&gt;
    cor = cor /(N-1)&lt;br /&gt;
    return cor&lt;br /&gt;
&lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
b = np.array([-1,-2,-3])&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    print koreluj(a,b,i)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}} --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadanie 4===&lt;br /&gt;
Z danych zarejestrowanych w trakcie czuwania z zamkniętymi oczami wybierz sygnały z następujących kanałów: Fp1, P3, Pz, P4, Fp2, O1, O2.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Dla każdego kanału oblicz funkcję autokorelacji, zaś  dla każdej pary kanałów oblicz funkcję korelacji wzajemnej. Wyniki zaprezentuj w formie kwadratowej macierzy wykresów (za pomocą funkcji subplot, tak jak na przykładowym rys. (rys. &amp;lt;xr id=&amp;quot;uid9&amp;quot;&amp;gt; %i&amp;lt;/xr&amp;gt;)). Na przekątnej macierzy narysuj funkcję autokorelacji odpowiednich kanałów, poza przekątną &amp;amp;mdash; funkcję korelacji wzajemnej. Wskaż kanały, które są najbardziej skorelowane ze sobą. Czy możliwe jest wyznaczenie opóźnienia sygnału pomiędzy tymi kanałami?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Powtórz punkt 1, tym razem jednak funkcję autokorelacji i korelacji wzajemnej oblicz na sygnałach przefiltrowanych filtrem wąskopasmowym w paśmie alfa charakterystycznym dla badanej osoby. ([[%C4%86wiczenia_7#Funkcje_do_projektowania_filtr.C3.B3w_IIR_dost.C4.99pne_w_module_scipy.signal|przypomnienie konstrukcji filtrów]])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Oszacuj istotność statystyczną zależności między parami kanałów. Twoją hipotezą zerową jest brak istotnej korelacji pomiędzy sygnałami zarejestrowanymi przez dwie różne elektrody EEG. Hipoteza alternatywna to występowanie zależności pomiędzy tymi sygnałami. Podanie estymatorów wariancji funkcji korelacji jest bardzo trudne, dlatego jednym ze sposobów oszacowania progu powyżej którego wartość funkcji korelacji można byłoby uznać za istotną statystycznie, jest zastosowanie metody ''bootstrap''. Teoretycznie, funkcja korelacji policzona dla dwóch rzeczywistych, nieskorelowanych sygnałów, powinna wynosić 0 dla każdego przesunięcia &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt;. Tak jest jednak w przypadku sygnałów nieskończonych; w analizie sygnałów takowych nie spotkamy.&lt;br /&gt;
&lt;br /&gt;
Dokonując losowej zamiany kolejności próbek, możemy doprowadzić do wytworzenia sygnałów zależnych losowo, które jednak ze względu na skończony czas trwania, dadzą niezerową funkcję korelacji. Poziom losowych fluktuacji tej funkcji oszacujemy wykonując następujące kroki:&lt;br /&gt;
&amp;lt;ol type=&amp;quot;A&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Losowa zamiana kolejności próbek w analizowanych sygnałach. Jeżeli pomiędzy dwoma sygnałami istnieją jakieś zależności, losowa zamiana próbek doprowadzi do zniszczenia tych związków. W ten sposób uzyskujemy sygnały, które teoretycznie są nieskorelowane.&lt;br /&gt;
&amp;lt;li&amp;gt; Obliczenie funkcji  korelacji wzajemnej dla sygnałów policzonych w punkcie A.&lt;br /&gt;
&amp;lt;li&amp;gt; Powtórzenie kroków A i B wiele (np. 1000) razy.&lt;br /&gt;
&amp;lt;li&amp;gt; Oszacowanie 95% przedziału ufności dla wartości średniej funkcji korelacji wzajemnej dla danego przesunięcia &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; korzystając z otrzymanego w kroku C empirycznego rozkładu wartości tych funkcji dla sygnałów niezależnych.  &lt;br /&gt;
&amp;lt;li&amp;gt; Powtórzenie kroków A-D dla kolejnych przesunięć &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;li&amp;gt; Sprawdzenie, dla których przesunięć &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; funkcje autokorelacji i korelacji obliczone dla oryginalnych sygnałów uzyskały wartości wyższe niż wartości progowe oszacowane dla sygnałów o losowych zależnościach.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Procedura opisana powyżej ma jednak '''zasadniczą wadę'''. Staramy się w niej oszacować poziom przypadkowych korelacji pomiędzy dwoma sygnałami dla kolejnych przesunięć &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt;, co jest niczym innym jak wielokrotnym powtórzeniem pewnego testu. Obserwowanie korelacji dla wielu par kanałów równocześnie również prowadzi do zwiększenia szansy na zaobserwowanie ekstremalnie dużych fluktuacji.&lt;br /&gt;
Występuje tu zatem ''problem wielokrotnych porównań''.&lt;br /&gt;
Przypominamy, iż może to doprowadzić do przypadkowego uznania wyników jako &amp;amp;bdquo;istotnych&amp;amp;rdquo; statystycznie. Np. jeśli pojedynczy test wykonujemy na poziomie istotności 5% to dopuszczamy odrzucenie w 1 przypadku na 20 hipotezy zerowej pomimo, iż jest ona prawdziwa. Z drugiej jednak strony, jeśli powtórzymy wykonywany test 20 razy, to oczekujemy uzyskania 1 przypadku, w którym poziom ''p'' będzie mniejszy od 5% co jest przesłanką za odrzuceniem hipotezy zerowej. &lt;br /&gt;
&lt;br /&gt;
W przypadku wykonywania serii testów należałoby więc zastosować odpowiednie poprawki, np. [http://www.bmj.com/content/310/6973/170.full korektę Bonferroniego] czy [http://en.wikipedia.org/wiki/False_discovery_rate false discovery rate (FDR)]. Innym rozwiązaniem w analizowanym przez nas problemie jest zastosowanie tzw. statystyk wartości ekstremalnych, które prowadzą do następujących zmian w procedurze:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol type=&amp;quot;A&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;	Losowa zmiana kolejności próbek w analizowanych sygnałach (we wszystkich analizowanych kanałach). Jeżeli pomiędzy dwoma sygnałami istnieją jakieś zależności, losowa zamiana próbek doprowadzi do zniszczenia tych związków. W ten sposób uzyskujemy sygnały, które teoretycznie są nieskorelowane.&lt;br /&gt;
&amp;lt;li&amp;gt;	Obliczenie funkcji korelacji dla sygnałów otrzymanych w punkcie A.&lt;br /&gt;
&amp;lt;li&amp;gt;    Zapamiętanie maksymalnej wartości bezwzględnej funkcji korelacji z punktu B (maksimum bierzemy po wszystkich przesunięciach i po wszystkich parach kanałów; dla funkcji autokorelacji, ze względu na jej normalizację do 1 dla zerowego przesunięcia, tam maksymalnych wartości poszukujemy dla przesunięć innych niż 0).&lt;br /&gt;
&amp;lt;li&amp;gt;	Powtórzenie kroków A-C 1000 razy. Uzyskamy w ten sposób rozkład maksymalnych wartości funkcji korelacji możliwych do zaobserwowania dla sygnałów niezależnych.&lt;br /&gt;
&amp;lt;li&amp;gt;    Wyznaczenie 95 centyla rozkładu wartości maksymalnych.&lt;br /&gt;
&amp;lt;li&amp;gt;	Nałożenie na rysunki funkcji korelacji uzyskane w Zadaniu 2 poziomych linii symbolizujących poziom zależności dwóch sygnałów o losowych zależnościach i sprawdzenie, dla których przesunięć &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; wartości funkcji korelacji przekraczają estymowane progi istotności statystycznej.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Plik:Korelacje_wzajemne.png|700px|center|thumb|&amp;lt;figure id=&amp;quot;uid9&amp;quot; /&amp;gt;Przykład wyniku analizy korelacji wzajemnych dla sygnału niefiltrowanego z naniesionymi granicami możliwych fluktuacji.]]&lt;br /&gt;
&lt;br /&gt;
==Wzajemna gęstość widmowa sygnałów==&lt;br /&gt;
&lt;br /&gt;
Podobnie jak w przypadku twierdzenia Chinczyna dla pojedynczego sygnału, możliwe jest policzenie transformaty Fouriera funkcji kowariancji. Uzyskana w ten sposób wielkość nazywa się funkcją wzajemnej gęstości mocy widmowej sygnału:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid122&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
S_{xy}(f) = \int _{-\infty }^{\infty }\gamma_{xy}(\tau )e^{-2\pi i f \tau}d\tau &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W celu dalszego omówienia własności funkcji wzajemnej mocy widmowej sygnałów funkcję tę zapiszemy w postaci:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid123&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
S_{xy}(f) = |S_{xy}(f)|e^{i\phi _{xy}(f)}\\&lt;br /&gt;
\\&lt;br /&gt;
\phi _{xy} = \arg(S_{xy}) &lt;br /&gt;
\end{array} &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&amp;lt;!-- \mathrm{arc\,tg}\left[\frac{\mathrm{Im}(S_{xy}(f))}{\mathrm{Re}(S_{xy}(f))}\right]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wartość bezwzględna funkcji wzajemnej gęstości mocy widmowej osiąga największą wartość dla '''częstości''', w których sygnały &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;y(t)&amp;lt;/math&amp;gt; są ze sobą skorelowane. Funkcja wzajemnej mocy widmowej sygnałów pozbawiona jest zatem wady, która charakteryzowała funkcję korelacji, to jest problemu z wyznaczeniem czasu transmisji sygnału, w przypadku gdy czas ten zależał od częstości. Przy pomocy funkcji wzajemnej mocy widmowej, czas ten można oszacować przy pomocy fazy tej funkcji &amp;amp;mdash; &amp;lt;math&amp;gt;\phi _{xy}(f)&amp;lt;/math&amp;gt;. Jeśli funkcja wzajemnej mocy widmowej została wyznaczona pomiędzy sygnałami na wejściu i wyjściu układu liniowego, to faza ta reprezentuje przesunięcie fazowe sygnału przy przejściu przez układ. Czas tego przejścia można oszacować za pomocą następującej wyrażenia:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid124&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\tau = \frac{\phi _{xy}(f)}{2\pi f}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Podobnie jak w przypadku funkcji autokorelacji i korelacji wzajemnej, funkcję wzajemnej gęstości mocy widmowej można znormalizować:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid125&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
C_{xy}(f) = \frac{S_{xy}(f)}{\sqrt{S_x(f)S_y(f)}}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Znormalizowaną postać funkcji wzajemnej gęstości mocy widmowej nazywamy funkcją ''koherencji''. &lt;br /&gt;
Koherencja jest wielkością zespoloną. Faza koherencji odzwierciedla różnicę faz pomiędzy dwoma sygnałami. Moduł koherencji reprezentuje stopień synchronizacji sygnałów i zawiera się w przedziale od 0.0 do 1.0. Moduł tej funkcji zawiera się w przedziale od 0 do 1. Wartości 0 odpowiada brak synchronizacji pomiędzy sygnałami, zaś wartości 1 pełna synchronizacja dwóch przebiegów czasowych. Należy również zwrócić uwagę na nazewnictwo - często sam moduł koherencji określany jest jako koherencja, w literaturze anglojęzycznej moduł koherencji posiada jednak odrębną nazwę: Magnitude Square Coherence (MSC). Istotny jest również sposób estymacji modułu koherencji, który wyprowadzono w następnym rozdziale, zaś sam estymator reprezentuje wzór (36).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadanie 5===&lt;br /&gt;
Zaimplementuj funkcję obliczającą wzajemną gęstość widmową dla pary kanałów. &lt;br /&gt;
&amp;lt;!--Niech argumentami tej funkcji będą dwa wektory zawierające sygnały, zakres częstości, częstość próbkowania. --&amp;gt;&lt;br /&gt;
Oblicz i narysuj macierz gęstości widmowych (własnych i wzajemnych) dla kolejnych par kanałów (tych samych co w zadaniu 3). Wyniki zaprezentuj w postaci kwadratowej macierzy rysunków. Ponieważ są to funkcje zespolone, dobrze jest zaprezentować osobno ich wartość i fazę. Uzyskane wartości bezwzględne narysuj nad przekątną tej macierzy, a fazę pod przekątną.&lt;br /&gt;
&lt;br /&gt;
===Zadanie 6===&lt;br /&gt;
Przygotuj sygnał dwukanałowy, w którym jako pierwszy sygnał wybierz fragment sygnału EEG (z danych zebranych wcześniej) o długości 2000 próbek, a jako drugiego sygnału użyj tego samego fragmentu EEG, ale opóźnionego o wybraną liczbę (1 - 5) próbek. Oblicz widma wzajemne tych sygnałów i zaprezentuj ich fazy na rysunku. Na podstawie tych widm znajdź wartość przesunięcia czasowego tych sygnałów.&lt;br /&gt;
&lt;br /&gt;
Obliczenia powtórz w przypadku, gdy do drugiego sygnału dodany będzie szum o wariancji równej 0,25 wariancji oryginalnego sygnału.&lt;/div&gt;</summary>
		<author><name>Maciek</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG_2/EEG_wlasno%C5%9Bci_EEG_spoczynkowego&amp;diff=11189</id>
		<title>Pracownia EEG 2/EEG wlasności EEG spoczynkowego</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG_2/EEG_wlasno%C5%9Bci_EEG_spoczynkowego&amp;diff=11189"/>
		<updated>2024-11-22T16:42:07Z</updated>

		<summary type="html">&lt;p&gt;Maciek: /* Polecenie */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Pracownia EEG 2|Pracownia EEG 2]] / Własności EEG spoczynkowego: funkcja autokorelacji i widmo&lt;br /&gt;
&lt;br /&gt;
=Estymacja funkcji autokowariancji, autokorelacji i koherencji sygnału.=&lt;br /&gt;
==Wstęp==&lt;br /&gt;
Z funkcjami tymi spotkaliśmy się już na zajęciach z [[Ćwiczenia_4|analizy sygnałów]].&lt;br /&gt;
&lt;br /&gt;
Funkcja autokowariancji sygnału charakteryzuje liniową zależność wartości tego sygnału w danej określonej chwili czasu od wartości (tego samego sygnału) w innej chwili.&lt;br /&gt;
W przypadku [[Nieparametryczne_widmo_mocy#Sygna.C5.82y_stochastyczne  | stacjonarnych procesów stochastycznych]], przebieg tej funkcji nie zależy od czasu. &lt;br /&gt;
Oznacza to, że obliczając funkcję autokorelacji sygnału pomiędzy chwilą czasu &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;x(t+\tau )&amp;lt;/math&amp;gt; otrzymamy tę samą wartość, jak dla przypadku obliczania funkcji autokorelacji pomiędzy momentami &amp;lt;math&amp;gt;x(t + T)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;x(t + T+\tau )&amp;lt;/math&amp;gt;, gdzie &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; to dowolny przedział czasu. Innymi słowy, funkcja autokorelacji procesu stacjonarnego zależy tylko od odstępu czasu pomiędzy próbkami &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt;, dla którego jest wyznaczana, a nie od konkretnej chwili czasu. Odrębną klasę sygnałów stanowią procesy niestacjonarne, w przypadku których funkcja autokorelacji będzie zależeć od czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; w którym jest obliczana. Estymator funkcji autokowariancji uzyskuje się poprzez obliczanie iloczynów wartości sygnału &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; w chwilach czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; czyli &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; i wartości sygnału &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; w chwili czasu ''t''+&amp;amp;tau; czyli &amp;lt;math&amp;gt;x(t+\tau)&amp;lt;/math&amp;gt; i uśredniając wartości iloczynów po czasie &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid79&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma (\tau) = \mathrm{cov}(x(t),x(t-\tau ))=\mathrm{E}[(x(t)-\mu )(x(t-\tau )-\mu )]&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(1)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid80&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\mu = \mathrm{E}[x(t)]&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(2)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W przypadku sygnałów ciągłych estymatę tę można zapisać w poniższy sposób:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid81&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma (\tau ) = \frac{1}{T}\int _0^{T}(x(t)-\mu )(x(t-\tau )-\mu )dt&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(3)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
natomiast dla sygnałów dyskretnych jako:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid82&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma (k) = \frac{1}{N-1}\sum _{i=1}^{N-|k|}(x(i+k)-x_s)(x(i)-x_s)&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(4)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid83&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
x_s = \frac{\sum _{i=1}^{N}x(i)}{N}&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(5)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcja autokowariancji może osiągać dowolne wartości, dlatego aby można było porównać przebieg tej funkcji np. pomiędzy dwoma sygnałami, wprowadzono wersję znormalizowaną tej funkcji &amp;amp;mdash; ''funkcję autokorelacji''. Normalizacja ta wygląda następująco:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid84&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\rho (k) = \frac{\gamma (\tau )}{\sigma^2}&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(6)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid85&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\sigma ^2 = \mathrm{E}[(x(t)-\mu )^2]&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(7)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wariancję sygnału (&amp;lt;math&amp;gt;\gamma (0)=\sigma ^2&amp;lt;/math&amp;gt;) można wyrazić przez funkcję autokowariancji dla przesunięcia &amp;lt;math&amp;gt;\tau =0&amp;lt;/math&amp;gt;.  Wynika z tego, że funkcja korelacji przyjmuje wartości z zakresu [&amp;amp;minus;1,&amp;amp;nbsp;1]. Ostatecznie estymator funkcji autokorelacji można zapisać jak poniżej:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid86&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\rho(k) = \frac{\gamma (k)}{\gamma (0)}&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(8)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcję autokorelacji estymuje się w celu określenia, w jakim stopniu wartości sygnału w danej chwili czasu wpływają na wartości sygnału w kolejnych chwilach czasu. Ma to kluczowe znaczenie przy rozpoznawaniu rodzaju procesów fizycznych odpowiedzialnego za generowanie sygnału. Funkcja ta zawsze mam maksimum dla przesunięcia &amp;lt;math&amp;gt;\tau =0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cechą charakterystyczną funkcji autokorelacji jest to, iż w przypadku sygnałów harmonicznych, przebieg funkcji ma charakter okresowy, z okresem takim samym jak okres badanego sygnału. W przypadku szumu, funkcja autokorelacji ma kształt funkcji delta Diraca.&lt;br /&gt;
&lt;br /&gt;
==Polecenie:==&lt;br /&gt;
Do policzenia funkcji autokorelacji posłużymy się funkcją biblioteczną &amp;lt;tt&amp;gt;numpy.correlate&amp;lt;/tt&amp;gt;. Funkcja ta, wbrew nazwie, oblicza wyłącznie splot swoich dwóch pierwszych argumentów wywołania. Musimy je więc przystosować do obliczenia wielkości zgodnie ze wzorem (4).&lt;br /&gt;
&lt;br /&gt;
Zaimplementuj funkcję do obliczania funkcji korelacji zgodnie ze wzorem &amp;lt;xr id=&amp;quot;uid82&amp;quot;&amp;gt;(%i)&amp;lt;/xr&amp;gt;. Funkcja powinna przyjmować jako parametry dwa wektory&amp;lt;!--i maksymalne przesunięcie wzajemne tych wektorów--&amp;gt;, a zwracać wektor zawierający ich funkcję autokorelacji. &lt;br /&gt;
&lt;br /&gt;
Wywołanie przykładowe:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
print koreluj(a,a)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
powinno dać wynik:&lt;br /&gt;
 [-0.5  0.   1.   0.  -0.5]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
# Średnia&lt;br /&gt;
mean = numpy.mean(data)&lt;br /&gt;
mean2 = numpy.mean(data2)&lt;br /&gt;
&lt;br /&gt;
# Wariancja&lt;br /&gt;
var = numpy.var(data)&lt;br /&gt;
var2 = numpy.var(data2)&lt;br /&gt;
&lt;br /&gt;
# Dane po odjęciu średnich&lt;br /&gt;
ndata = data - mean&lt;br /&gt;
ndata2 = data2 - mean2&lt;br /&gt;
&lt;br /&gt;
# Splot&lt;br /&gt;
acorr = numpy.correlate(ndata, ndata2, 'full')&lt;br /&gt;
&lt;br /&gt;
# Normalizacja kowariancji do korelacji i przez 1/N&lt;br /&gt;
acorr = acorr / numpy.sqrt(var*var2) / len(ndata)&lt;br /&gt;
&lt;br /&gt;
print(acorr)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{{hidden begin|title=Przykładowe rozwiązanie:}}--&amp;gt;&lt;br /&gt;
 &amp;lt;!-- &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
def koreluj_pol(x,y,max_tau):&lt;br /&gt;
    x = x - np.mean(x)&lt;br /&gt;
    y = y - np.mean(y)&lt;br /&gt;
    N= len(x)&lt;br /&gt;
    cor = np.zeros(max_tau+1)&lt;br /&gt;
    cor[0] = np.sum(x[:]*y[:]) &lt;br /&gt;
    for i in range(1,max_tau+1):&lt;br /&gt;
        cor[i] = np.sum(x[i:]*y[:-i])&lt;br /&gt;
        &lt;br /&gt;
    cor = cor /(N-1)&lt;br /&gt;
    return cor&lt;br /&gt;
&lt;br /&gt;
def koreluj(x,y,max_tau):&lt;br /&gt;
    cor = np.zeros(2*max_tau+1)    &lt;br /&gt;
    cor[max_tau:] = koreluj_pol(x,y,max_tau)&lt;br /&gt;
    tmp = koreluj_pol(y,x,max_tau)&lt;br /&gt;
    cor[:max_tau+1] = tmp[-1::-1]&lt;br /&gt;
    return cor    &lt;br /&gt;
    &lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    print koreluj(a,a,i)&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
b = np.array([-1,-2,-3])&lt;br /&gt;
&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    print koreluj(a,b,i)&lt;br /&gt;
    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zadanie 1: Pomiar sygnału EEG ==&lt;br /&gt;
&lt;br /&gt;
Zarejestruj 10 minut sygnału EEG, w trakcie których badana osoba będzie siedziała z otwartymi oczami oraz kolejne 10 minut w stanie czuwania z zamkniętymi oczami. Rejestrację należy wykonać na pełnym czepku 10-20 z częstością próbkowania 128 Hz. &lt;br /&gt;
&lt;br /&gt;
==Zadanie 2:  Funkcje autokowariancji i autokorelacji==&lt;br /&gt;
W tym zadaniu posłużymy się sygnałami zarejestrowanymi w punkcie 3. poprzedniego ćwiczenia. Zaobserwuj, na którym kanale rytm alfa osiąga najwyższą wartość. Następnie zaimplementuj w Pythonie następujące kroki:&lt;br /&gt;
&lt;br /&gt;
#	Wczytaj dane z wybranego kanału.&lt;br /&gt;
#	Oblicz funkcję autokorelacji dla sygnału zarejestrowanego w warunkach, gdy osoba badana siedziała z otwartymi oczami. Narysuj autokorelogram, to jest wykres wartości funkcji autokorelacji względem przesunięcia &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt;. Oś &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; wyskaluj w sekundach.&lt;br /&gt;
#	Powtórz krok 2, tym razem dla sygnału zebranego w warunkach czuwania z zamkniętymi oczami.&lt;br /&gt;
#	Porównaj autokorelogramy.&lt;br /&gt;
&lt;br /&gt;
=Związek autokorelacji z widmem sygnału=&lt;br /&gt;
==Wstęp==&lt;br /&gt;
Zgodnie z twierdzeniem Chinczyna, z którym zapoznaliśmy się na wykładzie z [[Twierdzenie_Wienera-Chinczyna|Analizy Sygnałów]], widmową gęstość mocy sygnału można policzyć jako transformatę Fouriera funkcji autokowariancji:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid93&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
S(f) = \int _{-\infty }^{\infty }\gamma (\tau )e^{-2\pi i f \tau}d\tau &amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(9)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	&amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; &amp;amp;mdash; częstość&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	&amp;lt;math&amp;gt;S(f)&amp;lt;/math&amp;gt; &amp;amp;mdash;  gęstość widmowa mocy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Poniższy kod ilustruje to twierdzenie:&lt;br /&gt;
&amp;lt;source lang = py&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
from numpy.fft import rfft,fft,fftfreq,fftshift&lt;br /&gt;
 &lt;br /&gt;
def widmo_mocy(s, Fs):&lt;br /&gt;
    '''Funkcja licąca widmo mocy metodą periodogramu,&lt;br /&gt;
	pobiera sygnał i częstość próbkowania&lt;br /&gt;
	zwraca widmo mocy i oś częstości&lt;br /&gt;
    '''&lt;br /&gt;
    S = fft(s)/np.sqrt(len(s))&lt;br /&gt;
    S_moc = S*S.conj()&lt;br /&gt;
    S_moc = S_moc.real&lt;br /&gt;
    F = fftfreq(len(s), 1/Fs)&lt;br /&gt;
    return (fftshift(S_moc),fftshift(F))&lt;br /&gt;
 &lt;br /&gt;
def sin(f = 1, T = 1, Fs = 128, phi =0 ):&lt;br /&gt;
    '''sin o zadanej częstości (w Hz), długości, fazie i częstości próbkowania&lt;br /&gt;
    Domyślnie wytwarzany jest sygnał reprezentujący &lt;br /&gt;
    1 sekundę sinusa o częstości 1Hz i zerowej fazie próbkowanego 128 Hz&lt;br /&gt;
    '''&lt;br /&gt;
    dt = 1.0/Fs&lt;br /&gt;
    t = np.arange(0,T,dt)&lt;br /&gt;
    s = np.sin(2*np.pi*f*t + phi)&lt;br /&gt;
    return (s,t)&lt;br /&gt;
 &lt;br /&gt;
# sygnał próbny będzie próbkowany z częstością FS&lt;br /&gt;
FS = 100.0&lt;br /&gt;
# sygnałem próbnym będzie sinusoida o częstości f &lt;br /&gt;
(s,t) = sin(f=10.5,Fs=FS)&lt;br /&gt;
# obliczamy moc i energię sygnału w dziedzinie czasu&lt;br /&gt;
moc_w_czasie = s**2&lt;br /&gt;
energia_w_czasie = np.sum(moc_w_czasie)&lt;br /&gt;
print 'energia w czasie: ', energia_w_czasie&lt;br /&gt;
 &lt;br /&gt;
# obliczamy widmo mocy sygnału i jego energię estymowaną w dziedzinie częstości&lt;br /&gt;
(moc_w_czestosci, F) = widmo_mocy(s, Fs=FS)&lt;br /&gt;
energia_w_czestosci = np.sum(moc_w_czestosci)&lt;br /&gt;
print 'energia w czestosci: ', energia_w_czestosci&lt;br /&gt;
 &lt;br /&gt;
# estymujemy funkcję autokorelacji sygnału&lt;br /&gt;
ak = 1./(2*len(s)-1)*np.correlate(s,s,'full')&lt;br /&gt;
&lt;br /&gt;
# estymujemy widmo mocy i energię sygnału z twierdzenia Chinczyna korzystając z funkcji fft:&lt;br /&gt;
moc_chi = np.abs(fft(ak))&lt;br /&gt;
energia_chin = sum(moc_chi)&lt;br /&gt;
print 'energia z tw. Chinczyna przez fft: ', energia_chin&lt;br /&gt;
 &lt;br /&gt;
# estymujemy widmo mocy i energię sygnału z twierdzenia Chinczyna korzystając z jawnej postaci transformaty Fouriera:&lt;br /&gt;
FF = np.linspace(-FS/2,FS/2,1000)&lt;br /&gt;
M = np.zeros(len(FF),dtype='complex')&lt;br /&gt;
 &lt;br /&gt;
for i,f in enumerate( FF):&lt;br /&gt;
    for tau in range(len(ak)):&lt;br /&gt;
        M[i] += ak[tau]*np.exp(2*np.pi*1j*f*(len(ak)-tau)/FS) &lt;br /&gt;
M = np.abs(M)&lt;br /&gt;
energia_chin_sum = np.sum(M)* (len(ak)/len(FF))&lt;br /&gt;
print 'energia z tw. Chinczyna przez sumowanie: ', energia_chin_sum&lt;br /&gt;
&lt;br /&gt;
# Rysunki&lt;br /&gt;
py.figure(1)&lt;br /&gt;
py.subplot(3,1,1)&lt;br /&gt;
py.plot(t,s)&lt;br /&gt;
py.title(u'Sygnal')&lt;br /&gt;
py.subplot(3,1,2)&lt;br /&gt;
py.plot(t,moc_w_czasie)&lt;br /&gt;
py.title(u'moc w czasie')&lt;br /&gt;
py.subplot(3,1,3)&lt;br /&gt;
py.plot(F,moc_w_czestosci)&lt;br /&gt;
py.title(u'moc w czestosci')&lt;br /&gt;
 &lt;br /&gt;
py.figure(2)&lt;br /&gt;
py.subplot(3,1,1)&lt;br /&gt;
py.title('f. autokowariancji')&lt;br /&gt;
py.plot(np.arange(-len(ak)/2,len(ak)/2,1)/FS ,ak)&lt;br /&gt;
py.subplot(3,1,2)&lt;br /&gt;
py.plot(fftshift(fftfreq(len(moc_chi),1./FS)),fftshift(moc_chi))&lt;br /&gt;
py.title('widmo mocy z Tw. Chinczyna przez fft')&lt;br /&gt;
py.subplot(3,1,3)&lt;br /&gt;
py.plot(FF,M)&lt;br /&gt;
py.title('widmo mocy z Tw. Chinczyna przez sumowanie')&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W wyniku powinniśmy zobaczyć w terminalu:&lt;br /&gt;
 energia w czasie:  50.0&lt;br /&gt;
 energia w czestosci:  50.0&lt;br /&gt;
 energia z tw. Chinczyna przez fft:  50.0&lt;br /&gt;
 energia z tw. Chinczyna przez sumowanie:  49.9501172217&lt;br /&gt;
&lt;br /&gt;
oraz powinny pojawić się rysunki:&lt;br /&gt;
[[Plik:Fig_chinczyn1.png|thumb 200 px|center]]&lt;br /&gt;
[[Plik:Fig_chinczyn2.png|thumb 200 px|center]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Polecenie ==&lt;br /&gt;
Zaimplementuj funkcję obliczającą transformację Fouriera dyskretyzując wzór (9) dla zadanego wektora częstości &amp;lt;tt&amp;gt;f&amp;lt;/tt&amp;gt; i zadanej częstości próbkowania sygnału (tutaj: 10).&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Wywołanie przykładowe:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
t= np.arange(0,1,0.1)&lt;br /&gt;
x = np.sin(2*np.pi*2*t)&lt;br /&gt;
f = np.arange(-5,5,1)&lt;br /&gt;
X,f = fourier(x,f,10.0)&lt;br /&gt;
print X&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Natomiast wywołanie:&lt;br /&gt;
&amp;lt;source lang ='python'&amp;gt;&lt;br /&gt;
t= np.arange(0,1,0.1)&lt;br /&gt;
x = np.sin(2*np.pi*2*t)&lt;br /&gt;
f = np.arange(-5,5,0.01)&lt;br /&gt;
X = fourier(x,f,10.0)&lt;br /&gt;
py.plot(f,np.abs(X))&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Powinno wytworzyć rysunek:&lt;br /&gt;
&lt;br /&gt;
[[Plik:Fourier_test.png]] &lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
import numpy as np&lt;br /&gt;
import pylab as py&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def koreluj_pol(x,y,max_tau):&lt;br /&gt;
    x = x - np.mean(x)&lt;br /&gt;
    y = y - np.mean(y)&lt;br /&gt;
    N= len(x)&lt;br /&gt;
    cor = np.zeros(max_tau+1)&lt;br /&gt;
    cor[0] = np.sum(x[:]*y[:]) &lt;br /&gt;
    for i in range(1,max_tau+1):&lt;br /&gt;
        cor[i] = np.sum(x[i:]*y[:-i])&lt;br /&gt;
        &lt;br /&gt;
    cor = cor /(N)&lt;br /&gt;
    return cor&lt;br /&gt;
&lt;br /&gt;
def koreluj(x,y,max_tau):&lt;br /&gt;
    cor = np.zeros(2*max_tau+1)    &lt;br /&gt;
    cor[max_tau:] = koreluj_pol(x,y,max_tau)&lt;br /&gt;
    tmp = koreluj_pol(y,x,max_tau)&lt;br /&gt;
    cor[:max_tau+1] = tmp[-1::-1]&lt;br /&gt;
    return cor  &lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
def fourier_chin(x, FF, FS):&lt;br /&gt;
    ak = koreluj(x,x,len(x)-1)&lt;br /&gt;
    M = np.zeros(len(FF),dtype='complex') &lt;br /&gt;
    for i,f in enumerate( FF):&lt;br /&gt;
        for tau in range(len(ak)):&lt;br /&gt;
	    M[i] += ak[tau]*np.exp(-2*np.pi*1j*f*( tau- len(x))/FS)&lt;br /&gt;
    #M/=np.sqrt(len(ak))&lt;br /&gt;
    return M&lt;br /&gt;
    &lt;br /&gt;
def fourier(ak, FF, FS):&lt;br /&gt;
   &lt;br /&gt;
    M = np.zeros(len(FF),dtype='complex') &lt;br /&gt;
    for i,f in enumerate( FF):&lt;br /&gt;
        for tau in range(len(ak)):&lt;br /&gt;
	    M[i] += ak[tau]*np.exp(-2*np.pi*1j*f*( tau)/FS)&lt;br /&gt;
    M/=np.sqrt(len(ak))&lt;br /&gt;
    return M&lt;br /&gt;
t= np.arange(0,1,0.05)&lt;br /&gt;
x = np.sin(2*np.pi*2*t)&lt;br /&gt;
f = np.arange(-5,5,0.01)&lt;br /&gt;
&lt;br /&gt;
X = fourier_chin(x,f,10.0)&lt;br /&gt;
Xf = fourier(x,f,10.0)&lt;br /&gt;
print X&lt;br /&gt;
py.plot(f,np.abs(X), f,np.abs(Xf)**2)&lt;br /&gt;
py.show()&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zadanie 3: Związek autokorelacji z widmem sygnału==&lt;br /&gt;
Oblicz gęstość widmową mocy sygnału zarejestrowanego w trakcie czuwania z zamkniętymi oczami, korzystając z twierdzenia Chinczyna oraz [[Nieparametryczne_widmo_mocy#Metoda_Welcha | metodą Welcha]].&lt;br /&gt;
Znajdź częstość rytmu &amp;amp;alpha; dla osoby, która była badana.&lt;br /&gt;
&lt;br /&gt;
==Funkcja kowariancji (wzajemnej)==&lt;br /&gt;
&lt;br /&gt;
W celu scharakteryzowania zależności wzajemnej dwóch sygnałów losowych, stosuje się funkcję kowariancji, zdefiniowaną w następujący sposób:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid98&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy} (\tau ) = \mathrm{cov}(x(t),y(t-\tau ))=\mathrm{E}[(x(t)-\mu _x)(y(t-\tau )-\mu _y)]&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid99&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\mu _x = \mathrm{E}[x(t)]\\&lt;br /&gt;
\mu _y = \mathrm{E}[y(t)]\\ \end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W przypadku sygnałów ciągłych estymatę tę można zapisać w poniższy sposób:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid100&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy} (\tau ) = \frac{1}{T}\int _0^{T}(x(t)-\mu_x)(y(t-\tau)-\mu_y)dt&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
natomiast dla sygnałów dyskretnych jako:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid101&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy}(k) = \frac{1}{N-1}\sum _{i=0}^{N-k}(x(i+k)-x_s)(y(i)-y_s)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W odróżnieniu od funkcji autokowariancji, funkcja kowariancji nie musi mieć maksimum dla przesunięcia &amp;lt;math&amp;gt;\tau =0&amp;lt;/math&amp;gt;. Ponadto posiada ona następującą cechę:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid102&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy}(-\tau ) = \gamma _{yx}(\tau )&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcję kowariancji można znormalizować:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid103&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\rho (\tau) = \frac{\mathrm{E}[(x(t)-\mu _x)(y(t-\tau )-\mu _y)]}{\sqrt{\mathrm{E}[(x(t)-\mu _x)^2]\mathrm{E}[(y(t)-\mu _y)^2]}} = \frac{\gamma _{xy}}{\sigma_x\sigma_y}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
Otrzymaną funkcję nazywamy funkcją korelacji.&lt;br /&gt;
Jednym z zastosowań funkcji korelacji jest wyznaczanie czasu przejścia sygnału przez dany układ liniowy. Funkcja korelacji pomiędzy sygnałem na wejściu układu i sygnałem na jego wyjściu osiągnie wartość maksymalną dla przesunięcia &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; równego czasowi, jaki potrzebował sygnał na pokonanie danego układu. Niestety, taka metoda wyznaczania opóźnienia obarczona jest pewną wadą &amp;amp;mdash; w przypadku gdy prędkość sygnału bądź jego droga zależą od częstości, wtedy na wykresie funkcji korelacji nie uzyskamy wyraźnego maksimum.&lt;br /&gt;
&lt;br /&gt;
=====Polecenie =====&lt;br /&gt;
Zaimplementuj funkcję obliczającą funkcję kowariancji dla różnych sygnałów ''x'' i ''y'' (równanie &amp;lt;xr id=&amp;quot;uid82&amp;quot;&amp;gt;%i&amp;lt;/xr&amp;gt;) skorzystaj przy tym z własności opisanej równaniem &amp;lt;xr id=&amp;quot;uid82&amp;quot;&amp;gt;(%i)&amp;lt;/xr&amp;gt;. &lt;br /&gt;
Przykładowe wywołanie:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
b = np.array([-1,-2,-3])&lt;br /&gt;
&lt;br /&gt;
print koreluj(a,b)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
powinno dać w wyniku:&lt;br /&gt;
 [ 0.5 0.  -1.   0.   0.5]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
{{hidden begin|title=Przykładowe rozwiązanie:}}&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import pylab as py&lt;br /&gt;
&lt;br /&gt;
def koreluj(x,y,max_tau):&lt;br /&gt;
    x = x - np.mean(x)&lt;br /&gt;
    y = y - np.mean(y)&lt;br /&gt;
    cor = np.zeros(2*max_tau+1)&lt;br /&gt;
    cor[max_tau] = np.sum(x[:]*y[:]) &lt;br /&gt;
    for i in range(1,max_tau+1):&lt;br /&gt;
        cor[max_tau+i] = np.sum(x[i:]*y[:-i])&lt;br /&gt;
        cor[max_tau-i] = np.sum(y[i:]*x[:-i])&lt;br /&gt;
    N= len(x)&lt;br /&gt;
    cor = cor /(N-1)&lt;br /&gt;
    return cor&lt;br /&gt;
&lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
b = np.array([-1,-2,-3])&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    print koreluj(a,b,i)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}} --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadanie 4===&lt;br /&gt;
Z danych zarejestrowanych w trakcie czuwania z zamkniętymi oczami wybierz sygnały z następujących kanałów: Fp1, P3, Pz, P4, Fp2, O1, O2.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Dla każdego kanału oblicz funkcję autokorelacji, zaś  dla każdej pary kanałów oblicz funkcję korelacji wzajemnej. Wyniki zaprezentuj w formie kwadratowej macierzy wykresów (za pomocą funkcji subplot, tak jak na przykładowym rys. (rys. &amp;lt;xr id=&amp;quot;uid9&amp;quot;&amp;gt; %i&amp;lt;/xr&amp;gt;)). Na przekątnej macierzy narysuj funkcję autokorelacji odpowiednich kanałów, poza przekątną &amp;amp;mdash; funkcję korelacji wzajemnej. Wskaż kanały, które są najbardziej skorelowane ze sobą. Czy możliwe jest wyznaczenie opóźnienia sygnału pomiędzy tymi kanałami?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Powtórz punkt 1, tym razem jednak funkcję autokorelacji i korelacji wzajemnej oblicz na sygnałach przefiltrowanych filtrem wąskopasmowym w paśmie alfa charakterystycznym dla badanej osoby. ([[%C4%86wiczenia_7#Funkcje_do_projektowania_filtr.C3.B3w_IIR_dost.C4.99pne_w_module_scipy.signal|przypomnienie konstrukcji filtrów]])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Oszacuj istotność statystyczną zależności między parami kanałów. Twoją hipotezą zerową jest brak istotnej korelacji pomiędzy sygnałami zarejestrowanymi przez dwie różne elektrody EEG. Hipoteza alternatywna to występowanie zależności pomiędzy tymi sygnałami. Podanie estymatorów wariancji funkcji korelacji jest bardzo trudne, dlatego jednym ze sposobów oszacowania progu powyżej którego wartość funkcji korelacji można byłoby uznać za istotną statystycznie, jest zastosowanie metody ''bootstrap''. Teoretycznie, funkcja korelacji policzona dla dwóch rzeczywistych, nieskorelowanych sygnałów, powinna wynosić 0 dla każdego przesunięcia &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt;. Tak jest jednak w przypadku sygnałów nieskończonych; w analizie sygnałów takowych nie spotkamy.&lt;br /&gt;
&lt;br /&gt;
Dokonując losowej zamiany kolejności próbek, możemy doprowadzić do wytworzenia sygnałów zależnych losowo, które jednak ze względu na skończony czas trwania, dadzą niezerową funkcję korelacji. Poziom losowych fluktuacji tej funkcji oszacujemy wykonując następujące kroki:&lt;br /&gt;
&amp;lt;ol type=&amp;quot;A&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Losowa zamiana kolejności próbek w analizowanych sygnałach. Jeżeli pomiędzy dwoma sygnałami istnieją jakieś zależności, losowa zamiana próbek doprowadzi do zniszczenia tych związków. W ten sposób uzyskujemy sygnały, które teoretycznie są nieskorelowane.&lt;br /&gt;
&amp;lt;li&amp;gt; Obliczenie funkcji  korelacji wzajemnej dla sygnałów policzonych w punkcie A.&lt;br /&gt;
&amp;lt;li&amp;gt; Powtórzenie kroków A i B wiele (np. 1000) razy.&lt;br /&gt;
&amp;lt;li&amp;gt; Oszacowanie 95% przedziału ufności dla wartości średniej funkcji korelacji wzajemnej dla danego przesunięcia &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; korzystając z otrzymanego w kroku C empirycznego rozkładu wartości tych funkcji dla sygnałów niezależnych.  &lt;br /&gt;
&amp;lt;li&amp;gt; Powtórzenie kroków A-D dla kolejnych przesunięć &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;li&amp;gt; Sprawdzenie, dla których przesunięć &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; funkcje autokorelacji i korelacji obliczone dla oryginalnych sygnałów uzyskały wartości wyższe niż wartości progowe oszacowane dla sygnałów o losowych zależnościach.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Procedura opisana powyżej ma jednak '''zasadniczą wadę'''. Staramy się w niej oszacować poziom przypadkowych korelacji pomiędzy dwoma sygnałami dla kolejnych przesunięć &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt;, co jest niczym innym jak wielokrotnym powtórzeniem pewnego testu. Obserwowanie korelacji dla wielu par kanałów równocześnie również prowadzi do zwiększenia szansy na zaobserwowanie ekstremalnie dużych fluktuacji.&lt;br /&gt;
Występuje tu zatem ''problem wielokrotnych porównań''.&lt;br /&gt;
Przypominamy, iż może to doprowadzić do przypadkowego uznania wyników jako &amp;amp;bdquo;istotnych&amp;amp;rdquo; statystycznie. Np. jeśli pojedynczy test wykonujemy na poziomie istotności 5% to dopuszczamy odrzucenie w 1 przypadku na 20 hipotezy zerowej pomimo, iż jest ona prawdziwa. Z drugiej jednak strony, jeśli powtórzymy wykonywany test 20 razy, to oczekujemy uzyskania 1 przypadku, w którym poziom ''p'' będzie mniejszy od 5% co jest przesłanką za odrzuceniem hipotezy zerowej. &lt;br /&gt;
&lt;br /&gt;
W przypadku wykonywania serii testów należałoby więc zastosować odpowiednie poprawki, np. [http://www.bmj.com/content/310/6973/170.full korektę Bonferroniego] czy [http://en.wikipedia.org/wiki/False_discovery_rate false discovery rate (FDR)]. Innym rozwiązaniem w analizowanym przez nas problemie jest zastosowanie tzw. statystyk wartości ekstremalnych, które prowadzą do następujących zmian w procedurze:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol type=&amp;quot;A&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;	Losowa zmiana kolejności próbek w analizowanych sygnałach (we wszystkich analizowanych kanałach). Jeżeli pomiędzy dwoma sygnałami istnieją jakieś zależności, losowa zamiana próbek doprowadzi do zniszczenia tych związków. W ten sposób uzyskujemy sygnały, które teoretycznie są nieskorelowane.&lt;br /&gt;
&amp;lt;li&amp;gt;	Obliczenie funkcji korelacji dla sygnałów otrzymanych w punkcie A.&lt;br /&gt;
&amp;lt;li&amp;gt;    Zapamiętanie maksymalnej wartości bezwzględnej funkcji korelacji z punktu B (maksimum bierzemy po wszystkich przesunięciach i po wszystkich parach kanałów; dla funkcji autokorelacji, ze względu na jej normalizację do 1 dla zerowego przesunięcia, tam maksymalnych wartości poszukujemy dla przesunięć innych niż 0).&lt;br /&gt;
&amp;lt;li&amp;gt;	Powtórzenie kroków A-C 1000 razy. Uzyskamy w ten sposób rozkład maksymalnych wartości funkcji korelacji możliwych do zaobserwowania dla sygnałów niezależnych.&lt;br /&gt;
&amp;lt;li&amp;gt;    Wyznaczenie 95 centyla rozkładu wartości maksymalnych.&lt;br /&gt;
&amp;lt;li&amp;gt;	Nałożenie na rysunki funkcji korelacji uzyskane w Zadaniu 2 poziomych linii symbolizujących poziom zależności dwóch sygnałów o losowych zależnościach i sprawdzenie, dla których przesunięć &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; wartości funkcji korelacji przekraczają estymowane progi istotności statystycznej.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Plik:Korelacje_wzajemne.png|700px|center|thumb|&amp;lt;figure id=&amp;quot;uid9&amp;quot; /&amp;gt;Przykład wyniku analizy korelacji wzajemnych dla sygnału niefiltrowanego z naniesionymi granicami możliwych fluktuacji.]]&lt;br /&gt;
&lt;br /&gt;
==Wzajemna gęstość widmowa sygnałów==&lt;br /&gt;
&lt;br /&gt;
Podobnie jak w przypadku twierdzenia Chinczyna dla pojedynczego sygnału, możliwe jest policzenie transformaty Fouriera funkcji kowariancji. Uzyskana w ten sposób wielkość nazywa się funkcją wzajemnej gęstości mocy widmowej sygnału:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid122&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
S_{xy}(f) = \int _{-\infty }^{\infty }\gamma_{xy}(\tau )e^{-2\pi i f \tau}d\tau &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W celu dalszego omówienia własności funkcji wzajemnej mocy widmowej sygnałów funkcję tę zapiszemy w postaci:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid123&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
S_{xy}(f) = |S_{xy}(f)|e^{i\phi _{xy}(f)}\\&lt;br /&gt;
\\&lt;br /&gt;
\phi _{xy} = \arg(S_{xy}) &lt;br /&gt;
\end{array} &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&amp;lt;!-- \mathrm{arc\,tg}\left[\frac{\mathrm{Im}(S_{xy}(f))}{\mathrm{Re}(S_{xy}(f))}\right]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wartość bezwzględna funkcji wzajemnej gęstości mocy widmowej osiąga największą wartość dla '''częstości''', w których sygnały &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;y(t)&amp;lt;/math&amp;gt; są ze sobą skorelowane. Funkcja wzajemnej mocy widmowej sygnałów pozbawiona jest zatem wady, która charakteryzowała funkcję korelacji, to jest problemu z wyznaczeniem czasu transmisji sygnału, w przypadku gdy czas ten zależał od częstości. Przy pomocy funkcji wzajemnej mocy widmowej, czas ten można oszacować przy pomocy fazy tej funkcji &amp;amp;mdash; &amp;lt;math&amp;gt;\phi _{xy}(f)&amp;lt;/math&amp;gt;. Jeśli funkcja wzajemnej mocy widmowej została wyznaczona pomiędzy sygnałami na wejściu i wyjściu układu liniowego, to faza ta reprezentuje przesunięcie fazowe sygnału przy przejściu przez układ. Czas tego przejścia można oszacować za pomocą następującej wyrażenia:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid124&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\tau = \frac{\phi _{xy}(f)}{2\pi f}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Podobnie jak w przypadku funkcji autokorelacji i korelacji wzajemnej, funkcję wzajemnej gęstości mocy widmowej można znormalizować:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid125&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
C_{xy}(f) = \frac{S_{xy}(f)}{\sqrt{S_x(f)S_y(f)}}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Znormalizowaną postać funkcji wzajemnej gęstości mocy widmowej nazywamy funkcją ''koherencji''. &lt;br /&gt;
Koherencja jest wielkością zespoloną. Faza koherencji odzwierciedla różnicę faz pomiędzy dwoma sygnałami. Moduł koherencji reprezentuje stopień synchronizacji sygnałów i zawiera się w przedziale od 0.0 do 1.0. Moduł tej funkcji zawiera się w przedziale od 0 do 1. Wartości 0 odpowiada brak synchronizacji pomiędzy sygnałami, zaś wartości 1 pełna synchronizacja dwóch przebiegów czasowych. Należy również zwrócić uwagę na nazewnictwo - często sam moduł koherencji określany jest jako koherencja, w literaturze anglojęzycznej moduł koherencji posiada jednak odrębną nazwę: Magnitude Square Coherence (MSC). Istotny jest również sposób estymacji modułu koherencji, który wyprowadzono w następnym rozdziale, zaś sam estymator reprezentuje wzór (36).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadanie 5===&lt;br /&gt;
Zaimplementuj funkcję obliczającą wzajemną gęstość widmową dla pary kanałów. &lt;br /&gt;
&amp;lt;!--Niech argumentami tej funkcji będą dwa wektory zawierające sygnały, zakres częstości, częstość próbkowania. --&amp;gt;&lt;br /&gt;
Oblicz i narysuj macierz gęstości widmowych (własnych i wzajemnych) dla kolejnych par kanałów (tych samych co w zadaniu 3). Wyniki zaprezentuj w postaci kwadratowej macierzy rysunków. Ponieważ są to funkcje zespolone, dobrze jest zaprezentować osobno ich wartość i fazę. Uzyskane wartości bezwzględne narysuj nad przekątną tej macierzy, a fazę pod przekątną.&lt;br /&gt;
&lt;br /&gt;
===Zadanie 6===&lt;br /&gt;
Przygotuj sygnał dwukanałowy, w którym jako pierwszy sygnał wybierz fragment sygnału EEG (z danych zebranych wcześniej) o długości 2000 próbek, a jako drugiego sygnału użyj tego samego fragmentu EEG, ale opóźnionego o wybraną liczbę (1 - 5) próbek. Oblicz widma wzajemne tych sygnałów i zaprezentuj ich fazy na rysunku. Na podstawie tych widm znajdź wartość przesunięcia czasowego tych sygnałów.&lt;br /&gt;
&lt;br /&gt;
Obliczenia powtórz w przypadku, gdy do drugiego sygnału dodany będzie szum o wariancji równej 0,25 wariancji oryginalnego sygnału.&lt;/div&gt;</summary>
		<author><name>Maciek</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG_2/EEG_wlasno%C5%9Bci_EEG_spoczynkowego&amp;diff=11188</id>
		<title>Pracownia EEG 2/EEG wlasności EEG spoczynkowego</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG_2/EEG_wlasno%C5%9Bci_EEG_spoczynkowego&amp;diff=11188"/>
		<updated>2024-11-22T16:41:16Z</updated>

		<summary type="html">&lt;p&gt;Maciek: /* Polecenie: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Pracownia EEG 2|Pracownia EEG 2]] / Własności EEG spoczynkowego: funkcja autokorelacji i widmo&lt;br /&gt;
&lt;br /&gt;
=Estymacja funkcji autokowariancji, autokorelacji i koherencji sygnału.=&lt;br /&gt;
==Wstęp==&lt;br /&gt;
Z funkcjami tymi spotkaliśmy się już na zajęciach z [[Ćwiczenia_4|analizy sygnałów]].&lt;br /&gt;
&lt;br /&gt;
Funkcja autokowariancji sygnału charakteryzuje liniową zależność wartości tego sygnału w danej określonej chwili czasu od wartości (tego samego sygnału) w innej chwili.&lt;br /&gt;
W przypadku [[Nieparametryczne_widmo_mocy#Sygna.C5.82y_stochastyczne  | stacjonarnych procesów stochastycznych]], przebieg tej funkcji nie zależy od czasu. &lt;br /&gt;
Oznacza to, że obliczając funkcję autokorelacji sygnału pomiędzy chwilą czasu &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;x(t+\tau )&amp;lt;/math&amp;gt; otrzymamy tę samą wartość, jak dla przypadku obliczania funkcji autokorelacji pomiędzy momentami &amp;lt;math&amp;gt;x(t + T)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;x(t + T+\tau )&amp;lt;/math&amp;gt;, gdzie &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; to dowolny przedział czasu. Innymi słowy, funkcja autokorelacji procesu stacjonarnego zależy tylko od odstępu czasu pomiędzy próbkami &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt;, dla którego jest wyznaczana, a nie od konkretnej chwili czasu. Odrębną klasę sygnałów stanowią procesy niestacjonarne, w przypadku których funkcja autokorelacji będzie zależeć od czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; w którym jest obliczana. Estymator funkcji autokowariancji uzyskuje się poprzez obliczanie iloczynów wartości sygnału &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; w chwilach czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; czyli &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; i wartości sygnału &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; w chwili czasu ''t''+&amp;amp;tau; czyli &amp;lt;math&amp;gt;x(t+\tau)&amp;lt;/math&amp;gt; i uśredniając wartości iloczynów po czasie &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid79&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma (\tau) = \mathrm{cov}(x(t),x(t-\tau ))=\mathrm{E}[(x(t)-\mu )(x(t-\tau )-\mu )]&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(1)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid80&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\mu = \mathrm{E}[x(t)]&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(2)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W przypadku sygnałów ciągłych estymatę tę można zapisać w poniższy sposób:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid81&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma (\tau ) = \frac{1}{T}\int _0^{T}(x(t)-\mu )(x(t-\tau )-\mu )dt&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(3)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
natomiast dla sygnałów dyskretnych jako:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid82&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma (k) = \frac{1}{N-1}\sum _{i=1}^{N-|k|}(x(i+k)-x_s)(x(i)-x_s)&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(4)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid83&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
x_s = \frac{\sum _{i=1}^{N}x(i)}{N}&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(5)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcja autokowariancji może osiągać dowolne wartości, dlatego aby można było porównać przebieg tej funkcji np. pomiędzy dwoma sygnałami, wprowadzono wersję znormalizowaną tej funkcji &amp;amp;mdash; ''funkcję autokorelacji''. Normalizacja ta wygląda następująco:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid84&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\rho (k) = \frac{\gamma (\tau )}{\sigma^2}&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(6)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid85&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\sigma ^2 = \mathrm{E}[(x(t)-\mu )^2]&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(7)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wariancję sygnału (&amp;lt;math&amp;gt;\gamma (0)=\sigma ^2&amp;lt;/math&amp;gt;) można wyrazić przez funkcję autokowariancji dla przesunięcia &amp;lt;math&amp;gt;\tau =0&amp;lt;/math&amp;gt;.  Wynika z tego, że funkcja korelacji przyjmuje wartości z zakresu [&amp;amp;minus;1,&amp;amp;nbsp;1]. Ostatecznie estymator funkcji autokorelacji można zapisać jak poniżej:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid86&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\rho(k) = \frac{\gamma (k)}{\gamma (0)}&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(8)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcję autokorelacji estymuje się w celu określenia, w jakim stopniu wartości sygnału w danej chwili czasu wpływają na wartości sygnału w kolejnych chwilach czasu. Ma to kluczowe znaczenie przy rozpoznawaniu rodzaju procesów fizycznych odpowiedzialnego za generowanie sygnału. Funkcja ta zawsze mam maksimum dla przesunięcia &amp;lt;math&amp;gt;\tau =0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cechą charakterystyczną funkcji autokorelacji jest to, iż w przypadku sygnałów harmonicznych, przebieg funkcji ma charakter okresowy, z okresem takim samym jak okres badanego sygnału. W przypadku szumu, funkcja autokorelacji ma kształt funkcji delta Diraca.&lt;br /&gt;
&lt;br /&gt;
==Polecenie:==&lt;br /&gt;
Do policzenia funkcji autokorelacji posłużymy się funkcją biblioteczną &amp;lt;tt&amp;gt;numpy.correlate&amp;lt;/tt&amp;gt;. Funkcja ta, wbrew nazwie, oblicza wyłącznie splot swoich dwóch pierwszych argumentów wywołania. Musimy je więc przystosować do obliczenia wielkości zgodnie ze wzorem (4).&lt;br /&gt;
&lt;br /&gt;
Zaimplementuj funkcję do obliczania funkcji korelacji zgodnie ze wzorem &amp;lt;xr id=&amp;quot;uid82&amp;quot;&amp;gt;(%i)&amp;lt;/xr&amp;gt;. Funkcja powinna przyjmować jako parametry dwa wektory&amp;lt;!--i maksymalne przesunięcie wzajemne tych wektorów--&amp;gt;, a zwracać wektor zawierający ich funkcję autokorelacji. &lt;br /&gt;
&lt;br /&gt;
Wywołanie przykładowe:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
print koreluj(a,a)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
powinno dać wynik:&lt;br /&gt;
 [-0.5  0.   1.   0.  -0.5]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
# Średnia&lt;br /&gt;
mean = numpy.mean(data)&lt;br /&gt;
mean2 = numpy.mean(data2)&lt;br /&gt;
&lt;br /&gt;
# Wariancja&lt;br /&gt;
var = numpy.var(data)&lt;br /&gt;
var2 = numpy.var(data2)&lt;br /&gt;
&lt;br /&gt;
# Dane po odjęciu średnich&lt;br /&gt;
ndata = data - mean&lt;br /&gt;
ndata2 = data2 - mean2&lt;br /&gt;
&lt;br /&gt;
# Splot&lt;br /&gt;
acorr = numpy.correlate(ndata, ndata2, 'full')&lt;br /&gt;
&lt;br /&gt;
# Normalizacja kowariancji do korelacji i przez 1/N&lt;br /&gt;
acorr = acorr / numpy.sqrt(var*var2) / len(ndata)&lt;br /&gt;
&lt;br /&gt;
print(acorr)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{{hidden begin|title=Przykładowe rozwiązanie:}}--&amp;gt;&lt;br /&gt;
 &amp;lt;!-- &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
def koreluj_pol(x,y,max_tau):&lt;br /&gt;
    x = x - np.mean(x)&lt;br /&gt;
    y = y - np.mean(y)&lt;br /&gt;
    N= len(x)&lt;br /&gt;
    cor = np.zeros(max_tau+1)&lt;br /&gt;
    cor[0] = np.sum(x[:]*y[:]) &lt;br /&gt;
    for i in range(1,max_tau+1):&lt;br /&gt;
        cor[i] = np.sum(x[i:]*y[:-i])&lt;br /&gt;
        &lt;br /&gt;
    cor = cor /(N-1)&lt;br /&gt;
    return cor&lt;br /&gt;
&lt;br /&gt;
def koreluj(x,y,max_tau):&lt;br /&gt;
    cor = np.zeros(2*max_tau+1)    &lt;br /&gt;
    cor[max_tau:] = koreluj_pol(x,y,max_tau)&lt;br /&gt;
    tmp = koreluj_pol(y,x,max_tau)&lt;br /&gt;
    cor[:max_tau+1] = tmp[-1::-1]&lt;br /&gt;
    return cor    &lt;br /&gt;
    &lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    print koreluj(a,a,i)&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
b = np.array([-1,-2,-3])&lt;br /&gt;
&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    print koreluj(a,b,i)&lt;br /&gt;
    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zadanie 1: Pomiar sygnału EEG ==&lt;br /&gt;
&lt;br /&gt;
Zarejestruj 10 minut sygnału EEG, w trakcie których badana osoba będzie siedziała z otwartymi oczami oraz kolejne 10 minut w stanie czuwania z zamkniętymi oczami. Rejestrację należy wykonać na pełnym czepku 10-20 z częstością próbkowania 128 Hz. &lt;br /&gt;
&lt;br /&gt;
==Zadanie 2:  Funkcje autokowariancji i autokorelacji==&lt;br /&gt;
W tym zadaniu posłużymy się sygnałami zarejestrowanymi w punkcie 3. poprzedniego ćwiczenia. Zaobserwuj, na którym kanale rytm alfa osiąga najwyższą wartość. Następnie zaimplementuj w Pythonie następujące kroki:&lt;br /&gt;
&lt;br /&gt;
#	Wczytaj dane z wybranego kanału.&lt;br /&gt;
#	Oblicz funkcję autokorelacji dla sygnału zarejestrowanego w warunkach, gdy osoba badana siedziała z otwartymi oczami. Narysuj autokorelogram, to jest wykres wartości funkcji autokorelacji względem przesunięcia &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt;. Oś &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; wyskaluj w sekundach.&lt;br /&gt;
#	Powtórz krok 2, tym razem dla sygnału zebranego w warunkach czuwania z zamkniętymi oczami.&lt;br /&gt;
#	Porównaj autokorelogramy.&lt;br /&gt;
&lt;br /&gt;
=Związek autokorelacji z widmem sygnału=&lt;br /&gt;
==Wstęp==&lt;br /&gt;
Zgodnie z twierdzeniem Chinczyna, z którym zapoznaliśmy się na wykładzie z [[Twierdzenie_Wienera-Chinczyna|Analizy Sygnałów]], widmową gęstość mocy sygnału można policzyć jako transformatę Fouriera funkcji autokowariancji:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid93&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
S(f) = \int _{-\infty }^{\infty }\gamma (\tau )e^{-2\pi i f \tau}d\tau &amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(9)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	&amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; &amp;amp;mdash; częstość&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	&amp;lt;math&amp;gt;S(f)&amp;lt;/math&amp;gt; &amp;amp;mdash;  gęstość widmowa mocy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Poniższy kod ilustruje to twierdzenie:&lt;br /&gt;
&amp;lt;source lang = py&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
from numpy.fft import rfft,fft,fftfreq,fftshift&lt;br /&gt;
 &lt;br /&gt;
def widmo_mocy(s, Fs):&lt;br /&gt;
    '''Funkcja licąca widmo mocy metodą periodogramu,&lt;br /&gt;
	pobiera sygnał i częstość próbkowania&lt;br /&gt;
	zwraca widmo mocy i oś częstości&lt;br /&gt;
    '''&lt;br /&gt;
    S = fft(s)/np.sqrt(len(s))&lt;br /&gt;
    S_moc = S*S.conj()&lt;br /&gt;
    S_moc = S_moc.real&lt;br /&gt;
    F = fftfreq(len(s), 1/Fs)&lt;br /&gt;
    return (fftshift(S_moc),fftshift(F))&lt;br /&gt;
 &lt;br /&gt;
def sin(f = 1, T = 1, Fs = 128, phi =0 ):&lt;br /&gt;
    '''sin o zadanej częstości (w Hz), długości, fazie i częstości próbkowania&lt;br /&gt;
    Domyślnie wytwarzany jest sygnał reprezentujący &lt;br /&gt;
    1 sekundę sinusa o częstości 1Hz i zerowej fazie próbkowanego 128 Hz&lt;br /&gt;
    '''&lt;br /&gt;
    dt = 1.0/Fs&lt;br /&gt;
    t = np.arange(0,T,dt)&lt;br /&gt;
    s = np.sin(2*np.pi*f*t + phi)&lt;br /&gt;
    return (s,t)&lt;br /&gt;
 &lt;br /&gt;
# sygnał próbny będzie próbkowany z częstością FS&lt;br /&gt;
FS = 100.0&lt;br /&gt;
# sygnałem próbnym będzie sinusoida o częstości f &lt;br /&gt;
(s,t) = sin(f=10.5,Fs=FS)&lt;br /&gt;
# obliczamy moc i energię sygnału w dziedzinie czasu&lt;br /&gt;
moc_w_czasie = s**2&lt;br /&gt;
energia_w_czasie = np.sum(moc_w_czasie)&lt;br /&gt;
print 'energia w czasie: ', energia_w_czasie&lt;br /&gt;
 &lt;br /&gt;
# obliczamy widmo mocy sygnału i jego energię estymowaną w dziedzinie częstości&lt;br /&gt;
(moc_w_czestosci, F) = widmo_mocy(s, Fs=FS)&lt;br /&gt;
energia_w_czestosci = np.sum(moc_w_czestosci)&lt;br /&gt;
print 'energia w czestosci: ', energia_w_czestosci&lt;br /&gt;
 &lt;br /&gt;
# estymujemy funkcję autokorelacji sygnału&lt;br /&gt;
ak = 1./(2*len(s)-1)*np.correlate(s,s,'full')&lt;br /&gt;
&lt;br /&gt;
# estymujemy widmo mocy i energię sygnału z twierdzenia Chinczyna korzystając z funkcji fft:&lt;br /&gt;
moc_chi = np.abs(fft(ak))&lt;br /&gt;
energia_chin = sum(moc_chi)&lt;br /&gt;
print 'energia z tw. Chinczyna przez fft: ', energia_chin&lt;br /&gt;
 &lt;br /&gt;
# estymujemy widmo mocy i energię sygnału z twierdzenia Chinczyna korzystając z jawnej postaci transformaty Fouriera:&lt;br /&gt;
FF = np.linspace(-FS/2,FS/2,1000)&lt;br /&gt;
M = np.zeros(len(FF),dtype='complex')&lt;br /&gt;
 &lt;br /&gt;
for i,f in enumerate( FF):&lt;br /&gt;
    for tau in range(len(ak)):&lt;br /&gt;
        M[i] += ak[tau]*np.exp(2*np.pi*1j*f*(len(ak)-tau)/FS) &lt;br /&gt;
M = np.abs(M)&lt;br /&gt;
energia_chin_sum = np.sum(M)* (len(ak)/len(FF))&lt;br /&gt;
print 'energia z tw. Chinczyna przez sumowanie: ', energia_chin_sum&lt;br /&gt;
&lt;br /&gt;
# Rysunki&lt;br /&gt;
py.figure(1)&lt;br /&gt;
py.subplot(3,1,1)&lt;br /&gt;
py.plot(t,s)&lt;br /&gt;
py.title(u'Sygnal')&lt;br /&gt;
py.subplot(3,1,2)&lt;br /&gt;
py.plot(t,moc_w_czasie)&lt;br /&gt;
py.title(u'moc w czasie')&lt;br /&gt;
py.subplot(3,1,3)&lt;br /&gt;
py.plot(F,moc_w_czestosci)&lt;br /&gt;
py.title(u'moc w czestosci')&lt;br /&gt;
 &lt;br /&gt;
py.figure(2)&lt;br /&gt;
py.subplot(3,1,1)&lt;br /&gt;
py.title('f. autokowariancji')&lt;br /&gt;
py.plot(np.arange(-len(ak)/2,len(ak)/2,1)/FS ,ak)&lt;br /&gt;
py.subplot(3,1,2)&lt;br /&gt;
py.plot(fftshift(fftfreq(len(moc_chi),1./FS)),fftshift(moc_chi))&lt;br /&gt;
py.title('widmo mocy z Tw. Chinczyna przez fft')&lt;br /&gt;
py.subplot(3,1,3)&lt;br /&gt;
py.plot(FF,M)&lt;br /&gt;
py.title('widmo mocy z Tw. Chinczyna przez sumowanie')&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W wyniku powinniśmy zobaczyć w terminalu:&lt;br /&gt;
 energia w czasie:  50.0&lt;br /&gt;
 energia w czestosci:  50.0&lt;br /&gt;
 energia z tw. Chinczyna przez fft:  50.0&lt;br /&gt;
 energia z tw. Chinczyna przez sumowanie:  49.9501172217&lt;br /&gt;
&lt;br /&gt;
oraz powinny pojawić się rysunki:&lt;br /&gt;
[[Plik:Fig_chinczyn1.png|thumb 200 px|center]]&lt;br /&gt;
[[Plik:Fig_chinczyn2.png|thumb 200 px|center]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Polecenie ==&lt;br /&gt;
Zaimplementuj funkcję obliczającą transformację Fouriera dyskretyzując wzór (9) dla zadanego wektora częstości &amp;lt;tt&amp;gt;f&amp;lt;/tt&amp;gt; i zadanej częstości próbkowania sygnału (tutaj: 10).&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Wywołanie przykładowe:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
t= np.arange(0,1,0.1)&lt;br /&gt;
x = np.sin(2*np.pi*2*t)&lt;br /&gt;
f = np.arange(-5,5,1)&lt;br /&gt;
X,f = fourier(x,f,10.0)&lt;br /&gt;
print X&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Natomiast wywołanie:&lt;br /&gt;
&amp;lt;source lang ='python'&amp;gt;&lt;br /&gt;
t= np.arange(0,1,0.1)&lt;br /&gt;
x = np.sin(2*np.pi*2*t)&lt;br /&gt;
f = np.arange(-5,5,0.01)&lt;br /&gt;
X = fourier(x,f,10.0)&lt;br /&gt;
py.plot(f,np.abs(X))&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Powinno wytworzyć rysunek:&lt;br /&gt;
&lt;br /&gt;
[[Plik:Fourier_test.png]] &lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
import numpy as np&lt;br /&gt;
import pylab as py&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def koreluj_pol(x,y,max_tau):&lt;br /&gt;
    x = x - np.mean(x)&lt;br /&gt;
    y = y - np.mean(y)&lt;br /&gt;
    N= len(x)&lt;br /&gt;
    cor = np.zeros(max_tau+1)&lt;br /&gt;
    cor[0] = np.sum(x[:]*y[:]) &lt;br /&gt;
    for i in range(1,max_tau+1):&lt;br /&gt;
        cor[i] = np.sum(x[i:]*y[:-i])&lt;br /&gt;
        &lt;br /&gt;
    cor = cor /(N)&lt;br /&gt;
    return cor&lt;br /&gt;
&lt;br /&gt;
def koreluj(x,y,max_tau):&lt;br /&gt;
    cor = np.zeros(2*max_tau+1)    &lt;br /&gt;
    cor[max_tau:] = koreluj_pol(x,y,max_tau)&lt;br /&gt;
    tmp = koreluj_pol(y,x,max_tau)&lt;br /&gt;
    cor[:max_tau+1] = tmp[-1::-1]&lt;br /&gt;
    return cor  &lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
def fourier_chin(x, FF, FS):&lt;br /&gt;
    ak = koreluj(x,x,len(x)-1)&lt;br /&gt;
    M = np.zeros(len(FF),dtype='complex') &lt;br /&gt;
    for i,f in enumerate( FF):&lt;br /&gt;
        for tau in range(len(ak)):&lt;br /&gt;
	    M[i] += ak[tau]*np.exp(-2*np.pi*1j*f*( tau- len(x))/FS)&lt;br /&gt;
    #M/=np.sqrt(len(ak))&lt;br /&gt;
    return M&lt;br /&gt;
    &lt;br /&gt;
def fourier(ak, FF, FS):&lt;br /&gt;
   &lt;br /&gt;
    M = np.zeros(len(FF),dtype='complex') &lt;br /&gt;
    for i,f in enumerate( FF):&lt;br /&gt;
        for tau in range(len(ak)):&lt;br /&gt;
	    M[i] += ak[tau]*np.exp(-2*np.pi*1j*f*( tau)/FS)&lt;br /&gt;
    M/=np.sqrt(len(ak))&lt;br /&gt;
    return M&lt;br /&gt;
t= np.arange(0,1,0.05)&lt;br /&gt;
x = np.sin(2*np.pi*2*t)&lt;br /&gt;
f = np.arange(-5,5,0.01)&lt;br /&gt;
&lt;br /&gt;
X = fourier_chin(x,f,10.0)&lt;br /&gt;
Xf = fourier(x,f,10.0)&lt;br /&gt;
print X&lt;br /&gt;
py.plot(f,np.abs(X), f,np.abs(Xf)**2)&lt;br /&gt;
py.show()&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zadanie 3: Związek autokorelacji z widmem sygnału==&lt;br /&gt;
Oblicz gęstość widmową mocy sygnału zarejestrowanego w trakcie czuwania z zamkniętymi oczami, korzystając z twierdzenia Chinczyna oraz [[Nieparametryczne_widmo_mocy#Metoda_Welcha | metodą Welcha]].&lt;br /&gt;
Znajdź częstość rytmu &amp;amp;alpha; dla osoby, która była badana.&lt;br /&gt;
&lt;br /&gt;
==Funkcja kowariancji (wzajemnej)==&lt;br /&gt;
&lt;br /&gt;
W celu scharakteryzowania zależności wzajemnej dwóch sygnałów losowych, stosuje się funkcję kowariancji, zdefiniowaną w następujący sposób:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid98&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy} (\tau ) = \mathrm{cov}(x(t),y(t-\tau ))=\mathrm{E}[(x(t)-\mu _x)(y(t-\tau )-\mu _y)]&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid99&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\mu _x = \mathrm{E}[x(t)]\\&lt;br /&gt;
\mu _y = \mathrm{E}[y(t)]\\ \end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W przypadku sygnałów ciągłych estymatę tę można zapisać w poniższy sposób:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid100&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy} (\tau ) = \frac{1}{T}\int _0^{T}(x(t)-\mu_x)(y(t-\tau)-\mu_y)dt&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
natomiast dla sygnałów dyskretnych jako:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid101&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy}(k) = \frac{1}{N-1}\sum _{i=0}^{N-k}(x(i+k)-x_s)(y(i)-y_s)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W odróżnieniu od funkcji autokowariancji, funkcja kowariancji nie musi mieć maksimum dla przesunięcia &amp;lt;math&amp;gt;\tau =0&amp;lt;/math&amp;gt;. Ponadto posiada ona następującą cechę:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid102&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy}(-\tau ) = \gamma _{yx}(\tau )&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcję kowariancji można znormalizować:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid103&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\rho (\tau) = \frac{\mathrm{E}[(x(t)-\mu _x)(y(t-\tau )-\mu _y)]}{\sqrt{\mathrm{E}[(x(t)-\mu _x)^2]\mathrm{E}[(y(t)-\mu _y)^2]}} = \frac{\gamma _{xy}}{\sigma_x\sigma_y}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
Otrzymaną funkcję nazywamy funkcją korelacji.&lt;br /&gt;
Jednym z zastosowań funkcji korelacji jest wyznaczanie czasu przejścia sygnału przez dany układ liniowy. Funkcja korelacji pomiędzy sygnałem na wejściu układu i sygnałem na jego wyjściu osiągnie wartość maksymalną dla przesunięcia &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; równego czasowi, jaki potrzebował sygnał na pokonanie danego układu. Niestety, taka metoda wyznaczania opóźnienia obarczona jest pewną wadą &amp;amp;mdash; w przypadku gdy prędkość sygnału bądź jego droga zależą od częstości, wtedy na wykresie funkcji korelacji nie uzyskamy wyraźnego maksimum.&lt;br /&gt;
&lt;br /&gt;
=====Polecenie =====&lt;br /&gt;
Zaimplementuj funkcję obliczającą funkcję kowariancji dla różnych sygnałów ''x'' i ''y'' (równanie 13) skorzystaj przy tym z własności opisanej równaniem (14). &lt;br /&gt;
Przykładowe wywołanie:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
b = np.array([-1,-2,-3])&lt;br /&gt;
&lt;br /&gt;
print koreluj(a,b)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
powinno dać w wyniku:&lt;br /&gt;
 [ 0.5 0.  -1.   0.   0.5]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
{{hidden begin|title=Przykładowe rozwiązanie:}}&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import pylab as py&lt;br /&gt;
&lt;br /&gt;
def koreluj(x,y,max_tau):&lt;br /&gt;
    x = x - np.mean(x)&lt;br /&gt;
    y = y - np.mean(y)&lt;br /&gt;
    cor = np.zeros(2*max_tau+1)&lt;br /&gt;
    cor[max_tau] = np.sum(x[:]*y[:]) &lt;br /&gt;
    for i in range(1,max_tau+1):&lt;br /&gt;
        cor[max_tau+i] = np.sum(x[i:]*y[:-i])&lt;br /&gt;
        cor[max_tau-i] = np.sum(y[i:]*x[:-i])&lt;br /&gt;
    N= len(x)&lt;br /&gt;
    cor = cor /(N-1)&lt;br /&gt;
    return cor&lt;br /&gt;
&lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
b = np.array([-1,-2,-3])&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    print koreluj(a,b,i)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}} --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadanie 4===&lt;br /&gt;
Z danych zarejestrowanych w trakcie czuwania z zamkniętymi oczami wybierz sygnały z następujących kanałów: Fp1, P3, Pz, P4, Fp2, O1, O2.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Dla każdego kanału oblicz funkcję autokorelacji, zaś  dla każdej pary kanałów oblicz funkcję korelacji wzajemnej. Wyniki zaprezentuj w formie kwadratowej macierzy wykresów (za pomocą funkcji subplot, tak jak na przykładowym rys. (rys. &amp;lt;xr id=&amp;quot;uid9&amp;quot;&amp;gt; %i&amp;lt;/xr&amp;gt;)). Na przekątnej macierzy narysuj funkcję autokorelacji odpowiednich kanałów, poza przekątną &amp;amp;mdash; funkcję korelacji wzajemnej. Wskaż kanały, które są najbardziej skorelowane ze sobą. Czy możliwe jest wyznaczenie opóźnienia sygnału pomiędzy tymi kanałami?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Powtórz punkt 1, tym razem jednak funkcję autokorelacji i korelacji wzajemnej oblicz na sygnałach przefiltrowanych filtrem wąskopasmowym w paśmie alfa charakterystycznym dla badanej osoby. ([[%C4%86wiczenia_7#Funkcje_do_projektowania_filtr.C3.B3w_IIR_dost.C4.99pne_w_module_scipy.signal|przypomnienie konstrukcji filtrów]])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Oszacuj istotność statystyczną zależności między parami kanałów. Twoją hipotezą zerową jest brak istotnej korelacji pomiędzy sygnałami zarejestrowanymi przez dwie różne elektrody EEG. Hipoteza alternatywna to występowanie zależności pomiędzy tymi sygnałami. Podanie estymatorów wariancji funkcji korelacji jest bardzo trudne, dlatego jednym ze sposobów oszacowania progu powyżej którego wartość funkcji korelacji można byłoby uznać za istotną statystycznie, jest zastosowanie metody ''bootstrap''. Teoretycznie, funkcja korelacji policzona dla dwóch rzeczywistych, nieskorelowanych sygnałów, powinna wynosić 0 dla każdego przesunięcia &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt;. Tak jest jednak w przypadku sygnałów nieskończonych; w analizie sygnałów takowych nie spotkamy.&lt;br /&gt;
&lt;br /&gt;
Dokonując losowej zamiany kolejności próbek, możemy doprowadzić do wytworzenia sygnałów zależnych losowo, które jednak ze względu na skończony czas trwania, dadzą niezerową funkcję korelacji. Poziom losowych fluktuacji tej funkcji oszacujemy wykonując następujące kroki:&lt;br /&gt;
&amp;lt;ol type=&amp;quot;A&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Losowa zamiana kolejności próbek w analizowanych sygnałach. Jeżeli pomiędzy dwoma sygnałami istnieją jakieś zależności, losowa zamiana próbek doprowadzi do zniszczenia tych związków. W ten sposób uzyskujemy sygnały, które teoretycznie są nieskorelowane.&lt;br /&gt;
&amp;lt;li&amp;gt; Obliczenie funkcji  korelacji wzajemnej dla sygnałów policzonych w punkcie A.&lt;br /&gt;
&amp;lt;li&amp;gt; Powtórzenie kroków A i B wiele (np. 1000) razy.&lt;br /&gt;
&amp;lt;li&amp;gt; Oszacowanie 95% przedziału ufności dla wartości średniej funkcji korelacji wzajemnej dla danego przesunięcia &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; korzystając z otrzymanego w kroku C empirycznego rozkładu wartości tych funkcji dla sygnałów niezależnych.  &lt;br /&gt;
&amp;lt;li&amp;gt; Powtórzenie kroków A-D dla kolejnych przesunięć &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;li&amp;gt; Sprawdzenie, dla których przesunięć &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; funkcje autokorelacji i korelacji obliczone dla oryginalnych sygnałów uzyskały wartości wyższe niż wartości progowe oszacowane dla sygnałów o losowych zależnościach.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Procedura opisana powyżej ma jednak '''zasadniczą wadę'''. Staramy się w niej oszacować poziom przypadkowych korelacji pomiędzy dwoma sygnałami dla kolejnych przesunięć &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt;, co jest niczym innym jak wielokrotnym powtórzeniem pewnego testu. Obserwowanie korelacji dla wielu par kanałów równocześnie również prowadzi do zwiększenia szansy na zaobserwowanie ekstremalnie dużych fluktuacji.&lt;br /&gt;
Występuje tu zatem ''problem wielokrotnych porównań''.&lt;br /&gt;
Przypominamy, iż może to doprowadzić do przypadkowego uznania wyników jako &amp;amp;bdquo;istotnych&amp;amp;rdquo; statystycznie. Np. jeśli pojedynczy test wykonujemy na poziomie istotności 5% to dopuszczamy odrzucenie w 1 przypadku na 20 hipotezy zerowej pomimo, iż jest ona prawdziwa. Z drugiej jednak strony, jeśli powtórzymy wykonywany test 20 razy, to oczekujemy uzyskania 1 przypadku, w którym poziom ''p'' będzie mniejszy od 5% co jest przesłanką za odrzuceniem hipotezy zerowej. &lt;br /&gt;
&lt;br /&gt;
W przypadku wykonywania serii testów należałoby więc zastosować odpowiednie poprawki, np. [http://www.bmj.com/content/310/6973/170.full korektę Bonferroniego] czy [http://en.wikipedia.org/wiki/False_discovery_rate false discovery rate (FDR)]. Innym rozwiązaniem w analizowanym przez nas problemie jest zastosowanie tzw. statystyk wartości ekstremalnych, które prowadzą do następujących zmian w procedurze:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol type=&amp;quot;A&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;	Losowa zmiana kolejności próbek w analizowanych sygnałach (we wszystkich analizowanych kanałach). Jeżeli pomiędzy dwoma sygnałami istnieją jakieś zależności, losowa zamiana próbek doprowadzi do zniszczenia tych związków. W ten sposób uzyskujemy sygnały, które teoretycznie są nieskorelowane.&lt;br /&gt;
&amp;lt;li&amp;gt;	Obliczenie funkcji korelacji dla sygnałów otrzymanych w punkcie A.&lt;br /&gt;
&amp;lt;li&amp;gt;    Zapamiętanie maksymalnej wartości bezwzględnej funkcji korelacji z punktu B (maksimum bierzemy po wszystkich przesunięciach i po wszystkich parach kanałów; dla funkcji autokorelacji, ze względu na jej normalizację do 1 dla zerowego przesunięcia, tam maksymalnych wartości poszukujemy dla przesunięć innych niż 0).&lt;br /&gt;
&amp;lt;li&amp;gt;	Powtórzenie kroków A-C 1000 razy. Uzyskamy w ten sposób rozkład maksymalnych wartości funkcji korelacji możliwych do zaobserwowania dla sygnałów niezależnych.&lt;br /&gt;
&amp;lt;li&amp;gt;    Wyznaczenie 95 centyla rozkładu wartości maksymalnych.&lt;br /&gt;
&amp;lt;li&amp;gt;	Nałożenie na rysunki funkcji korelacji uzyskane w Zadaniu 2 poziomych linii symbolizujących poziom zależności dwóch sygnałów o losowych zależnościach i sprawdzenie, dla których przesunięć &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; wartości funkcji korelacji przekraczają estymowane progi istotności statystycznej.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Plik:Korelacje_wzajemne.png|700px|center|thumb|&amp;lt;figure id=&amp;quot;uid9&amp;quot; /&amp;gt;Przykład wyniku analizy korelacji wzajemnych dla sygnału niefiltrowanego z naniesionymi granicami możliwych fluktuacji.]]&lt;br /&gt;
&lt;br /&gt;
==Wzajemna gęstość widmowa sygnałów==&lt;br /&gt;
&lt;br /&gt;
Podobnie jak w przypadku twierdzenia Chinczyna dla pojedynczego sygnału, możliwe jest policzenie transformaty Fouriera funkcji kowariancji. Uzyskana w ten sposób wielkość nazywa się funkcją wzajemnej gęstości mocy widmowej sygnału:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid122&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
S_{xy}(f) = \int _{-\infty }^{\infty }\gamma_{xy}(\tau )e^{-2\pi i f \tau}d\tau &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W celu dalszego omówienia własności funkcji wzajemnej mocy widmowej sygnałów funkcję tę zapiszemy w postaci:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid123&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
S_{xy}(f) = |S_{xy}(f)|e^{i\phi _{xy}(f)}\\&lt;br /&gt;
\\&lt;br /&gt;
\phi _{xy} = \arg(S_{xy}) &lt;br /&gt;
\end{array} &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&amp;lt;!-- \mathrm{arc\,tg}\left[\frac{\mathrm{Im}(S_{xy}(f))}{\mathrm{Re}(S_{xy}(f))}\right]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wartość bezwzględna funkcji wzajemnej gęstości mocy widmowej osiąga największą wartość dla '''częstości''', w których sygnały &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;y(t)&amp;lt;/math&amp;gt; są ze sobą skorelowane. Funkcja wzajemnej mocy widmowej sygnałów pozbawiona jest zatem wady, która charakteryzowała funkcję korelacji, to jest problemu z wyznaczeniem czasu transmisji sygnału, w przypadku gdy czas ten zależał od częstości. Przy pomocy funkcji wzajemnej mocy widmowej, czas ten można oszacować przy pomocy fazy tej funkcji &amp;amp;mdash; &amp;lt;math&amp;gt;\phi _{xy}(f)&amp;lt;/math&amp;gt;. Jeśli funkcja wzajemnej mocy widmowej została wyznaczona pomiędzy sygnałami na wejściu i wyjściu układu liniowego, to faza ta reprezentuje przesunięcie fazowe sygnału przy przejściu przez układ. Czas tego przejścia można oszacować za pomocą następującej wyrażenia:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid124&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\tau = \frac{\phi _{xy}(f)}{2\pi f}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Podobnie jak w przypadku funkcji autokorelacji i korelacji wzajemnej, funkcję wzajemnej gęstości mocy widmowej można znormalizować:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid125&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
C_{xy}(f) = \frac{S_{xy}(f)}{\sqrt{S_x(f)S_y(f)}}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Znormalizowaną postać funkcji wzajemnej gęstości mocy widmowej nazywamy funkcją ''koherencji''. &lt;br /&gt;
Koherencja jest wielkością zespoloną. Faza koherencji odzwierciedla różnicę faz pomiędzy dwoma sygnałami. Moduł koherencji reprezentuje stopień synchronizacji sygnałów i zawiera się w przedziale od 0.0 do 1.0. Moduł tej funkcji zawiera się w przedziale od 0 do 1. Wartości 0 odpowiada brak synchronizacji pomiędzy sygnałami, zaś wartości 1 pełna synchronizacja dwóch przebiegów czasowych. Należy również zwrócić uwagę na nazewnictwo - często sam moduł koherencji określany jest jako koherencja, w literaturze anglojęzycznej moduł koherencji posiada jednak odrębną nazwę: Magnitude Square Coherence (MSC). Istotny jest również sposób estymacji modułu koherencji, który wyprowadzono w następnym rozdziale, zaś sam estymator reprezentuje wzór (36).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadanie 5===&lt;br /&gt;
Zaimplementuj funkcję obliczającą wzajemną gęstość widmową dla pary kanałów. &lt;br /&gt;
&amp;lt;!--Niech argumentami tej funkcji będą dwa wektory zawierające sygnały, zakres częstości, częstość próbkowania. --&amp;gt;&lt;br /&gt;
Oblicz i narysuj macierz gęstości widmowych (własnych i wzajemnych) dla kolejnych par kanałów (tych samych co w zadaniu 3). Wyniki zaprezentuj w postaci kwadratowej macierzy rysunków. Ponieważ są to funkcje zespolone, dobrze jest zaprezentować osobno ich wartość i fazę. Uzyskane wartości bezwzględne narysuj nad przekątną tej macierzy, a fazę pod przekątną.&lt;br /&gt;
&lt;br /&gt;
===Zadanie 6===&lt;br /&gt;
Przygotuj sygnał dwukanałowy, w którym jako pierwszy sygnał wybierz fragment sygnału EEG (z danych zebranych wcześniej) o długości 2000 próbek, a jako drugiego sygnału użyj tego samego fragmentu EEG, ale opóźnionego o wybraną liczbę (1 - 5) próbek. Oblicz widma wzajemne tych sygnałów i zaprezentuj ich fazy na rysunku. Na podstawie tych widm znajdź wartość przesunięcia czasowego tych sygnałów.&lt;br /&gt;
&lt;br /&gt;
Obliczenia powtórz w przypadku, gdy do drugiego sygnału dodany będzie szum o wariancji równej 0,25 wariancji oryginalnego sygnału.&lt;/div&gt;</summary>
		<author><name>Maciek</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG_2/EEG_wlasno%C5%9Bci_EEG_spoczynkowego&amp;diff=11187</id>
		<title>Pracownia EEG 2/EEG wlasności EEG spoczynkowego</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG_2/EEG_wlasno%C5%9Bci_EEG_spoczynkowego&amp;diff=11187"/>
		<updated>2024-11-22T16:40:51Z</updated>

		<summary type="html">&lt;p&gt;Maciek: /* Polecenie: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Pracownia EEG 2|Pracownia EEG 2]] / Własności EEG spoczynkowego: funkcja autokorelacji i widmo&lt;br /&gt;
&lt;br /&gt;
=Estymacja funkcji autokowariancji, autokorelacji i koherencji sygnału.=&lt;br /&gt;
==Wstęp==&lt;br /&gt;
Z funkcjami tymi spotkaliśmy się już na zajęciach z [[Ćwiczenia_4|analizy sygnałów]].&lt;br /&gt;
&lt;br /&gt;
Funkcja autokowariancji sygnału charakteryzuje liniową zależność wartości tego sygnału w danej określonej chwili czasu od wartości (tego samego sygnału) w innej chwili.&lt;br /&gt;
W przypadku [[Nieparametryczne_widmo_mocy#Sygna.C5.82y_stochastyczne  | stacjonarnych procesów stochastycznych]], przebieg tej funkcji nie zależy od czasu. &lt;br /&gt;
Oznacza to, że obliczając funkcję autokorelacji sygnału pomiędzy chwilą czasu &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;x(t+\tau )&amp;lt;/math&amp;gt; otrzymamy tę samą wartość, jak dla przypadku obliczania funkcji autokorelacji pomiędzy momentami &amp;lt;math&amp;gt;x(t + T)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;x(t + T+\tau )&amp;lt;/math&amp;gt;, gdzie &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; to dowolny przedział czasu. Innymi słowy, funkcja autokorelacji procesu stacjonarnego zależy tylko od odstępu czasu pomiędzy próbkami &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt;, dla którego jest wyznaczana, a nie od konkretnej chwili czasu. Odrębną klasę sygnałów stanowią procesy niestacjonarne, w przypadku których funkcja autokorelacji będzie zależeć od czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; w którym jest obliczana. Estymator funkcji autokowariancji uzyskuje się poprzez obliczanie iloczynów wartości sygnału &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; w chwilach czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; czyli &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; i wartości sygnału &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; w chwili czasu ''t''+&amp;amp;tau; czyli &amp;lt;math&amp;gt;x(t+\tau)&amp;lt;/math&amp;gt; i uśredniając wartości iloczynów po czasie &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid79&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma (\tau) = \mathrm{cov}(x(t),x(t-\tau ))=\mathrm{E}[(x(t)-\mu )(x(t-\tau )-\mu )]&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(1)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid80&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\mu = \mathrm{E}[x(t)]&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(2)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W przypadku sygnałów ciągłych estymatę tę można zapisać w poniższy sposób:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid81&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma (\tau ) = \frac{1}{T}\int _0^{T}(x(t)-\mu )(x(t-\tau )-\mu )dt&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(3)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
natomiast dla sygnałów dyskretnych jako:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid82&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma (k) = \frac{1}{N-1}\sum _{i=1}^{N-|k|}(x(i+k)-x_s)(x(i)-x_s)&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(4)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid83&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
x_s = \frac{\sum _{i=1}^{N}x(i)}{N}&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(5)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcja autokowariancji może osiągać dowolne wartości, dlatego aby można było porównać przebieg tej funkcji np. pomiędzy dwoma sygnałami, wprowadzono wersję znormalizowaną tej funkcji &amp;amp;mdash; ''funkcję autokorelacji''. Normalizacja ta wygląda następująco:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid84&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\rho (k) = \frac{\gamma (\tau )}{\sigma^2}&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(6)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid85&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\sigma ^2 = \mathrm{E}[(x(t)-\mu )^2]&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(7)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wariancję sygnału (&amp;lt;math&amp;gt;\gamma (0)=\sigma ^2&amp;lt;/math&amp;gt;) można wyrazić przez funkcję autokowariancji dla przesunięcia &amp;lt;math&amp;gt;\tau =0&amp;lt;/math&amp;gt;.  Wynika z tego, że funkcja korelacji przyjmuje wartości z zakresu [&amp;amp;minus;1,&amp;amp;nbsp;1]. Ostatecznie estymator funkcji autokorelacji można zapisać jak poniżej:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid86&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\rho(k) = \frac{\gamma (k)}{\gamma (0)}&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(8)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcję autokorelacji estymuje się w celu określenia, w jakim stopniu wartości sygnału w danej chwili czasu wpływają na wartości sygnału w kolejnych chwilach czasu. Ma to kluczowe znaczenie przy rozpoznawaniu rodzaju procesów fizycznych odpowiedzialnego za generowanie sygnału. Funkcja ta zawsze mam maksimum dla przesunięcia &amp;lt;math&amp;gt;\tau =0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cechą charakterystyczną funkcji autokorelacji jest to, iż w przypadku sygnałów harmonicznych, przebieg funkcji ma charakter okresowy, z okresem takim samym jak okres badanego sygnału. W przypadku szumu, funkcja autokorelacji ma kształt funkcji delta Diraca.&lt;br /&gt;
&lt;br /&gt;
==Polecenie:==&lt;br /&gt;
Do policzenia funkcji autokorelacji posłużymy się funkcją biblioteczną &amp;lt;tt&amp;gt;numpy.correlate&amp;lt;/tt&amp;gt;. Funkcja ta, wbrew nazwie, oblicza wyłącznie splot swoich dwóch pierwszych argumentów wywołania. Musimy je więc przystosować do obliczenia wielkości zgodnie ze wzorem (4).&lt;br /&gt;
&lt;br /&gt;
Zaimplementuj funkcję do obliczania funkcji korelacji zgodnie ze wzorem (&amp;lt;xr id=&amp;quot;uid82&amp;quot;&amp;gt;(%i)&amp;lt;/xr&amp;gt;). Funkcja powinna przyjmować jako parametry dwa wektory&amp;lt;!--i maksymalne przesunięcie wzajemne tych wektorów--&amp;gt;, a zwracać wektor zawierający ich funkcję autokorelacji. &lt;br /&gt;
&lt;br /&gt;
Wywołanie przykładowe:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
print koreluj(a,a)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
powinno dać wynik:&lt;br /&gt;
 [-0.5  0.   1.   0.  -0.5]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
# Średnia&lt;br /&gt;
mean = numpy.mean(data)&lt;br /&gt;
mean2 = numpy.mean(data2)&lt;br /&gt;
&lt;br /&gt;
# Wariancja&lt;br /&gt;
var = numpy.var(data)&lt;br /&gt;
var2 = numpy.var(data2)&lt;br /&gt;
&lt;br /&gt;
# Dane po odjęciu średnich&lt;br /&gt;
ndata = data - mean&lt;br /&gt;
ndata2 = data2 - mean2&lt;br /&gt;
&lt;br /&gt;
# Splot&lt;br /&gt;
acorr = numpy.correlate(ndata, ndata2, 'full')&lt;br /&gt;
&lt;br /&gt;
# Normalizacja kowariancji do korelacji i przez 1/N&lt;br /&gt;
acorr = acorr / numpy.sqrt(var*var2) / len(ndata)&lt;br /&gt;
&lt;br /&gt;
print(acorr)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{{hidden begin|title=Przykładowe rozwiązanie:}}--&amp;gt;&lt;br /&gt;
 &amp;lt;!-- &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
def koreluj_pol(x,y,max_tau):&lt;br /&gt;
    x = x - np.mean(x)&lt;br /&gt;
    y = y - np.mean(y)&lt;br /&gt;
    N= len(x)&lt;br /&gt;
    cor = np.zeros(max_tau+1)&lt;br /&gt;
    cor[0] = np.sum(x[:]*y[:]) &lt;br /&gt;
    for i in range(1,max_tau+1):&lt;br /&gt;
        cor[i] = np.sum(x[i:]*y[:-i])&lt;br /&gt;
        &lt;br /&gt;
    cor = cor /(N-1)&lt;br /&gt;
    return cor&lt;br /&gt;
&lt;br /&gt;
def koreluj(x,y,max_tau):&lt;br /&gt;
    cor = np.zeros(2*max_tau+1)    &lt;br /&gt;
    cor[max_tau:] = koreluj_pol(x,y,max_tau)&lt;br /&gt;
    tmp = koreluj_pol(y,x,max_tau)&lt;br /&gt;
    cor[:max_tau+1] = tmp[-1::-1]&lt;br /&gt;
    return cor    &lt;br /&gt;
    &lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    print koreluj(a,a,i)&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
b = np.array([-1,-2,-3])&lt;br /&gt;
&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    print koreluj(a,b,i)&lt;br /&gt;
    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zadanie 1: Pomiar sygnału EEG ==&lt;br /&gt;
&lt;br /&gt;
Zarejestruj 10 minut sygnału EEG, w trakcie których badana osoba będzie siedziała z otwartymi oczami oraz kolejne 10 minut w stanie czuwania z zamkniętymi oczami. Rejestrację należy wykonać na pełnym czepku 10-20 z częstością próbkowania 128 Hz. &lt;br /&gt;
&lt;br /&gt;
==Zadanie 2:  Funkcje autokowariancji i autokorelacji==&lt;br /&gt;
W tym zadaniu posłużymy się sygnałami zarejestrowanymi w punkcie 3. poprzedniego ćwiczenia. Zaobserwuj, na którym kanale rytm alfa osiąga najwyższą wartość. Następnie zaimplementuj w Pythonie następujące kroki:&lt;br /&gt;
&lt;br /&gt;
#	Wczytaj dane z wybranego kanału.&lt;br /&gt;
#	Oblicz funkcję autokorelacji dla sygnału zarejestrowanego w warunkach, gdy osoba badana siedziała z otwartymi oczami. Narysuj autokorelogram, to jest wykres wartości funkcji autokorelacji względem przesunięcia &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt;. Oś &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; wyskaluj w sekundach.&lt;br /&gt;
#	Powtórz krok 2, tym razem dla sygnału zebranego w warunkach czuwania z zamkniętymi oczami.&lt;br /&gt;
#	Porównaj autokorelogramy.&lt;br /&gt;
&lt;br /&gt;
=Związek autokorelacji z widmem sygnału=&lt;br /&gt;
==Wstęp==&lt;br /&gt;
Zgodnie z twierdzeniem Chinczyna, z którym zapoznaliśmy się na wykładzie z [[Twierdzenie_Wienera-Chinczyna|Analizy Sygnałów]], widmową gęstość mocy sygnału można policzyć jako transformatę Fouriera funkcji autokowariancji:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid93&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
S(f) = \int _{-\infty }^{\infty }\gamma (\tau )e^{-2\pi i f \tau}d\tau &amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(9)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	&amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; &amp;amp;mdash; częstość&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	&amp;lt;math&amp;gt;S(f)&amp;lt;/math&amp;gt; &amp;amp;mdash;  gęstość widmowa mocy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Poniższy kod ilustruje to twierdzenie:&lt;br /&gt;
&amp;lt;source lang = py&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
from numpy.fft import rfft,fft,fftfreq,fftshift&lt;br /&gt;
 &lt;br /&gt;
def widmo_mocy(s, Fs):&lt;br /&gt;
    '''Funkcja licąca widmo mocy metodą periodogramu,&lt;br /&gt;
	pobiera sygnał i częstość próbkowania&lt;br /&gt;
	zwraca widmo mocy i oś częstości&lt;br /&gt;
    '''&lt;br /&gt;
    S = fft(s)/np.sqrt(len(s))&lt;br /&gt;
    S_moc = S*S.conj()&lt;br /&gt;
    S_moc = S_moc.real&lt;br /&gt;
    F = fftfreq(len(s), 1/Fs)&lt;br /&gt;
    return (fftshift(S_moc),fftshift(F))&lt;br /&gt;
 &lt;br /&gt;
def sin(f = 1, T = 1, Fs = 128, phi =0 ):&lt;br /&gt;
    '''sin o zadanej częstości (w Hz), długości, fazie i częstości próbkowania&lt;br /&gt;
    Domyślnie wytwarzany jest sygnał reprezentujący &lt;br /&gt;
    1 sekundę sinusa o częstości 1Hz i zerowej fazie próbkowanego 128 Hz&lt;br /&gt;
    '''&lt;br /&gt;
    dt = 1.0/Fs&lt;br /&gt;
    t = np.arange(0,T,dt)&lt;br /&gt;
    s = np.sin(2*np.pi*f*t + phi)&lt;br /&gt;
    return (s,t)&lt;br /&gt;
 &lt;br /&gt;
# sygnał próbny będzie próbkowany z częstością FS&lt;br /&gt;
FS = 100.0&lt;br /&gt;
# sygnałem próbnym będzie sinusoida o częstości f &lt;br /&gt;
(s,t) = sin(f=10.5,Fs=FS)&lt;br /&gt;
# obliczamy moc i energię sygnału w dziedzinie czasu&lt;br /&gt;
moc_w_czasie = s**2&lt;br /&gt;
energia_w_czasie = np.sum(moc_w_czasie)&lt;br /&gt;
print 'energia w czasie: ', energia_w_czasie&lt;br /&gt;
 &lt;br /&gt;
# obliczamy widmo mocy sygnału i jego energię estymowaną w dziedzinie częstości&lt;br /&gt;
(moc_w_czestosci, F) = widmo_mocy(s, Fs=FS)&lt;br /&gt;
energia_w_czestosci = np.sum(moc_w_czestosci)&lt;br /&gt;
print 'energia w czestosci: ', energia_w_czestosci&lt;br /&gt;
 &lt;br /&gt;
# estymujemy funkcję autokorelacji sygnału&lt;br /&gt;
ak = 1./(2*len(s)-1)*np.correlate(s,s,'full')&lt;br /&gt;
&lt;br /&gt;
# estymujemy widmo mocy i energię sygnału z twierdzenia Chinczyna korzystając z funkcji fft:&lt;br /&gt;
moc_chi = np.abs(fft(ak))&lt;br /&gt;
energia_chin = sum(moc_chi)&lt;br /&gt;
print 'energia z tw. Chinczyna przez fft: ', energia_chin&lt;br /&gt;
 &lt;br /&gt;
# estymujemy widmo mocy i energię sygnału z twierdzenia Chinczyna korzystając z jawnej postaci transformaty Fouriera:&lt;br /&gt;
FF = np.linspace(-FS/2,FS/2,1000)&lt;br /&gt;
M = np.zeros(len(FF),dtype='complex')&lt;br /&gt;
 &lt;br /&gt;
for i,f in enumerate( FF):&lt;br /&gt;
    for tau in range(len(ak)):&lt;br /&gt;
        M[i] += ak[tau]*np.exp(2*np.pi*1j*f*(len(ak)-tau)/FS) &lt;br /&gt;
M = np.abs(M)&lt;br /&gt;
energia_chin_sum = np.sum(M)* (len(ak)/len(FF))&lt;br /&gt;
print 'energia z tw. Chinczyna przez sumowanie: ', energia_chin_sum&lt;br /&gt;
&lt;br /&gt;
# Rysunki&lt;br /&gt;
py.figure(1)&lt;br /&gt;
py.subplot(3,1,1)&lt;br /&gt;
py.plot(t,s)&lt;br /&gt;
py.title(u'Sygnal')&lt;br /&gt;
py.subplot(3,1,2)&lt;br /&gt;
py.plot(t,moc_w_czasie)&lt;br /&gt;
py.title(u'moc w czasie')&lt;br /&gt;
py.subplot(3,1,3)&lt;br /&gt;
py.plot(F,moc_w_czestosci)&lt;br /&gt;
py.title(u'moc w czestosci')&lt;br /&gt;
 &lt;br /&gt;
py.figure(2)&lt;br /&gt;
py.subplot(3,1,1)&lt;br /&gt;
py.title('f. autokowariancji')&lt;br /&gt;
py.plot(np.arange(-len(ak)/2,len(ak)/2,1)/FS ,ak)&lt;br /&gt;
py.subplot(3,1,2)&lt;br /&gt;
py.plot(fftshift(fftfreq(len(moc_chi),1./FS)),fftshift(moc_chi))&lt;br /&gt;
py.title('widmo mocy z Tw. Chinczyna przez fft')&lt;br /&gt;
py.subplot(3,1,3)&lt;br /&gt;
py.plot(FF,M)&lt;br /&gt;
py.title('widmo mocy z Tw. Chinczyna przez sumowanie')&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W wyniku powinniśmy zobaczyć w terminalu:&lt;br /&gt;
 energia w czasie:  50.0&lt;br /&gt;
 energia w czestosci:  50.0&lt;br /&gt;
 energia z tw. Chinczyna przez fft:  50.0&lt;br /&gt;
 energia z tw. Chinczyna przez sumowanie:  49.9501172217&lt;br /&gt;
&lt;br /&gt;
oraz powinny pojawić się rysunki:&lt;br /&gt;
[[Plik:Fig_chinczyn1.png|thumb 200 px|center]]&lt;br /&gt;
[[Plik:Fig_chinczyn2.png|thumb 200 px|center]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Polecenie ==&lt;br /&gt;
Zaimplementuj funkcję obliczającą transformację Fouriera dyskretyzując wzór (9) dla zadanego wektora częstości &amp;lt;tt&amp;gt;f&amp;lt;/tt&amp;gt; i zadanej częstości próbkowania sygnału (tutaj: 10).&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Wywołanie przykładowe:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
t= np.arange(0,1,0.1)&lt;br /&gt;
x = np.sin(2*np.pi*2*t)&lt;br /&gt;
f = np.arange(-5,5,1)&lt;br /&gt;
X,f = fourier(x,f,10.0)&lt;br /&gt;
print X&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Natomiast wywołanie:&lt;br /&gt;
&amp;lt;source lang ='python'&amp;gt;&lt;br /&gt;
t= np.arange(0,1,0.1)&lt;br /&gt;
x = np.sin(2*np.pi*2*t)&lt;br /&gt;
f = np.arange(-5,5,0.01)&lt;br /&gt;
X = fourier(x,f,10.0)&lt;br /&gt;
py.plot(f,np.abs(X))&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Powinno wytworzyć rysunek:&lt;br /&gt;
&lt;br /&gt;
[[Plik:Fourier_test.png]] &lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
import numpy as np&lt;br /&gt;
import pylab as py&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def koreluj_pol(x,y,max_tau):&lt;br /&gt;
    x = x - np.mean(x)&lt;br /&gt;
    y = y - np.mean(y)&lt;br /&gt;
    N= len(x)&lt;br /&gt;
    cor = np.zeros(max_tau+1)&lt;br /&gt;
    cor[0] = np.sum(x[:]*y[:]) &lt;br /&gt;
    for i in range(1,max_tau+1):&lt;br /&gt;
        cor[i] = np.sum(x[i:]*y[:-i])&lt;br /&gt;
        &lt;br /&gt;
    cor = cor /(N)&lt;br /&gt;
    return cor&lt;br /&gt;
&lt;br /&gt;
def koreluj(x,y,max_tau):&lt;br /&gt;
    cor = np.zeros(2*max_tau+1)    &lt;br /&gt;
    cor[max_tau:] = koreluj_pol(x,y,max_tau)&lt;br /&gt;
    tmp = koreluj_pol(y,x,max_tau)&lt;br /&gt;
    cor[:max_tau+1] = tmp[-1::-1]&lt;br /&gt;
    return cor  &lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
def fourier_chin(x, FF, FS):&lt;br /&gt;
    ak = koreluj(x,x,len(x)-1)&lt;br /&gt;
    M = np.zeros(len(FF),dtype='complex') &lt;br /&gt;
    for i,f in enumerate( FF):&lt;br /&gt;
        for tau in range(len(ak)):&lt;br /&gt;
	    M[i] += ak[tau]*np.exp(-2*np.pi*1j*f*( tau- len(x))/FS)&lt;br /&gt;
    #M/=np.sqrt(len(ak))&lt;br /&gt;
    return M&lt;br /&gt;
    &lt;br /&gt;
def fourier(ak, FF, FS):&lt;br /&gt;
   &lt;br /&gt;
    M = np.zeros(len(FF),dtype='complex') &lt;br /&gt;
    for i,f in enumerate( FF):&lt;br /&gt;
        for tau in range(len(ak)):&lt;br /&gt;
	    M[i] += ak[tau]*np.exp(-2*np.pi*1j*f*( tau)/FS)&lt;br /&gt;
    M/=np.sqrt(len(ak))&lt;br /&gt;
    return M&lt;br /&gt;
t= np.arange(0,1,0.05)&lt;br /&gt;
x = np.sin(2*np.pi*2*t)&lt;br /&gt;
f = np.arange(-5,5,0.01)&lt;br /&gt;
&lt;br /&gt;
X = fourier_chin(x,f,10.0)&lt;br /&gt;
Xf = fourier(x,f,10.0)&lt;br /&gt;
print X&lt;br /&gt;
py.plot(f,np.abs(X), f,np.abs(Xf)**2)&lt;br /&gt;
py.show()&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zadanie 3: Związek autokorelacji z widmem sygnału==&lt;br /&gt;
Oblicz gęstość widmową mocy sygnału zarejestrowanego w trakcie czuwania z zamkniętymi oczami, korzystając z twierdzenia Chinczyna oraz [[Nieparametryczne_widmo_mocy#Metoda_Welcha | metodą Welcha]].&lt;br /&gt;
Znajdź częstość rytmu &amp;amp;alpha; dla osoby, która była badana.&lt;br /&gt;
&lt;br /&gt;
==Funkcja kowariancji (wzajemnej)==&lt;br /&gt;
&lt;br /&gt;
W celu scharakteryzowania zależności wzajemnej dwóch sygnałów losowych, stosuje się funkcję kowariancji, zdefiniowaną w następujący sposób:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid98&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy} (\tau ) = \mathrm{cov}(x(t),y(t-\tau ))=\mathrm{E}[(x(t)-\mu _x)(y(t-\tau )-\mu _y)]&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid99&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\mu _x = \mathrm{E}[x(t)]\\&lt;br /&gt;
\mu _y = \mathrm{E}[y(t)]\\ \end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W przypadku sygnałów ciągłych estymatę tę można zapisać w poniższy sposób:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid100&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy} (\tau ) = \frac{1}{T}\int _0^{T}(x(t)-\mu_x)(y(t-\tau)-\mu_y)dt&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
natomiast dla sygnałów dyskretnych jako:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid101&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy}(k) = \frac{1}{N-1}\sum _{i=0}^{N-k}(x(i+k)-x_s)(y(i)-y_s)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W odróżnieniu od funkcji autokowariancji, funkcja kowariancji nie musi mieć maksimum dla przesunięcia &amp;lt;math&amp;gt;\tau =0&amp;lt;/math&amp;gt;. Ponadto posiada ona następującą cechę:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid102&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy}(-\tau ) = \gamma _{yx}(\tau )&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcję kowariancji można znormalizować:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid103&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\rho (\tau) = \frac{\mathrm{E}[(x(t)-\mu _x)(y(t-\tau )-\mu _y)]}{\sqrt{\mathrm{E}[(x(t)-\mu _x)^2]\mathrm{E}[(y(t)-\mu _y)^2]}} = \frac{\gamma _{xy}}{\sigma_x\sigma_y}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
Otrzymaną funkcję nazywamy funkcją korelacji.&lt;br /&gt;
Jednym z zastosowań funkcji korelacji jest wyznaczanie czasu przejścia sygnału przez dany układ liniowy. Funkcja korelacji pomiędzy sygnałem na wejściu układu i sygnałem na jego wyjściu osiągnie wartość maksymalną dla przesunięcia &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; równego czasowi, jaki potrzebował sygnał na pokonanie danego układu. Niestety, taka metoda wyznaczania opóźnienia obarczona jest pewną wadą &amp;amp;mdash; w przypadku gdy prędkość sygnału bądź jego droga zależą od częstości, wtedy na wykresie funkcji korelacji nie uzyskamy wyraźnego maksimum.&lt;br /&gt;
&lt;br /&gt;
=====Polecenie =====&lt;br /&gt;
Zaimplementuj funkcję obliczającą funkcję kowariancji dla różnych sygnałów ''x'' i ''y'' (równanie 13) skorzystaj przy tym z własności opisanej równaniem (14). &lt;br /&gt;
Przykładowe wywołanie:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
b = np.array([-1,-2,-3])&lt;br /&gt;
&lt;br /&gt;
print koreluj(a,b)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
powinno dać w wyniku:&lt;br /&gt;
 [ 0.5 0.  -1.   0.   0.5]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
{{hidden begin|title=Przykładowe rozwiązanie:}}&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import pylab as py&lt;br /&gt;
&lt;br /&gt;
def koreluj(x,y,max_tau):&lt;br /&gt;
    x = x - np.mean(x)&lt;br /&gt;
    y = y - np.mean(y)&lt;br /&gt;
    cor = np.zeros(2*max_tau+1)&lt;br /&gt;
    cor[max_tau] = np.sum(x[:]*y[:]) &lt;br /&gt;
    for i in range(1,max_tau+1):&lt;br /&gt;
        cor[max_tau+i] = np.sum(x[i:]*y[:-i])&lt;br /&gt;
        cor[max_tau-i] = np.sum(y[i:]*x[:-i])&lt;br /&gt;
    N= len(x)&lt;br /&gt;
    cor = cor /(N-1)&lt;br /&gt;
    return cor&lt;br /&gt;
&lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
b = np.array([-1,-2,-3])&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    print koreluj(a,b,i)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}} --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadanie 4===&lt;br /&gt;
Z danych zarejestrowanych w trakcie czuwania z zamkniętymi oczami wybierz sygnały z następujących kanałów: Fp1, P3, Pz, P4, Fp2, O1, O2.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Dla każdego kanału oblicz funkcję autokorelacji, zaś  dla każdej pary kanałów oblicz funkcję korelacji wzajemnej. Wyniki zaprezentuj w formie kwadratowej macierzy wykresów (za pomocą funkcji subplot, tak jak na przykładowym rys. (rys. &amp;lt;xr id=&amp;quot;uid9&amp;quot;&amp;gt; %i&amp;lt;/xr&amp;gt;)). Na przekątnej macierzy narysuj funkcję autokorelacji odpowiednich kanałów, poza przekątną &amp;amp;mdash; funkcję korelacji wzajemnej. Wskaż kanały, które są najbardziej skorelowane ze sobą. Czy możliwe jest wyznaczenie opóźnienia sygnału pomiędzy tymi kanałami?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Powtórz punkt 1, tym razem jednak funkcję autokorelacji i korelacji wzajemnej oblicz na sygnałach przefiltrowanych filtrem wąskopasmowym w paśmie alfa charakterystycznym dla badanej osoby. ([[%C4%86wiczenia_7#Funkcje_do_projektowania_filtr.C3.B3w_IIR_dost.C4.99pne_w_module_scipy.signal|przypomnienie konstrukcji filtrów]])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Oszacuj istotność statystyczną zależności między parami kanałów. Twoją hipotezą zerową jest brak istotnej korelacji pomiędzy sygnałami zarejestrowanymi przez dwie różne elektrody EEG. Hipoteza alternatywna to występowanie zależności pomiędzy tymi sygnałami. Podanie estymatorów wariancji funkcji korelacji jest bardzo trudne, dlatego jednym ze sposobów oszacowania progu powyżej którego wartość funkcji korelacji można byłoby uznać za istotną statystycznie, jest zastosowanie metody ''bootstrap''. Teoretycznie, funkcja korelacji policzona dla dwóch rzeczywistych, nieskorelowanych sygnałów, powinna wynosić 0 dla każdego przesunięcia &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt;. Tak jest jednak w przypadku sygnałów nieskończonych; w analizie sygnałów takowych nie spotkamy.&lt;br /&gt;
&lt;br /&gt;
Dokonując losowej zamiany kolejności próbek, możemy doprowadzić do wytworzenia sygnałów zależnych losowo, które jednak ze względu na skończony czas trwania, dadzą niezerową funkcję korelacji. Poziom losowych fluktuacji tej funkcji oszacujemy wykonując następujące kroki:&lt;br /&gt;
&amp;lt;ol type=&amp;quot;A&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Losowa zamiana kolejności próbek w analizowanych sygnałach. Jeżeli pomiędzy dwoma sygnałami istnieją jakieś zależności, losowa zamiana próbek doprowadzi do zniszczenia tych związków. W ten sposób uzyskujemy sygnały, które teoretycznie są nieskorelowane.&lt;br /&gt;
&amp;lt;li&amp;gt; Obliczenie funkcji  korelacji wzajemnej dla sygnałów policzonych w punkcie A.&lt;br /&gt;
&amp;lt;li&amp;gt; Powtórzenie kroków A i B wiele (np. 1000) razy.&lt;br /&gt;
&amp;lt;li&amp;gt; Oszacowanie 95% przedziału ufności dla wartości średniej funkcji korelacji wzajemnej dla danego przesunięcia &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; korzystając z otrzymanego w kroku C empirycznego rozkładu wartości tych funkcji dla sygnałów niezależnych.  &lt;br /&gt;
&amp;lt;li&amp;gt; Powtórzenie kroków A-D dla kolejnych przesunięć &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;li&amp;gt; Sprawdzenie, dla których przesunięć &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; funkcje autokorelacji i korelacji obliczone dla oryginalnych sygnałów uzyskały wartości wyższe niż wartości progowe oszacowane dla sygnałów o losowych zależnościach.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Procedura opisana powyżej ma jednak '''zasadniczą wadę'''. Staramy się w niej oszacować poziom przypadkowych korelacji pomiędzy dwoma sygnałami dla kolejnych przesunięć &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt;, co jest niczym innym jak wielokrotnym powtórzeniem pewnego testu. Obserwowanie korelacji dla wielu par kanałów równocześnie również prowadzi do zwiększenia szansy na zaobserwowanie ekstremalnie dużych fluktuacji.&lt;br /&gt;
Występuje tu zatem ''problem wielokrotnych porównań''.&lt;br /&gt;
Przypominamy, iż może to doprowadzić do przypadkowego uznania wyników jako &amp;amp;bdquo;istotnych&amp;amp;rdquo; statystycznie. Np. jeśli pojedynczy test wykonujemy na poziomie istotności 5% to dopuszczamy odrzucenie w 1 przypadku na 20 hipotezy zerowej pomimo, iż jest ona prawdziwa. Z drugiej jednak strony, jeśli powtórzymy wykonywany test 20 razy, to oczekujemy uzyskania 1 przypadku, w którym poziom ''p'' będzie mniejszy od 5% co jest przesłanką za odrzuceniem hipotezy zerowej. &lt;br /&gt;
&lt;br /&gt;
W przypadku wykonywania serii testów należałoby więc zastosować odpowiednie poprawki, np. [http://www.bmj.com/content/310/6973/170.full korektę Bonferroniego] czy [http://en.wikipedia.org/wiki/False_discovery_rate false discovery rate (FDR)]. Innym rozwiązaniem w analizowanym przez nas problemie jest zastosowanie tzw. statystyk wartości ekstremalnych, które prowadzą do następujących zmian w procedurze:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol type=&amp;quot;A&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;	Losowa zmiana kolejności próbek w analizowanych sygnałach (we wszystkich analizowanych kanałach). Jeżeli pomiędzy dwoma sygnałami istnieją jakieś zależności, losowa zamiana próbek doprowadzi do zniszczenia tych związków. W ten sposób uzyskujemy sygnały, które teoretycznie są nieskorelowane.&lt;br /&gt;
&amp;lt;li&amp;gt;	Obliczenie funkcji korelacji dla sygnałów otrzymanych w punkcie A.&lt;br /&gt;
&amp;lt;li&amp;gt;    Zapamiętanie maksymalnej wartości bezwzględnej funkcji korelacji z punktu B (maksimum bierzemy po wszystkich przesunięciach i po wszystkich parach kanałów; dla funkcji autokorelacji, ze względu na jej normalizację do 1 dla zerowego przesunięcia, tam maksymalnych wartości poszukujemy dla przesunięć innych niż 0).&lt;br /&gt;
&amp;lt;li&amp;gt;	Powtórzenie kroków A-C 1000 razy. Uzyskamy w ten sposób rozkład maksymalnych wartości funkcji korelacji możliwych do zaobserwowania dla sygnałów niezależnych.&lt;br /&gt;
&amp;lt;li&amp;gt;    Wyznaczenie 95 centyla rozkładu wartości maksymalnych.&lt;br /&gt;
&amp;lt;li&amp;gt;	Nałożenie na rysunki funkcji korelacji uzyskane w Zadaniu 2 poziomych linii symbolizujących poziom zależności dwóch sygnałów o losowych zależnościach i sprawdzenie, dla których przesunięć &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; wartości funkcji korelacji przekraczają estymowane progi istotności statystycznej.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Plik:Korelacje_wzajemne.png|700px|center|thumb|&amp;lt;figure id=&amp;quot;uid9&amp;quot; /&amp;gt;Przykład wyniku analizy korelacji wzajemnych dla sygnału niefiltrowanego z naniesionymi granicami możliwych fluktuacji.]]&lt;br /&gt;
&lt;br /&gt;
==Wzajemna gęstość widmowa sygnałów==&lt;br /&gt;
&lt;br /&gt;
Podobnie jak w przypadku twierdzenia Chinczyna dla pojedynczego sygnału, możliwe jest policzenie transformaty Fouriera funkcji kowariancji. Uzyskana w ten sposób wielkość nazywa się funkcją wzajemnej gęstości mocy widmowej sygnału:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid122&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
S_{xy}(f) = \int _{-\infty }^{\infty }\gamma_{xy}(\tau )e^{-2\pi i f \tau}d\tau &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W celu dalszego omówienia własności funkcji wzajemnej mocy widmowej sygnałów funkcję tę zapiszemy w postaci:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid123&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
S_{xy}(f) = |S_{xy}(f)|e^{i\phi _{xy}(f)}\\&lt;br /&gt;
\\&lt;br /&gt;
\phi _{xy} = \arg(S_{xy}) &lt;br /&gt;
\end{array} &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&amp;lt;!-- \mathrm{arc\,tg}\left[\frac{\mathrm{Im}(S_{xy}(f))}{\mathrm{Re}(S_{xy}(f))}\right]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wartość bezwzględna funkcji wzajemnej gęstości mocy widmowej osiąga największą wartość dla '''częstości''', w których sygnały &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;y(t)&amp;lt;/math&amp;gt; są ze sobą skorelowane. Funkcja wzajemnej mocy widmowej sygnałów pozbawiona jest zatem wady, która charakteryzowała funkcję korelacji, to jest problemu z wyznaczeniem czasu transmisji sygnału, w przypadku gdy czas ten zależał od częstości. Przy pomocy funkcji wzajemnej mocy widmowej, czas ten można oszacować przy pomocy fazy tej funkcji &amp;amp;mdash; &amp;lt;math&amp;gt;\phi _{xy}(f)&amp;lt;/math&amp;gt;. Jeśli funkcja wzajemnej mocy widmowej została wyznaczona pomiędzy sygnałami na wejściu i wyjściu układu liniowego, to faza ta reprezentuje przesunięcie fazowe sygnału przy przejściu przez układ. Czas tego przejścia można oszacować za pomocą następującej wyrażenia:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid124&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\tau = \frac{\phi _{xy}(f)}{2\pi f}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Podobnie jak w przypadku funkcji autokorelacji i korelacji wzajemnej, funkcję wzajemnej gęstości mocy widmowej można znormalizować:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid125&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
C_{xy}(f) = \frac{S_{xy}(f)}{\sqrt{S_x(f)S_y(f)}}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Znormalizowaną postać funkcji wzajemnej gęstości mocy widmowej nazywamy funkcją ''koherencji''. &lt;br /&gt;
Koherencja jest wielkością zespoloną. Faza koherencji odzwierciedla różnicę faz pomiędzy dwoma sygnałami. Moduł koherencji reprezentuje stopień synchronizacji sygnałów i zawiera się w przedziale od 0.0 do 1.0. Moduł tej funkcji zawiera się w przedziale od 0 do 1. Wartości 0 odpowiada brak synchronizacji pomiędzy sygnałami, zaś wartości 1 pełna synchronizacja dwóch przebiegów czasowych. Należy również zwrócić uwagę na nazewnictwo - często sam moduł koherencji określany jest jako koherencja, w literaturze anglojęzycznej moduł koherencji posiada jednak odrębną nazwę: Magnitude Square Coherence (MSC). Istotny jest również sposób estymacji modułu koherencji, który wyprowadzono w następnym rozdziale, zaś sam estymator reprezentuje wzór (36).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadanie 5===&lt;br /&gt;
Zaimplementuj funkcję obliczającą wzajemną gęstość widmową dla pary kanałów. &lt;br /&gt;
&amp;lt;!--Niech argumentami tej funkcji będą dwa wektory zawierające sygnały, zakres częstości, częstość próbkowania. --&amp;gt;&lt;br /&gt;
Oblicz i narysuj macierz gęstości widmowych (własnych i wzajemnych) dla kolejnych par kanałów (tych samych co w zadaniu 3). Wyniki zaprezentuj w postaci kwadratowej macierzy rysunków. Ponieważ są to funkcje zespolone, dobrze jest zaprezentować osobno ich wartość i fazę. Uzyskane wartości bezwzględne narysuj nad przekątną tej macierzy, a fazę pod przekątną.&lt;br /&gt;
&lt;br /&gt;
===Zadanie 6===&lt;br /&gt;
Przygotuj sygnał dwukanałowy, w którym jako pierwszy sygnał wybierz fragment sygnału EEG (z danych zebranych wcześniej) o długości 2000 próbek, a jako drugiego sygnału użyj tego samego fragmentu EEG, ale opóźnionego o wybraną liczbę (1 - 5) próbek. Oblicz widma wzajemne tych sygnałów i zaprezentuj ich fazy na rysunku. Na podstawie tych widm znajdź wartość przesunięcia czasowego tych sygnałów.&lt;br /&gt;
&lt;br /&gt;
Obliczenia powtórz w przypadku, gdy do drugiego sygnału dodany będzie szum o wariancji równej 0,25 wariancji oryginalnego sygnału.&lt;/div&gt;</summary>
		<author><name>Maciek</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG_2/EEG_wlasno%C5%9Bci_EEG_spoczynkowego&amp;diff=11186</id>
		<title>Pracownia EEG 2/EEG wlasności EEG spoczynkowego</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG_2/EEG_wlasno%C5%9Bci_EEG_spoczynkowego&amp;diff=11186"/>
		<updated>2024-11-22T16:40:34Z</updated>

		<summary type="html">&lt;p&gt;Maciek: /* Polecenie: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Pracownia EEG 2|Pracownia EEG 2]] / Własności EEG spoczynkowego: funkcja autokorelacji i widmo&lt;br /&gt;
&lt;br /&gt;
=Estymacja funkcji autokowariancji, autokorelacji i koherencji sygnału.=&lt;br /&gt;
==Wstęp==&lt;br /&gt;
Z funkcjami tymi spotkaliśmy się już na zajęciach z [[Ćwiczenia_4|analizy sygnałów]].&lt;br /&gt;
&lt;br /&gt;
Funkcja autokowariancji sygnału charakteryzuje liniową zależność wartości tego sygnału w danej określonej chwili czasu od wartości (tego samego sygnału) w innej chwili.&lt;br /&gt;
W przypadku [[Nieparametryczne_widmo_mocy#Sygna.C5.82y_stochastyczne  | stacjonarnych procesów stochastycznych]], przebieg tej funkcji nie zależy od czasu. &lt;br /&gt;
Oznacza to, że obliczając funkcję autokorelacji sygnału pomiędzy chwilą czasu &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;x(t+\tau )&amp;lt;/math&amp;gt; otrzymamy tę samą wartość, jak dla przypadku obliczania funkcji autokorelacji pomiędzy momentami &amp;lt;math&amp;gt;x(t + T)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;x(t + T+\tau )&amp;lt;/math&amp;gt;, gdzie &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; to dowolny przedział czasu. Innymi słowy, funkcja autokorelacji procesu stacjonarnego zależy tylko od odstępu czasu pomiędzy próbkami &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt;, dla którego jest wyznaczana, a nie od konkretnej chwili czasu. Odrębną klasę sygnałów stanowią procesy niestacjonarne, w przypadku których funkcja autokorelacji będzie zależeć od czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; w którym jest obliczana. Estymator funkcji autokowariancji uzyskuje się poprzez obliczanie iloczynów wartości sygnału &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; w chwilach czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; czyli &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; i wartości sygnału &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; w chwili czasu ''t''+&amp;amp;tau; czyli &amp;lt;math&amp;gt;x(t+\tau)&amp;lt;/math&amp;gt; i uśredniając wartości iloczynów po czasie &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid79&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma (\tau) = \mathrm{cov}(x(t),x(t-\tau ))=\mathrm{E}[(x(t)-\mu )(x(t-\tau )-\mu )]&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(1)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid80&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\mu = \mathrm{E}[x(t)]&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(2)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W przypadku sygnałów ciągłych estymatę tę można zapisać w poniższy sposób:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid81&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma (\tau ) = \frac{1}{T}\int _0^{T}(x(t)-\mu )(x(t-\tau )-\mu )dt&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(3)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
natomiast dla sygnałów dyskretnych jako:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid82&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma (k) = \frac{1}{N-1}\sum _{i=1}^{N-|k|}(x(i+k)-x_s)(x(i)-x_s)&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(4)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid83&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
x_s = \frac{\sum _{i=1}^{N}x(i)}{N}&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(5)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcja autokowariancji może osiągać dowolne wartości, dlatego aby można było porównać przebieg tej funkcji np. pomiędzy dwoma sygnałami, wprowadzono wersję znormalizowaną tej funkcji &amp;amp;mdash; ''funkcję autokorelacji''. Normalizacja ta wygląda następująco:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid84&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\rho (k) = \frac{\gamma (\tau )}{\sigma^2}&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(6)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid85&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\sigma ^2 = \mathrm{E}[(x(t)-\mu )^2]&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(7)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wariancję sygnału (&amp;lt;math&amp;gt;\gamma (0)=\sigma ^2&amp;lt;/math&amp;gt;) można wyrazić przez funkcję autokowariancji dla przesunięcia &amp;lt;math&amp;gt;\tau =0&amp;lt;/math&amp;gt;.  Wynika z tego, że funkcja korelacji przyjmuje wartości z zakresu [&amp;amp;minus;1,&amp;amp;nbsp;1]. Ostatecznie estymator funkcji autokorelacji można zapisać jak poniżej:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid86&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\rho(k) = \frac{\gamma (k)}{\gamma (0)}&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(8)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcję autokorelacji estymuje się w celu określenia, w jakim stopniu wartości sygnału w danej chwili czasu wpływają na wartości sygnału w kolejnych chwilach czasu. Ma to kluczowe znaczenie przy rozpoznawaniu rodzaju procesów fizycznych odpowiedzialnego za generowanie sygnału. Funkcja ta zawsze mam maksimum dla przesunięcia &amp;lt;math&amp;gt;\tau =0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cechą charakterystyczną funkcji autokorelacji jest to, iż w przypadku sygnałów harmonicznych, przebieg funkcji ma charakter okresowy, z okresem takim samym jak okres badanego sygnału. W przypadku szumu, funkcja autokorelacji ma kształt funkcji delta Diraca.&lt;br /&gt;
&lt;br /&gt;
==Polecenie:==&lt;br /&gt;
Do policzenia funkcji autokorelacji posłużymy się funkcją biblioteczną &amp;lt;tt&amp;gt;numpy.correlate&amp;lt;/tt&amp;gt;. Funkcja ta, wbrew nazwie, oblicza wyłącznie splot swoich dwóch pierwszych argumentów wywołania. Musimy je więc przystosować do obliczenia wielkości zgodnie ze wzorem (4).&lt;br /&gt;
&lt;br /&gt;
Zaimplementuj funkcję do obliczania funkcji korelacji zgodnie ze wzorem (&amp;lt;xr id=&amp;quot;uid82&amp;quot;&amp;gt; &amp;lt;/xr&amp;gt;). Funkcja powinna przyjmować jako parametry dwa wektory&amp;lt;!--i maksymalne przesunięcie wzajemne tych wektorów--&amp;gt;, a zwracać wektor zawierający ich funkcję autokorelacji. &lt;br /&gt;
&lt;br /&gt;
Wywołanie przykładowe:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
print koreluj(a,a)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
powinno dać wynik:&lt;br /&gt;
 [-0.5  0.   1.   0.  -0.5]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
# Średnia&lt;br /&gt;
mean = numpy.mean(data)&lt;br /&gt;
mean2 = numpy.mean(data2)&lt;br /&gt;
&lt;br /&gt;
# Wariancja&lt;br /&gt;
var = numpy.var(data)&lt;br /&gt;
var2 = numpy.var(data2)&lt;br /&gt;
&lt;br /&gt;
# Dane po odjęciu średnich&lt;br /&gt;
ndata = data - mean&lt;br /&gt;
ndata2 = data2 - mean2&lt;br /&gt;
&lt;br /&gt;
# Splot&lt;br /&gt;
acorr = numpy.correlate(ndata, ndata2, 'full')&lt;br /&gt;
&lt;br /&gt;
# Normalizacja kowariancji do korelacji i przez 1/N&lt;br /&gt;
acorr = acorr / numpy.sqrt(var*var2) / len(ndata)&lt;br /&gt;
&lt;br /&gt;
print(acorr)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{{hidden begin|title=Przykładowe rozwiązanie:}}--&amp;gt;&lt;br /&gt;
 &amp;lt;!-- &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
def koreluj_pol(x,y,max_tau):&lt;br /&gt;
    x = x - np.mean(x)&lt;br /&gt;
    y = y - np.mean(y)&lt;br /&gt;
    N= len(x)&lt;br /&gt;
    cor = np.zeros(max_tau+1)&lt;br /&gt;
    cor[0] = np.sum(x[:]*y[:]) &lt;br /&gt;
    for i in range(1,max_tau+1):&lt;br /&gt;
        cor[i] = np.sum(x[i:]*y[:-i])&lt;br /&gt;
        &lt;br /&gt;
    cor = cor /(N-1)&lt;br /&gt;
    return cor&lt;br /&gt;
&lt;br /&gt;
def koreluj(x,y,max_tau):&lt;br /&gt;
    cor = np.zeros(2*max_tau+1)    &lt;br /&gt;
    cor[max_tau:] = koreluj_pol(x,y,max_tau)&lt;br /&gt;
    tmp = koreluj_pol(y,x,max_tau)&lt;br /&gt;
    cor[:max_tau+1] = tmp[-1::-1]&lt;br /&gt;
    return cor    &lt;br /&gt;
    &lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    print koreluj(a,a,i)&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
b = np.array([-1,-2,-3])&lt;br /&gt;
&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    print koreluj(a,b,i)&lt;br /&gt;
    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zadanie 1: Pomiar sygnału EEG ==&lt;br /&gt;
&lt;br /&gt;
Zarejestruj 10 minut sygnału EEG, w trakcie których badana osoba będzie siedziała z otwartymi oczami oraz kolejne 10 minut w stanie czuwania z zamkniętymi oczami. Rejestrację należy wykonać na pełnym czepku 10-20 z częstością próbkowania 128 Hz. &lt;br /&gt;
&lt;br /&gt;
==Zadanie 2:  Funkcje autokowariancji i autokorelacji==&lt;br /&gt;
W tym zadaniu posłużymy się sygnałami zarejestrowanymi w punkcie 3. poprzedniego ćwiczenia. Zaobserwuj, na którym kanale rytm alfa osiąga najwyższą wartość. Następnie zaimplementuj w Pythonie następujące kroki:&lt;br /&gt;
&lt;br /&gt;
#	Wczytaj dane z wybranego kanału.&lt;br /&gt;
#	Oblicz funkcję autokorelacji dla sygnału zarejestrowanego w warunkach, gdy osoba badana siedziała z otwartymi oczami. Narysuj autokorelogram, to jest wykres wartości funkcji autokorelacji względem przesunięcia &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt;. Oś &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; wyskaluj w sekundach.&lt;br /&gt;
#	Powtórz krok 2, tym razem dla sygnału zebranego w warunkach czuwania z zamkniętymi oczami.&lt;br /&gt;
#	Porównaj autokorelogramy.&lt;br /&gt;
&lt;br /&gt;
=Związek autokorelacji z widmem sygnału=&lt;br /&gt;
==Wstęp==&lt;br /&gt;
Zgodnie z twierdzeniem Chinczyna, z którym zapoznaliśmy się na wykładzie z [[Twierdzenie_Wienera-Chinczyna|Analizy Sygnałów]], widmową gęstość mocy sygnału można policzyć jako transformatę Fouriera funkcji autokowariancji:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid93&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
S(f) = \int _{-\infty }^{\infty }\gamma (\tau )e^{-2\pi i f \tau}d\tau &amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(9)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	&amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; &amp;amp;mdash; częstość&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	&amp;lt;math&amp;gt;S(f)&amp;lt;/math&amp;gt; &amp;amp;mdash;  gęstość widmowa mocy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Poniższy kod ilustruje to twierdzenie:&lt;br /&gt;
&amp;lt;source lang = py&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
from numpy.fft import rfft,fft,fftfreq,fftshift&lt;br /&gt;
 &lt;br /&gt;
def widmo_mocy(s, Fs):&lt;br /&gt;
    '''Funkcja licąca widmo mocy metodą periodogramu,&lt;br /&gt;
	pobiera sygnał i częstość próbkowania&lt;br /&gt;
	zwraca widmo mocy i oś częstości&lt;br /&gt;
    '''&lt;br /&gt;
    S = fft(s)/np.sqrt(len(s))&lt;br /&gt;
    S_moc = S*S.conj()&lt;br /&gt;
    S_moc = S_moc.real&lt;br /&gt;
    F = fftfreq(len(s), 1/Fs)&lt;br /&gt;
    return (fftshift(S_moc),fftshift(F))&lt;br /&gt;
 &lt;br /&gt;
def sin(f = 1, T = 1, Fs = 128, phi =0 ):&lt;br /&gt;
    '''sin o zadanej częstości (w Hz), długości, fazie i częstości próbkowania&lt;br /&gt;
    Domyślnie wytwarzany jest sygnał reprezentujący &lt;br /&gt;
    1 sekundę sinusa o częstości 1Hz i zerowej fazie próbkowanego 128 Hz&lt;br /&gt;
    '''&lt;br /&gt;
    dt = 1.0/Fs&lt;br /&gt;
    t = np.arange(0,T,dt)&lt;br /&gt;
    s = np.sin(2*np.pi*f*t + phi)&lt;br /&gt;
    return (s,t)&lt;br /&gt;
 &lt;br /&gt;
# sygnał próbny będzie próbkowany z częstością FS&lt;br /&gt;
FS = 100.0&lt;br /&gt;
# sygnałem próbnym będzie sinusoida o częstości f &lt;br /&gt;
(s,t) = sin(f=10.5,Fs=FS)&lt;br /&gt;
# obliczamy moc i energię sygnału w dziedzinie czasu&lt;br /&gt;
moc_w_czasie = s**2&lt;br /&gt;
energia_w_czasie = np.sum(moc_w_czasie)&lt;br /&gt;
print 'energia w czasie: ', energia_w_czasie&lt;br /&gt;
 &lt;br /&gt;
# obliczamy widmo mocy sygnału i jego energię estymowaną w dziedzinie częstości&lt;br /&gt;
(moc_w_czestosci, F) = widmo_mocy(s, Fs=FS)&lt;br /&gt;
energia_w_czestosci = np.sum(moc_w_czestosci)&lt;br /&gt;
print 'energia w czestosci: ', energia_w_czestosci&lt;br /&gt;
 &lt;br /&gt;
# estymujemy funkcję autokorelacji sygnału&lt;br /&gt;
ak = 1./(2*len(s)-1)*np.correlate(s,s,'full')&lt;br /&gt;
&lt;br /&gt;
# estymujemy widmo mocy i energię sygnału z twierdzenia Chinczyna korzystając z funkcji fft:&lt;br /&gt;
moc_chi = np.abs(fft(ak))&lt;br /&gt;
energia_chin = sum(moc_chi)&lt;br /&gt;
print 'energia z tw. Chinczyna przez fft: ', energia_chin&lt;br /&gt;
 &lt;br /&gt;
# estymujemy widmo mocy i energię sygnału z twierdzenia Chinczyna korzystając z jawnej postaci transformaty Fouriera:&lt;br /&gt;
FF = np.linspace(-FS/2,FS/2,1000)&lt;br /&gt;
M = np.zeros(len(FF),dtype='complex')&lt;br /&gt;
 &lt;br /&gt;
for i,f in enumerate( FF):&lt;br /&gt;
    for tau in range(len(ak)):&lt;br /&gt;
        M[i] += ak[tau]*np.exp(2*np.pi*1j*f*(len(ak)-tau)/FS) &lt;br /&gt;
M = np.abs(M)&lt;br /&gt;
energia_chin_sum = np.sum(M)* (len(ak)/len(FF))&lt;br /&gt;
print 'energia z tw. Chinczyna przez sumowanie: ', energia_chin_sum&lt;br /&gt;
&lt;br /&gt;
# Rysunki&lt;br /&gt;
py.figure(1)&lt;br /&gt;
py.subplot(3,1,1)&lt;br /&gt;
py.plot(t,s)&lt;br /&gt;
py.title(u'Sygnal')&lt;br /&gt;
py.subplot(3,1,2)&lt;br /&gt;
py.plot(t,moc_w_czasie)&lt;br /&gt;
py.title(u'moc w czasie')&lt;br /&gt;
py.subplot(3,1,3)&lt;br /&gt;
py.plot(F,moc_w_czestosci)&lt;br /&gt;
py.title(u'moc w czestosci')&lt;br /&gt;
 &lt;br /&gt;
py.figure(2)&lt;br /&gt;
py.subplot(3,1,1)&lt;br /&gt;
py.title('f. autokowariancji')&lt;br /&gt;
py.plot(np.arange(-len(ak)/2,len(ak)/2,1)/FS ,ak)&lt;br /&gt;
py.subplot(3,1,2)&lt;br /&gt;
py.plot(fftshift(fftfreq(len(moc_chi),1./FS)),fftshift(moc_chi))&lt;br /&gt;
py.title('widmo mocy z Tw. Chinczyna przez fft')&lt;br /&gt;
py.subplot(3,1,3)&lt;br /&gt;
py.plot(FF,M)&lt;br /&gt;
py.title('widmo mocy z Tw. Chinczyna przez sumowanie')&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W wyniku powinniśmy zobaczyć w terminalu:&lt;br /&gt;
 energia w czasie:  50.0&lt;br /&gt;
 energia w czestosci:  50.0&lt;br /&gt;
 energia z tw. Chinczyna przez fft:  50.0&lt;br /&gt;
 energia z tw. Chinczyna przez sumowanie:  49.9501172217&lt;br /&gt;
&lt;br /&gt;
oraz powinny pojawić się rysunki:&lt;br /&gt;
[[Plik:Fig_chinczyn1.png|thumb 200 px|center]]&lt;br /&gt;
[[Plik:Fig_chinczyn2.png|thumb 200 px|center]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Polecenie ==&lt;br /&gt;
Zaimplementuj funkcję obliczającą transformację Fouriera dyskretyzując wzór (9) dla zadanego wektora częstości &amp;lt;tt&amp;gt;f&amp;lt;/tt&amp;gt; i zadanej częstości próbkowania sygnału (tutaj: 10).&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Wywołanie przykładowe:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
t= np.arange(0,1,0.1)&lt;br /&gt;
x = np.sin(2*np.pi*2*t)&lt;br /&gt;
f = np.arange(-5,5,1)&lt;br /&gt;
X,f = fourier(x,f,10.0)&lt;br /&gt;
print X&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Natomiast wywołanie:&lt;br /&gt;
&amp;lt;source lang ='python'&amp;gt;&lt;br /&gt;
t= np.arange(0,1,0.1)&lt;br /&gt;
x = np.sin(2*np.pi*2*t)&lt;br /&gt;
f = np.arange(-5,5,0.01)&lt;br /&gt;
X = fourier(x,f,10.0)&lt;br /&gt;
py.plot(f,np.abs(X))&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Powinno wytworzyć rysunek:&lt;br /&gt;
&lt;br /&gt;
[[Plik:Fourier_test.png]] &lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
import numpy as np&lt;br /&gt;
import pylab as py&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def koreluj_pol(x,y,max_tau):&lt;br /&gt;
    x = x - np.mean(x)&lt;br /&gt;
    y = y - np.mean(y)&lt;br /&gt;
    N= len(x)&lt;br /&gt;
    cor = np.zeros(max_tau+1)&lt;br /&gt;
    cor[0] = np.sum(x[:]*y[:]) &lt;br /&gt;
    for i in range(1,max_tau+1):&lt;br /&gt;
        cor[i] = np.sum(x[i:]*y[:-i])&lt;br /&gt;
        &lt;br /&gt;
    cor = cor /(N)&lt;br /&gt;
    return cor&lt;br /&gt;
&lt;br /&gt;
def koreluj(x,y,max_tau):&lt;br /&gt;
    cor = np.zeros(2*max_tau+1)    &lt;br /&gt;
    cor[max_tau:] = koreluj_pol(x,y,max_tau)&lt;br /&gt;
    tmp = koreluj_pol(y,x,max_tau)&lt;br /&gt;
    cor[:max_tau+1] = tmp[-1::-1]&lt;br /&gt;
    return cor  &lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
def fourier_chin(x, FF, FS):&lt;br /&gt;
    ak = koreluj(x,x,len(x)-1)&lt;br /&gt;
    M = np.zeros(len(FF),dtype='complex') &lt;br /&gt;
    for i,f in enumerate( FF):&lt;br /&gt;
        for tau in range(len(ak)):&lt;br /&gt;
	    M[i] += ak[tau]*np.exp(-2*np.pi*1j*f*( tau- len(x))/FS)&lt;br /&gt;
    #M/=np.sqrt(len(ak))&lt;br /&gt;
    return M&lt;br /&gt;
    &lt;br /&gt;
def fourier(ak, FF, FS):&lt;br /&gt;
   &lt;br /&gt;
    M = np.zeros(len(FF),dtype='complex') &lt;br /&gt;
    for i,f in enumerate( FF):&lt;br /&gt;
        for tau in range(len(ak)):&lt;br /&gt;
	    M[i] += ak[tau]*np.exp(-2*np.pi*1j*f*( tau)/FS)&lt;br /&gt;
    M/=np.sqrt(len(ak))&lt;br /&gt;
    return M&lt;br /&gt;
t= np.arange(0,1,0.05)&lt;br /&gt;
x = np.sin(2*np.pi*2*t)&lt;br /&gt;
f = np.arange(-5,5,0.01)&lt;br /&gt;
&lt;br /&gt;
X = fourier_chin(x,f,10.0)&lt;br /&gt;
Xf = fourier(x,f,10.0)&lt;br /&gt;
print X&lt;br /&gt;
py.plot(f,np.abs(X), f,np.abs(Xf)**2)&lt;br /&gt;
py.show()&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zadanie 3: Związek autokorelacji z widmem sygnału==&lt;br /&gt;
Oblicz gęstość widmową mocy sygnału zarejestrowanego w trakcie czuwania z zamkniętymi oczami, korzystając z twierdzenia Chinczyna oraz [[Nieparametryczne_widmo_mocy#Metoda_Welcha | metodą Welcha]].&lt;br /&gt;
Znajdź częstość rytmu &amp;amp;alpha; dla osoby, która była badana.&lt;br /&gt;
&lt;br /&gt;
==Funkcja kowariancji (wzajemnej)==&lt;br /&gt;
&lt;br /&gt;
W celu scharakteryzowania zależności wzajemnej dwóch sygnałów losowych, stosuje się funkcję kowariancji, zdefiniowaną w następujący sposób:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid98&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy} (\tau ) = \mathrm{cov}(x(t),y(t-\tau ))=\mathrm{E}[(x(t)-\mu _x)(y(t-\tau )-\mu _y)]&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid99&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\mu _x = \mathrm{E}[x(t)]\\&lt;br /&gt;
\mu _y = \mathrm{E}[y(t)]\\ \end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W przypadku sygnałów ciągłych estymatę tę można zapisać w poniższy sposób:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid100&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy} (\tau ) = \frac{1}{T}\int _0^{T}(x(t)-\mu_x)(y(t-\tau)-\mu_y)dt&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
natomiast dla sygnałów dyskretnych jako:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid101&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy}(k) = \frac{1}{N-1}\sum _{i=0}^{N-k}(x(i+k)-x_s)(y(i)-y_s)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W odróżnieniu od funkcji autokowariancji, funkcja kowariancji nie musi mieć maksimum dla przesunięcia &amp;lt;math&amp;gt;\tau =0&amp;lt;/math&amp;gt;. Ponadto posiada ona następującą cechę:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid102&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy}(-\tau ) = \gamma _{yx}(\tau )&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcję kowariancji można znormalizować:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid103&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\rho (\tau) = \frac{\mathrm{E}[(x(t)-\mu _x)(y(t-\tau )-\mu _y)]}{\sqrt{\mathrm{E}[(x(t)-\mu _x)^2]\mathrm{E}[(y(t)-\mu _y)^2]}} = \frac{\gamma _{xy}}{\sigma_x\sigma_y}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
Otrzymaną funkcję nazywamy funkcją korelacji.&lt;br /&gt;
Jednym z zastosowań funkcji korelacji jest wyznaczanie czasu przejścia sygnału przez dany układ liniowy. Funkcja korelacji pomiędzy sygnałem na wejściu układu i sygnałem na jego wyjściu osiągnie wartość maksymalną dla przesunięcia &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; równego czasowi, jaki potrzebował sygnał na pokonanie danego układu. Niestety, taka metoda wyznaczania opóźnienia obarczona jest pewną wadą &amp;amp;mdash; w przypadku gdy prędkość sygnału bądź jego droga zależą od częstości, wtedy na wykresie funkcji korelacji nie uzyskamy wyraźnego maksimum.&lt;br /&gt;
&lt;br /&gt;
=====Polecenie =====&lt;br /&gt;
Zaimplementuj funkcję obliczającą funkcję kowariancji dla różnych sygnałów ''x'' i ''y'' (równanie 13) skorzystaj przy tym z własności opisanej równaniem (14). &lt;br /&gt;
Przykładowe wywołanie:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
b = np.array([-1,-2,-3])&lt;br /&gt;
&lt;br /&gt;
print koreluj(a,b)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
powinno dać w wyniku:&lt;br /&gt;
 [ 0.5 0.  -1.   0.   0.5]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
{{hidden begin|title=Przykładowe rozwiązanie:}}&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import pylab as py&lt;br /&gt;
&lt;br /&gt;
def koreluj(x,y,max_tau):&lt;br /&gt;
    x = x - np.mean(x)&lt;br /&gt;
    y = y - np.mean(y)&lt;br /&gt;
    cor = np.zeros(2*max_tau+1)&lt;br /&gt;
    cor[max_tau] = np.sum(x[:]*y[:]) &lt;br /&gt;
    for i in range(1,max_tau+1):&lt;br /&gt;
        cor[max_tau+i] = np.sum(x[i:]*y[:-i])&lt;br /&gt;
        cor[max_tau-i] = np.sum(y[i:]*x[:-i])&lt;br /&gt;
    N= len(x)&lt;br /&gt;
    cor = cor /(N-1)&lt;br /&gt;
    return cor&lt;br /&gt;
&lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
b = np.array([-1,-2,-3])&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    print koreluj(a,b,i)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}} --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadanie 4===&lt;br /&gt;
Z danych zarejestrowanych w trakcie czuwania z zamkniętymi oczami wybierz sygnały z następujących kanałów: Fp1, P3, Pz, P4, Fp2, O1, O2.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Dla każdego kanału oblicz funkcję autokorelacji, zaś  dla każdej pary kanałów oblicz funkcję korelacji wzajemnej. Wyniki zaprezentuj w formie kwadratowej macierzy wykresów (za pomocą funkcji subplot, tak jak na przykładowym rys. (rys. &amp;lt;xr id=&amp;quot;uid9&amp;quot;&amp;gt; %i&amp;lt;/xr&amp;gt;)). Na przekątnej macierzy narysuj funkcję autokorelacji odpowiednich kanałów, poza przekątną &amp;amp;mdash; funkcję korelacji wzajemnej. Wskaż kanały, które są najbardziej skorelowane ze sobą. Czy możliwe jest wyznaczenie opóźnienia sygnału pomiędzy tymi kanałami?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Powtórz punkt 1, tym razem jednak funkcję autokorelacji i korelacji wzajemnej oblicz na sygnałach przefiltrowanych filtrem wąskopasmowym w paśmie alfa charakterystycznym dla badanej osoby. ([[%C4%86wiczenia_7#Funkcje_do_projektowania_filtr.C3.B3w_IIR_dost.C4.99pne_w_module_scipy.signal|przypomnienie konstrukcji filtrów]])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Oszacuj istotność statystyczną zależności między parami kanałów. Twoją hipotezą zerową jest brak istotnej korelacji pomiędzy sygnałami zarejestrowanymi przez dwie różne elektrody EEG. Hipoteza alternatywna to występowanie zależności pomiędzy tymi sygnałami. Podanie estymatorów wariancji funkcji korelacji jest bardzo trudne, dlatego jednym ze sposobów oszacowania progu powyżej którego wartość funkcji korelacji można byłoby uznać za istotną statystycznie, jest zastosowanie metody ''bootstrap''. Teoretycznie, funkcja korelacji policzona dla dwóch rzeczywistych, nieskorelowanych sygnałów, powinna wynosić 0 dla każdego przesunięcia &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt;. Tak jest jednak w przypadku sygnałów nieskończonych; w analizie sygnałów takowych nie spotkamy.&lt;br /&gt;
&lt;br /&gt;
Dokonując losowej zamiany kolejności próbek, możemy doprowadzić do wytworzenia sygnałów zależnych losowo, które jednak ze względu na skończony czas trwania, dadzą niezerową funkcję korelacji. Poziom losowych fluktuacji tej funkcji oszacujemy wykonując następujące kroki:&lt;br /&gt;
&amp;lt;ol type=&amp;quot;A&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Losowa zamiana kolejności próbek w analizowanych sygnałach. Jeżeli pomiędzy dwoma sygnałami istnieją jakieś zależności, losowa zamiana próbek doprowadzi do zniszczenia tych związków. W ten sposób uzyskujemy sygnały, które teoretycznie są nieskorelowane.&lt;br /&gt;
&amp;lt;li&amp;gt; Obliczenie funkcji  korelacji wzajemnej dla sygnałów policzonych w punkcie A.&lt;br /&gt;
&amp;lt;li&amp;gt; Powtórzenie kroków A i B wiele (np. 1000) razy.&lt;br /&gt;
&amp;lt;li&amp;gt; Oszacowanie 95% przedziału ufności dla wartości średniej funkcji korelacji wzajemnej dla danego przesunięcia &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; korzystając z otrzymanego w kroku C empirycznego rozkładu wartości tych funkcji dla sygnałów niezależnych.  &lt;br /&gt;
&amp;lt;li&amp;gt; Powtórzenie kroków A-D dla kolejnych przesunięć &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;li&amp;gt; Sprawdzenie, dla których przesunięć &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; funkcje autokorelacji i korelacji obliczone dla oryginalnych sygnałów uzyskały wartości wyższe niż wartości progowe oszacowane dla sygnałów o losowych zależnościach.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Procedura opisana powyżej ma jednak '''zasadniczą wadę'''. Staramy się w niej oszacować poziom przypadkowych korelacji pomiędzy dwoma sygnałami dla kolejnych przesunięć &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt;, co jest niczym innym jak wielokrotnym powtórzeniem pewnego testu. Obserwowanie korelacji dla wielu par kanałów równocześnie również prowadzi do zwiększenia szansy na zaobserwowanie ekstremalnie dużych fluktuacji.&lt;br /&gt;
Występuje tu zatem ''problem wielokrotnych porównań''.&lt;br /&gt;
Przypominamy, iż może to doprowadzić do przypadkowego uznania wyników jako &amp;amp;bdquo;istotnych&amp;amp;rdquo; statystycznie. Np. jeśli pojedynczy test wykonujemy na poziomie istotności 5% to dopuszczamy odrzucenie w 1 przypadku na 20 hipotezy zerowej pomimo, iż jest ona prawdziwa. Z drugiej jednak strony, jeśli powtórzymy wykonywany test 20 razy, to oczekujemy uzyskania 1 przypadku, w którym poziom ''p'' będzie mniejszy od 5% co jest przesłanką za odrzuceniem hipotezy zerowej. &lt;br /&gt;
&lt;br /&gt;
W przypadku wykonywania serii testów należałoby więc zastosować odpowiednie poprawki, np. [http://www.bmj.com/content/310/6973/170.full korektę Bonferroniego] czy [http://en.wikipedia.org/wiki/False_discovery_rate false discovery rate (FDR)]. Innym rozwiązaniem w analizowanym przez nas problemie jest zastosowanie tzw. statystyk wartości ekstremalnych, które prowadzą do następujących zmian w procedurze:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol type=&amp;quot;A&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;	Losowa zmiana kolejności próbek w analizowanych sygnałach (we wszystkich analizowanych kanałach). Jeżeli pomiędzy dwoma sygnałami istnieją jakieś zależności, losowa zamiana próbek doprowadzi do zniszczenia tych związków. W ten sposób uzyskujemy sygnały, które teoretycznie są nieskorelowane.&lt;br /&gt;
&amp;lt;li&amp;gt;	Obliczenie funkcji korelacji dla sygnałów otrzymanych w punkcie A.&lt;br /&gt;
&amp;lt;li&amp;gt;    Zapamiętanie maksymalnej wartości bezwzględnej funkcji korelacji z punktu B (maksimum bierzemy po wszystkich przesunięciach i po wszystkich parach kanałów; dla funkcji autokorelacji, ze względu na jej normalizację do 1 dla zerowego przesunięcia, tam maksymalnych wartości poszukujemy dla przesunięć innych niż 0).&lt;br /&gt;
&amp;lt;li&amp;gt;	Powtórzenie kroków A-C 1000 razy. Uzyskamy w ten sposób rozkład maksymalnych wartości funkcji korelacji możliwych do zaobserwowania dla sygnałów niezależnych.&lt;br /&gt;
&amp;lt;li&amp;gt;    Wyznaczenie 95 centyla rozkładu wartości maksymalnych.&lt;br /&gt;
&amp;lt;li&amp;gt;	Nałożenie na rysunki funkcji korelacji uzyskane w Zadaniu 2 poziomych linii symbolizujących poziom zależności dwóch sygnałów o losowych zależnościach i sprawdzenie, dla których przesunięć &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; wartości funkcji korelacji przekraczają estymowane progi istotności statystycznej.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Plik:Korelacje_wzajemne.png|700px|center|thumb|&amp;lt;figure id=&amp;quot;uid9&amp;quot; /&amp;gt;Przykład wyniku analizy korelacji wzajemnych dla sygnału niefiltrowanego z naniesionymi granicami możliwych fluktuacji.]]&lt;br /&gt;
&lt;br /&gt;
==Wzajemna gęstość widmowa sygnałów==&lt;br /&gt;
&lt;br /&gt;
Podobnie jak w przypadku twierdzenia Chinczyna dla pojedynczego sygnału, możliwe jest policzenie transformaty Fouriera funkcji kowariancji. Uzyskana w ten sposób wielkość nazywa się funkcją wzajemnej gęstości mocy widmowej sygnału:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid122&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
S_{xy}(f) = \int _{-\infty }^{\infty }\gamma_{xy}(\tau )e^{-2\pi i f \tau}d\tau &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W celu dalszego omówienia własności funkcji wzajemnej mocy widmowej sygnałów funkcję tę zapiszemy w postaci:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid123&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
S_{xy}(f) = |S_{xy}(f)|e^{i\phi _{xy}(f)}\\&lt;br /&gt;
\\&lt;br /&gt;
\phi _{xy} = \arg(S_{xy}) &lt;br /&gt;
\end{array} &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&amp;lt;!-- \mathrm{arc\,tg}\left[\frac{\mathrm{Im}(S_{xy}(f))}{\mathrm{Re}(S_{xy}(f))}\right]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wartość bezwzględna funkcji wzajemnej gęstości mocy widmowej osiąga największą wartość dla '''częstości''', w których sygnały &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;y(t)&amp;lt;/math&amp;gt; są ze sobą skorelowane. Funkcja wzajemnej mocy widmowej sygnałów pozbawiona jest zatem wady, która charakteryzowała funkcję korelacji, to jest problemu z wyznaczeniem czasu transmisji sygnału, w przypadku gdy czas ten zależał od częstości. Przy pomocy funkcji wzajemnej mocy widmowej, czas ten można oszacować przy pomocy fazy tej funkcji &amp;amp;mdash; &amp;lt;math&amp;gt;\phi _{xy}(f)&amp;lt;/math&amp;gt;. Jeśli funkcja wzajemnej mocy widmowej została wyznaczona pomiędzy sygnałami na wejściu i wyjściu układu liniowego, to faza ta reprezentuje przesunięcie fazowe sygnału przy przejściu przez układ. Czas tego przejścia można oszacować za pomocą następującej wyrażenia:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid124&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\tau = \frac{\phi _{xy}(f)}{2\pi f}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Podobnie jak w przypadku funkcji autokorelacji i korelacji wzajemnej, funkcję wzajemnej gęstości mocy widmowej można znormalizować:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid125&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
C_{xy}(f) = \frac{S_{xy}(f)}{\sqrt{S_x(f)S_y(f)}}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Znormalizowaną postać funkcji wzajemnej gęstości mocy widmowej nazywamy funkcją ''koherencji''. &lt;br /&gt;
Koherencja jest wielkością zespoloną. Faza koherencji odzwierciedla różnicę faz pomiędzy dwoma sygnałami. Moduł koherencji reprezentuje stopień synchronizacji sygnałów i zawiera się w przedziale od 0.0 do 1.0. Moduł tej funkcji zawiera się w przedziale od 0 do 1. Wartości 0 odpowiada brak synchronizacji pomiędzy sygnałami, zaś wartości 1 pełna synchronizacja dwóch przebiegów czasowych. Należy również zwrócić uwagę na nazewnictwo - często sam moduł koherencji określany jest jako koherencja, w literaturze anglojęzycznej moduł koherencji posiada jednak odrębną nazwę: Magnitude Square Coherence (MSC). Istotny jest również sposób estymacji modułu koherencji, który wyprowadzono w następnym rozdziale, zaś sam estymator reprezentuje wzór (36).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadanie 5===&lt;br /&gt;
Zaimplementuj funkcję obliczającą wzajemną gęstość widmową dla pary kanałów. &lt;br /&gt;
&amp;lt;!--Niech argumentami tej funkcji będą dwa wektory zawierające sygnały, zakres częstości, częstość próbkowania. --&amp;gt;&lt;br /&gt;
Oblicz i narysuj macierz gęstości widmowych (własnych i wzajemnych) dla kolejnych par kanałów (tych samych co w zadaniu 3). Wyniki zaprezentuj w postaci kwadratowej macierzy rysunków. Ponieważ są to funkcje zespolone, dobrze jest zaprezentować osobno ich wartość i fazę. Uzyskane wartości bezwzględne narysuj nad przekątną tej macierzy, a fazę pod przekątną.&lt;br /&gt;
&lt;br /&gt;
===Zadanie 6===&lt;br /&gt;
Przygotuj sygnał dwukanałowy, w którym jako pierwszy sygnał wybierz fragment sygnału EEG (z danych zebranych wcześniej) o długości 2000 próbek, a jako drugiego sygnału użyj tego samego fragmentu EEG, ale opóźnionego o wybraną liczbę (1 - 5) próbek. Oblicz widma wzajemne tych sygnałów i zaprezentuj ich fazy na rysunku. Na podstawie tych widm znajdź wartość przesunięcia czasowego tych sygnałów.&lt;br /&gt;
&lt;br /&gt;
Obliczenia powtórz w przypadku, gdy do drugiego sygnału dodany będzie szum o wariancji równej 0,25 wariancji oryginalnego sygnału.&lt;/div&gt;</summary>
		<author><name>Maciek</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG_2/EEG_wlasno%C5%9Bci_EEG_spoczynkowego&amp;diff=11185</id>
		<title>Pracownia EEG 2/EEG wlasności EEG spoczynkowego</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG_2/EEG_wlasno%C5%9Bci_EEG_spoczynkowego&amp;diff=11185"/>
		<updated>2024-11-22T16:40:18Z</updated>

		<summary type="html">&lt;p&gt;Maciek: /* Polecenie: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Pracownia EEG 2|Pracownia EEG 2]] / Własności EEG spoczynkowego: funkcja autokorelacji i widmo&lt;br /&gt;
&lt;br /&gt;
=Estymacja funkcji autokowariancji, autokorelacji i koherencji sygnału.=&lt;br /&gt;
==Wstęp==&lt;br /&gt;
Z funkcjami tymi spotkaliśmy się już na zajęciach z [[Ćwiczenia_4|analizy sygnałów]].&lt;br /&gt;
&lt;br /&gt;
Funkcja autokowariancji sygnału charakteryzuje liniową zależność wartości tego sygnału w danej określonej chwili czasu od wartości (tego samego sygnału) w innej chwili.&lt;br /&gt;
W przypadku [[Nieparametryczne_widmo_mocy#Sygna.C5.82y_stochastyczne  | stacjonarnych procesów stochastycznych]], przebieg tej funkcji nie zależy od czasu. &lt;br /&gt;
Oznacza to, że obliczając funkcję autokorelacji sygnału pomiędzy chwilą czasu &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;x(t+\tau )&amp;lt;/math&amp;gt; otrzymamy tę samą wartość, jak dla przypadku obliczania funkcji autokorelacji pomiędzy momentami &amp;lt;math&amp;gt;x(t + T)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;x(t + T+\tau )&amp;lt;/math&amp;gt;, gdzie &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; to dowolny przedział czasu. Innymi słowy, funkcja autokorelacji procesu stacjonarnego zależy tylko od odstępu czasu pomiędzy próbkami &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt;, dla którego jest wyznaczana, a nie od konkretnej chwili czasu. Odrębną klasę sygnałów stanowią procesy niestacjonarne, w przypadku których funkcja autokorelacji będzie zależeć od czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; w którym jest obliczana. Estymator funkcji autokowariancji uzyskuje się poprzez obliczanie iloczynów wartości sygnału &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; w chwilach czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; czyli &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; i wartości sygnału &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; w chwili czasu ''t''+&amp;amp;tau; czyli &amp;lt;math&amp;gt;x(t+\tau)&amp;lt;/math&amp;gt; i uśredniając wartości iloczynów po czasie &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid79&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma (\tau) = \mathrm{cov}(x(t),x(t-\tau ))=\mathrm{E}[(x(t)-\mu )(x(t-\tau )-\mu )]&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(1)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid80&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\mu = \mathrm{E}[x(t)]&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(2)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W przypadku sygnałów ciągłych estymatę tę można zapisać w poniższy sposób:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid81&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma (\tau ) = \frac{1}{T}\int _0^{T}(x(t)-\mu )(x(t-\tau )-\mu )dt&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(3)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
natomiast dla sygnałów dyskretnych jako:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid82&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma (k) = \frac{1}{N-1}\sum _{i=1}^{N-|k|}(x(i+k)-x_s)(x(i)-x_s)&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(4)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid83&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
x_s = \frac{\sum _{i=1}^{N}x(i)}{N}&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(5)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcja autokowariancji może osiągać dowolne wartości, dlatego aby można było porównać przebieg tej funkcji np. pomiędzy dwoma sygnałami, wprowadzono wersję znormalizowaną tej funkcji &amp;amp;mdash; ''funkcję autokorelacji''. Normalizacja ta wygląda następująco:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid84&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\rho (k) = \frac{\gamma (\tau )}{\sigma^2}&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(6)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid85&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\sigma ^2 = \mathrm{E}[(x(t)-\mu )^2]&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(7)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wariancję sygnału (&amp;lt;math&amp;gt;\gamma (0)=\sigma ^2&amp;lt;/math&amp;gt;) można wyrazić przez funkcję autokowariancji dla przesunięcia &amp;lt;math&amp;gt;\tau =0&amp;lt;/math&amp;gt;.  Wynika z tego, że funkcja korelacji przyjmuje wartości z zakresu [&amp;amp;minus;1,&amp;amp;nbsp;1]. Ostatecznie estymator funkcji autokorelacji można zapisać jak poniżej:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid86&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\rho(k) = \frac{\gamma (k)}{\gamma (0)}&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(8)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcję autokorelacji estymuje się w celu określenia, w jakim stopniu wartości sygnału w danej chwili czasu wpływają na wartości sygnału w kolejnych chwilach czasu. Ma to kluczowe znaczenie przy rozpoznawaniu rodzaju procesów fizycznych odpowiedzialnego za generowanie sygnału. Funkcja ta zawsze mam maksimum dla przesunięcia &amp;lt;math&amp;gt;\tau =0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cechą charakterystyczną funkcji autokorelacji jest to, iż w przypadku sygnałów harmonicznych, przebieg funkcji ma charakter okresowy, z okresem takim samym jak okres badanego sygnału. W przypadku szumu, funkcja autokorelacji ma kształt funkcji delta Diraca.&lt;br /&gt;
&lt;br /&gt;
==Polecenie:==&lt;br /&gt;
Do policzenia funkcji autokorelacji posłużymy się funkcją biblioteczną &amp;lt;tt&amp;gt;numpy.correlate&amp;lt;/tt&amp;gt;. Funkcja ta, wbrew nazwie, oblicza wyłącznie splot swoich dwóch pierwszych argumentów wywołania. Musimy je więc przystosować do obliczenia wielkości zgodnie ze wzorem (4).&lt;br /&gt;
&lt;br /&gt;
Zaimplementuj funkcję do obliczania funkcji korelacji zgodnie ze wzorem (&amp;lt;xr id=&amp;quot;uid82&amp;quot;&amp;gt;&amp;lt;/xr&amp;gt;). Funkcja powinna przyjmować jako parametry dwa wektory&amp;lt;!--i maksymalne przesunięcie wzajemne tych wektorów--&amp;gt;, a zwracać wektor zawierający ich funkcję autokorelacji. &lt;br /&gt;
&lt;br /&gt;
Wywołanie przykładowe:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
print koreluj(a,a)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
powinno dać wynik:&lt;br /&gt;
 [-0.5  0.   1.   0.  -0.5]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
# Średnia&lt;br /&gt;
mean = numpy.mean(data)&lt;br /&gt;
mean2 = numpy.mean(data2)&lt;br /&gt;
&lt;br /&gt;
# Wariancja&lt;br /&gt;
var = numpy.var(data)&lt;br /&gt;
var2 = numpy.var(data2)&lt;br /&gt;
&lt;br /&gt;
# Dane po odjęciu średnich&lt;br /&gt;
ndata = data - mean&lt;br /&gt;
ndata2 = data2 - mean2&lt;br /&gt;
&lt;br /&gt;
# Splot&lt;br /&gt;
acorr = numpy.correlate(ndata, ndata2, 'full')&lt;br /&gt;
&lt;br /&gt;
# Normalizacja kowariancji do korelacji i przez 1/N&lt;br /&gt;
acorr = acorr / numpy.sqrt(var*var2) / len(ndata)&lt;br /&gt;
&lt;br /&gt;
print(acorr)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{{hidden begin|title=Przykładowe rozwiązanie:}}--&amp;gt;&lt;br /&gt;
 &amp;lt;!-- &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
def koreluj_pol(x,y,max_tau):&lt;br /&gt;
    x = x - np.mean(x)&lt;br /&gt;
    y = y - np.mean(y)&lt;br /&gt;
    N= len(x)&lt;br /&gt;
    cor = np.zeros(max_tau+1)&lt;br /&gt;
    cor[0] = np.sum(x[:]*y[:]) &lt;br /&gt;
    for i in range(1,max_tau+1):&lt;br /&gt;
        cor[i] = np.sum(x[i:]*y[:-i])&lt;br /&gt;
        &lt;br /&gt;
    cor = cor /(N-1)&lt;br /&gt;
    return cor&lt;br /&gt;
&lt;br /&gt;
def koreluj(x,y,max_tau):&lt;br /&gt;
    cor = np.zeros(2*max_tau+1)    &lt;br /&gt;
    cor[max_tau:] = koreluj_pol(x,y,max_tau)&lt;br /&gt;
    tmp = koreluj_pol(y,x,max_tau)&lt;br /&gt;
    cor[:max_tau+1] = tmp[-1::-1]&lt;br /&gt;
    return cor    &lt;br /&gt;
    &lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    print koreluj(a,a,i)&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
b = np.array([-1,-2,-3])&lt;br /&gt;
&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    print koreluj(a,b,i)&lt;br /&gt;
    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zadanie 1: Pomiar sygnału EEG ==&lt;br /&gt;
&lt;br /&gt;
Zarejestruj 10 minut sygnału EEG, w trakcie których badana osoba będzie siedziała z otwartymi oczami oraz kolejne 10 minut w stanie czuwania z zamkniętymi oczami. Rejestrację należy wykonać na pełnym czepku 10-20 z częstością próbkowania 128 Hz. &lt;br /&gt;
&lt;br /&gt;
==Zadanie 2:  Funkcje autokowariancji i autokorelacji==&lt;br /&gt;
W tym zadaniu posłużymy się sygnałami zarejestrowanymi w punkcie 3. poprzedniego ćwiczenia. Zaobserwuj, na którym kanale rytm alfa osiąga najwyższą wartość. Następnie zaimplementuj w Pythonie następujące kroki:&lt;br /&gt;
&lt;br /&gt;
#	Wczytaj dane z wybranego kanału.&lt;br /&gt;
#	Oblicz funkcję autokorelacji dla sygnału zarejestrowanego w warunkach, gdy osoba badana siedziała z otwartymi oczami. Narysuj autokorelogram, to jest wykres wartości funkcji autokorelacji względem przesunięcia &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt;. Oś &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; wyskaluj w sekundach.&lt;br /&gt;
#	Powtórz krok 2, tym razem dla sygnału zebranego w warunkach czuwania z zamkniętymi oczami.&lt;br /&gt;
#	Porównaj autokorelogramy.&lt;br /&gt;
&lt;br /&gt;
=Związek autokorelacji z widmem sygnału=&lt;br /&gt;
==Wstęp==&lt;br /&gt;
Zgodnie z twierdzeniem Chinczyna, z którym zapoznaliśmy się na wykładzie z [[Twierdzenie_Wienera-Chinczyna|Analizy Sygnałów]], widmową gęstość mocy sygnału można policzyć jako transformatę Fouriera funkcji autokowariancji:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid93&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
S(f) = \int _{-\infty }^{\infty }\gamma (\tau )e^{-2\pi i f \tau}d\tau &amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(9)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	&amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; &amp;amp;mdash; częstość&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	&amp;lt;math&amp;gt;S(f)&amp;lt;/math&amp;gt; &amp;amp;mdash;  gęstość widmowa mocy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Poniższy kod ilustruje to twierdzenie:&lt;br /&gt;
&amp;lt;source lang = py&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
from numpy.fft import rfft,fft,fftfreq,fftshift&lt;br /&gt;
 &lt;br /&gt;
def widmo_mocy(s, Fs):&lt;br /&gt;
    '''Funkcja licąca widmo mocy metodą periodogramu,&lt;br /&gt;
	pobiera sygnał i częstość próbkowania&lt;br /&gt;
	zwraca widmo mocy i oś częstości&lt;br /&gt;
    '''&lt;br /&gt;
    S = fft(s)/np.sqrt(len(s))&lt;br /&gt;
    S_moc = S*S.conj()&lt;br /&gt;
    S_moc = S_moc.real&lt;br /&gt;
    F = fftfreq(len(s), 1/Fs)&lt;br /&gt;
    return (fftshift(S_moc),fftshift(F))&lt;br /&gt;
 &lt;br /&gt;
def sin(f = 1, T = 1, Fs = 128, phi =0 ):&lt;br /&gt;
    '''sin o zadanej częstości (w Hz), długości, fazie i częstości próbkowania&lt;br /&gt;
    Domyślnie wytwarzany jest sygnał reprezentujący &lt;br /&gt;
    1 sekundę sinusa o częstości 1Hz i zerowej fazie próbkowanego 128 Hz&lt;br /&gt;
    '''&lt;br /&gt;
    dt = 1.0/Fs&lt;br /&gt;
    t = np.arange(0,T,dt)&lt;br /&gt;
    s = np.sin(2*np.pi*f*t + phi)&lt;br /&gt;
    return (s,t)&lt;br /&gt;
 &lt;br /&gt;
# sygnał próbny będzie próbkowany z częstością FS&lt;br /&gt;
FS = 100.0&lt;br /&gt;
# sygnałem próbnym będzie sinusoida o częstości f &lt;br /&gt;
(s,t) = sin(f=10.5,Fs=FS)&lt;br /&gt;
# obliczamy moc i energię sygnału w dziedzinie czasu&lt;br /&gt;
moc_w_czasie = s**2&lt;br /&gt;
energia_w_czasie = np.sum(moc_w_czasie)&lt;br /&gt;
print 'energia w czasie: ', energia_w_czasie&lt;br /&gt;
 &lt;br /&gt;
# obliczamy widmo mocy sygnału i jego energię estymowaną w dziedzinie częstości&lt;br /&gt;
(moc_w_czestosci, F) = widmo_mocy(s, Fs=FS)&lt;br /&gt;
energia_w_czestosci = np.sum(moc_w_czestosci)&lt;br /&gt;
print 'energia w czestosci: ', energia_w_czestosci&lt;br /&gt;
 &lt;br /&gt;
# estymujemy funkcję autokorelacji sygnału&lt;br /&gt;
ak = 1./(2*len(s)-1)*np.correlate(s,s,'full')&lt;br /&gt;
&lt;br /&gt;
# estymujemy widmo mocy i energię sygnału z twierdzenia Chinczyna korzystając z funkcji fft:&lt;br /&gt;
moc_chi = np.abs(fft(ak))&lt;br /&gt;
energia_chin = sum(moc_chi)&lt;br /&gt;
print 'energia z tw. Chinczyna przez fft: ', energia_chin&lt;br /&gt;
 &lt;br /&gt;
# estymujemy widmo mocy i energię sygnału z twierdzenia Chinczyna korzystając z jawnej postaci transformaty Fouriera:&lt;br /&gt;
FF = np.linspace(-FS/2,FS/2,1000)&lt;br /&gt;
M = np.zeros(len(FF),dtype='complex')&lt;br /&gt;
 &lt;br /&gt;
for i,f in enumerate( FF):&lt;br /&gt;
    for tau in range(len(ak)):&lt;br /&gt;
        M[i] += ak[tau]*np.exp(2*np.pi*1j*f*(len(ak)-tau)/FS) &lt;br /&gt;
M = np.abs(M)&lt;br /&gt;
energia_chin_sum = np.sum(M)* (len(ak)/len(FF))&lt;br /&gt;
print 'energia z tw. Chinczyna przez sumowanie: ', energia_chin_sum&lt;br /&gt;
&lt;br /&gt;
# Rysunki&lt;br /&gt;
py.figure(1)&lt;br /&gt;
py.subplot(3,1,1)&lt;br /&gt;
py.plot(t,s)&lt;br /&gt;
py.title(u'Sygnal')&lt;br /&gt;
py.subplot(3,1,2)&lt;br /&gt;
py.plot(t,moc_w_czasie)&lt;br /&gt;
py.title(u'moc w czasie')&lt;br /&gt;
py.subplot(3,1,3)&lt;br /&gt;
py.plot(F,moc_w_czestosci)&lt;br /&gt;
py.title(u'moc w czestosci')&lt;br /&gt;
 &lt;br /&gt;
py.figure(2)&lt;br /&gt;
py.subplot(3,1,1)&lt;br /&gt;
py.title('f. autokowariancji')&lt;br /&gt;
py.plot(np.arange(-len(ak)/2,len(ak)/2,1)/FS ,ak)&lt;br /&gt;
py.subplot(3,1,2)&lt;br /&gt;
py.plot(fftshift(fftfreq(len(moc_chi),1./FS)),fftshift(moc_chi))&lt;br /&gt;
py.title('widmo mocy z Tw. Chinczyna przez fft')&lt;br /&gt;
py.subplot(3,1,3)&lt;br /&gt;
py.plot(FF,M)&lt;br /&gt;
py.title('widmo mocy z Tw. Chinczyna przez sumowanie')&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W wyniku powinniśmy zobaczyć w terminalu:&lt;br /&gt;
 energia w czasie:  50.0&lt;br /&gt;
 energia w czestosci:  50.0&lt;br /&gt;
 energia z tw. Chinczyna przez fft:  50.0&lt;br /&gt;
 energia z tw. Chinczyna przez sumowanie:  49.9501172217&lt;br /&gt;
&lt;br /&gt;
oraz powinny pojawić się rysunki:&lt;br /&gt;
[[Plik:Fig_chinczyn1.png|thumb 200 px|center]]&lt;br /&gt;
[[Plik:Fig_chinczyn2.png|thumb 200 px|center]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Polecenie ==&lt;br /&gt;
Zaimplementuj funkcję obliczającą transformację Fouriera dyskretyzując wzór (9) dla zadanego wektora częstości &amp;lt;tt&amp;gt;f&amp;lt;/tt&amp;gt; i zadanej częstości próbkowania sygnału (tutaj: 10).&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Wywołanie przykładowe:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
t= np.arange(0,1,0.1)&lt;br /&gt;
x = np.sin(2*np.pi*2*t)&lt;br /&gt;
f = np.arange(-5,5,1)&lt;br /&gt;
X,f = fourier(x,f,10.0)&lt;br /&gt;
print X&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Natomiast wywołanie:&lt;br /&gt;
&amp;lt;source lang ='python'&amp;gt;&lt;br /&gt;
t= np.arange(0,1,0.1)&lt;br /&gt;
x = np.sin(2*np.pi*2*t)&lt;br /&gt;
f = np.arange(-5,5,0.01)&lt;br /&gt;
X = fourier(x,f,10.0)&lt;br /&gt;
py.plot(f,np.abs(X))&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Powinno wytworzyć rysunek:&lt;br /&gt;
&lt;br /&gt;
[[Plik:Fourier_test.png]] &lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
import numpy as np&lt;br /&gt;
import pylab as py&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def koreluj_pol(x,y,max_tau):&lt;br /&gt;
    x = x - np.mean(x)&lt;br /&gt;
    y = y - np.mean(y)&lt;br /&gt;
    N= len(x)&lt;br /&gt;
    cor = np.zeros(max_tau+1)&lt;br /&gt;
    cor[0] = np.sum(x[:]*y[:]) &lt;br /&gt;
    for i in range(1,max_tau+1):&lt;br /&gt;
        cor[i] = np.sum(x[i:]*y[:-i])&lt;br /&gt;
        &lt;br /&gt;
    cor = cor /(N)&lt;br /&gt;
    return cor&lt;br /&gt;
&lt;br /&gt;
def koreluj(x,y,max_tau):&lt;br /&gt;
    cor = np.zeros(2*max_tau+1)    &lt;br /&gt;
    cor[max_tau:] = koreluj_pol(x,y,max_tau)&lt;br /&gt;
    tmp = koreluj_pol(y,x,max_tau)&lt;br /&gt;
    cor[:max_tau+1] = tmp[-1::-1]&lt;br /&gt;
    return cor  &lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
def fourier_chin(x, FF, FS):&lt;br /&gt;
    ak = koreluj(x,x,len(x)-1)&lt;br /&gt;
    M = np.zeros(len(FF),dtype='complex') &lt;br /&gt;
    for i,f in enumerate( FF):&lt;br /&gt;
        for tau in range(len(ak)):&lt;br /&gt;
	    M[i] += ak[tau]*np.exp(-2*np.pi*1j*f*( tau- len(x))/FS)&lt;br /&gt;
    #M/=np.sqrt(len(ak))&lt;br /&gt;
    return M&lt;br /&gt;
    &lt;br /&gt;
def fourier(ak, FF, FS):&lt;br /&gt;
   &lt;br /&gt;
    M = np.zeros(len(FF),dtype='complex') &lt;br /&gt;
    for i,f in enumerate( FF):&lt;br /&gt;
        for tau in range(len(ak)):&lt;br /&gt;
	    M[i] += ak[tau]*np.exp(-2*np.pi*1j*f*( tau)/FS)&lt;br /&gt;
    M/=np.sqrt(len(ak))&lt;br /&gt;
    return M&lt;br /&gt;
t= np.arange(0,1,0.05)&lt;br /&gt;
x = np.sin(2*np.pi*2*t)&lt;br /&gt;
f = np.arange(-5,5,0.01)&lt;br /&gt;
&lt;br /&gt;
X = fourier_chin(x,f,10.0)&lt;br /&gt;
Xf = fourier(x,f,10.0)&lt;br /&gt;
print X&lt;br /&gt;
py.plot(f,np.abs(X), f,np.abs(Xf)**2)&lt;br /&gt;
py.show()&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zadanie 3: Związek autokorelacji z widmem sygnału==&lt;br /&gt;
Oblicz gęstość widmową mocy sygnału zarejestrowanego w trakcie czuwania z zamkniętymi oczami, korzystając z twierdzenia Chinczyna oraz [[Nieparametryczne_widmo_mocy#Metoda_Welcha | metodą Welcha]].&lt;br /&gt;
Znajdź częstość rytmu &amp;amp;alpha; dla osoby, która była badana.&lt;br /&gt;
&lt;br /&gt;
==Funkcja kowariancji (wzajemnej)==&lt;br /&gt;
&lt;br /&gt;
W celu scharakteryzowania zależności wzajemnej dwóch sygnałów losowych, stosuje się funkcję kowariancji, zdefiniowaną w następujący sposób:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid98&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy} (\tau ) = \mathrm{cov}(x(t),y(t-\tau ))=\mathrm{E}[(x(t)-\mu _x)(y(t-\tau )-\mu _y)]&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid99&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\mu _x = \mathrm{E}[x(t)]\\&lt;br /&gt;
\mu _y = \mathrm{E}[y(t)]\\ \end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W przypadku sygnałów ciągłych estymatę tę można zapisać w poniższy sposób:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid100&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy} (\tau ) = \frac{1}{T}\int _0^{T}(x(t)-\mu_x)(y(t-\tau)-\mu_y)dt&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
natomiast dla sygnałów dyskretnych jako:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid101&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy}(k) = \frac{1}{N-1}\sum _{i=0}^{N-k}(x(i+k)-x_s)(y(i)-y_s)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W odróżnieniu od funkcji autokowariancji, funkcja kowariancji nie musi mieć maksimum dla przesunięcia &amp;lt;math&amp;gt;\tau =0&amp;lt;/math&amp;gt;. Ponadto posiada ona następującą cechę:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid102&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy}(-\tau ) = \gamma _{yx}(\tau )&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcję kowariancji można znormalizować:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid103&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\rho (\tau) = \frac{\mathrm{E}[(x(t)-\mu _x)(y(t-\tau )-\mu _y)]}{\sqrt{\mathrm{E}[(x(t)-\mu _x)^2]\mathrm{E}[(y(t)-\mu _y)^2]}} = \frac{\gamma _{xy}}{\sigma_x\sigma_y}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
Otrzymaną funkcję nazywamy funkcją korelacji.&lt;br /&gt;
Jednym z zastosowań funkcji korelacji jest wyznaczanie czasu przejścia sygnału przez dany układ liniowy. Funkcja korelacji pomiędzy sygnałem na wejściu układu i sygnałem na jego wyjściu osiągnie wartość maksymalną dla przesunięcia &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; równego czasowi, jaki potrzebował sygnał na pokonanie danego układu. Niestety, taka metoda wyznaczania opóźnienia obarczona jest pewną wadą &amp;amp;mdash; w przypadku gdy prędkość sygnału bądź jego droga zależą od częstości, wtedy na wykresie funkcji korelacji nie uzyskamy wyraźnego maksimum.&lt;br /&gt;
&lt;br /&gt;
=====Polecenie =====&lt;br /&gt;
Zaimplementuj funkcję obliczającą funkcję kowariancji dla różnych sygnałów ''x'' i ''y'' (równanie 13) skorzystaj przy tym z własności opisanej równaniem (14). &lt;br /&gt;
Przykładowe wywołanie:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
b = np.array([-1,-2,-3])&lt;br /&gt;
&lt;br /&gt;
print koreluj(a,b)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
powinno dać w wyniku:&lt;br /&gt;
 [ 0.5 0.  -1.   0.   0.5]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
{{hidden begin|title=Przykładowe rozwiązanie:}}&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import pylab as py&lt;br /&gt;
&lt;br /&gt;
def koreluj(x,y,max_tau):&lt;br /&gt;
    x = x - np.mean(x)&lt;br /&gt;
    y = y - np.mean(y)&lt;br /&gt;
    cor = np.zeros(2*max_tau+1)&lt;br /&gt;
    cor[max_tau] = np.sum(x[:]*y[:]) &lt;br /&gt;
    for i in range(1,max_tau+1):&lt;br /&gt;
        cor[max_tau+i] = np.sum(x[i:]*y[:-i])&lt;br /&gt;
        cor[max_tau-i] = np.sum(y[i:]*x[:-i])&lt;br /&gt;
    N= len(x)&lt;br /&gt;
    cor = cor /(N-1)&lt;br /&gt;
    return cor&lt;br /&gt;
&lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
b = np.array([-1,-2,-3])&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    print koreluj(a,b,i)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}} --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadanie 4===&lt;br /&gt;
Z danych zarejestrowanych w trakcie czuwania z zamkniętymi oczami wybierz sygnały z następujących kanałów: Fp1, P3, Pz, P4, Fp2, O1, O2.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Dla każdego kanału oblicz funkcję autokorelacji, zaś  dla każdej pary kanałów oblicz funkcję korelacji wzajemnej. Wyniki zaprezentuj w formie kwadratowej macierzy wykresów (za pomocą funkcji subplot, tak jak na przykładowym rys. (rys. &amp;lt;xr id=&amp;quot;uid9&amp;quot;&amp;gt; %i&amp;lt;/xr&amp;gt;)). Na przekątnej macierzy narysuj funkcję autokorelacji odpowiednich kanałów, poza przekątną &amp;amp;mdash; funkcję korelacji wzajemnej. Wskaż kanały, które są najbardziej skorelowane ze sobą. Czy możliwe jest wyznaczenie opóźnienia sygnału pomiędzy tymi kanałami?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Powtórz punkt 1, tym razem jednak funkcję autokorelacji i korelacji wzajemnej oblicz na sygnałach przefiltrowanych filtrem wąskopasmowym w paśmie alfa charakterystycznym dla badanej osoby. ([[%C4%86wiczenia_7#Funkcje_do_projektowania_filtr.C3.B3w_IIR_dost.C4.99pne_w_module_scipy.signal|przypomnienie konstrukcji filtrów]])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Oszacuj istotność statystyczną zależności między parami kanałów. Twoją hipotezą zerową jest brak istotnej korelacji pomiędzy sygnałami zarejestrowanymi przez dwie różne elektrody EEG. Hipoteza alternatywna to występowanie zależności pomiędzy tymi sygnałami. Podanie estymatorów wariancji funkcji korelacji jest bardzo trudne, dlatego jednym ze sposobów oszacowania progu powyżej którego wartość funkcji korelacji można byłoby uznać za istotną statystycznie, jest zastosowanie metody ''bootstrap''. Teoretycznie, funkcja korelacji policzona dla dwóch rzeczywistych, nieskorelowanych sygnałów, powinna wynosić 0 dla każdego przesunięcia &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt;. Tak jest jednak w przypadku sygnałów nieskończonych; w analizie sygnałów takowych nie spotkamy.&lt;br /&gt;
&lt;br /&gt;
Dokonując losowej zamiany kolejności próbek, możemy doprowadzić do wytworzenia sygnałów zależnych losowo, które jednak ze względu na skończony czas trwania, dadzą niezerową funkcję korelacji. Poziom losowych fluktuacji tej funkcji oszacujemy wykonując następujące kroki:&lt;br /&gt;
&amp;lt;ol type=&amp;quot;A&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Losowa zamiana kolejności próbek w analizowanych sygnałach. Jeżeli pomiędzy dwoma sygnałami istnieją jakieś zależności, losowa zamiana próbek doprowadzi do zniszczenia tych związków. W ten sposób uzyskujemy sygnały, które teoretycznie są nieskorelowane.&lt;br /&gt;
&amp;lt;li&amp;gt; Obliczenie funkcji  korelacji wzajemnej dla sygnałów policzonych w punkcie A.&lt;br /&gt;
&amp;lt;li&amp;gt; Powtórzenie kroków A i B wiele (np. 1000) razy.&lt;br /&gt;
&amp;lt;li&amp;gt; Oszacowanie 95% przedziału ufności dla wartości średniej funkcji korelacji wzajemnej dla danego przesunięcia &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; korzystając z otrzymanego w kroku C empirycznego rozkładu wartości tych funkcji dla sygnałów niezależnych.  &lt;br /&gt;
&amp;lt;li&amp;gt; Powtórzenie kroków A-D dla kolejnych przesunięć &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;li&amp;gt; Sprawdzenie, dla których przesunięć &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; funkcje autokorelacji i korelacji obliczone dla oryginalnych sygnałów uzyskały wartości wyższe niż wartości progowe oszacowane dla sygnałów o losowych zależnościach.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Procedura opisana powyżej ma jednak '''zasadniczą wadę'''. Staramy się w niej oszacować poziom przypadkowych korelacji pomiędzy dwoma sygnałami dla kolejnych przesunięć &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt;, co jest niczym innym jak wielokrotnym powtórzeniem pewnego testu. Obserwowanie korelacji dla wielu par kanałów równocześnie również prowadzi do zwiększenia szansy na zaobserwowanie ekstremalnie dużych fluktuacji.&lt;br /&gt;
Występuje tu zatem ''problem wielokrotnych porównań''.&lt;br /&gt;
Przypominamy, iż może to doprowadzić do przypadkowego uznania wyników jako &amp;amp;bdquo;istotnych&amp;amp;rdquo; statystycznie. Np. jeśli pojedynczy test wykonujemy na poziomie istotności 5% to dopuszczamy odrzucenie w 1 przypadku na 20 hipotezy zerowej pomimo, iż jest ona prawdziwa. Z drugiej jednak strony, jeśli powtórzymy wykonywany test 20 razy, to oczekujemy uzyskania 1 przypadku, w którym poziom ''p'' będzie mniejszy od 5% co jest przesłanką za odrzuceniem hipotezy zerowej. &lt;br /&gt;
&lt;br /&gt;
W przypadku wykonywania serii testów należałoby więc zastosować odpowiednie poprawki, np. [http://www.bmj.com/content/310/6973/170.full korektę Bonferroniego] czy [http://en.wikipedia.org/wiki/False_discovery_rate false discovery rate (FDR)]. Innym rozwiązaniem w analizowanym przez nas problemie jest zastosowanie tzw. statystyk wartości ekstremalnych, które prowadzą do następujących zmian w procedurze:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol type=&amp;quot;A&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;	Losowa zmiana kolejności próbek w analizowanych sygnałach (we wszystkich analizowanych kanałach). Jeżeli pomiędzy dwoma sygnałami istnieją jakieś zależności, losowa zamiana próbek doprowadzi do zniszczenia tych związków. W ten sposób uzyskujemy sygnały, które teoretycznie są nieskorelowane.&lt;br /&gt;
&amp;lt;li&amp;gt;	Obliczenie funkcji korelacji dla sygnałów otrzymanych w punkcie A.&lt;br /&gt;
&amp;lt;li&amp;gt;    Zapamiętanie maksymalnej wartości bezwzględnej funkcji korelacji z punktu B (maksimum bierzemy po wszystkich przesunięciach i po wszystkich parach kanałów; dla funkcji autokorelacji, ze względu na jej normalizację do 1 dla zerowego przesunięcia, tam maksymalnych wartości poszukujemy dla przesunięć innych niż 0).&lt;br /&gt;
&amp;lt;li&amp;gt;	Powtórzenie kroków A-C 1000 razy. Uzyskamy w ten sposób rozkład maksymalnych wartości funkcji korelacji możliwych do zaobserwowania dla sygnałów niezależnych.&lt;br /&gt;
&amp;lt;li&amp;gt;    Wyznaczenie 95 centyla rozkładu wartości maksymalnych.&lt;br /&gt;
&amp;lt;li&amp;gt;	Nałożenie na rysunki funkcji korelacji uzyskane w Zadaniu 2 poziomych linii symbolizujących poziom zależności dwóch sygnałów o losowych zależnościach i sprawdzenie, dla których przesunięć &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; wartości funkcji korelacji przekraczają estymowane progi istotności statystycznej.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Plik:Korelacje_wzajemne.png|700px|center|thumb|&amp;lt;figure id=&amp;quot;uid9&amp;quot; /&amp;gt;Przykład wyniku analizy korelacji wzajemnych dla sygnału niefiltrowanego z naniesionymi granicami możliwych fluktuacji.]]&lt;br /&gt;
&lt;br /&gt;
==Wzajemna gęstość widmowa sygnałów==&lt;br /&gt;
&lt;br /&gt;
Podobnie jak w przypadku twierdzenia Chinczyna dla pojedynczego sygnału, możliwe jest policzenie transformaty Fouriera funkcji kowariancji. Uzyskana w ten sposób wielkość nazywa się funkcją wzajemnej gęstości mocy widmowej sygnału:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid122&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
S_{xy}(f) = \int _{-\infty }^{\infty }\gamma_{xy}(\tau )e^{-2\pi i f \tau}d\tau &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W celu dalszego omówienia własności funkcji wzajemnej mocy widmowej sygnałów funkcję tę zapiszemy w postaci:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid123&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
S_{xy}(f) = |S_{xy}(f)|e^{i\phi _{xy}(f)}\\&lt;br /&gt;
\\&lt;br /&gt;
\phi _{xy} = \arg(S_{xy}) &lt;br /&gt;
\end{array} &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&amp;lt;!-- \mathrm{arc\,tg}\left[\frac{\mathrm{Im}(S_{xy}(f))}{\mathrm{Re}(S_{xy}(f))}\right]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wartość bezwzględna funkcji wzajemnej gęstości mocy widmowej osiąga największą wartość dla '''częstości''', w których sygnały &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;y(t)&amp;lt;/math&amp;gt; są ze sobą skorelowane. Funkcja wzajemnej mocy widmowej sygnałów pozbawiona jest zatem wady, która charakteryzowała funkcję korelacji, to jest problemu z wyznaczeniem czasu transmisji sygnału, w przypadku gdy czas ten zależał od częstości. Przy pomocy funkcji wzajemnej mocy widmowej, czas ten można oszacować przy pomocy fazy tej funkcji &amp;amp;mdash; &amp;lt;math&amp;gt;\phi _{xy}(f)&amp;lt;/math&amp;gt;. Jeśli funkcja wzajemnej mocy widmowej została wyznaczona pomiędzy sygnałami na wejściu i wyjściu układu liniowego, to faza ta reprezentuje przesunięcie fazowe sygnału przy przejściu przez układ. Czas tego przejścia można oszacować za pomocą następującej wyrażenia:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid124&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\tau = \frac{\phi _{xy}(f)}{2\pi f}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Podobnie jak w przypadku funkcji autokorelacji i korelacji wzajemnej, funkcję wzajemnej gęstości mocy widmowej można znormalizować:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid125&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
C_{xy}(f) = \frac{S_{xy}(f)}{\sqrt{S_x(f)S_y(f)}}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Znormalizowaną postać funkcji wzajemnej gęstości mocy widmowej nazywamy funkcją ''koherencji''. &lt;br /&gt;
Koherencja jest wielkością zespoloną. Faza koherencji odzwierciedla różnicę faz pomiędzy dwoma sygnałami. Moduł koherencji reprezentuje stopień synchronizacji sygnałów i zawiera się w przedziale od 0.0 do 1.0. Moduł tej funkcji zawiera się w przedziale od 0 do 1. Wartości 0 odpowiada brak synchronizacji pomiędzy sygnałami, zaś wartości 1 pełna synchronizacja dwóch przebiegów czasowych. Należy również zwrócić uwagę na nazewnictwo - często sam moduł koherencji określany jest jako koherencja, w literaturze anglojęzycznej moduł koherencji posiada jednak odrębną nazwę: Magnitude Square Coherence (MSC). Istotny jest również sposób estymacji modułu koherencji, który wyprowadzono w następnym rozdziale, zaś sam estymator reprezentuje wzór (36).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadanie 5===&lt;br /&gt;
Zaimplementuj funkcję obliczającą wzajemną gęstość widmową dla pary kanałów. &lt;br /&gt;
&amp;lt;!--Niech argumentami tej funkcji będą dwa wektory zawierające sygnały, zakres częstości, częstość próbkowania. --&amp;gt;&lt;br /&gt;
Oblicz i narysuj macierz gęstości widmowych (własnych i wzajemnych) dla kolejnych par kanałów (tych samych co w zadaniu 3). Wyniki zaprezentuj w postaci kwadratowej macierzy rysunków. Ponieważ są to funkcje zespolone, dobrze jest zaprezentować osobno ich wartość i fazę. Uzyskane wartości bezwzględne narysuj nad przekątną tej macierzy, a fazę pod przekątną.&lt;br /&gt;
&lt;br /&gt;
===Zadanie 6===&lt;br /&gt;
Przygotuj sygnał dwukanałowy, w którym jako pierwszy sygnał wybierz fragment sygnału EEG (z danych zebranych wcześniej) o długości 2000 próbek, a jako drugiego sygnału użyj tego samego fragmentu EEG, ale opóźnionego o wybraną liczbę (1 - 5) próbek. Oblicz widma wzajemne tych sygnałów i zaprezentuj ich fazy na rysunku. Na podstawie tych widm znajdź wartość przesunięcia czasowego tych sygnałów.&lt;br /&gt;
&lt;br /&gt;
Obliczenia powtórz w przypadku, gdy do drugiego sygnału dodany będzie szum o wariancji równej 0,25 wariancji oryginalnego sygnału.&lt;/div&gt;</summary>
		<author><name>Maciek</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG_2/EEG_wlasno%C5%9Bci_EEG_spoczynkowego&amp;diff=11184</id>
		<title>Pracownia EEG 2/EEG wlasności EEG spoczynkowego</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG_2/EEG_wlasno%C5%9Bci_EEG_spoczynkowego&amp;diff=11184"/>
		<updated>2024-11-22T16:39:59Z</updated>

		<summary type="html">&lt;p&gt;Maciek: /* Polecenie: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Pracownia EEG 2|Pracownia EEG 2]] / Własności EEG spoczynkowego: funkcja autokorelacji i widmo&lt;br /&gt;
&lt;br /&gt;
=Estymacja funkcji autokowariancji, autokorelacji i koherencji sygnału.=&lt;br /&gt;
==Wstęp==&lt;br /&gt;
Z funkcjami tymi spotkaliśmy się już na zajęciach z [[Ćwiczenia_4|analizy sygnałów]].&lt;br /&gt;
&lt;br /&gt;
Funkcja autokowariancji sygnału charakteryzuje liniową zależność wartości tego sygnału w danej określonej chwili czasu od wartości (tego samego sygnału) w innej chwili.&lt;br /&gt;
W przypadku [[Nieparametryczne_widmo_mocy#Sygna.C5.82y_stochastyczne  | stacjonarnych procesów stochastycznych]], przebieg tej funkcji nie zależy od czasu. &lt;br /&gt;
Oznacza to, że obliczając funkcję autokorelacji sygnału pomiędzy chwilą czasu &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;x(t+\tau )&amp;lt;/math&amp;gt; otrzymamy tę samą wartość, jak dla przypadku obliczania funkcji autokorelacji pomiędzy momentami &amp;lt;math&amp;gt;x(t + T)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;x(t + T+\tau )&amp;lt;/math&amp;gt;, gdzie &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; to dowolny przedział czasu. Innymi słowy, funkcja autokorelacji procesu stacjonarnego zależy tylko od odstępu czasu pomiędzy próbkami &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt;, dla którego jest wyznaczana, a nie od konkretnej chwili czasu. Odrębną klasę sygnałów stanowią procesy niestacjonarne, w przypadku których funkcja autokorelacji będzie zależeć od czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; w którym jest obliczana. Estymator funkcji autokowariancji uzyskuje się poprzez obliczanie iloczynów wartości sygnału &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; w chwilach czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; czyli &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; i wartości sygnału &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; w chwili czasu ''t''+&amp;amp;tau; czyli &amp;lt;math&amp;gt;x(t+\tau)&amp;lt;/math&amp;gt; i uśredniając wartości iloczynów po czasie &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid79&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma (\tau) = \mathrm{cov}(x(t),x(t-\tau ))=\mathrm{E}[(x(t)-\mu )(x(t-\tau )-\mu )]&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(1)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid80&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\mu = \mathrm{E}[x(t)]&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(2)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W przypadku sygnałów ciągłych estymatę tę można zapisać w poniższy sposób:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid81&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma (\tau ) = \frac{1}{T}\int _0^{T}(x(t)-\mu )(x(t-\tau )-\mu )dt&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(3)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
natomiast dla sygnałów dyskretnych jako:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid82&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma (k) = \frac{1}{N-1}\sum _{i=1}^{N-|k|}(x(i+k)-x_s)(x(i)-x_s)&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(4)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid83&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
x_s = \frac{\sum _{i=1}^{N}x(i)}{N}&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(5)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcja autokowariancji może osiągać dowolne wartości, dlatego aby można było porównać przebieg tej funkcji np. pomiędzy dwoma sygnałami, wprowadzono wersję znormalizowaną tej funkcji &amp;amp;mdash; ''funkcję autokorelacji''. Normalizacja ta wygląda następująco:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid84&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\rho (k) = \frac{\gamma (\tau )}{\sigma^2}&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(6)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid85&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\sigma ^2 = \mathrm{E}[(x(t)-\mu )^2]&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(7)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wariancję sygnału (&amp;lt;math&amp;gt;\gamma (0)=\sigma ^2&amp;lt;/math&amp;gt;) można wyrazić przez funkcję autokowariancji dla przesunięcia &amp;lt;math&amp;gt;\tau =0&amp;lt;/math&amp;gt;.  Wynika z tego, że funkcja korelacji przyjmuje wartości z zakresu [&amp;amp;minus;1,&amp;amp;nbsp;1]. Ostatecznie estymator funkcji autokorelacji można zapisać jak poniżej:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid86&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\rho(k) = \frac{\gamma (k)}{\gamma (0)}&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(8)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcję autokorelacji estymuje się w celu określenia, w jakim stopniu wartości sygnału w danej chwili czasu wpływają na wartości sygnału w kolejnych chwilach czasu. Ma to kluczowe znaczenie przy rozpoznawaniu rodzaju procesów fizycznych odpowiedzialnego za generowanie sygnału. Funkcja ta zawsze mam maksimum dla przesunięcia &amp;lt;math&amp;gt;\tau =0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cechą charakterystyczną funkcji autokorelacji jest to, iż w przypadku sygnałów harmonicznych, przebieg funkcji ma charakter okresowy, z okresem takim samym jak okres badanego sygnału. W przypadku szumu, funkcja autokorelacji ma kształt funkcji delta Diraca.&lt;br /&gt;
&lt;br /&gt;
==Polecenie:==&lt;br /&gt;
Do policzenia funkcji autokorelacji posłużymy się funkcją biblioteczną &amp;lt;tt&amp;gt;numpy.correlate&amp;lt;/tt&amp;gt;. Funkcja ta, wbrew nazwie, oblicza wyłącznie splot swoich dwóch pierwszych argumentów wywołania. Musimy je więc przystosować do obliczenia wielkości zgodnie ze wzorem (4).&lt;br /&gt;
&lt;br /&gt;
Zaimplementuj funkcję do obliczania funkcji korelacji zgodnie ze wzorem (&amp;lt;xr id=&amp;quot;uid82&amp;quot;&amp;gt;)&amp;lt;/xr&amp;gt;. Funkcja powinna przyjmować jako parametry dwa wektory&amp;lt;!--i maksymalne przesunięcie wzajemne tych wektorów--&amp;gt;, a zwracać wektor zawierający ich funkcję autokorelacji. &lt;br /&gt;
&lt;br /&gt;
Wywołanie przykładowe:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
print koreluj(a,a)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
powinno dać wynik:&lt;br /&gt;
 [-0.5  0.   1.   0.  -0.5]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
# Średnia&lt;br /&gt;
mean = numpy.mean(data)&lt;br /&gt;
mean2 = numpy.mean(data2)&lt;br /&gt;
&lt;br /&gt;
# Wariancja&lt;br /&gt;
var = numpy.var(data)&lt;br /&gt;
var2 = numpy.var(data2)&lt;br /&gt;
&lt;br /&gt;
# Dane po odjęciu średnich&lt;br /&gt;
ndata = data - mean&lt;br /&gt;
ndata2 = data2 - mean2&lt;br /&gt;
&lt;br /&gt;
# Splot&lt;br /&gt;
acorr = numpy.correlate(ndata, ndata2, 'full')&lt;br /&gt;
&lt;br /&gt;
# Normalizacja kowariancji do korelacji i przez 1/N&lt;br /&gt;
acorr = acorr / numpy.sqrt(var*var2) / len(ndata)&lt;br /&gt;
&lt;br /&gt;
print(acorr)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{{hidden begin|title=Przykładowe rozwiązanie:}}--&amp;gt;&lt;br /&gt;
 &amp;lt;!-- &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
def koreluj_pol(x,y,max_tau):&lt;br /&gt;
    x = x - np.mean(x)&lt;br /&gt;
    y = y - np.mean(y)&lt;br /&gt;
    N= len(x)&lt;br /&gt;
    cor = np.zeros(max_tau+1)&lt;br /&gt;
    cor[0] = np.sum(x[:]*y[:]) &lt;br /&gt;
    for i in range(1,max_tau+1):&lt;br /&gt;
        cor[i] = np.sum(x[i:]*y[:-i])&lt;br /&gt;
        &lt;br /&gt;
    cor = cor /(N-1)&lt;br /&gt;
    return cor&lt;br /&gt;
&lt;br /&gt;
def koreluj(x,y,max_tau):&lt;br /&gt;
    cor = np.zeros(2*max_tau+1)    &lt;br /&gt;
    cor[max_tau:] = koreluj_pol(x,y,max_tau)&lt;br /&gt;
    tmp = koreluj_pol(y,x,max_tau)&lt;br /&gt;
    cor[:max_tau+1] = tmp[-1::-1]&lt;br /&gt;
    return cor    &lt;br /&gt;
    &lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    print koreluj(a,a,i)&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
b = np.array([-1,-2,-3])&lt;br /&gt;
&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    print koreluj(a,b,i)&lt;br /&gt;
    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zadanie 1: Pomiar sygnału EEG ==&lt;br /&gt;
&lt;br /&gt;
Zarejestruj 10 minut sygnału EEG, w trakcie których badana osoba będzie siedziała z otwartymi oczami oraz kolejne 10 minut w stanie czuwania z zamkniętymi oczami. Rejestrację należy wykonać na pełnym czepku 10-20 z częstością próbkowania 128 Hz. &lt;br /&gt;
&lt;br /&gt;
==Zadanie 2:  Funkcje autokowariancji i autokorelacji==&lt;br /&gt;
W tym zadaniu posłużymy się sygnałami zarejestrowanymi w punkcie 3. poprzedniego ćwiczenia. Zaobserwuj, na którym kanale rytm alfa osiąga najwyższą wartość. Następnie zaimplementuj w Pythonie następujące kroki:&lt;br /&gt;
&lt;br /&gt;
#	Wczytaj dane z wybranego kanału.&lt;br /&gt;
#	Oblicz funkcję autokorelacji dla sygnału zarejestrowanego w warunkach, gdy osoba badana siedziała z otwartymi oczami. Narysuj autokorelogram, to jest wykres wartości funkcji autokorelacji względem przesunięcia &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt;. Oś &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; wyskaluj w sekundach.&lt;br /&gt;
#	Powtórz krok 2, tym razem dla sygnału zebranego w warunkach czuwania z zamkniętymi oczami.&lt;br /&gt;
#	Porównaj autokorelogramy.&lt;br /&gt;
&lt;br /&gt;
=Związek autokorelacji z widmem sygnału=&lt;br /&gt;
==Wstęp==&lt;br /&gt;
Zgodnie z twierdzeniem Chinczyna, z którym zapoznaliśmy się na wykładzie z [[Twierdzenie_Wienera-Chinczyna|Analizy Sygnałów]], widmową gęstość mocy sygnału można policzyć jako transformatę Fouriera funkcji autokowariancji:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid93&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
S(f) = \int _{-\infty }^{\infty }\gamma (\tau )e^{-2\pi i f \tau}d\tau &amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(9)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	&amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; &amp;amp;mdash; częstość&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	&amp;lt;math&amp;gt;S(f)&amp;lt;/math&amp;gt; &amp;amp;mdash;  gęstość widmowa mocy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Poniższy kod ilustruje to twierdzenie:&lt;br /&gt;
&amp;lt;source lang = py&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
from numpy.fft import rfft,fft,fftfreq,fftshift&lt;br /&gt;
 &lt;br /&gt;
def widmo_mocy(s, Fs):&lt;br /&gt;
    '''Funkcja licąca widmo mocy metodą periodogramu,&lt;br /&gt;
	pobiera sygnał i częstość próbkowania&lt;br /&gt;
	zwraca widmo mocy i oś częstości&lt;br /&gt;
    '''&lt;br /&gt;
    S = fft(s)/np.sqrt(len(s))&lt;br /&gt;
    S_moc = S*S.conj()&lt;br /&gt;
    S_moc = S_moc.real&lt;br /&gt;
    F = fftfreq(len(s), 1/Fs)&lt;br /&gt;
    return (fftshift(S_moc),fftshift(F))&lt;br /&gt;
 &lt;br /&gt;
def sin(f = 1, T = 1, Fs = 128, phi =0 ):&lt;br /&gt;
    '''sin o zadanej częstości (w Hz), długości, fazie i częstości próbkowania&lt;br /&gt;
    Domyślnie wytwarzany jest sygnał reprezentujący &lt;br /&gt;
    1 sekundę sinusa o częstości 1Hz i zerowej fazie próbkowanego 128 Hz&lt;br /&gt;
    '''&lt;br /&gt;
    dt = 1.0/Fs&lt;br /&gt;
    t = np.arange(0,T,dt)&lt;br /&gt;
    s = np.sin(2*np.pi*f*t + phi)&lt;br /&gt;
    return (s,t)&lt;br /&gt;
 &lt;br /&gt;
# sygnał próbny będzie próbkowany z częstością FS&lt;br /&gt;
FS = 100.0&lt;br /&gt;
# sygnałem próbnym będzie sinusoida o częstości f &lt;br /&gt;
(s,t) = sin(f=10.5,Fs=FS)&lt;br /&gt;
# obliczamy moc i energię sygnału w dziedzinie czasu&lt;br /&gt;
moc_w_czasie = s**2&lt;br /&gt;
energia_w_czasie = np.sum(moc_w_czasie)&lt;br /&gt;
print 'energia w czasie: ', energia_w_czasie&lt;br /&gt;
 &lt;br /&gt;
# obliczamy widmo mocy sygnału i jego energię estymowaną w dziedzinie częstości&lt;br /&gt;
(moc_w_czestosci, F) = widmo_mocy(s, Fs=FS)&lt;br /&gt;
energia_w_czestosci = np.sum(moc_w_czestosci)&lt;br /&gt;
print 'energia w czestosci: ', energia_w_czestosci&lt;br /&gt;
 &lt;br /&gt;
# estymujemy funkcję autokorelacji sygnału&lt;br /&gt;
ak = 1./(2*len(s)-1)*np.correlate(s,s,'full')&lt;br /&gt;
&lt;br /&gt;
# estymujemy widmo mocy i energię sygnału z twierdzenia Chinczyna korzystając z funkcji fft:&lt;br /&gt;
moc_chi = np.abs(fft(ak))&lt;br /&gt;
energia_chin = sum(moc_chi)&lt;br /&gt;
print 'energia z tw. Chinczyna przez fft: ', energia_chin&lt;br /&gt;
 &lt;br /&gt;
# estymujemy widmo mocy i energię sygnału z twierdzenia Chinczyna korzystając z jawnej postaci transformaty Fouriera:&lt;br /&gt;
FF = np.linspace(-FS/2,FS/2,1000)&lt;br /&gt;
M = np.zeros(len(FF),dtype='complex')&lt;br /&gt;
 &lt;br /&gt;
for i,f in enumerate( FF):&lt;br /&gt;
    for tau in range(len(ak)):&lt;br /&gt;
        M[i] += ak[tau]*np.exp(2*np.pi*1j*f*(len(ak)-tau)/FS) &lt;br /&gt;
M = np.abs(M)&lt;br /&gt;
energia_chin_sum = np.sum(M)* (len(ak)/len(FF))&lt;br /&gt;
print 'energia z tw. Chinczyna przez sumowanie: ', energia_chin_sum&lt;br /&gt;
&lt;br /&gt;
# Rysunki&lt;br /&gt;
py.figure(1)&lt;br /&gt;
py.subplot(3,1,1)&lt;br /&gt;
py.plot(t,s)&lt;br /&gt;
py.title(u'Sygnal')&lt;br /&gt;
py.subplot(3,1,2)&lt;br /&gt;
py.plot(t,moc_w_czasie)&lt;br /&gt;
py.title(u'moc w czasie')&lt;br /&gt;
py.subplot(3,1,3)&lt;br /&gt;
py.plot(F,moc_w_czestosci)&lt;br /&gt;
py.title(u'moc w czestosci')&lt;br /&gt;
 &lt;br /&gt;
py.figure(2)&lt;br /&gt;
py.subplot(3,1,1)&lt;br /&gt;
py.title('f. autokowariancji')&lt;br /&gt;
py.plot(np.arange(-len(ak)/2,len(ak)/2,1)/FS ,ak)&lt;br /&gt;
py.subplot(3,1,2)&lt;br /&gt;
py.plot(fftshift(fftfreq(len(moc_chi),1./FS)),fftshift(moc_chi))&lt;br /&gt;
py.title('widmo mocy z Tw. Chinczyna przez fft')&lt;br /&gt;
py.subplot(3,1,3)&lt;br /&gt;
py.plot(FF,M)&lt;br /&gt;
py.title('widmo mocy z Tw. Chinczyna przez sumowanie')&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W wyniku powinniśmy zobaczyć w terminalu:&lt;br /&gt;
 energia w czasie:  50.0&lt;br /&gt;
 energia w czestosci:  50.0&lt;br /&gt;
 energia z tw. Chinczyna przez fft:  50.0&lt;br /&gt;
 energia z tw. Chinczyna przez sumowanie:  49.9501172217&lt;br /&gt;
&lt;br /&gt;
oraz powinny pojawić się rysunki:&lt;br /&gt;
[[Plik:Fig_chinczyn1.png|thumb 200 px|center]]&lt;br /&gt;
[[Plik:Fig_chinczyn2.png|thumb 200 px|center]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Polecenie ==&lt;br /&gt;
Zaimplementuj funkcję obliczającą transformację Fouriera dyskretyzując wzór (9) dla zadanego wektora częstości &amp;lt;tt&amp;gt;f&amp;lt;/tt&amp;gt; i zadanej częstości próbkowania sygnału (tutaj: 10).&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Wywołanie przykładowe:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
t= np.arange(0,1,0.1)&lt;br /&gt;
x = np.sin(2*np.pi*2*t)&lt;br /&gt;
f = np.arange(-5,5,1)&lt;br /&gt;
X,f = fourier(x,f,10.0)&lt;br /&gt;
print X&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Natomiast wywołanie:&lt;br /&gt;
&amp;lt;source lang ='python'&amp;gt;&lt;br /&gt;
t= np.arange(0,1,0.1)&lt;br /&gt;
x = np.sin(2*np.pi*2*t)&lt;br /&gt;
f = np.arange(-5,5,0.01)&lt;br /&gt;
X = fourier(x,f,10.0)&lt;br /&gt;
py.plot(f,np.abs(X))&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Powinno wytworzyć rysunek:&lt;br /&gt;
&lt;br /&gt;
[[Plik:Fourier_test.png]] &lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
import numpy as np&lt;br /&gt;
import pylab as py&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def koreluj_pol(x,y,max_tau):&lt;br /&gt;
    x = x - np.mean(x)&lt;br /&gt;
    y = y - np.mean(y)&lt;br /&gt;
    N= len(x)&lt;br /&gt;
    cor = np.zeros(max_tau+1)&lt;br /&gt;
    cor[0] = np.sum(x[:]*y[:]) &lt;br /&gt;
    for i in range(1,max_tau+1):&lt;br /&gt;
        cor[i] = np.sum(x[i:]*y[:-i])&lt;br /&gt;
        &lt;br /&gt;
    cor = cor /(N)&lt;br /&gt;
    return cor&lt;br /&gt;
&lt;br /&gt;
def koreluj(x,y,max_tau):&lt;br /&gt;
    cor = np.zeros(2*max_tau+1)    &lt;br /&gt;
    cor[max_tau:] = koreluj_pol(x,y,max_tau)&lt;br /&gt;
    tmp = koreluj_pol(y,x,max_tau)&lt;br /&gt;
    cor[:max_tau+1] = tmp[-1::-1]&lt;br /&gt;
    return cor  &lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
def fourier_chin(x, FF, FS):&lt;br /&gt;
    ak = koreluj(x,x,len(x)-1)&lt;br /&gt;
    M = np.zeros(len(FF),dtype='complex') &lt;br /&gt;
    for i,f in enumerate( FF):&lt;br /&gt;
        for tau in range(len(ak)):&lt;br /&gt;
	    M[i] += ak[tau]*np.exp(-2*np.pi*1j*f*( tau- len(x))/FS)&lt;br /&gt;
    #M/=np.sqrt(len(ak))&lt;br /&gt;
    return M&lt;br /&gt;
    &lt;br /&gt;
def fourier(ak, FF, FS):&lt;br /&gt;
   &lt;br /&gt;
    M = np.zeros(len(FF),dtype='complex') &lt;br /&gt;
    for i,f in enumerate( FF):&lt;br /&gt;
        for tau in range(len(ak)):&lt;br /&gt;
	    M[i] += ak[tau]*np.exp(-2*np.pi*1j*f*( tau)/FS)&lt;br /&gt;
    M/=np.sqrt(len(ak))&lt;br /&gt;
    return M&lt;br /&gt;
t= np.arange(0,1,0.05)&lt;br /&gt;
x = np.sin(2*np.pi*2*t)&lt;br /&gt;
f = np.arange(-5,5,0.01)&lt;br /&gt;
&lt;br /&gt;
X = fourier_chin(x,f,10.0)&lt;br /&gt;
Xf = fourier(x,f,10.0)&lt;br /&gt;
print X&lt;br /&gt;
py.plot(f,np.abs(X), f,np.abs(Xf)**2)&lt;br /&gt;
py.show()&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zadanie 3: Związek autokorelacji z widmem sygnału==&lt;br /&gt;
Oblicz gęstość widmową mocy sygnału zarejestrowanego w trakcie czuwania z zamkniętymi oczami, korzystając z twierdzenia Chinczyna oraz [[Nieparametryczne_widmo_mocy#Metoda_Welcha | metodą Welcha]].&lt;br /&gt;
Znajdź częstość rytmu &amp;amp;alpha; dla osoby, która była badana.&lt;br /&gt;
&lt;br /&gt;
==Funkcja kowariancji (wzajemnej)==&lt;br /&gt;
&lt;br /&gt;
W celu scharakteryzowania zależności wzajemnej dwóch sygnałów losowych, stosuje się funkcję kowariancji, zdefiniowaną w następujący sposób:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid98&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy} (\tau ) = \mathrm{cov}(x(t),y(t-\tau ))=\mathrm{E}[(x(t)-\mu _x)(y(t-\tau )-\mu _y)]&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid99&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\mu _x = \mathrm{E}[x(t)]\\&lt;br /&gt;
\mu _y = \mathrm{E}[y(t)]\\ \end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W przypadku sygnałów ciągłych estymatę tę można zapisać w poniższy sposób:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid100&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy} (\tau ) = \frac{1}{T}\int _0^{T}(x(t)-\mu_x)(y(t-\tau)-\mu_y)dt&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
natomiast dla sygnałów dyskretnych jako:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid101&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy}(k) = \frac{1}{N-1}\sum _{i=0}^{N-k}(x(i+k)-x_s)(y(i)-y_s)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W odróżnieniu od funkcji autokowariancji, funkcja kowariancji nie musi mieć maksimum dla przesunięcia &amp;lt;math&amp;gt;\tau =0&amp;lt;/math&amp;gt;. Ponadto posiada ona następującą cechę:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid102&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy}(-\tau ) = \gamma _{yx}(\tau )&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcję kowariancji można znormalizować:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid103&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\rho (\tau) = \frac{\mathrm{E}[(x(t)-\mu _x)(y(t-\tau )-\mu _y)]}{\sqrt{\mathrm{E}[(x(t)-\mu _x)^2]\mathrm{E}[(y(t)-\mu _y)^2]}} = \frac{\gamma _{xy}}{\sigma_x\sigma_y}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
Otrzymaną funkcję nazywamy funkcją korelacji.&lt;br /&gt;
Jednym z zastosowań funkcji korelacji jest wyznaczanie czasu przejścia sygnału przez dany układ liniowy. Funkcja korelacji pomiędzy sygnałem na wejściu układu i sygnałem na jego wyjściu osiągnie wartość maksymalną dla przesunięcia &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; równego czasowi, jaki potrzebował sygnał na pokonanie danego układu. Niestety, taka metoda wyznaczania opóźnienia obarczona jest pewną wadą &amp;amp;mdash; w przypadku gdy prędkość sygnału bądź jego droga zależą od częstości, wtedy na wykresie funkcji korelacji nie uzyskamy wyraźnego maksimum.&lt;br /&gt;
&lt;br /&gt;
=====Polecenie =====&lt;br /&gt;
Zaimplementuj funkcję obliczającą funkcję kowariancji dla różnych sygnałów ''x'' i ''y'' (równanie 13) skorzystaj przy tym z własności opisanej równaniem (14). &lt;br /&gt;
Przykładowe wywołanie:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
b = np.array([-1,-2,-3])&lt;br /&gt;
&lt;br /&gt;
print koreluj(a,b)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
powinno dać w wyniku:&lt;br /&gt;
 [ 0.5 0.  -1.   0.   0.5]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
{{hidden begin|title=Przykładowe rozwiązanie:}}&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import pylab as py&lt;br /&gt;
&lt;br /&gt;
def koreluj(x,y,max_tau):&lt;br /&gt;
    x = x - np.mean(x)&lt;br /&gt;
    y = y - np.mean(y)&lt;br /&gt;
    cor = np.zeros(2*max_tau+1)&lt;br /&gt;
    cor[max_tau] = np.sum(x[:]*y[:]) &lt;br /&gt;
    for i in range(1,max_tau+1):&lt;br /&gt;
        cor[max_tau+i] = np.sum(x[i:]*y[:-i])&lt;br /&gt;
        cor[max_tau-i] = np.sum(y[i:]*x[:-i])&lt;br /&gt;
    N= len(x)&lt;br /&gt;
    cor = cor /(N-1)&lt;br /&gt;
    return cor&lt;br /&gt;
&lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
b = np.array([-1,-2,-3])&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    print koreluj(a,b,i)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}} --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadanie 4===&lt;br /&gt;
Z danych zarejestrowanych w trakcie czuwania z zamkniętymi oczami wybierz sygnały z następujących kanałów: Fp1, P3, Pz, P4, Fp2, O1, O2.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Dla każdego kanału oblicz funkcję autokorelacji, zaś  dla każdej pary kanałów oblicz funkcję korelacji wzajemnej. Wyniki zaprezentuj w formie kwadratowej macierzy wykresów (za pomocą funkcji subplot, tak jak na przykładowym rys. (rys. &amp;lt;xr id=&amp;quot;uid9&amp;quot;&amp;gt; %i&amp;lt;/xr&amp;gt;)). Na przekątnej macierzy narysuj funkcję autokorelacji odpowiednich kanałów, poza przekątną &amp;amp;mdash; funkcję korelacji wzajemnej. Wskaż kanały, które są najbardziej skorelowane ze sobą. Czy możliwe jest wyznaczenie opóźnienia sygnału pomiędzy tymi kanałami?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Powtórz punkt 1, tym razem jednak funkcję autokorelacji i korelacji wzajemnej oblicz na sygnałach przefiltrowanych filtrem wąskopasmowym w paśmie alfa charakterystycznym dla badanej osoby. ([[%C4%86wiczenia_7#Funkcje_do_projektowania_filtr.C3.B3w_IIR_dost.C4.99pne_w_module_scipy.signal|przypomnienie konstrukcji filtrów]])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Oszacuj istotność statystyczną zależności między parami kanałów. Twoją hipotezą zerową jest brak istotnej korelacji pomiędzy sygnałami zarejestrowanymi przez dwie różne elektrody EEG. Hipoteza alternatywna to występowanie zależności pomiędzy tymi sygnałami. Podanie estymatorów wariancji funkcji korelacji jest bardzo trudne, dlatego jednym ze sposobów oszacowania progu powyżej którego wartość funkcji korelacji można byłoby uznać za istotną statystycznie, jest zastosowanie metody ''bootstrap''. Teoretycznie, funkcja korelacji policzona dla dwóch rzeczywistych, nieskorelowanych sygnałów, powinna wynosić 0 dla każdego przesunięcia &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt;. Tak jest jednak w przypadku sygnałów nieskończonych; w analizie sygnałów takowych nie spotkamy.&lt;br /&gt;
&lt;br /&gt;
Dokonując losowej zamiany kolejności próbek, możemy doprowadzić do wytworzenia sygnałów zależnych losowo, które jednak ze względu na skończony czas trwania, dadzą niezerową funkcję korelacji. Poziom losowych fluktuacji tej funkcji oszacujemy wykonując następujące kroki:&lt;br /&gt;
&amp;lt;ol type=&amp;quot;A&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Losowa zamiana kolejności próbek w analizowanych sygnałach. Jeżeli pomiędzy dwoma sygnałami istnieją jakieś zależności, losowa zamiana próbek doprowadzi do zniszczenia tych związków. W ten sposób uzyskujemy sygnały, które teoretycznie są nieskorelowane.&lt;br /&gt;
&amp;lt;li&amp;gt; Obliczenie funkcji  korelacji wzajemnej dla sygnałów policzonych w punkcie A.&lt;br /&gt;
&amp;lt;li&amp;gt; Powtórzenie kroków A i B wiele (np. 1000) razy.&lt;br /&gt;
&amp;lt;li&amp;gt; Oszacowanie 95% przedziału ufności dla wartości średniej funkcji korelacji wzajemnej dla danego przesunięcia &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; korzystając z otrzymanego w kroku C empirycznego rozkładu wartości tych funkcji dla sygnałów niezależnych.  &lt;br /&gt;
&amp;lt;li&amp;gt; Powtórzenie kroków A-D dla kolejnych przesunięć &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;li&amp;gt; Sprawdzenie, dla których przesunięć &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; funkcje autokorelacji i korelacji obliczone dla oryginalnych sygnałów uzyskały wartości wyższe niż wartości progowe oszacowane dla sygnałów o losowych zależnościach.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Procedura opisana powyżej ma jednak '''zasadniczą wadę'''. Staramy się w niej oszacować poziom przypadkowych korelacji pomiędzy dwoma sygnałami dla kolejnych przesunięć &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt;, co jest niczym innym jak wielokrotnym powtórzeniem pewnego testu. Obserwowanie korelacji dla wielu par kanałów równocześnie również prowadzi do zwiększenia szansy na zaobserwowanie ekstremalnie dużych fluktuacji.&lt;br /&gt;
Występuje tu zatem ''problem wielokrotnych porównań''.&lt;br /&gt;
Przypominamy, iż może to doprowadzić do przypadkowego uznania wyników jako &amp;amp;bdquo;istotnych&amp;amp;rdquo; statystycznie. Np. jeśli pojedynczy test wykonujemy na poziomie istotności 5% to dopuszczamy odrzucenie w 1 przypadku na 20 hipotezy zerowej pomimo, iż jest ona prawdziwa. Z drugiej jednak strony, jeśli powtórzymy wykonywany test 20 razy, to oczekujemy uzyskania 1 przypadku, w którym poziom ''p'' będzie mniejszy od 5% co jest przesłanką za odrzuceniem hipotezy zerowej. &lt;br /&gt;
&lt;br /&gt;
W przypadku wykonywania serii testów należałoby więc zastosować odpowiednie poprawki, np. [http://www.bmj.com/content/310/6973/170.full korektę Bonferroniego] czy [http://en.wikipedia.org/wiki/False_discovery_rate false discovery rate (FDR)]. Innym rozwiązaniem w analizowanym przez nas problemie jest zastosowanie tzw. statystyk wartości ekstremalnych, które prowadzą do następujących zmian w procedurze:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol type=&amp;quot;A&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;	Losowa zmiana kolejności próbek w analizowanych sygnałach (we wszystkich analizowanych kanałach). Jeżeli pomiędzy dwoma sygnałami istnieją jakieś zależności, losowa zamiana próbek doprowadzi do zniszczenia tych związków. W ten sposób uzyskujemy sygnały, które teoretycznie są nieskorelowane.&lt;br /&gt;
&amp;lt;li&amp;gt;	Obliczenie funkcji korelacji dla sygnałów otrzymanych w punkcie A.&lt;br /&gt;
&amp;lt;li&amp;gt;    Zapamiętanie maksymalnej wartości bezwzględnej funkcji korelacji z punktu B (maksimum bierzemy po wszystkich przesunięciach i po wszystkich parach kanałów; dla funkcji autokorelacji, ze względu na jej normalizację do 1 dla zerowego przesunięcia, tam maksymalnych wartości poszukujemy dla przesunięć innych niż 0).&lt;br /&gt;
&amp;lt;li&amp;gt;	Powtórzenie kroków A-C 1000 razy. Uzyskamy w ten sposób rozkład maksymalnych wartości funkcji korelacji możliwych do zaobserwowania dla sygnałów niezależnych.&lt;br /&gt;
&amp;lt;li&amp;gt;    Wyznaczenie 95 centyla rozkładu wartości maksymalnych.&lt;br /&gt;
&amp;lt;li&amp;gt;	Nałożenie na rysunki funkcji korelacji uzyskane w Zadaniu 2 poziomych linii symbolizujących poziom zależności dwóch sygnałów o losowych zależnościach i sprawdzenie, dla których przesunięć &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; wartości funkcji korelacji przekraczają estymowane progi istotności statystycznej.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Plik:Korelacje_wzajemne.png|700px|center|thumb|&amp;lt;figure id=&amp;quot;uid9&amp;quot; /&amp;gt;Przykład wyniku analizy korelacji wzajemnych dla sygnału niefiltrowanego z naniesionymi granicami możliwych fluktuacji.]]&lt;br /&gt;
&lt;br /&gt;
==Wzajemna gęstość widmowa sygnałów==&lt;br /&gt;
&lt;br /&gt;
Podobnie jak w przypadku twierdzenia Chinczyna dla pojedynczego sygnału, możliwe jest policzenie transformaty Fouriera funkcji kowariancji. Uzyskana w ten sposób wielkość nazywa się funkcją wzajemnej gęstości mocy widmowej sygnału:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid122&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
S_{xy}(f) = \int _{-\infty }^{\infty }\gamma_{xy}(\tau )e^{-2\pi i f \tau}d\tau &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W celu dalszego omówienia własności funkcji wzajemnej mocy widmowej sygnałów funkcję tę zapiszemy w postaci:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid123&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
S_{xy}(f) = |S_{xy}(f)|e^{i\phi _{xy}(f)}\\&lt;br /&gt;
\\&lt;br /&gt;
\phi _{xy} = \arg(S_{xy}) &lt;br /&gt;
\end{array} &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&amp;lt;!-- \mathrm{arc\,tg}\left[\frac{\mathrm{Im}(S_{xy}(f))}{\mathrm{Re}(S_{xy}(f))}\right]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wartość bezwzględna funkcji wzajemnej gęstości mocy widmowej osiąga największą wartość dla '''częstości''', w których sygnały &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;y(t)&amp;lt;/math&amp;gt; są ze sobą skorelowane. Funkcja wzajemnej mocy widmowej sygnałów pozbawiona jest zatem wady, która charakteryzowała funkcję korelacji, to jest problemu z wyznaczeniem czasu transmisji sygnału, w przypadku gdy czas ten zależał od częstości. Przy pomocy funkcji wzajemnej mocy widmowej, czas ten można oszacować przy pomocy fazy tej funkcji &amp;amp;mdash; &amp;lt;math&amp;gt;\phi _{xy}(f)&amp;lt;/math&amp;gt;. Jeśli funkcja wzajemnej mocy widmowej została wyznaczona pomiędzy sygnałami na wejściu i wyjściu układu liniowego, to faza ta reprezentuje przesunięcie fazowe sygnału przy przejściu przez układ. Czas tego przejścia można oszacować za pomocą następującej wyrażenia:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid124&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\tau = \frac{\phi _{xy}(f)}{2\pi f}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Podobnie jak w przypadku funkcji autokorelacji i korelacji wzajemnej, funkcję wzajemnej gęstości mocy widmowej można znormalizować:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid125&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
C_{xy}(f) = \frac{S_{xy}(f)}{\sqrt{S_x(f)S_y(f)}}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Znormalizowaną postać funkcji wzajemnej gęstości mocy widmowej nazywamy funkcją ''koherencji''. &lt;br /&gt;
Koherencja jest wielkością zespoloną. Faza koherencji odzwierciedla różnicę faz pomiędzy dwoma sygnałami. Moduł koherencji reprezentuje stopień synchronizacji sygnałów i zawiera się w przedziale od 0.0 do 1.0. Moduł tej funkcji zawiera się w przedziale od 0 do 1. Wartości 0 odpowiada brak synchronizacji pomiędzy sygnałami, zaś wartości 1 pełna synchronizacja dwóch przebiegów czasowych. Należy również zwrócić uwagę na nazewnictwo - często sam moduł koherencji określany jest jako koherencja, w literaturze anglojęzycznej moduł koherencji posiada jednak odrębną nazwę: Magnitude Square Coherence (MSC). Istotny jest również sposób estymacji modułu koherencji, który wyprowadzono w następnym rozdziale, zaś sam estymator reprezentuje wzór (36).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadanie 5===&lt;br /&gt;
Zaimplementuj funkcję obliczającą wzajemną gęstość widmową dla pary kanałów. &lt;br /&gt;
&amp;lt;!--Niech argumentami tej funkcji będą dwa wektory zawierające sygnały, zakres częstości, częstość próbkowania. --&amp;gt;&lt;br /&gt;
Oblicz i narysuj macierz gęstości widmowych (własnych i wzajemnych) dla kolejnych par kanałów (tych samych co w zadaniu 3). Wyniki zaprezentuj w postaci kwadratowej macierzy rysunków. Ponieważ są to funkcje zespolone, dobrze jest zaprezentować osobno ich wartość i fazę. Uzyskane wartości bezwzględne narysuj nad przekątną tej macierzy, a fazę pod przekątną.&lt;br /&gt;
&lt;br /&gt;
===Zadanie 6===&lt;br /&gt;
Przygotuj sygnał dwukanałowy, w którym jako pierwszy sygnał wybierz fragment sygnału EEG (z danych zebranych wcześniej) o długości 2000 próbek, a jako drugiego sygnału użyj tego samego fragmentu EEG, ale opóźnionego o wybraną liczbę (1 - 5) próbek. Oblicz widma wzajemne tych sygnałów i zaprezentuj ich fazy na rysunku. Na podstawie tych widm znajdź wartość przesunięcia czasowego tych sygnałów.&lt;br /&gt;
&lt;br /&gt;
Obliczenia powtórz w przypadku, gdy do drugiego sygnału dodany będzie szum o wariancji równej 0,25 wariancji oryginalnego sygnału.&lt;/div&gt;</summary>
		<author><name>Maciek</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG_2/EEG_wlasno%C5%9Bci_EEG_spoczynkowego&amp;diff=11183</id>
		<title>Pracownia EEG 2/EEG wlasności EEG spoczynkowego</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG_2/EEG_wlasno%C5%9Bci_EEG_spoczynkowego&amp;diff=11183"/>
		<updated>2024-11-22T16:39:14Z</updated>

		<summary type="html">&lt;p&gt;Maciek: /* Polecenie: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Pracownia EEG 2|Pracownia EEG 2]] / Własności EEG spoczynkowego: funkcja autokorelacji i widmo&lt;br /&gt;
&lt;br /&gt;
=Estymacja funkcji autokowariancji, autokorelacji i koherencji sygnału.=&lt;br /&gt;
==Wstęp==&lt;br /&gt;
Z funkcjami tymi spotkaliśmy się już na zajęciach z [[Ćwiczenia_4|analizy sygnałów]].&lt;br /&gt;
&lt;br /&gt;
Funkcja autokowariancji sygnału charakteryzuje liniową zależność wartości tego sygnału w danej określonej chwili czasu od wartości (tego samego sygnału) w innej chwili.&lt;br /&gt;
W przypadku [[Nieparametryczne_widmo_mocy#Sygna.C5.82y_stochastyczne  | stacjonarnych procesów stochastycznych]], przebieg tej funkcji nie zależy od czasu. &lt;br /&gt;
Oznacza to, że obliczając funkcję autokorelacji sygnału pomiędzy chwilą czasu &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;x(t+\tau )&amp;lt;/math&amp;gt; otrzymamy tę samą wartość, jak dla przypadku obliczania funkcji autokorelacji pomiędzy momentami &amp;lt;math&amp;gt;x(t + T)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;x(t + T+\tau )&amp;lt;/math&amp;gt;, gdzie &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; to dowolny przedział czasu. Innymi słowy, funkcja autokorelacji procesu stacjonarnego zależy tylko od odstępu czasu pomiędzy próbkami &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt;, dla którego jest wyznaczana, a nie od konkretnej chwili czasu. Odrębną klasę sygnałów stanowią procesy niestacjonarne, w przypadku których funkcja autokorelacji będzie zależeć od czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; w którym jest obliczana. Estymator funkcji autokowariancji uzyskuje się poprzez obliczanie iloczynów wartości sygnału &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; w chwilach czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; czyli &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; i wartości sygnału &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; w chwili czasu ''t''+&amp;amp;tau; czyli &amp;lt;math&amp;gt;x(t+\tau)&amp;lt;/math&amp;gt; i uśredniając wartości iloczynów po czasie &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid79&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma (\tau) = \mathrm{cov}(x(t),x(t-\tau ))=\mathrm{E}[(x(t)-\mu )(x(t-\tau )-\mu )]&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(1)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid80&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\mu = \mathrm{E}[x(t)]&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(2)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W przypadku sygnałów ciągłych estymatę tę można zapisać w poniższy sposób:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid81&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma (\tau ) = \frac{1}{T}\int _0^{T}(x(t)-\mu )(x(t-\tau )-\mu )dt&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(3)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
natomiast dla sygnałów dyskretnych jako:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid82&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma (k) = \frac{1}{N-1}\sum _{i=1}^{N-|k|}(x(i+k)-x_s)(x(i)-x_s)&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(4)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid83&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
x_s = \frac{\sum _{i=1}^{N}x(i)}{N}&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(5)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcja autokowariancji może osiągać dowolne wartości, dlatego aby można było porównać przebieg tej funkcji np. pomiędzy dwoma sygnałami, wprowadzono wersję znormalizowaną tej funkcji &amp;amp;mdash; ''funkcję autokorelacji''. Normalizacja ta wygląda następująco:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid84&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\rho (k) = \frac{\gamma (\tau )}{\sigma^2}&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(6)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid85&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\sigma ^2 = \mathrm{E}[(x(t)-\mu )^2]&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(7)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wariancję sygnału (&amp;lt;math&amp;gt;\gamma (0)=\sigma ^2&amp;lt;/math&amp;gt;) można wyrazić przez funkcję autokowariancji dla przesunięcia &amp;lt;math&amp;gt;\tau =0&amp;lt;/math&amp;gt;.  Wynika z tego, że funkcja korelacji przyjmuje wartości z zakresu [&amp;amp;minus;1,&amp;amp;nbsp;1]. Ostatecznie estymator funkcji autokorelacji można zapisać jak poniżej:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid86&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\rho(k) = \frac{\gamma (k)}{\gamma (0)}&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(8)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcję autokorelacji estymuje się w celu określenia, w jakim stopniu wartości sygnału w danej chwili czasu wpływają na wartości sygnału w kolejnych chwilach czasu. Ma to kluczowe znaczenie przy rozpoznawaniu rodzaju procesów fizycznych odpowiedzialnego za generowanie sygnału. Funkcja ta zawsze mam maksimum dla przesunięcia &amp;lt;math&amp;gt;\tau =0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cechą charakterystyczną funkcji autokorelacji jest to, iż w przypadku sygnałów harmonicznych, przebieg funkcji ma charakter okresowy, z okresem takim samym jak okres badanego sygnału. W przypadku szumu, funkcja autokorelacji ma kształt funkcji delta Diraca.&lt;br /&gt;
&lt;br /&gt;
==Polecenie:==&lt;br /&gt;
Do policzenia funkcji autokorelacji posłużymy się funkcją biblioteczną &amp;lt;tt&amp;gt;numpy.correlate&amp;lt;/tt&amp;gt;. Funkcja ta, wbrew nazwie, oblicza wyłącznie splot swoich dwóch pierwszych argumentów wywołania. Musimy je więc przystosować do obliczenia wielkości zgodnie ze wzorem (4).&lt;br /&gt;
&lt;br /&gt;
Zaimplementuj funkcję do obliczania funkcji korelacji zgodnie ze wzorem &amp;lt;xr id=&amp;quot;uid82&amp;quot;&amp;gt;&amp;lt;/xr&amp;gt;(4). Funkcja powinna przyjmować jako parametry dwa wektory&amp;lt;!--i maksymalne przesunięcie wzajemne tych wektorów--&amp;gt;, a zwracać wektor zawierający ich funkcję autokorelacji. &lt;br /&gt;
&lt;br /&gt;
Wywołanie przykładowe:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
print koreluj(a,a)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
powinno dać wynik:&lt;br /&gt;
 [-0.5  0.   1.   0.  -0.5]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
# Średnia&lt;br /&gt;
mean = numpy.mean(data)&lt;br /&gt;
mean2 = numpy.mean(data2)&lt;br /&gt;
&lt;br /&gt;
# Wariancja&lt;br /&gt;
var = numpy.var(data)&lt;br /&gt;
var2 = numpy.var(data2)&lt;br /&gt;
&lt;br /&gt;
# Dane po odjęciu średnich&lt;br /&gt;
ndata = data - mean&lt;br /&gt;
ndata2 = data2 - mean2&lt;br /&gt;
&lt;br /&gt;
# Splot&lt;br /&gt;
acorr = numpy.correlate(ndata, ndata2, 'full')&lt;br /&gt;
&lt;br /&gt;
# Normalizacja kowariancji do korelacji i przez 1/N&lt;br /&gt;
acorr = acorr / numpy.sqrt(var*var2) / len(ndata)&lt;br /&gt;
&lt;br /&gt;
print(acorr)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{{hidden begin|title=Przykładowe rozwiązanie:}}--&amp;gt;&lt;br /&gt;
 &amp;lt;!-- &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
def koreluj_pol(x,y,max_tau):&lt;br /&gt;
    x = x - np.mean(x)&lt;br /&gt;
    y = y - np.mean(y)&lt;br /&gt;
    N= len(x)&lt;br /&gt;
    cor = np.zeros(max_tau+1)&lt;br /&gt;
    cor[0] = np.sum(x[:]*y[:]) &lt;br /&gt;
    for i in range(1,max_tau+1):&lt;br /&gt;
        cor[i] = np.sum(x[i:]*y[:-i])&lt;br /&gt;
        &lt;br /&gt;
    cor = cor /(N-1)&lt;br /&gt;
    return cor&lt;br /&gt;
&lt;br /&gt;
def koreluj(x,y,max_tau):&lt;br /&gt;
    cor = np.zeros(2*max_tau+1)    &lt;br /&gt;
    cor[max_tau:] = koreluj_pol(x,y,max_tau)&lt;br /&gt;
    tmp = koreluj_pol(y,x,max_tau)&lt;br /&gt;
    cor[:max_tau+1] = tmp[-1::-1]&lt;br /&gt;
    return cor    &lt;br /&gt;
    &lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    print koreluj(a,a,i)&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
b = np.array([-1,-2,-3])&lt;br /&gt;
&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    print koreluj(a,b,i)&lt;br /&gt;
    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zadanie 1: Pomiar sygnału EEG ==&lt;br /&gt;
&lt;br /&gt;
Zarejestruj 10 minut sygnału EEG, w trakcie których badana osoba będzie siedziała z otwartymi oczami oraz kolejne 10 minut w stanie czuwania z zamkniętymi oczami. Rejestrację należy wykonać na pełnym czepku 10-20 z częstością próbkowania 128 Hz. &lt;br /&gt;
&lt;br /&gt;
==Zadanie 2:  Funkcje autokowariancji i autokorelacji==&lt;br /&gt;
W tym zadaniu posłużymy się sygnałami zarejestrowanymi w punkcie 3. poprzedniego ćwiczenia. Zaobserwuj, na którym kanale rytm alfa osiąga najwyższą wartość. Następnie zaimplementuj w Pythonie następujące kroki:&lt;br /&gt;
&lt;br /&gt;
#	Wczytaj dane z wybranego kanału.&lt;br /&gt;
#	Oblicz funkcję autokorelacji dla sygnału zarejestrowanego w warunkach, gdy osoba badana siedziała z otwartymi oczami. Narysuj autokorelogram, to jest wykres wartości funkcji autokorelacji względem przesunięcia &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt;. Oś &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; wyskaluj w sekundach.&lt;br /&gt;
#	Powtórz krok 2, tym razem dla sygnału zebranego w warunkach czuwania z zamkniętymi oczami.&lt;br /&gt;
#	Porównaj autokorelogramy.&lt;br /&gt;
&lt;br /&gt;
=Związek autokorelacji z widmem sygnału=&lt;br /&gt;
==Wstęp==&lt;br /&gt;
Zgodnie z twierdzeniem Chinczyna, z którym zapoznaliśmy się na wykładzie z [[Twierdzenie_Wienera-Chinczyna|Analizy Sygnałów]], widmową gęstość mocy sygnału można policzyć jako transformatę Fouriera funkcji autokowariancji:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid93&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
S(f) = \int _{-\infty }^{\infty }\gamma (\tau )e^{-2\pi i f \tau}d\tau &amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(9)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	&amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; &amp;amp;mdash; częstość&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	&amp;lt;math&amp;gt;S(f)&amp;lt;/math&amp;gt; &amp;amp;mdash;  gęstość widmowa mocy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Poniższy kod ilustruje to twierdzenie:&lt;br /&gt;
&amp;lt;source lang = py&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
from numpy.fft import rfft,fft,fftfreq,fftshift&lt;br /&gt;
 &lt;br /&gt;
def widmo_mocy(s, Fs):&lt;br /&gt;
    '''Funkcja licąca widmo mocy metodą periodogramu,&lt;br /&gt;
	pobiera sygnał i częstość próbkowania&lt;br /&gt;
	zwraca widmo mocy i oś częstości&lt;br /&gt;
    '''&lt;br /&gt;
    S = fft(s)/np.sqrt(len(s))&lt;br /&gt;
    S_moc = S*S.conj()&lt;br /&gt;
    S_moc = S_moc.real&lt;br /&gt;
    F = fftfreq(len(s), 1/Fs)&lt;br /&gt;
    return (fftshift(S_moc),fftshift(F))&lt;br /&gt;
 &lt;br /&gt;
def sin(f = 1, T = 1, Fs = 128, phi =0 ):&lt;br /&gt;
    '''sin o zadanej częstości (w Hz), długości, fazie i częstości próbkowania&lt;br /&gt;
    Domyślnie wytwarzany jest sygnał reprezentujący &lt;br /&gt;
    1 sekundę sinusa o częstości 1Hz i zerowej fazie próbkowanego 128 Hz&lt;br /&gt;
    '''&lt;br /&gt;
    dt = 1.0/Fs&lt;br /&gt;
    t = np.arange(0,T,dt)&lt;br /&gt;
    s = np.sin(2*np.pi*f*t + phi)&lt;br /&gt;
    return (s,t)&lt;br /&gt;
 &lt;br /&gt;
# sygnał próbny będzie próbkowany z częstością FS&lt;br /&gt;
FS = 100.0&lt;br /&gt;
# sygnałem próbnym będzie sinusoida o częstości f &lt;br /&gt;
(s,t) = sin(f=10.5,Fs=FS)&lt;br /&gt;
# obliczamy moc i energię sygnału w dziedzinie czasu&lt;br /&gt;
moc_w_czasie = s**2&lt;br /&gt;
energia_w_czasie = np.sum(moc_w_czasie)&lt;br /&gt;
print 'energia w czasie: ', energia_w_czasie&lt;br /&gt;
 &lt;br /&gt;
# obliczamy widmo mocy sygnału i jego energię estymowaną w dziedzinie częstości&lt;br /&gt;
(moc_w_czestosci, F) = widmo_mocy(s, Fs=FS)&lt;br /&gt;
energia_w_czestosci = np.sum(moc_w_czestosci)&lt;br /&gt;
print 'energia w czestosci: ', energia_w_czestosci&lt;br /&gt;
 &lt;br /&gt;
# estymujemy funkcję autokorelacji sygnału&lt;br /&gt;
ak = 1./(2*len(s)-1)*np.correlate(s,s,'full')&lt;br /&gt;
&lt;br /&gt;
# estymujemy widmo mocy i energię sygnału z twierdzenia Chinczyna korzystając z funkcji fft:&lt;br /&gt;
moc_chi = np.abs(fft(ak))&lt;br /&gt;
energia_chin = sum(moc_chi)&lt;br /&gt;
print 'energia z tw. Chinczyna przez fft: ', energia_chin&lt;br /&gt;
 &lt;br /&gt;
# estymujemy widmo mocy i energię sygnału z twierdzenia Chinczyna korzystając z jawnej postaci transformaty Fouriera:&lt;br /&gt;
FF = np.linspace(-FS/2,FS/2,1000)&lt;br /&gt;
M = np.zeros(len(FF),dtype='complex')&lt;br /&gt;
 &lt;br /&gt;
for i,f in enumerate( FF):&lt;br /&gt;
    for tau in range(len(ak)):&lt;br /&gt;
        M[i] += ak[tau]*np.exp(2*np.pi*1j*f*(len(ak)-tau)/FS) &lt;br /&gt;
M = np.abs(M)&lt;br /&gt;
energia_chin_sum = np.sum(M)* (len(ak)/len(FF))&lt;br /&gt;
print 'energia z tw. Chinczyna przez sumowanie: ', energia_chin_sum&lt;br /&gt;
&lt;br /&gt;
# Rysunki&lt;br /&gt;
py.figure(1)&lt;br /&gt;
py.subplot(3,1,1)&lt;br /&gt;
py.plot(t,s)&lt;br /&gt;
py.title(u'Sygnal')&lt;br /&gt;
py.subplot(3,1,2)&lt;br /&gt;
py.plot(t,moc_w_czasie)&lt;br /&gt;
py.title(u'moc w czasie')&lt;br /&gt;
py.subplot(3,1,3)&lt;br /&gt;
py.plot(F,moc_w_czestosci)&lt;br /&gt;
py.title(u'moc w czestosci')&lt;br /&gt;
 &lt;br /&gt;
py.figure(2)&lt;br /&gt;
py.subplot(3,1,1)&lt;br /&gt;
py.title('f. autokowariancji')&lt;br /&gt;
py.plot(np.arange(-len(ak)/2,len(ak)/2,1)/FS ,ak)&lt;br /&gt;
py.subplot(3,1,2)&lt;br /&gt;
py.plot(fftshift(fftfreq(len(moc_chi),1./FS)),fftshift(moc_chi))&lt;br /&gt;
py.title('widmo mocy z Tw. Chinczyna przez fft')&lt;br /&gt;
py.subplot(3,1,3)&lt;br /&gt;
py.plot(FF,M)&lt;br /&gt;
py.title('widmo mocy z Tw. Chinczyna przez sumowanie')&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W wyniku powinniśmy zobaczyć w terminalu:&lt;br /&gt;
 energia w czasie:  50.0&lt;br /&gt;
 energia w czestosci:  50.0&lt;br /&gt;
 energia z tw. Chinczyna przez fft:  50.0&lt;br /&gt;
 energia z tw. Chinczyna przez sumowanie:  49.9501172217&lt;br /&gt;
&lt;br /&gt;
oraz powinny pojawić się rysunki:&lt;br /&gt;
[[Plik:Fig_chinczyn1.png|thumb 200 px|center]]&lt;br /&gt;
[[Plik:Fig_chinczyn2.png|thumb 200 px|center]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Polecenie ==&lt;br /&gt;
Zaimplementuj funkcję obliczającą transformację Fouriera dyskretyzując wzór (9) dla zadanego wektora częstości &amp;lt;tt&amp;gt;f&amp;lt;/tt&amp;gt; i zadanej częstości próbkowania sygnału (tutaj: 10).&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Wywołanie przykładowe:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
t= np.arange(0,1,0.1)&lt;br /&gt;
x = np.sin(2*np.pi*2*t)&lt;br /&gt;
f = np.arange(-5,5,1)&lt;br /&gt;
X,f = fourier(x,f,10.0)&lt;br /&gt;
print X&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Natomiast wywołanie:&lt;br /&gt;
&amp;lt;source lang ='python'&amp;gt;&lt;br /&gt;
t= np.arange(0,1,0.1)&lt;br /&gt;
x = np.sin(2*np.pi*2*t)&lt;br /&gt;
f = np.arange(-5,5,0.01)&lt;br /&gt;
X = fourier(x,f,10.0)&lt;br /&gt;
py.plot(f,np.abs(X))&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Powinno wytworzyć rysunek:&lt;br /&gt;
&lt;br /&gt;
[[Plik:Fourier_test.png]] &lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
import numpy as np&lt;br /&gt;
import pylab as py&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def koreluj_pol(x,y,max_tau):&lt;br /&gt;
    x = x - np.mean(x)&lt;br /&gt;
    y = y - np.mean(y)&lt;br /&gt;
    N= len(x)&lt;br /&gt;
    cor = np.zeros(max_tau+1)&lt;br /&gt;
    cor[0] = np.sum(x[:]*y[:]) &lt;br /&gt;
    for i in range(1,max_tau+1):&lt;br /&gt;
        cor[i] = np.sum(x[i:]*y[:-i])&lt;br /&gt;
        &lt;br /&gt;
    cor = cor /(N)&lt;br /&gt;
    return cor&lt;br /&gt;
&lt;br /&gt;
def koreluj(x,y,max_tau):&lt;br /&gt;
    cor = np.zeros(2*max_tau+1)    &lt;br /&gt;
    cor[max_tau:] = koreluj_pol(x,y,max_tau)&lt;br /&gt;
    tmp = koreluj_pol(y,x,max_tau)&lt;br /&gt;
    cor[:max_tau+1] = tmp[-1::-1]&lt;br /&gt;
    return cor  &lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
def fourier_chin(x, FF, FS):&lt;br /&gt;
    ak = koreluj(x,x,len(x)-1)&lt;br /&gt;
    M = np.zeros(len(FF),dtype='complex') &lt;br /&gt;
    for i,f in enumerate( FF):&lt;br /&gt;
        for tau in range(len(ak)):&lt;br /&gt;
	    M[i] += ak[tau]*np.exp(-2*np.pi*1j*f*( tau- len(x))/FS)&lt;br /&gt;
    #M/=np.sqrt(len(ak))&lt;br /&gt;
    return M&lt;br /&gt;
    &lt;br /&gt;
def fourier(ak, FF, FS):&lt;br /&gt;
   &lt;br /&gt;
    M = np.zeros(len(FF),dtype='complex') &lt;br /&gt;
    for i,f in enumerate( FF):&lt;br /&gt;
        for tau in range(len(ak)):&lt;br /&gt;
	    M[i] += ak[tau]*np.exp(-2*np.pi*1j*f*( tau)/FS)&lt;br /&gt;
    M/=np.sqrt(len(ak))&lt;br /&gt;
    return M&lt;br /&gt;
t= np.arange(0,1,0.05)&lt;br /&gt;
x = np.sin(2*np.pi*2*t)&lt;br /&gt;
f = np.arange(-5,5,0.01)&lt;br /&gt;
&lt;br /&gt;
X = fourier_chin(x,f,10.0)&lt;br /&gt;
Xf = fourier(x,f,10.0)&lt;br /&gt;
print X&lt;br /&gt;
py.plot(f,np.abs(X), f,np.abs(Xf)**2)&lt;br /&gt;
py.show()&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zadanie 3: Związek autokorelacji z widmem sygnału==&lt;br /&gt;
Oblicz gęstość widmową mocy sygnału zarejestrowanego w trakcie czuwania z zamkniętymi oczami, korzystając z twierdzenia Chinczyna oraz [[Nieparametryczne_widmo_mocy#Metoda_Welcha | metodą Welcha]].&lt;br /&gt;
Znajdź częstość rytmu &amp;amp;alpha; dla osoby, która była badana.&lt;br /&gt;
&lt;br /&gt;
==Funkcja kowariancji (wzajemnej)==&lt;br /&gt;
&lt;br /&gt;
W celu scharakteryzowania zależności wzajemnej dwóch sygnałów losowych, stosuje się funkcję kowariancji, zdefiniowaną w następujący sposób:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid98&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy} (\tau ) = \mathrm{cov}(x(t),y(t-\tau ))=\mathrm{E}[(x(t)-\mu _x)(y(t-\tau )-\mu _y)]&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid99&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\mu _x = \mathrm{E}[x(t)]\\&lt;br /&gt;
\mu _y = \mathrm{E}[y(t)]\\ \end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W przypadku sygnałów ciągłych estymatę tę można zapisać w poniższy sposób:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid100&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy} (\tau ) = \frac{1}{T}\int _0^{T}(x(t)-\mu_x)(y(t-\tau)-\mu_y)dt&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
natomiast dla sygnałów dyskretnych jako:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid101&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy}(k) = \frac{1}{N-1}\sum _{i=0}^{N-k}(x(i+k)-x_s)(y(i)-y_s)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W odróżnieniu od funkcji autokowariancji, funkcja kowariancji nie musi mieć maksimum dla przesunięcia &amp;lt;math&amp;gt;\tau =0&amp;lt;/math&amp;gt;. Ponadto posiada ona następującą cechę:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid102&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy}(-\tau ) = \gamma _{yx}(\tau )&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcję kowariancji można znormalizować:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid103&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\rho (\tau) = \frac{\mathrm{E}[(x(t)-\mu _x)(y(t-\tau )-\mu _y)]}{\sqrt{\mathrm{E}[(x(t)-\mu _x)^2]\mathrm{E}[(y(t)-\mu _y)^2]}} = \frac{\gamma _{xy}}{\sigma_x\sigma_y}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
Otrzymaną funkcję nazywamy funkcją korelacji.&lt;br /&gt;
Jednym z zastosowań funkcji korelacji jest wyznaczanie czasu przejścia sygnału przez dany układ liniowy. Funkcja korelacji pomiędzy sygnałem na wejściu układu i sygnałem na jego wyjściu osiągnie wartość maksymalną dla przesunięcia &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; równego czasowi, jaki potrzebował sygnał na pokonanie danego układu. Niestety, taka metoda wyznaczania opóźnienia obarczona jest pewną wadą &amp;amp;mdash; w przypadku gdy prędkość sygnału bądź jego droga zależą od częstości, wtedy na wykresie funkcji korelacji nie uzyskamy wyraźnego maksimum.&lt;br /&gt;
&lt;br /&gt;
=====Polecenie =====&lt;br /&gt;
Zaimplementuj funkcję obliczającą funkcję kowariancji dla różnych sygnałów ''x'' i ''y'' (równanie 13) skorzystaj przy tym z własności opisanej równaniem (14). &lt;br /&gt;
Przykładowe wywołanie:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
b = np.array([-1,-2,-3])&lt;br /&gt;
&lt;br /&gt;
print koreluj(a,b)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
powinno dać w wyniku:&lt;br /&gt;
 [ 0.5 0.  -1.   0.   0.5]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
{{hidden begin|title=Przykładowe rozwiązanie:}}&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import pylab as py&lt;br /&gt;
&lt;br /&gt;
def koreluj(x,y,max_tau):&lt;br /&gt;
    x = x - np.mean(x)&lt;br /&gt;
    y = y - np.mean(y)&lt;br /&gt;
    cor = np.zeros(2*max_tau+1)&lt;br /&gt;
    cor[max_tau] = np.sum(x[:]*y[:]) &lt;br /&gt;
    for i in range(1,max_tau+1):&lt;br /&gt;
        cor[max_tau+i] = np.sum(x[i:]*y[:-i])&lt;br /&gt;
        cor[max_tau-i] = np.sum(y[i:]*x[:-i])&lt;br /&gt;
    N= len(x)&lt;br /&gt;
    cor = cor /(N-1)&lt;br /&gt;
    return cor&lt;br /&gt;
&lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
b = np.array([-1,-2,-3])&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    print koreluj(a,b,i)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}} --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadanie 4===&lt;br /&gt;
Z danych zarejestrowanych w trakcie czuwania z zamkniętymi oczami wybierz sygnały z następujących kanałów: Fp1, P3, Pz, P4, Fp2, O1, O2.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Dla każdego kanału oblicz funkcję autokorelacji, zaś  dla każdej pary kanałów oblicz funkcję korelacji wzajemnej. Wyniki zaprezentuj w formie kwadratowej macierzy wykresów (za pomocą funkcji subplot, tak jak na przykładowym rys. (rys. &amp;lt;xr id=&amp;quot;uid9&amp;quot;&amp;gt; %i&amp;lt;/xr&amp;gt;)). Na przekątnej macierzy narysuj funkcję autokorelacji odpowiednich kanałów, poza przekątną &amp;amp;mdash; funkcję korelacji wzajemnej. Wskaż kanały, które są najbardziej skorelowane ze sobą. Czy możliwe jest wyznaczenie opóźnienia sygnału pomiędzy tymi kanałami?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Powtórz punkt 1, tym razem jednak funkcję autokorelacji i korelacji wzajemnej oblicz na sygnałach przefiltrowanych filtrem wąskopasmowym w paśmie alfa charakterystycznym dla badanej osoby. ([[%C4%86wiczenia_7#Funkcje_do_projektowania_filtr.C3.B3w_IIR_dost.C4.99pne_w_module_scipy.signal|przypomnienie konstrukcji filtrów]])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Oszacuj istotność statystyczną zależności między parami kanałów. Twoją hipotezą zerową jest brak istotnej korelacji pomiędzy sygnałami zarejestrowanymi przez dwie różne elektrody EEG. Hipoteza alternatywna to występowanie zależności pomiędzy tymi sygnałami. Podanie estymatorów wariancji funkcji korelacji jest bardzo trudne, dlatego jednym ze sposobów oszacowania progu powyżej którego wartość funkcji korelacji można byłoby uznać za istotną statystycznie, jest zastosowanie metody ''bootstrap''. Teoretycznie, funkcja korelacji policzona dla dwóch rzeczywistych, nieskorelowanych sygnałów, powinna wynosić 0 dla każdego przesunięcia &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt;. Tak jest jednak w przypadku sygnałów nieskończonych; w analizie sygnałów takowych nie spotkamy.&lt;br /&gt;
&lt;br /&gt;
Dokonując losowej zamiany kolejności próbek, możemy doprowadzić do wytworzenia sygnałów zależnych losowo, które jednak ze względu na skończony czas trwania, dadzą niezerową funkcję korelacji. Poziom losowych fluktuacji tej funkcji oszacujemy wykonując następujące kroki:&lt;br /&gt;
&amp;lt;ol type=&amp;quot;A&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Losowa zamiana kolejności próbek w analizowanych sygnałach. Jeżeli pomiędzy dwoma sygnałami istnieją jakieś zależności, losowa zamiana próbek doprowadzi do zniszczenia tych związków. W ten sposób uzyskujemy sygnały, które teoretycznie są nieskorelowane.&lt;br /&gt;
&amp;lt;li&amp;gt; Obliczenie funkcji  korelacji wzajemnej dla sygnałów policzonych w punkcie A.&lt;br /&gt;
&amp;lt;li&amp;gt; Powtórzenie kroków A i B wiele (np. 1000) razy.&lt;br /&gt;
&amp;lt;li&amp;gt; Oszacowanie 95% przedziału ufności dla wartości średniej funkcji korelacji wzajemnej dla danego przesunięcia &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; korzystając z otrzymanego w kroku C empirycznego rozkładu wartości tych funkcji dla sygnałów niezależnych.  &lt;br /&gt;
&amp;lt;li&amp;gt; Powtórzenie kroków A-D dla kolejnych przesunięć &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;li&amp;gt; Sprawdzenie, dla których przesunięć &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; funkcje autokorelacji i korelacji obliczone dla oryginalnych sygnałów uzyskały wartości wyższe niż wartości progowe oszacowane dla sygnałów o losowych zależnościach.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Procedura opisana powyżej ma jednak '''zasadniczą wadę'''. Staramy się w niej oszacować poziom przypadkowych korelacji pomiędzy dwoma sygnałami dla kolejnych przesunięć &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt;, co jest niczym innym jak wielokrotnym powtórzeniem pewnego testu. Obserwowanie korelacji dla wielu par kanałów równocześnie również prowadzi do zwiększenia szansy na zaobserwowanie ekstremalnie dużych fluktuacji.&lt;br /&gt;
Występuje tu zatem ''problem wielokrotnych porównań''.&lt;br /&gt;
Przypominamy, iż może to doprowadzić do przypadkowego uznania wyników jako &amp;amp;bdquo;istotnych&amp;amp;rdquo; statystycznie. Np. jeśli pojedynczy test wykonujemy na poziomie istotności 5% to dopuszczamy odrzucenie w 1 przypadku na 20 hipotezy zerowej pomimo, iż jest ona prawdziwa. Z drugiej jednak strony, jeśli powtórzymy wykonywany test 20 razy, to oczekujemy uzyskania 1 przypadku, w którym poziom ''p'' będzie mniejszy od 5% co jest przesłanką za odrzuceniem hipotezy zerowej. &lt;br /&gt;
&lt;br /&gt;
W przypadku wykonywania serii testów należałoby więc zastosować odpowiednie poprawki, np. [http://www.bmj.com/content/310/6973/170.full korektę Bonferroniego] czy [http://en.wikipedia.org/wiki/False_discovery_rate false discovery rate (FDR)]. Innym rozwiązaniem w analizowanym przez nas problemie jest zastosowanie tzw. statystyk wartości ekstremalnych, które prowadzą do następujących zmian w procedurze:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol type=&amp;quot;A&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;	Losowa zmiana kolejności próbek w analizowanych sygnałach (we wszystkich analizowanych kanałach). Jeżeli pomiędzy dwoma sygnałami istnieją jakieś zależności, losowa zamiana próbek doprowadzi do zniszczenia tych związków. W ten sposób uzyskujemy sygnały, które teoretycznie są nieskorelowane.&lt;br /&gt;
&amp;lt;li&amp;gt;	Obliczenie funkcji korelacji dla sygnałów otrzymanych w punkcie A.&lt;br /&gt;
&amp;lt;li&amp;gt;    Zapamiętanie maksymalnej wartości bezwzględnej funkcji korelacji z punktu B (maksimum bierzemy po wszystkich przesunięciach i po wszystkich parach kanałów; dla funkcji autokorelacji, ze względu na jej normalizację do 1 dla zerowego przesunięcia, tam maksymalnych wartości poszukujemy dla przesunięć innych niż 0).&lt;br /&gt;
&amp;lt;li&amp;gt;	Powtórzenie kroków A-C 1000 razy. Uzyskamy w ten sposób rozkład maksymalnych wartości funkcji korelacji możliwych do zaobserwowania dla sygnałów niezależnych.&lt;br /&gt;
&amp;lt;li&amp;gt;    Wyznaczenie 95 centyla rozkładu wartości maksymalnych.&lt;br /&gt;
&amp;lt;li&amp;gt;	Nałożenie na rysunki funkcji korelacji uzyskane w Zadaniu 2 poziomych linii symbolizujących poziom zależności dwóch sygnałów o losowych zależnościach i sprawdzenie, dla których przesunięć &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; wartości funkcji korelacji przekraczają estymowane progi istotności statystycznej.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Plik:Korelacje_wzajemne.png|700px|center|thumb|&amp;lt;figure id=&amp;quot;uid9&amp;quot; /&amp;gt;Przykład wyniku analizy korelacji wzajemnych dla sygnału niefiltrowanego z naniesionymi granicami możliwych fluktuacji.]]&lt;br /&gt;
&lt;br /&gt;
==Wzajemna gęstość widmowa sygnałów==&lt;br /&gt;
&lt;br /&gt;
Podobnie jak w przypadku twierdzenia Chinczyna dla pojedynczego sygnału, możliwe jest policzenie transformaty Fouriera funkcji kowariancji. Uzyskana w ten sposób wielkość nazywa się funkcją wzajemnej gęstości mocy widmowej sygnału:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid122&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
S_{xy}(f) = \int _{-\infty }^{\infty }\gamma_{xy}(\tau )e^{-2\pi i f \tau}d\tau &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W celu dalszego omówienia własności funkcji wzajemnej mocy widmowej sygnałów funkcję tę zapiszemy w postaci:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid123&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
S_{xy}(f) = |S_{xy}(f)|e^{i\phi _{xy}(f)}\\&lt;br /&gt;
\\&lt;br /&gt;
\phi _{xy} = \arg(S_{xy}) &lt;br /&gt;
\end{array} &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&amp;lt;!-- \mathrm{arc\,tg}\left[\frac{\mathrm{Im}(S_{xy}(f))}{\mathrm{Re}(S_{xy}(f))}\right]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wartość bezwzględna funkcji wzajemnej gęstości mocy widmowej osiąga największą wartość dla '''częstości''', w których sygnały &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;y(t)&amp;lt;/math&amp;gt; są ze sobą skorelowane. Funkcja wzajemnej mocy widmowej sygnałów pozbawiona jest zatem wady, która charakteryzowała funkcję korelacji, to jest problemu z wyznaczeniem czasu transmisji sygnału, w przypadku gdy czas ten zależał od częstości. Przy pomocy funkcji wzajemnej mocy widmowej, czas ten można oszacować przy pomocy fazy tej funkcji &amp;amp;mdash; &amp;lt;math&amp;gt;\phi _{xy}(f)&amp;lt;/math&amp;gt;. Jeśli funkcja wzajemnej mocy widmowej została wyznaczona pomiędzy sygnałami na wejściu i wyjściu układu liniowego, to faza ta reprezentuje przesunięcie fazowe sygnału przy przejściu przez układ. Czas tego przejścia można oszacować za pomocą następującej wyrażenia:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid124&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\tau = \frac{\phi _{xy}(f)}{2\pi f}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Podobnie jak w przypadku funkcji autokorelacji i korelacji wzajemnej, funkcję wzajemnej gęstości mocy widmowej można znormalizować:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid125&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
C_{xy}(f) = \frac{S_{xy}(f)}{\sqrt{S_x(f)S_y(f)}}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Znormalizowaną postać funkcji wzajemnej gęstości mocy widmowej nazywamy funkcją ''koherencji''. &lt;br /&gt;
Koherencja jest wielkością zespoloną. Faza koherencji odzwierciedla różnicę faz pomiędzy dwoma sygnałami. Moduł koherencji reprezentuje stopień synchronizacji sygnałów i zawiera się w przedziale od 0.0 do 1.0. Moduł tej funkcji zawiera się w przedziale od 0 do 1. Wartości 0 odpowiada brak synchronizacji pomiędzy sygnałami, zaś wartości 1 pełna synchronizacja dwóch przebiegów czasowych. Należy również zwrócić uwagę na nazewnictwo - często sam moduł koherencji określany jest jako koherencja, w literaturze anglojęzycznej moduł koherencji posiada jednak odrębną nazwę: Magnitude Square Coherence (MSC). Istotny jest również sposób estymacji modułu koherencji, który wyprowadzono w następnym rozdziale, zaś sam estymator reprezentuje wzór (36).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadanie 5===&lt;br /&gt;
Zaimplementuj funkcję obliczającą wzajemną gęstość widmową dla pary kanałów. &lt;br /&gt;
&amp;lt;!--Niech argumentami tej funkcji będą dwa wektory zawierające sygnały, zakres częstości, częstość próbkowania. --&amp;gt;&lt;br /&gt;
Oblicz i narysuj macierz gęstości widmowych (własnych i wzajemnych) dla kolejnych par kanałów (tych samych co w zadaniu 3). Wyniki zaprezentuj w postaci kwadratowej macierzy rysunków. Ponieważ są to funkcje zespolone, dobrze jest zaprezentować osobno ich wartość i fazę. Uzyskane wartości bezwzględne narysuj nad przekątną tej macierzy, a fazę pod przekątną.&lt;br /&gt;
&lt;br /&gt;
===Zadanie 6===&lt;br /&gt;
Przygotuj sygnał dwukanałowy, w którym jako pierwszy sygnał wybierz fragment sygnału EEG (z danych zebranych wcześniej) o długości 2000 próbek, a jako drugiego sygnału użyj tego samego fragmentu EEG, ale opóźnionego o wybraną liczbę (1 - 5) próbek. Oblicz widma wzajemne tych sygnałów i zaprezentuj ich fazy na rysunku. Na podstawie tych widm znajdź wartość przesunięcia czasowego tych sygnałów.&lt;br /&gt;
&lt;br /&gt;
Obliczenia powtórz w przypadku, gdy do drugiego sygnału dodany będzie szum o wariancji równej 0,25 wariancji oryginalnego sygnału.&lt;/div&gt;</summary>
		<author><name>Maciek</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG_2/EEG_wlasno%C5%9Bci_EEG_spoczynkowego&amp;diff=11182</id>
		<title>Pracownia EEG 2/EEG wlasności EEG spoczynkowego</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG_2/EEG_wlasno%C5%9Bci_EEG_spoczynkowego&amp;diff=11182"/>
		<updated>2024-11-22T16:38:37Z</updated>

		<summary type="html">&lt;p&gt;Maciek: /* Polecenie: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Pracownia EEG 2|Pracownia EEG 2]] / Własności EEG spoczynkowego: funkcja autokorelacji i widmo&lt;br /&gt;
&lt;br /&gt;
=Estymacja funkcji autokowariancji, autokorelacji i koherencji sygnału.=&lt;br /&gt;
==Wstęp==&lt;br /&gt;
Z funkcjami tymi spotkaliśmy się już na zajęciach z [[Ćwiczenia_4|analizy sygnałów]].&lt;br /&gt;
&lt;br /&gt;
Funkcja autokowariancji sygnału charakteryzuje liniową zależność wartości tego sygnału w danej określonej chwili czasu od wartości (tego samego sygnału) w innej chwili.&lt;br /&gt;
W przypadku [[Nieparametryczne_widmo_mocy#Sygna.C5.82y_stochastyczne  | stacjonarnych procesów stochastycznych]], przebieg tej funkcji nie zależy od czasu. &lt;br /&gt;
Oznacza to, że obliczając funkcję autokorelacji sygnału pomiędzy chwilą czasu &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;x(t+\tau )&amp;lt;/math&amp;gt; otrzymamy tę samą wartość, jak dla przypadku obliczania funkcji autokorelacji pomiędzy momentami &amp;lt;math&amp;gt;x(t + T)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;x(t + T+\tau )&amp;lt;/math&amp;gt;, gdzie &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; to dowolny przedział czasu. Innymi słowy, funkcja autokorelacji procesu stacjonarnego zależy tylko od odstępu czasu pomiędzy próbkami &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt;, dla którego jest wyznaczana, a nie od konkretnej chwili czasu. Odrębną klasę sygnałów stanowią procesy niestacjonarne, w przypadku których funkcja autokorelacji będzie zależeć od czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; w którym jest obliczana. Estymator funkcji autokowariancji uzyskuje się poprzez obliczanie iloczynów wartości sygnału &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; w chwilach czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; czyli &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; i wartości sygnału &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; w chwili czasu ''t''+&amp;amp;tau; czyli &amp;lt;math&amp;gt;x(t+\tau)&amp;lt;/math&amp;gt; i uśredniając wartości iloczynów po czasie &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid79&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma (\tau) = \mathrm{cov}(x(t),x(t-\tau ))=\mathrm{E}[(x(t)-\mu )(x(t-\tau )-\mu )]&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(1)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid80&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\mu = \mathrm{E}[x(t)]&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(2)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W przypadku sygnałów ciągłych estymatę tę można zapisać w poniższy sposób:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid81&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma (\tau ) = \frac{1}{T}\int _0^{T}(x(t)-\mu )(x(t-\tau )-\mu )dt&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(3)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
natomiast dla sygnałów dyskretnych jako:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid82&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma (k) = \frac{1}{N-1}\sum _{i=1}^{N-|k|}(x(i+k)-x_s)(x(i)-x_s)&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(4)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid83&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
x_s = \frac{\sum _{i=1}^{N}x(i)}{N}&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(5)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcja autokowariancji może osiągać dowolne wartości, dlatego aby można było porównać przebieg tej funkcji np. pomiędzy dwoma sygnałami, wprowadzono wersję znormalizowaną tej funkcji &amp;amp;mdash; ''funkcję autokorelacji''. Normalizacja ta wygląda następująco:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid84&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\rho (k) = \frac{\gamma (\tau )}{\sigma^2}&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(6)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid85&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\sigma ^2 = \mathrm{E}[(x(t)-\mu )^2]&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(7)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wariancję sygnału (&amp;lt;math&amp;gt;\gamma (0)=\sigma ^2&amp;lt;/math&amp;gt;) można wyrazić przez funkcję autokowariancji dla przesunięcia &amp;lt;math&amp;gt;\tau =0&amp;lt;/math&amp;gt;.  Wynika z tego, że funkcja korelacji przyjmuje wartości z zakresu [&amp;amp;minus;1,&amp;amp;nbsp;1]. Ostatecznie estymator funkcji autokorelacji można zapisać jak poniżej:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid86&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\rho(k) = \frac{\gamma (k)}{\gamma (0)}&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(8)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcję autokorelacji estymuje się w celu określenia, w jakim stopniu wartości sygnału w danej chwili czasu wpływają na wartości sygnału w kolejnych chwilach czasu. Ma to kluczowe znaczenie przy rozpoznawaniu rodzaju procesów fizycznych odpowiedzialnego za generowanie sygnału. Funkcja ta zawsze mam maksimum dla przesunięcia &amp;lt;math&amp;gt;\tau =0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cechą charakterystyczną funkcji autokorelacji jest to, iż w przypadku sygnałów harmonicznych, przebieg funkcji ma charakter okresowy, z okresem takim samym jak okres badanego sygnału. W przypadku szumu, funkcja autokorelacji ma kształt funkcji delta Diraca.&lt;br /&gt;
&lt;br /&gt;
==Polecenie:==&lt;br /&gt;
Do policzenia funkcji autokorelacji posłużymy się funkcją biblioteczną &amp;lt;tt&amp;gt;numpy.correlate&amp;lt;/tt&amp;gt;. Funkcja ta, wbrew nazwie, oblicza wyłącznie splot swoich dwóch pierwszych argumentów wywołania. Musimy je więc przystosować do obliczenia wielkości zgodnie ze wzorem (4).&lt;br /&gt;
&lt;br /&gt;
Zaimplementuj funkcję do obliczania funkcji korelacji zgodnie ze wzorem &amp;lt;xr id=&amp;quot;uid79&amp;quot;&amp;gt;%i&amp;lt;/xr&amp;gt;(4). Funkcja powinna przyjmować jako parametry dwa wektory&amp;lt;!--i maksymalne przesunięcie wzajemne tych wektorów--&amp;gt;, a zwracać wektor zawierający ich funkcję autokorelacji. &lt;br /&gt;
&lt;br /&gt;
Wywołanie przykładowe:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
print koreluj(a,a)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
powinno dać wynik:&lt;br /&gt;
 [-0.5  0.   1.   0.  -0.5]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
# Średnia&lt;br /&gt;
mean = numpy.mean(data)&lt;br /&gt;
mean2 = numpy.mean(data2)&lt;br /&gt;
&lt;br /&gt;
# Wariancja&lt;br /&gt;
var = numpy.var(data)&lt;br /&gt;
var2 = numpy.var(data2)&lt;br /&gt;
&lt;br /&gt;
# Dane po odjęciu średnich&lt;br /&gt;
ndata = data - mean&lt;br /&gt;
ndata2 = data2 - mean2&lt;br /&gt;
&lt;br /&gt;
# Splot&lt;br /&gt;
acorr = numpy.correlate(ndata, ndata2, 'full')&lt;br /&gt;
&lt;br /&gt;
# Normalizacja kowariancji do korelacji i przez 1/N&lt;br /&gt;
acorr = acorr / numpy.sqrt(var*var2) / len(ndata)&lt;br /&gt;
&lt;br /&gt;
print(acorr)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{{hidden begin|title=Przykładowe rozwiązanie:}}--&amp;gt;&lt;br /&gt;
 &amp;lt;!-- &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
def koreluj_pol(x,y,max_tau):&lt;br /&gt;
    x = x - np.mean(x)&lt;br /&gt;
    y = y - np.mean(y)&lt;br /&gt;
    N= len(x)&lt;br /&gt;
    cor = np.zeros(max_tau+1)&lt;br /&gt;
    cor[0] = np.sum(x[:]*y[:]) &lt;br /&gt;
    for i in range(1,max_tau+1):&lt;br /&gt;
        cor[i] = np.sum(x[i:]*y[:-i])&lt;br /&gt;
        &lt;br /&gt;
    cor = cor /(N-1)&lt;br /&gt;
    return cor&lt;br /&gt;
&lt;br /&gt;
def koreluj(x,y,max_tau):&lt;br /&gt;
    cor = np.zeros(2*max_tau+1)    &lt;br /&gt;
    cor[max_tau:] = koreluj_pol(x,y,max_tau)&lt;br /&gt;
    tmp = koreluj_pol(y,x,max_tau)&lt;br /&gt;
    cor[:max_tau+1] = tmp[-1::-1]&lt;br /&gt;
    return cor    &lt;br /&gt;
    &lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    print koreluj(a,a,i)&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
b = np.array([-1,-2,-3])&lt;br /&gt;
&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    print koreluj(a,b,i)&lt;br /&gt;
    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zadanie 1: Pomiar sygnału EEG ==&lt;br /&gt;
&lt;br /&gt;
Zarejestruj 10 minut sygnału EEG, w trakcie których badana osoba będzie siedziała z otwartymi oczami oraz kolejne 10 minut w stanie czuwania z zamkniętymi oczami. Rejestrację należy wykonać na pełnym czepku 10-20 z częstością próbkowania 128 Hz. &lt;br /&gt;
&lt;br /&gt;
==Zadanie 2:  Funkcje autokowariancji i autokorelacji==&lt;br /&gt;
W tym zadaniu posłużymy się sygnałami zarejestrowanymi w punkcie 3. poprzedniego ćwiczenia. Zaobserwuj, na którym kanale rytm alfa osiąga najwyższą wartość. Następnie zaimplementuj w Pythonie następujące kroki:&lt;br /&gt;
&lt;br /&gt;
#	Wczytaj dane z wybranego kanału.&lt;br /&gt;
#	Oblicz funkcję autokorelacji dla sygnału zarejestrowanego w warunkach, gdy osoba badana siedziała z otwartymi oczami. Narysuj autokorelogram, to jest wykres wartości funkcji autokorelacji względem przesunięcia &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt;. Oś &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; wyskaluj w sekundach.&lt;br /&gt;
#	Powtórz krok 2, tym razem dla sygnału zebranego w warunkach czuwania z zamkniętymi oczami.&lt;br /&gt;
#	Porównaj autokorelogramy.&lt;br /&gt;
&lt;br /&gt;
=Związek autokorelacji z widmem sygnału=&lt;br /&gt;
==Wstęp==&lt;br /&gt;
Zgodnie z twierdzeniem Chinczyna, z którym zapoznaliśmy się na wykładzie z [[Twierdzenie_Wienera-Chinczyna|Analizy Sygnałów]], widmową gęstość mocy sygnału można policzyć jako transformatę Fouriera funkcji autokowariancji:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid93&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
S(f) = \int _{-\infty }^{\infty }\gamma (\tau )e^{-2\pi i f \tau}d\tau &amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(9)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	&amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; &amp;amp;mdash; częstość&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	&amp;lt;math&amp;gt;S(f)&amp;lt;/math&amp;gt; &amp;amp;mdash;  gęstość widmowa mocy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Poniższy kod ilustruje to twierdzenie:&lt;br /&gt;
&amp;lt;source lang = py&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
from numpy.fft import rfft,fft,fftfreq,fftshift&lt;br /&gt;
 &lt;br /&gt;
def widmo_mocy(s, Fs):&lt;br /&gt;
    '''Funkcja licąca widmo mocy metodą periodogramu,&lt;br /&gt;
	pobiera sygnał i częstość próbkowania&lt;br /&gt;
	zwraca widmo mocy i oś częstości&lt;br /&gt;
    '''&lt;br /&gt;
    S = fft(s)/np.sqrt(len(s))&lt;br /&gt;
    S_moc = S*S.conj()&lt;br /&gt;
    S_moc = S_moc.real&lt;br /&gt;
    F = fftfreq(len(s), 1/Fs)&lt;br /&gt;
    return (fftshift(S_moc),fftshift(F))&lt;br /&gt;
 &lt;br /&gt;
def sin(f = 1, T = 1, Fs = 128, phi =0 ):&lt;br /&gt;
    '''sin o zadanej częstości (w Hz), długości, fazie i częstości próbkowania&lt;br /&gt;
    Domyślnie wytwarzany jest sygnał reprezentujący &lt;br /&gt;
    1 sekundę sinusa o częstości 1Hz i zerowej fazie próbkowanego 128 Hz&lt;br /&gt;
    '''&lt;br /&gt;
    dt = 1.0/Fs&lt;br /&gt;
    t = np.arange(0,T,dt)&lt;br /&gt;
    s = np.sin(2*np.pi*f*t + phi)&lt;br /&gt;
    return (s,t)&lt;br /&gt;
 &lt;br /&gt;
# sygnał próbny będzie próbkowany z częstością FS&lt;br /&gt;
FS = 100.0&lt;br /&gt;
# sygnałem próbnym będzie sinusoida o częstości f &lt;br /&gt;
(s,t) = sin(f=10.5,Fs=FS)&lt;br /&gt;
# obliczamy moc i energię sygnału w dziedzinie czasu&lt;br /&gt;
moc_w_czasie = s**2&lt;br /&gt;
energia_w_czasie = np.sum(moc_w_czasie)&lt;br /&gt;
print 'energia w czasie: ', energia_w_czasie&lt;br /&gt;
 &lt;br /&gt;
# obliczamy widmo mocy sygnału i jego energię estymowaną w dziedzinie częstości&lt;br /&gt;
(moc_w_czestosci, F) = widmo_mocy(s, Fs=FS)&lt;br /&gt;
energia_w_czestosci = np.sum(moc_w_czestosci)&lt;br /&gt;
print 'energia w czestosci: ', energia_w_czestosci&lt;br /&gt;
 &lt;br /&gt;
# estymujemy funkcję autokorelacji sygnału&lt;br /&gt;
ak = 1./(2*len(s)-1)*np.correlate(s,s,'full')&lt;br /&gt;
&lt;br /&gt;
# estymujemy widmo mocy i energię sygnału z twierdzenia Chinczyna korzystając z funkcji fft:&lt;br /&gt;
moc_chi = np.abs(fft(ak))&lt;br /&gt;
energia_chin = sum(moc_chi)&lt;br /&gt;
print 'energia z tw. Chinczyna przez fft: ', energia_chin&lt;br /&gt;
 &lt;br /&gt;
# estymujemy widmo mocy i energię sygnału z twierdzenia Chinczyna korzystając z jawnej postaci transformaty Fouriera:&lt;br /&gt;
FF = np.linspace(-FS/2,FS/2,1000)&lt;br /&gt;
M = np.zeros(len(FF),dtype='complex')&lt;br /&gt;
 &lt;br /&gt;
for i,f in enumerate( FF):&lt;br /&gt;
    for tau in range(len(ak)):&lt;br /&gt;
        M[i] += ak[tau]*np.exp(2*np.pi*1j*f*(len(ak)-tau)/FS) &lt;br /&gt;
M = np.abs(M)&lt;br /&gt;
energia_chin_sum = np.sum(M)* (len(ak)/len(FF))&lt;br /&gt;
print 'energia z tw. Chinczyna przez sumowanie: ', energia_chin_sum&lt;br /&gt;
&lt;br /&gt;
# Rysunki&lt;br /&gt;
py.figure(1)&lt;br /&gt;
py.subplot(3,1,1)&lt;br /&gt;
py.plot(t,s)&lt;br /&gt;
py.title(u'Sygnal')&lt;br /&gt;
py.subplot(3,1,2)&lt;br /&gt;
py.plot(t,moc_w_czasie)&lt;br /&gt;
py.title(u'moc w czasie')&lt;br /&gt;
py.subplot(3,1,3)&lt;br /&gt;
py.plot(F,moc_w_czestosci)&lt;br /&gt;
py.title(u'moc w czestosci')&lt;br /&gt;
 &lt;br /&gt;
py.figure(2)&lt;br /&gt;
py.subplot(3,1,1)&lt;br /&gt;
py.title('f. autokowariancji')&lt;br /&gt;
py.plot(np.arange(-len(ak)/2,len(ak)/2,1)/FS ,ak)&lt;br /&gt;
py.subplot(3,1,2)&lt;br /&gt;
py.plot(fftshift(fftfreq(len(moc_chi),1./FS)),fftshift(moc_chi))&lt;br /&gt;
py.title('widmo mocy z Tw. Chinczyna przez fft')&lt;br /&gt;
py.subplot(3,1,3)&lt;br /&gt;
py.plot(FF,M)&lt;br /&gt;
py.title('widmo mocy z Tw. Chinczyna przez sumowanie')&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W wyniku powinniśmy zobaczyć w terminalu:&lt;br /&gt;
 energia w czasie:  50.0&lt;br /&gt;
 energia w czestosci:  50.0&lt;br /&gt;
 energia z tw. Chinczyna przez fft:  50.0&lt;br /&gt;
 energia z tw. Chinczyna przez sumowanie:  49.9501172217&lt;br /&gt;
&lt;br /&gt;
oraz powinny pojawić się rysunki:&lt;br /&gt;
[[Plik:Fig_chinczyn1.png|thumb 200 px|center]]&lt;br /&gt;
[[Plik:Fig_chinczyn2.png|thumb 200 px|center]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Polecenie ==&lt;br /&gt;
Zaimplementuj funkcję obliczającą transformację Fouriera dyskretyzując wzór (9) dla zadanego wektora częstości &amp;lt;tt&amp;gt;f&amp;lt;/tt&amp;gt; i zadanej częstości próbkowania sygnału (tutaj: 10).&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Wywołanie przykładowe:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
t= np.arange(0,1,0.1)&lt;br /&gt;
x = np.sin(2*np.pi*2*t)&lt;br /&gt;
f = np.arange(-5,5,1)&lt;br /&gt;
X,f = fourier(x,f,10.0)&lt;br /&gt;
print X&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Natomiast wywołanie:&lt;br /&gt;
&amp;lt;source lang ='python'&amp;gt;&lt;br /&gt;
t= np.arange(0,1,0.1)&lt;br /&gt;
x = np.sin(2*np.pi*2*t)&lt;br /&gt;
f = np.arange(-5,5,0.01)&lt;br /&gt;
X = fourier(x,f,10.0)&lt;br /&gt;
py.plot(f,np.abs(X))&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Powinno wytworzyć rysunek:&lt;br /&gt;
&lt;br /&gt;
[[Plik:Fourier_test.png]] &lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
import numpy as np&lt;br /&gt;
import pylab as py&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def koreluj_pol(x,y,max_tau):&lt;br /&gt;
    x = x - np.mean(x)&lt;br /&gt;
    y = y - np.mean(y)&lt;br /&gt;
    N= len(x)&lt;br /&gt;
    cor = np.zeros(max_tau+1)&lt;br /&gt;
    cor[0] = np.sum(x[:]*y[:]) &lt;br /&gt;
    for i in range(1,max_tau+1):&lt;br /&gt;
        cor[i] = np.sum(x[i:]*y[:-i])&lt;br /&gt;
        &lt;br /&gt;
    cor = cor /(N)&lt;br /&gt;
    return cor&lt;br /&gt;
&lt;br /&gt;
def koreluj(x,y,max_tau):&lt;br /&gt;
    cor = np.zeros(2*max_tau+1)    &lt;br /&gt;
    cor[max_tau:] = koreluj_pol(x,y,max_tau)&lt;br /&gt;
    tmp = koreluj_pol(y,x,max_tau)&lt;br /&gt;
    cor[:max_tau+1] = tmp[-1::-1]&lt;br /&gt;
    return cor  &lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
def fourier_chin(x, FF, FS):&lt;br /&gt;
    ak = koreluj(x,x,len(x)-1)&lt;br /&gt;
    M = np.zeros(len(FF),dtype='complex') &lt;br /&gt;
    for i,f in enumerate( FF):&lt;br /&gt;
        for tau in range(len(ak)):&lt;br /&gt;
	    M[i] += ak[tau]*np.exp(-2*np.pi*1j*f*( tau- len(x))/FS)&lt;br /&gt;
    #M/=np.sqrt(len(ak))&lt;br /&gt;
    return M&lt;br /&gt;
    &lt;br /&gt;
def fourier(ak, FF, FS):&lt;br /&gt;
   &lt;br /&gt;
    M = np.zeros(len(FF),dtype='complex') &lt;br /&gt;
    for i,f in enumerate( FF):&lt;br /&gt;
        for tau in range(len(ak)):&lt;br /&gt;
	    M[i] += ak[tau]*np.exp(-2*np.pi*1j*f*( tau)/FS)&lt;br /&gt;
    M/=np.sqrt(len(ak))&lt;br /&gt;
    return M&lt;br /&gt;
t= np.arange(0,1,0.05)&lt;br /&gt;
x = np.sin(2*np.pi*2*t)&lt;br /&gt;
f = np.arange(-5,5,0.01)&lt;br /&gt;
&lt;br /&gt;
X = fourier_chin(x,f,10.0)&lt;br /&gt;
Xf = fourier(x,f,10.0)&lt;br /&gt;
print X&lt;br /&gt;
py.plot(f,np.abs(X), f,np.abs(Xf)**2)&lt;br /&gt;
py.show()&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zadanie 3: Związek autokorelacji z widmem sygnału==&lt;br /&gt;
Oblicz gęstość widmową mocy sygnału zarejestrowanego w trakcie czuwania z zamkniętymi oczami, korzystając z twierdzenia Chinczyna oraz [[Nieparametryczne_widmo_mocy#Metoda_Welcha | metodą Welcha]].&lt;br /&gt;
Znajdź częstość rytmu &amp;amp;alpha; dla osoby, która była badana.&lt;br /&gt;
&lt;br /&gt;
==Funkcja kowariancji (wzajemnej)==&lt;br /&gt;
&lt;br /&gt;
W celu scharakteryzowania zależności wzajemnej dwóch sygnałów losowych, stosuje się funkcję kowariancji, zdefiniowaną w następujący sposób:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid98&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy} (\tau ) = \mathrm{cov}(x(t),y(t-\tau ))=\mathrm{E}[(x(t)-\mu _x)(y(t-\tau )-\mu _y)]&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid99&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\mu _x = \mathrm{E}[x(t)]\\&lt;br /&gt;
\mu _y = \mathrm{E}[y(t)]\\ \end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W przypadku sygnałów ciągłych estymatę tę można zapisać w poniższy sposób:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid100&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy} (\tau ) = \frac{1}{T}\int _0^{T}(x(t)-\mu_x)(y(t-\tau)-\mu_y)dt&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
natomiast dla sygnałów dyskretnych jako:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid101&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy}(k) = \frac{1}{N-1}\sum _{i=0}^{N-k}(x(i+k)-x_s)(y(i)-y_s)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W odróżnieniu od funkcji autokowariancji, funkcja kowariancji nie musi mieć maksimum dla przesunięcia &amp;lt;math&amp;gt;\tau =0&amp;lt;/math&amp;gt;. Ponadto posiada ona następującą cechę:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid102&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy}(-\tau ) = \gamma _{yx}(\tau )&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcję kowariancji można znormalizować:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid103&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\rho (\tau) = \frac{\mathrm{E}[(x(t)-\mu _x)(y(t-\tau )-\mu _y)]}{\sqrt{\mathrm{E}[(x(t)-\mu _x)^2]\mathrm{E}[(y(t)-\mu _y)^2]}} = \frac{\gamma _{xy}}{\sigma_x\sigma_y}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
Otrzymaną funkcję nazywamy funkcją korelacji.&lt;br /&gt;
Jednym z zastosowań funkcji korelacji jest wyznaczanie czasu przejścia sygnału przez dany układ liniowy. Funkcja korelacji pomiędzy sygnałem na wejściu układu i sygnałem na jego wyjściu osiągnie wartość maksymalną dla przesunięcia &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; równego czasowi, jaki potrzebował sygnał na pokonanie danego układu. Niestety, taka metoda wyznaczania opóźnienia obarczona jest pewną wadą &amp;amp;mdash; w przypadku gdy prędkość sygnału bądź jego droga zależą od częstości, wtedy na wykresie funkcji korelacji nie uzyskamy wyraźnego maksimum.&lt;br /&gt;
&lt;br /&gt;
=====Polecenie =====&lt;br /&gt;
Zaimplementuj funkcję obliczającą funkcję kowariancji dla różnych sygnałów ''x'' i ''y'' (równanie 13) skorzystaj przy tym z własności opisanej równaniem (14). &lt;br /&gt;
Przykładowe wywołanie:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
b = np.array([-1,-2,-3])&lt;br /&gt;
&lt;br /&gt;
print koreluj(a,b)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
powinno dać w wyniku:&lt;br /&gt;
 [ 0.5 0.  -1.   0.   0.5]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
{{hidden begin|title=Przykładowe rozwiązanie:}}&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import pylab as py&lt;br /&gt;
&lt;br /&gt;
def koreluj(x,y,max_tau):&lt;br /&gt;
    x = x - np.mean(x)&lt;br /&gt;
    y = y - np.mean(y)&lt;br /&gt;
    cor = np.zeros(2*max_tau+1)&lt;br /&gt;
    cor[max_tau] = np.sum(x[:]*y[:]) &lt;br /&gt;
    for i in range(1,max_tau+1):&lt;br /&gt;
        cor[max_tau+i] = np.sum(x[i:]*y[:-i])&lt;br /&gt;
        cor[max_tau-i] = np.sum(y[i:]*x[:-i])&lt;br /&gt;
    N= len(x)&lt;br /&gt;
    cor = cor /(N-1)&lt;br /&gt;
    return cor&lt;br /&gt;
&lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
b = np.array([-1,-2,-3])&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    print koreluj(a,b,i)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}} --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadanie 4===&lt;br /&gt;
Z danych zarejestrowanych w trakcie czuwania z zamkniętymi oczami wybierz sygnały z następujących kanałów: Fp1, P3, Pz, P4, Fp2, O1, O2.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Dla każdego kanału oblicz funkcję autokorelacji, zaś  dla każdej pary kanałów oblicz funkcję korelacji wzajemnej. Wyniki zaprezentuj w formie kwadratowej macierzy wykresów (za pomocą funkcji subplot, tak jak na przykładowym rys. (rys. &amp;lt;xr id=&amp;quot;uid9&amp;quot;&amp;gt; %i&amp;lt;/xr&amp;gt;)). Na przekątnej macierzy narysuj funkcję autokorelacji odpowiednich kanałów, poza przekątną &amp;amp;mdash; funkcję korelacji wzajemnej. Wskaż kanały, które są najbardziej skorelowane ze sobą. Czy możliwe jest wyznaczenie opóźnienia sygnału pomiędzy tymi kanałami?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Powtórz punkt 1, tym razem jednak funkcję autokorelacji i korelacji wzajemnej oblicz na sygnałach przefiltrowanych filtrem wąskopasmowym w paśmie alfa charakterystycznym dla badanej osoby. ([[%C4%86wiczenia_7#Funkcje_do_projektowania_filtr.C3.B3w_IIR_dost.C4.99pne_w_module_scipy.signal|przypomnienie konstrukcji filtrów]])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Oszacuj istotność statystyczną zależności między parami kanałów. Twoją hipotezą zerową jest brak istotnej korelacji pomiędzy sygnałami zarejestrowanymi przez dwie różne elektrody EEG. Hipoteza alternatywna to występowanie zależności pomiędzy tymi sygnałami. Podanie estymatorów wariancji funkcji korelacji jest bardzo trudne, dlatego jednym ze sposobów oszacowania progu powyżej którego wartość funkcji korelacji można byłoby uznać za istotną statystycznie, jest zastosowanie metody ''bootstrap''. Teoretycznie, funkcja korelacji policzona dla dwóch rzeczywistych, nieskorelowanych sygnałów, powinna wynosić 0 dla każdego przesunięcia &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt;. Tak jest jednak w przypadku sygnałów nieskończonych; w analizie sygnałów takowych nie spotkamy.&lt;br /&gt;
&lt;br /&gt;
Dokonując losowej zamiany kolejności próbek, możemy doprowadzić do wytworzenia sygnałów zależnych losowo, które jednak ze względu na skończony czas trwania, dadzą niezerową funkcję korelacji. Poziom losowych fluktuacji tej funkcji oszacujemy wykonując następujące kroki:&lt;br /&gt;
&amp;lt;ol type=&amp;quot;A&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Losowa zamiana kolejności próbek w analizowanych sygnałach. Jeżeli pomiędzy dwoma sygnałami istnieją jakieś zależności, losowa zamiana próbek doprowadzi do zniszczenia tych związków. W ten sposób uzyskujemy sygnały, które teoretycznie są nieskorelowane.&lt;br /&gt;
&amp;lt;li&amp;gt; Obliczenie funkcji  korelacji wzajemnej dla sygnałów policzonych w punkcie A.&lt;br /&gt;
&amp;lt;li&amp;gt; Powtórzenie kroków A i B wiele (np. 1000) razy.&lt;br /&gt;
&amp;lt;li&amp;gt; Oszacowanie 95% przedziału ufności dla wartości średniej funkcji korelacji wzajemnej dla danego przesunięcia &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; korzystając z otrzymanego w kroku C empirycznego rozkładu wartości tych funkcji dla sygnałów niezależnych.  &lt;br /&gt;
&amp;lt;li&amp;gt; Powtórzenie kroków A-D dla kolejnych przesunięć &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;li&amp;gt; Sprawdzenie, dla których przesunięć &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; funkcje autokorelacji i korelacji obliczone dla oryginalnych sygnałów uzyskały wartości wyższe niż wartości progowe oszacowane dla sygnałów o losowych zależnościach.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Procedura opisana powyżej ma jednak '''zasadniczą wadę'''. Staramy się w niej oszacować poziom przypadkowych korelacji pomiędzy dwoma sygnałami dla kolejnych przesunięć &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt;, co jest niczym innym jak wielokrotnym powtórzeniem pewnego testu. Obserwowanie korelacji dla wielu par kanałów równocześnie również prowadzi do zwiększenia szansy na zaobserwowanie ekstremalnie dużych fluktuacji.&lt;br /&gt;
Występuje tu zatem ''problem wielokrotnych porównań''.&lt;br /&gt;
Przypominamy, iż może to doprowadzić do przypadkowego uznania wyników jako &amp;amp;bdquo;istotnych&amp;amp;rdquo; statystycznie. Np. jeśli pojedynczy test wykonujemy na poziomie istotności 5% to dopuszczamy odrzucenie w 1 przypadku na 20 hipotezy zerowej pomimo, iż jest ona prawdziwa. Z drugiej jednak strony, jeśli powtórzymy wykonywany test 20 razy, to oczekujemy uzyskania 1 przypadku, w którym poziom ''p'' będzie mniejszy od 5% co jest przesłanką za odrzuceniem hipotezy zerowej. &lt;br /&gt;
&lt;br /&gt;
W przypadku wykonywania serii testów należałoby więc zastosować odpowiednie poprawki, np. [http://www.bmj.com/content/310/6973/170.full korektę Bonferroniego] czy [http://en.wikipedia.org/wiki/False_discovery_rate false discovery rate (FDR)]. Innym rozwiązaniem w analizowanym przez nas problemie jest zastosowanie tzw. statystyk wartości ekstremalnych, które prowadzą do następujących zmian w procedurze:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol type=&amp;quot;A&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;	Losowa zmiana kolejności próbek w analizowanych sygnałach (we wszystkich analizowanych kanałach). Jeżeli pomiędzy dwoma sygnałami istnieją jakieś zależności, losowa zamiana próbek doprowadzi do zniszczenia tych związków. W ten sposób uzyskujemy sygnały, które teoretycznie są nieskorelowane.&lt;br /&gt;
&amp;lt;li&amp;gt;	Obliczenie funkcji korelacji dla sygnałów otrzymanych w punkcie A.&lt;br /&gt;
&amp;lt;li&amp;gt;    Zapamiętanie maksymalnej wartości bezwzględnej funkcji korelacji z punktu B (maksimum bierzemy po wszystkich przesunięciach i po wszystkich parach kanałów; dla funkcji autokorelacji, ze względu na jej normalizację do 1 dla zerowego przesunięcia, tam maksymalnych wartości poszukujemy dla przesunięć innych niż 0).&lt;br /&gt;
&amp;lt;li&amp;gt;	Powtórzenie kroków A-C 1000 razy. Uzyskamy w ten sposób rozkład maksymalnych wartości funkcji korelacji możliwych do zaobserwowania dla sygnałów niezależnych.&lt;br /&gt;
&amp;lt;li&amp;gt;    Wyznaczenie 95 centyla rozkładu wartości maksymalnych.&lt;br /&gt;
&amp;lt;li&amp;gt;	Nałożenie na rysunki funkcji korelacji uzyskane w Zadaniu 2 poziomych linii symbolizujących poziom zależności dwóch sygnałów o losowych zależnościach i sprawdzenie, dla których przesunięć &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; wartości funkcji korelacji przekraczają estymowane progi istotności statystycznej.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Plik:Korelacje_wzajemne.png|700px|center|thumb|&amp;lt;figure id=&amp;quot;uid9&amp;quot; /&amp;gt;Przykład wyniku analizy korelacji wzajemnych dla sygnału niefiltrowanego z naniesionymi granicami możliwych fluktuacji.]]&lt;br /&gt;
&lt;br /&gt;
==Wzajemna gęstość widmowa sygnałów==&lt;br /&gt;
&lt;br /&gt;
Podobnie jak w przypadku twierdzenia Chinczyna dla pojedynczego sygnału, możliwe jest policzenie transformaty Fouriera funkcji kowariancji. Uzyskana w ten sposób wielkość nazywa się funkcją wzajemnej gęstości mocy widmowej sygnału:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid122&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
S_{xy}(f) = \int _{-\infty }^{\infty }\gamma_{xy}(\tau )e^{-2\pi i f \tau}d\tau &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W celu dalszego omówienia własności funkcji wzajemnej mocy widmowej sygnałów funkcję tę zapiszemy w postaci:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid123&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
S_{xy}(f) = |S_{xy}(f)|e^{i\phi _{xy}(f)}\\&lt;br /&gt;
\\&lt;br /&gt;
\phi _{xy} = \arg(S_{xy}) &lt;br /&gt;
\end{array} &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&amp;lt;!-- \mathrm{arc\,tg}\left[\frac{\mathrm{Im}(S_{xy}(f))}{\mathrm{Re}(S_{xy}(f))}\right]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wartość bezwzględna funkcji wzajemnej gęstości mocy widmowej osiąga największą wartość dla '''częstości''', w których sygnały &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;y(t)&amp;lt;/math&amp;gt; są ze sobą skorelowane. Funkcja wzajemnej mocy widmowej sygnałów pozbawiona jest zatem wady, która charakteryzowała funkcję korelacji, to jest problemu z wyznaczeniem czasu transmisji sygnału, w przypadku gdy czas ten zależał od częstości. Przy pomocy funkcji wzajemnej mocy widmowej, czas ten można oszacować przy pomocy fazy tej funkcji &amp;amp;mdash; &amp;lt;math&amp;gt;\phi _{xy}(f)&amp;lt;/math&amp;gt;. Jeśli funkcja wzajemnej mocy widmowej została wyznaczona pomiędzy sygnałami na wejściu i wyjściu układu liniowego, to faza ta reprezentuje przesunięcie fazowe sygnału przy przejściu przez układ. Czas tego przejścia można oszacować za pomocą następującej wyrażenia:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid124&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\tau = \frac{\phi _{xy}(f)}{2\pi f}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Podobnie jak w przypadku funkcji autokorelacji i korelacji wzajemnej, funkcję wzajemnej gęstości mocy widmowej można znormalizować:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid125&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
C_{xy}(f) = \frac{S_{xy}(f)}{\sqrt{S_x(f)S_y(f)}}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Znormalizowaną postać funkcji wzajemnej gęstości mocy widmowej nazywamy funkcją ''koherencji''. &lt;br /&gt;
Koherencja jest wielkością zespoloną. Faza koherencji odzwierciedla różnicę faz pomiędzy dwoma sygnałami. Moduł koherencji reprezentuje stopień synchronizacji sygnałów i zawiera się w przedziale od 0.0 do 1.0. Moduł tej funkcji zawiera się w przedziale od 0 do 1. Wartości 0 odpowiada brak synchronizacji pomiędzy sygnałami, zaś wartości 1 pełna synchronizacja dwóch przebiegów czasowych. Należy również zwrócić uwagę na nazewnictwo - często sam moduł koherencji określany jest jako koherencja, w literaturze anglojęzycznej moduł koherencji posiada jednak odrębną nazwę: Magnitude Square Coherence (MSC). Istotny jest również sposób estymacji modułu koherencji, który wyprowadzono w następnym rozdziale, zaś sam estymator reprezentuje wzór (36).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadanie 5===&lt;br /&gt;
Zaimplementuj funkcję obliczającą wzajemną gęstość widmową dla pary kanałów. &lt;br /&gt;
&amp;lt;!--Niech argumentami tej funkcji będą dwa wektory zawierające sygnały, zakres częstości, częstość próbkowania. --&amp;gt;&lt;br /&gt;
Oblicz i narysuj macierz gęstości widmowych (własnych i wzajemnych) dla kolejnych par kanałów (tych samych co w zadaniu 3). Wyniki zaprezentuj w postaci kwadratowej macierzy rysunków. Ponieważ są to funkcje zespolone, dobrze jest zaprezentować osobno ich wartość i fazę. Uzyskane wartości bezwzględne narysuj nad przekątną tej macierzy, a fazę pod przekątną.&lt;br /&gt;
&lt;br /&gt;
===Zadanie 6===&lt;br /&gt;
Przygotuj sygnał dwukanałowy, w którym jako pierwszy sygnał wybierz fragment sygnału EEG (z danych zebranych wcześniej) o długości 2000 próbek, a jako drugiego sygnału użyj tego samego fragmentu EEG, ale opóźnionego o wybraną liczbę (1 - 5) próbek. Oblicz widma wzajemne tych sygnałów i zaprezentuj ich fazy na rysunku. Na podstawie tych widm znajdź wartość przesunięcia czasowego tych sygnałów.&lt;br /&gt;
&lt;br /&gt;
Obliczenia powtórz w przypadku, gdy do drugiego sygnału dodany będzie szum o wariancji równej 0,25 wariancji oryginalnego sygnału.&lt;/div&gt;</summary>
		<author><name>Maciek</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG_2/EEG_wlasno%C5%9Bci_EEG_spoczynkowego&amp;diff=11181</id>
		<title>Pracownia EEG 2/EEG wlasności EEG spoczynkowego</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG_2/EEG_wlasno%C5%9Bci_EEG_spoczynkowego&amp;diff=11181"/>
		<updated>2024-11-22T16:37:59Z</updated>

		<summary type="html">&lt;p&gt;Maciek: /* Polecenie: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Pracownia EEG 2|Pracownia EEG 2]] / Własności EEG spoczynkowego: funkcja autokorelacji i widmo&lt;br /&gt;
&lt;br /&gt;
=Estymacja funkcji autokowariancji, autokorelacji i koherencji sygnału.=&lt;br /&gt;
==Wstęp==&lt;br /&gt;
Z funkcjami tymi spotkaliśmy się już na zajęciach z [[Ćwiczenia_4|analizy sygnałów]].&lt;br /&gt;
&lt;br /&gt;
Funkcja autokowariancji sygnału charakteryzuje liniową zależność wartości tego sygnału w danej określonej chwili czasu od wartości (tego samego sygnału) w innej chwili.&lt;br /&gt;
W przypadku [[Nieparametryczne_widmo_mocy#Sygna.C5.82y_stochastyczne  | stacjonarnych procesów stochastycznych]], przebieg tej funkcji nie zależy od czasu. &lt;br /&gt;
Oznacza to, że obliczając funkcję autokorelacji sygnału pomiędzy chwilą czasu &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;x(t+\tau )&amp;lt;/math&amp;gt; otrzymamy tę samą wartość, jak dla przypadku obliczania funkcji autokorelacji pomiędzy momentami &amp;lt;math&amp;gt;x(t + T)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;x(t + T+\tau )&amp;lt;/math&amp;gt;, gdzie &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; to dowolny przedział czasu. Innymi słowy, funkcja autokorelacji procesu stacjonarnego zależy tylko od odstępu czasu pomiędzy próbkami &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt;, dla którego jest wyznaczana, a nie od konkretnej chwili czasu. Odrębną klasę sygnałów stanowią procesy niestacjonarne, w przypadku których funkcja autokorelacji będzie zależeć od czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; w którym jest obliczana. Estymator funkcji autokowariancji uzyskuje się poprzez obliczanie iloczynów wartości sygnału &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; w chwilach czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; czyli &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; i wartości sygnału &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; w chwili czasu ''t''+&amp;amp;tau; czyli &amp;lt;math&amp;gt;x(t+\tau)&amp;lt;/math&amp;gt; i uśredniając wartości iloczynów po czasie &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid79&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma (\tau) = \mathrm{cov}(x(t),x(t-\tau ))=\mathrm{E}[(x(t)-\mu )(x(t-\tau )-\mu )]&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(1)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid80&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\mu = \mathrm{E}[x(t)]&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(2)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W przypadku sygnałów ciągłych estymatę tę można zapisać w poniższy sposób:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid81&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma (\tau ) = \frac{1}{T}\int _0^{T}(x(t)-\mu )(x(t-\tau )-\mu )dt&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(3)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
natomiast dla sygnałów dyskretnych jako:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid82&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma (k) = \frac{1}{N-1}\sum _{i=1}^{N-|k|}(x(i+k)-x_s)(x(i)-x_s)&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(4)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid83&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
x_s = \frac{\sum _{i=1}^{N}x(i)}{N}&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(5)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcja autokowariancji może osiągać dowolne wartości, dlatego aby można było porównać przebieg tej funkcji np. pomiędzy dwoma sygnałami, wprowadzono wersję znormalizowaną tej funkcji &amp;amp;mdash; ''funkcję autokorelacji''. Normalizacja ta wygląda następująco:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid84&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\rho (k) = \frac{\gamma (\tau )}{\sigma^2}&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(6)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid85&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\sigma ^2 = \mathrm{E}[(x(t)-\mu )^2]&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(7)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wariancję sygnału (&amp;lt;math&amp;gt;\gamma (0)=\sigma ^2&amp;lt;/math&amp;gt;) można wyrazić przez funkcję autokowariancji dla przesunięcia &amp;lt;math&amp;gt;\tau =0&amp;lt;/math&amp;gt;.  Wynika z tego, że funkcja korelacji przyjmuje wartości z zakresu [&amp;amp;minus;1,&amp;amp;nbsp;1]. Ostatecznie estymator funkcji autokorelacji można zapisać jak poniżej:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid86&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\rho(k) = \frac{\gamma (k)}{\gamma (0)}&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(8)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcję autokorelacji estymuje się w celu określenia, w jakim stopniu wartości sygnału w danej chwili czasu wpływają na wartości sygnału w kolejnych chwilach czasu. Ma to kluczowe znaczenie przy rozpoznawaniu rodzaju procesów fizycznych odpowiedzialnego za generowanie sygnału. Funkcja ta zawsze mam maksimum dla przesunięcia &amp;lt;math&amp;gt;\tau =0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cechą charakterystyczną funkcji autokorelacji jest to, iż w przypadku sygnałów harmonicznych, przebieg funkcji ma charakter okresowy, z okresem takim samym jak okres badanego sygnału. W przypadku szumu, funkcja autokorelacji ma kształt funkcji delta Diraca.&lt;br /&gt;
&lt;br /&gt;
==Polecenie:==&lt;br /&gt;
Do policzenia funkcji autokorelacji posłużymy się funkcją biblioteczną &amp;lt;tt&amp;gt;numpy.correlate&amp;lt;/tt&amp;gt;. Funkcja ta, wbrew nazwie, oblicza wyłącznie splot swoich dwóch pierwszych argumentów wywołania. Musimy je więc przystosować do obliczenia wielkości zgodnie ze wzorem (4).&lt;br /&gt;
&lt;br /&gt;
Zaimplementuj funkcję do obliczania funkcji korelacji zgodnie ze wzorem &amp;lt;xr id=&amp;quot;id89&amp;quot;&amp;gt;%i&amp;lt;/xr&amp;gt;(4). Funkcja powinna przyjmować jako parametry dwa wektory&amp;lt;!--i maksymalne przesunięcie wzajemne tych wektorów--&amp;gt;, a zwracać wektor zawierający ich funkcję autokorelacji. &lt;br /&gt;
&lt;br /&gt;
Wywołanie przykładowe:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
print koreluj(a,a)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
powinno dać wynik:&lt;br /&gt;
 [-0.5  0.   1.   0.  -0.5]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
# Średnia&lt;br /&gt;
mean = numpy.mean(data)&lt;br /&gt;
mean2 = numpy.mean(data2)&lt;br /&gt;
&lt;br /&gt;
# Wariancja&lt;br /&gt;
var = numpy.var(data)&lt;br /&gt;
var2 = numpy.var(data2)&lt;br /&gt;
&lt;br /&gt;
# Dane po odjęciu średnich&lt;br /&gt;
ndata = data - mean&lt;br /&gt;
ndata2 = data2 - mean2&lt;br /&gt;
&lt;br /&gt;
# Splot&lt;br /&gt;
acorr = numpy.correlate(ndata, ndata2, 'full')&lt;br /&gt;
&lt;br /&gt;
# Normalizacja kowariancji do korelacji i przez 1/N&lt;br /&gt;
acorr = acorr / numpy.sqrt(var*var2) / len(ndata)&lt;br /&gt;
&lt;br /&gt;
print(acorr)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{{hidden begin|title=Przykładowe rozwiązanie:}}--&amp;gt;&lt;br /&gt;
 &amp;lt;!-- &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
def koreluj_pol(x,y,max_tau):&lt;br /&gt;
    x = x - np.mean(x)&lt;br /&gt;
    y = y - np.mean(y)&lt;br /&gt;
    N= len(x)&lt;br /&gt;
    cor = np.zeros(max_tau+1)&lt;br /&gt;
    cor[0] = np.sum(x[:]*y[:]) &lt;br /&gt;
    for i in range(1,max_tau+1):&lt;br /&gt;
        cor[i] = np.sum(x[i:]*y[:-i])&lt;br /&gt;
        &lt;br /&gt;
    cor = cor /(N-1)&lt;br /&gt;
    return cor&lt;br /&gt;
&lt;br /&gt;
def koreluj(x,y,max_tau):&lt;br /&gt;
    cor = np.zeros(2*max_tau+1)    &lt;br /&gt;
    cor[max_tau:] = koreluj_pol(x,y,max_tau)&lt;br /&gt;
    tmp = koreluj_pol(y,x,max_tau)&lt;br /&gt;
    cor[:max_tau+1] = tmp[-1::-1]&lt;br /&gt;
    return cor    &lt;br /&gt;
    &lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    print koreluj(a,a,i)&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
b = np.array([-1,-2,-3])&lt;br /&gt;
&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    print koreluj(a,b,i)&lt;br /&gt;
    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zadanie 1: Pomiar sygnału EEG ==&lt;br /&gt;
&lt;br /&gt;
Zarejestruj 10 minut sygnału EEG, w trakcie których badana osoba będzie siedziała z otwartymi oczami oraz kolejne 10 minut w stanie czuwania z zamkniętymi oczami. Rejestrację należy wykonać na pełnym czepku 10-20 z częstością próbkowania 128 Hz. &lt;br /&gt;
&lt;br /&gt;
==Zadanie 2:  Funkcje autokowariancji i autokorelacji==&lt;br /&gt;
W tym zadaniu posłużymy się sygnałami zarejestrowanymi w punkcie 3. poprzedniego ćwiczenia. Zaobserwuj, na którym kanale rytm alfa osiąga najwyższą wartość. Następnie zaimplementuj w Pythonie następujące kroki:&lt;br /&gt;
&lt;br /&gt;
#	Wczytaj dane z wybranego kanału.&lt;br /&gt;
#	Oblicz funkcję autokorelacji dla sygnału zarejestrowanego w warunkach, gdy osoba badana siedziała z otwartymi oczami. Narysuj autokorelogram, to jest wykres wartości funkcji autokorelacji względem przesunięcia &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt;. Oś &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; wyskaluj w sekundach.&lt;br /&gt;
#	Powtórz krok 2, tym razem dla sygnału zebranego w warunkach czuwania z zamkniętymi oczami.&lt;br /&gt;
#	Porównaj autokorelogramy.&lt;br /&gt;
&lt;br /&gt;
=Związek autokorelacji z widmem sygnału=&lt;br /&gt;
==Wstęp==&lt;br /&gt;
Zgodnie z twierdzeniem Chinczyna, z którym zapoznaliśmy się na wykładzie z [[Twierdzenie_Wienera-Chinczyna|Analizy Sygnałów]], widmową gęstość mocy sygnału można policzyć jako transformatę Fouriera funkcji autokowariancji:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid93&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
S(f) = \int _{-\infty }^{\infty }\gamma (\tau )e^{-2\pi i f \tau}d\tau &amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(9)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	&amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; &amp;amp;mdash; częstość&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	&amp;lt;math&amp;gt;S(f)&amp;lt;/math&amp;gt; &amp;amp;mdash;  gęstość widmowa mocy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Poniższy kod ilustruje to twierdzenie:&lt;br /&gt;
&amp;lt;source lang = py&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
from numpy.fft import rfft,fft,fftfreq,fftshift&lt;br /&gt;
 &lt;br /&gt;
def widmo_mocy(s, Fs):&lt;br /&gt;
    '''Funkcja licąca widmo mocy metodą periodogramu,&lt;br /&gt;
	pobiera sygnał i częstość próbkowania&lt;br /&gt;
	zwraca widmo mocy i oś częstości&lt;br /&gt;
    '''&lt;br /&gt;
    S = fft(s)/np.sqrt(len(s))&lt;br /&gt;
    S_moc = S*S.conj()&lt;br /&gt;
    S_moc = S_moc.real&lt;br /&gt;
    F = fftfreq(len(s), 1/Fs)&lt;br /&gt;
    return (fftshift(S_moc),fftshift(F))&lt;br /&gt;
 &lt;br /&gt;
def sin(f = 1, T = 1, Fs = 128, phi =0 ):&lt;br /&gt;
    '''sin o zadanej częstości (w Hz), długości, fazie i częstości próbkowania&lt;br /&gt;
    Domyślnie wytwarzany jest sygnał reprezentujący &lt;br /&gt;
    1 sekundę sinusa o częstości 1Hz i zerowej fazie próbkowanego 128 Hz&lt;br /&gt;
    '''&lt;br /&gt;
    dt = 1.0/Fs&lt;br /&gt;
    t = np.arange(0,T,dt)&lt;br /&gt;
    s = np.sin(2*np.pi*f*t + phi)&lt;br /&gt;
    return (s,t)&lt;br /&gt;
 &lt;br /&gt;
# sygnał próbny będzie próbkowany z częstością FS&lt;br /&gt;
FS = 100.0&lt;br /&gt;
# sygnałem próbnym będzie sinusoida o częstości f &lt;br /&gt;
(s,t) = sin(f=10.5,Fs=FS)&lt;br /&gt;
# obliczamy moc i energię sygnału w dziedzinie czasu&lt;br /&gt;
moc_w_czasie = s**2&lt;br /&gt;
energia_w_czasie = np.sum(moc_w_czasie)&lt;br /&gt;
print 'energia w czasie: ', energia_w_czasie&lt;br /&gt;
 &lt;br /&gt;
# obliczamy widmo mocy sygnału i jego energię estymowaną w dziedzinie częstości&lt;br /&gt;
(moc_w_czestosci, F) = widmo_mocy(s, Fs=FS)&lt;br /&gt;
energia_w_czestosci = np.sum(moc_w_czestosci)&lt;br /&gt;
print 'energia w czestosci: ', energia_w_czestosci&lt;br /&gt;
 &lt;br /&gt;
# estymujemy funkcję autokorelacji sygnału&lt;br /&gt;
ak = 1./(2*len(s)-1)*np.correlate(s,s,'full')&lt;br /&gt;
&lt;br /&gt;
# estymujemy widmo mocy i energię sygnału z twierdzenia Chinczyna korzystając z funkcji fft:&lt;br /&gt;
moc_chi = np.abs(fft(ak))&lt;br /&gt;
energia_chin = sum(moc_chi)&lt;br /&gt;
print 'energia z tw. Chinczyna przez fft: ', energia_chin&lt;br /&gt;
 &lt;br /&gt;
# estymujemy widmo mocy i energię sygnału z twierdzenia Chinczyna korzystając z jawnej postaci transformaty Fouriera:&lt;br /&gt;
FF = np.linspace(-FS/2,FS/2,1000)&lt;br /&gt;
M = np.zeros(len(FF),dtype='complex')&lt;br /&gt;
 &lt;br /&gt;
for i,f in enumerate( FF):&lt;br /&gt;
    for tau in range(len(ak)):&lt;br /&gt;
        M[i] += ak[tau]*np.exp(2*np.pi*1j*f*(len(ak)-tau)/FS) &lt;br /&gt;
M = np.abs(M)&lt;br /&gt;
energia_chin_sum = np.sum(M)* (len(ak)/len(FF))&lt;br /&gt;
print 'energia z tw. Chinczyna przez sumowanie: ', energia_chin_sum&lt;br /&gt;
&lt;br /&gt;
# Rysunki&lt;br /&gt;
py.figure(1)&lt;br /&gt;
py.subplot(3,1,1)&lt;br /&gt;
py.plot(t,s)&lt;br /&gt;
py.title(u'Sygnal')&lt;br /&gt;
py.subplot(3,1,2)&lt;br /&gt;
py.plot(t,moc_w_czasie)&lt;br /&gt;
py.title(u'moc w czasie')&lt;br /&gt;
py.subplot(3,1,3)&lt;br /&gt;
py.plot(F,moc_w_czestosci)&lt;br /&gt;
py.title(u'moc w czestosci')&lt;br /&gt;
 &lt;br /&gt;
py.figure(2)&lt;br /&gt;
py.subplot(3,1,1)&lt;br /&gt;
py.title('f. autokowariancji')&lt;br /&gt;
py.plot(np.arange(-len(ak)/2,len(ak)/2,1)/FS ,ak)&lt;br /&gt;
py.subplot(3,1,2)&lt;br /&gt;
py.plot(fftshift(fftfreq(len(moc_chi),1./FS)),fftshift(moc_chi))&lt;br /&gt;
py.title('widmo mocy z Tw. Chinczyna przez fft')&lt;br /&gt;
py.subplot(3,1,3)&lt;br /&gt;
py.plot(FF,M)&lt;br /&gt;
py.title('widmo mocy z Tw. Chinczyna przez sumowanie')&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W wyniku powinniśmy zobaczyć w terminalu:&lt;br /&gt;
 energia w czasie:  50.0&lt;br /&gt;
 energia w czestosci:  50.0&lt;br /&gt;
 energia z tw. Chinczyna przez fft:  50.0&lt;br /&gt;
 energia z tw. Chinczyna przez sumowanie:  49.9501172217&lt;br /&gt;
&lt;br /&gt;
oraz powinny pojawić się rysunki:&lt;br /&gt;
[[Plik:Fig_chinczyn1.png|thumb 200 px|center]]&lt;br /&gt;
[[Plik:Fig_chinczyn2.png|thumb 200 px|center]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Polecenie ==&lt;br /&gt;
Zaimplementuj funkcję obliczającą transformację Fouriera dyskretyzując wzór (9) dla zadanego wektora częstości &amp;lt;tt&amp;gt;f&amp;lt;/tt&amp;gt; i zadanej częstości próbkowania sygnału (tutaj: 10).&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Wywołanie przykładowe:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
t= np.arange(0,1,0.1)&lt;br /&gt;
x = np.sin(2*np.pi*2*t)&lt;br /&gt;
f = np.arange(-5,5,1)&lt;br /&gt;
X,f = fourier(x,f,10.0)&lt;br /&gt;
print X&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Natomiast wywołanie:&lt;br /&gt;
&amp;lt;source lang ='python'&amp;gt;&lt;br /&gt;
t= np.arange(0,1,0.1)&lt;br /&gt;
x = np.sin(2*np.pi*2*t)&lt;br /&gt;
f = np.arange(-5,5,0.01)&lt;br /&gt;
X = fourier(x,f,10.0)&lt;br /&gt;
py.plot(f,np.abs(X))&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Powinno wytworzyć rysunek:&lt;br /&gt;
&lt;br /&gt;
[[Plik:Fourier_test.png]] &lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
import numpy as np&lt;br /&gt;
import pylab as py&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def koreluj_pol(x,y,max_tau):&lt;br /&gt;
    x = x - np.mean(x)&lt;br /&gt;
    y = y - np.mean(y)&lt;br /&gt;
    N= len(x)&lt;br /&gt;
    cor = np.zeros(max_tau+1)&lt;br /&gt;
    cor[0] = np.sum(x[:]*y[:]) &lt;br /&gt;
    for i in range(1,max_tau+1):&lt;br /&gt;
        cor[i] = np.sum(x[i:]*y[:-i])&lt;br /&gt;
        &lt;br /&gt;
    cor = cor /(N)&lt;br /&gt;
    return cor&lt;br /&gt;
&lt;br /&gt;
def koreluj(x,y,max_tau):&lt;br /&gt;
    cor = np.zeros(2*max_tau+1)    &lt;br /&gt;
    cor[max_tau:] = koreluj_pol(x,y,max_tau)&lt;br /&gt;
    tmp = koreluj_pol(y,x,max_tau)&lt;br /&gt;
    cor[:max_tau+1] = tmp[-1::-1]&lt;br /&gt;
    return cor  &lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
def fourier_chin(x, FF, FS):&lt;br /&gt;
    ak = koreluj(x,x,len(x)-1)&lt;br /&gt;
    M = np.zeros(len(FF),dtype='complex') &lt;br /&gt;
    for i,f in enumerate( FF):&lt;br /&gt;
        for tau in range(len(ak)):&lt;br /&gt;
	    M[i] += ak[tau]*np.exp(-2*np.pi*1j*f*( tau- len(x))/FS)&lt;br /&gt;
    #M/=np.sqrt(len(ak))&lt;br /&gt;
    return M&lt;br /&gt;
    &lt;br /&gt;
def fourier(ak, FF, FS):&lt;br /&gt;
   &lt;br /&gt;
    M = np.zeros(len(FF),dtype='complex') &lt;br /&gt;
    for i,f in enumerate( FF):&lt;br /&gt;
        for tau in range(len(ak)):&lt;br /&gt;
	    M[i] += ak[tau]*np.exp(-2*np.pi*1j*f*( tau)/FS)&lt;br /&gt;
    M/=np.sqrt(len(ak))&lt;br /&gt;
    return M&lt;br /&gt;
t= np.arange(0,1,0.05)&lt;br /&gt;
x = np.sin(2*np.pi*2*t)&lt;br /&gt;
f = np.arange(-5,5,0.01)&lt;br /&gt;
&lt;br /&gt;
X = fourier_chin(x,f,10.0)&lt;br /&gt;
Xf = fourier(x,f,10.0)&lt;br /&gt;
print X&lt;br /&gt;
py.plot(f,np.abs(X), f,np.abs(Xf)**2)&lt;br /&gt;
py.show()&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zadanie 3: Związek autokorelacji z widmem sygnału==&lt;br /&gt;
Oblicz gęstość widmową mocy sygnału zarejestrowanego w trakcie czuwania z zamkniętymi oczami, korzystając z twierdzenia Chinczyna oraz [[Nieparametryczne_widmo_mocy#Metoda_Welcha | metodą Welcha]].&lt;br /&gt;
Znajdź częstość rytmu &amp;amp;alpha; dla osoby, która była badana.&lt;br /&gt;
&lt;br /&gt;
==Funkcja kowariancji (wzajemnej)==&lt;br /&gt;
&lt;br /&gt;
W celu scharakteryzowania zależności wzajemnej dwóch sygnałów losowych, stosuje się funkcję kowariancji, zdefiniowaną w następujący sposób:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid98&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy} (\tau ) = \mathrm{cov}(x(t),y(t-\tau ))=\mathrm{E}[(x(t)-\mu _x)(y(t-\tau )-\mu _y)]&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid99&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\mu _x = \mathrm{E}[x(t)]\\&lt;br /&gt;
\mu _y = \mathrm{E}[y(t)]\\ \end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W przypadku sygnałów ciągłych estymatę tę można zapisać w poniższy sposób:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid100&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy} (\tau ) = \frac{1}{T}\int _0^{T}(x(t)-\mu_x)(y(t-\tau)-\mu_y)dt&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
natomiast dla sygnałów dyskretnych jako:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid101&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy}(k) = \frac{1}{N-1}\sum _{i=0}^{N-k}(x(i+k)-x_s)(y(i)-y_s)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W odróżnieniu od funkcji autokowariancji, funkcja kowariancji nie musi mieć maksimum dla przesunięcia &amp;lt;math&amp;gt;\tau =0&amp;lt;/math&amp;gt;. Ponadto posiada ona następującą cechę:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid102&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy}(-\tau ) = \gamma _{yx}(\tau )&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcję kowariancji można znormalizować:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid103&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\rho (\tau) = \frac{\mathrm{E}[(x(t)-\mu _x)(y(t-\tau )-\mu _y)]}{\sqrt{\mathrm{E}[(x(t)-\mu _x)^2]\mathrm{E}[(y(t)-\mu _y)^2]}} = \frac{\gamma _{xy}}{\sigma_x\sigma_y}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
Otrzymaną funkcję nazywamy funkcją korelacji.&lt;br /&gt;
Jednym z zastosowań funkcji korelacji jest wyznaczanie czasu przejścia sygnału przez dany układ liniowy. Funkcja korelacji pomiędzy sygnałem na wejściu układu i sygnałem na jego wyjściu osiągnie wartość maksymalną dla przesunięcia &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; równego czasowi, jaki potrzebował sygnał na pokonanie danego układu. Niestety, taka metoda wyznaczania opóźnienia obarczona jest pewną wadą &amp;amp;mdash; w przypadku gdy prędkość sygnału bądź jego droga zależą od częstości, wtedy na wykresie funkcji korelacji nie uzyskamy wyraźnego maksimum.&lt;br /&gt;
&lt;br /&gt;
=====Polecenie =====&lt;br /&gt;
Zaimplementuj funkcję obliczającą funkcję kowariancji dla różnych sygnałów ''x'' i ''y'' (równanie 13) skorzystaj przy tym z własności opisanej równaniem (14). &lt;br /&gt;
Przykładowe wywołanie:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
b = np.array([-1,-2,-3])&lt;br /&gt;
&lt;br /&gt;
print koreluj(a,b)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
powinno dać w wyniku:&lt;br /&gt;
 [ 0.5 0.  -1.   0.   0.5]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
{{hidden begin|title=Przykładowe rozwiązanie:}}&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import pylab as py&lt;br /&gt;
&lt;br /&gt;
def koreluj(x,y,max_tau):&lt;br /&gt;
    x = x - np.mean(x)&lt;br /&gt;
    y = y - np.mean(y)&lt;br /&gt;
    cor = np.zeros(2*max_tau+1)&lt;br /&gt;
    cor[max_tau] = np.sum(x[:]*y[:]) &lt;br /&gt;
    for i in range(1,max_tau+1):&lt;br /&gt;
        cor[max_tau+i] = np.sum(x[i:]*y[:-i])&lt;br /&gt;
        cor[max_tau-i] = np.sum(y[i:]*x[:-i])&lt;br /&gt;
    N= len(x)&lt;br /&gt;
    cor = cor /(N-1)&lt;br /&gt;
    return cor&lt;br /&gt;
&lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
b = np.array([-1,-2,-3])&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    print koreluj(a,b,i)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}} --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadanie 4===&lt;br /&gt;
Z danych zarejestrowanych w trakcie czuwania z zamkniętymi oczami wybierz sygnały z następujących kanałów: Fp1, P3, Pz, P4, Fp2, O1, O2.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Dla każdego kanału oblicz funkcję autokorelacji, zaś  dla każdej pary kanałów oblicz funkcję korelacji wzajemnej. Wyniki zaprezentuj w formie kwadratowej macierzy wykresów (za pomocą funkcji subplot, tak jak na przykładowym rys. (rys. &amp;lt;xr id=&amp;quot;uid9&amp;quot;&amp;gt; %i&amp;lt;/xr&amp;gt;)). Na przekątnej macierzy narysuj funkcję autokorelacji odpowiednich kanałów, poza przekątną &amp;amp;mdash; funkcję korelacji wzajemnej. Wskaż kanały, które są najbardziej skorelowane ze sobą. Czy możliwe jest wyznaczenie opóźnienia sygnału pomiędzy tymi kanałami?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Powtórz punkt 1, tym razem jednak funkcję autokorelacji i korelacji wzajemnej oblicz na sygnałach przefiltrowanych filtrem wąskopasmowym w paśmie alfa charakterystycznym dla badanej osoby. ([[%C4%86wiczenia_7#Funkcje_do_projektowania_filtr.C3.B3w_IIR_dost.C4.99pne_w_module_scipy.signal|przypomnienie konstrukcji filtrów]])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Oszacuj istotność statystyczną zależności między parami kanałów. Twoją hipotezą zerową jest brak istotnej korelacji pomiędzy sygnałami zarejestrowanymi przez dwie różne elektrody EEG. Hipoteza alternatywna to występowanie zależności pomiędzy tymi sygnałami. Podanie estymatorów wariancji funkcji korelacji jest bardzo trudne, dlatego jednym ze sposobów oszacowania progu powyżej którego wartość funkcji korelacji można byłoby uznać za istotną statystycznie, jest zastosowanie metody ''bootstrap''. Teoretycznie, funkcja korelacji policzona dla dwóch rzeczywistych, nieskorelowanych sygnałów, powinna wynosić 0 dla każdego przesunięcia &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt;. Tak jest jednak w przypadku sygnałów nieskończonych; w analizie sygnałów takowych nie spotkamy.&lt;br /&gt;
&lt;br /&gt;
Dokonując losowej zamiany kolejności próbek, możemy doprowadzić do wytworzenia sygnałów zależnych losowo, które jednak ze względu na skończony czas trwania, dadzą niezerową funkcję korelacji. Poziom losowych fluktuacji tej funkcji oszacujemy wykonując następujące kroki:&lt;br /&gt;
&amp;lt;ol type=&amp;quot;A&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Losowa zamiana kolejności próbek w analizowanych sygnałach. Jeżeli pomiędzy dwoma sygnałami istnieją jakieś zależności, losowa zamiana próbek doprowadzi do zniszczenia tych związków. W ten sposób uzyskujemy sygnały, które teoretycznie są nieskorelowane.&lt;br /&gt;
&amp;lt;li&amp;gt; Obliczenie funkcji  korelacji wzajemnej dla sygnałów policzonych w punkcie A.&lt;br /&gt;
&amp;lt;li&amp;gt; Powtórzenie kroków A i B wiele (np. 1000) razy.&lt;br /&gt;
&amp;lt;li&amp;gt; Oszacowanie 95% przedziału ufności dla wartości średniej funkcji korelacji wzajemnej dla danego przesunięcia &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; korzystając z otrzymanego w kroku C empirycznego rozkładu wartości tych funkcji dla sygnałów niezależnych.  &lt;br /&gt;
&amp;lt;li&amp;gt; Powtórzenie kroków A-D dla kolejnych przesunięć &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;li&amp;gt; Sprawdzenie, dla których przesunięć &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; funkcje autokorelacji i korelacji obliczone dla oryginalnych sygnałów uzyskały wartości wyższe niż wartości progowe oszacowane dla sygnałów o losowych zależnościach.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Procedura opisana powyżej ma jednak '''zasadniczą wadę'''. Staramy się w niej oszacować poziom przypadkowych korelacji pomiędzy dwoma sygnałami dla kolejnych przesunięć &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt;, co jest niczym innym jak wielokrotnym powtórzeniem pewnego testu. Obserwowanie korelacji dla wielu par kanałów równocześnie również prowadzi do zwiększenia szansy na zaobserwowanie ekstremalnie dużych fluktuacji.&lt;br /&gt;
Występuje tu zatem ''problem wielokrotnych porównań''.&lt;br /&gt;
Przypominamy, iż może to doprowadzić do przypadkowego uznania wyników jako &amp;amp;bdquo;istotnych&amp;amp;rdquo; statystycznie. Np. jeśli pojedynczy test wykonujemy na poziomie istotności 5% to dopuszczamy odrzucenie w 1 przypadku na 20 hipotezy zerowej pomimo, iż jest ona prawdziwa. Z drugiej jednak strony, jeśli powtórzymy wykonywany test 20 razy, to oczekujemy uzyskania 1 przypadku, w którym poziom ''p'' będzie mniejszy od 5% co jest przesłanką za odrzuceniem hipotezy zerowej. &lt;br /&gt;
&lt;br /&gt;
W przypadku wykonywania serii testów należałoby więc zastosować odpowiednie poprawki, np. [http://www.bmj.com/content/310/6973/170.full korektę Bonferroniego] czy [http://en.wikipedia.org/wiki/False_discovery_rate false discovery rate (FDR)]. Innym rozwiązaniem w analizowanym przez nas problemie jest zastosowanie tzw. statystyk wartości ekstremalnych, które prowadzą do następujących zmian w procedurze:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol type=&amp;quot;A&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;	Losowa zmiana kolejności próbek w analizowanych sygnałach (we wszystkich analizowanych kanałach). Jeżeli pomiędzy dwoma sygnałami istnieją jakieś zależności, losowa zamiana próbek doprowadzi do zniszczenia tych związków. W ten sposób uzyskujemy sygnały, które teoretycznie są nieskorelowane.&lt;br /&gt;
&amp;lt;li&amp;gt;	Obliczenie funkcji korelacji dla sygnałów otrzymanych w punkcie A.&lt;br /&gt;
&amp;lt;li&amp;gt;    Zapamiętanie maksymalnej wartości bezwzględnej funkcji korelacji z punktu B (maksimum bierzemy po wszystkich przesunięciach i po wszystkich parach kanałów; dla funkcji autokorelacji, ze względu na jej normalizację do 1 dla zerowego przesunięcia, tam maksymalnych wartości poszukujemy dla przesunięć innych niż 0).&lt;br /&gt;
&amp;lt;li&amp;gt;	Powtórzenie kroków A-C 1000 razy. Uzyskamy w ten sposób rozkład maksymalnych wartości funkcji korelacji możliwych do zaobserwowania dla sygnałów niezależnych.&lt;br /&gt;
&amp;lt;li&amp;gt;    Wyznaczenie 95 centyla rozkładu wartości maksymalnych.&lt;br /&gt;
&amp;lt;li&amp;gt;	Nałożenie na rysunki funkcji korelacji uzyskane w Zadaniu 2 poziomych linii symbolizujących poziom zależności dwóch sygnałów o losowych zależnościach i sprawdzenie, dla których przesunięć &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; wartości funkcji korelacji przekraczają estymowane progi istotności statystycznej.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Plik:Korelacje_wzajemne.png|700px|center|thumb|&amp;lt;figure id=&amp;quot;uid9&amp;quot; /&amp;gt;Przykład wyniku analizy korelacji wzajemnych dla sygnału niefiltrowanego z naniesionymi granicami możliwych fluktuacji.]]&lt;br /&gt;
&lt;br /&gt;
==Wzajemna gęstość widmowa sygnałów==&lt;br /&gt;
&lt;br /&gt;
Podobnie jak w przypadku twierdzenia Chinczyna dla pojedynczego sygnału, możliwe jest policzenie transformaty Fouriera funkcji kowariancji. Uzyskana w ten sposób wielkość nazywa się funkcją wzajemnej gęstości mocy widmowej sygnału:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid122&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
S_{xy}(f) = \int _{-\infty }^{\infty }\gamma_{xy}(\tau )e^{-2\pi i f \tau}d\tau &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W celu dalszego omówienia własności funkcji wzajemnej mocy widmowej sygnałów funkcję tę zapiszemy w postaci:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid123&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
S_{xy}(f) = |S_{xy}(f)|e^{i\phi _{xy}(f)}\\&lt;br /&gt;
\\&lt;br /&gt;
\phi _{xy} = \arg(S_{xy}) &lt;br /&gt;
\end{array} &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&amp;lt;!-- \mathrm{arc\,tg}\left[\frac{\mathrm{Im}(S_{xy}(f))}{\mathrm{Re}(S_{xy}(f))}\right]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wartość bezwzględna funkcji wzajemnej gęstości mocy widmowej osiąga największą wartość dla '''częstości''', w których sygnały &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;y(t)&amp;lt;/math&amp;gt; są ze sobą skorelowane. Funkcja wzajemnej mocy widmowej sygnałów pozbawiona jest zatem wady, która charakteryzowała funkcję korelacji, to jest problemu z wyznaczeniem czasu transmisji sygnału, w przypadku gdy czas ten zależał od częstości. Przy pomocy funkcji wzajemnej mocy widmowej, czas ten można oszacować przy pomocy fazy tej funkcji &amp;amp;mdash; &amp;lt;math&amp;gt;\phi _{xy}(f)&amp;lt;/math&amp;gt;. Jeśli funkcja wzajemnej mocy widmowej została wyznaczona pomiędzy sygnałami na wejściu i wyjściu układu liniowego, to faza ta reprezentuje przesunięcie fazowe sygnału przy przejściu przez układ. Czas tego przejścia można oszacować za pomocą następującej wyrażenia:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid124&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\tau = \frac{\phi _{xy}(f)}{2\pi f}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Podobnie jak w przypadku funkcji autokorelacji i korelacji wzajemnej, funkcję wzajemnej gęstości mocy widmowej można znormalizować:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid125&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
C_{xy}(f) = \frac{S_{xy}(f)}{\sqrt{S_x(f)S_y(f)}}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Znormalizowaną postać funkcji wzajemnej gęstości mocy widmowej nazywamy funkcją ''koherencji''. &lt;br /&gt;
Koherencja jest wielkością zespoloną. Faza koherencji odzwierciedla różnicę faz pomiędzy dwoma sygnałami. Moduł koherencji reprezentuje stopień synchronizacji sygnałów i zawiera się w przedziale od 0.0 do 1.0. Moduł tej funkcji zawiera się w przedziale od 0 do 1. Wartości 0 odpowiada brak synchronizacji pomiędzy sygnałami, zaś wartości 1 pełna synchronizacja dwóch przebiegów czasowych. Należy również zwrócić uwagę na nazewnictwo - często sam moduł koherencji określany jest jako koherencja, w literaturze anglojęzycznej moduł koherencji posiada jednak odrębną nazwę: Magnitude Square Coherence (MSC). Istotny jest również sposób estymacji modułu koherencji, który wyprowadzono w następnym rozdziale, zaś sam estymator reprezentuje wzór (36).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadanie 5===&lt;br /&gt;
Zaimplementuj funkcję obliczającą wzajemną gęstość widmową dla pary kanałów. &lt;br /&gt;
&amp;lt;!--Niech argumentami tej funkcji będą dwa wektory zawierające sygnały, zakres częstości, częstość próbkowania. --&amp;gt;&lt;br /&gt;
Oblicz i narysuj macierz gęstości widmowych (własnych i wzajemnych) dla kolejnych par kanałów (tych samych co w zadaniu 3). Wyniki zaprezentuj w postaci kwadratowej macierzy rysunków. Ponieważ są to funkcje zespolone, dobrze jest zaprezentować osobno ich wartość i fazę. Uzyskane wartości bezwzględne narysuj nad przekątną tej macierzy, a fazę pod przekątną.&lt;br /&gt;
&lt;br /&gt;
===Zadanie 6===&lt;br /&gt;
Przygotuj sygnał dwukanałowy, w którym jako pierwszy sygnał wybierz fragment sygnału EEG (z danych zebranych wcześniej) o długości 2000 próbek, a jako drugiego sygnału użyj tego samego fragmentu EEG, ale opóźnionego o wybraną liczbę (1 - 5) próbek. Oblicz widma wzajemne tych sygnałów i zaprezentuj ich fazy na rysunku. Na podstawie tych widm znajdź wartość przesunięcia czasowego tych sygnałów.&lt;br /&gt;
&lt;br /&gt;
Obliczenia powtórz w przypadku, gdy do drugiego sygnału dodany będzie szum o wariancji równej 0,25 wariancji oryginalnego sygnału.&lt;/div&gt;</summary>
		<author><name>Maciek</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG_2/EEG_wlasno%C5%9Bci_EEG_spoczynkowego&amp;diff=11180</id>
		<title>Pracownia EEG 2/EEG wlasności EEG spoczynkowego</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG_2/EEG_wlasno%C5%9Bci_EEG_spoczynkowego&amp;diff=11180"/>
		<updated>2024-11-22T15:57:58Z</updated>

		<summary type="html">&lt;p&gt;Maciek: /* Polecenie */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Pracownia EEG 2|Pracownia EEG 2]] / Własności EEG spoczynkowego: funkcja autokorelacji i widmo&lt;br /&gt;
&lt;br /&gt;
=Estymacja funkcji autokowariancji, autokorelacji i koherencji sygnału.=&lt;br /&gt;
==Wstęp==&lt;br /&gt;
Z funkcjami tymi spotkaliśmy się już na zajęciach z [[Ćwiczenia_4|analizy sygnałów]].&lt;br /&gt;
&lt;br /&gt;
Funkcja autokowariancji sygnału charakteryzuje liniową zależność wartości tego sygnału w danej określonej chwili czasu od wartości (tego samego sygnału) w innej chwili.&lt;br /&gt;
W przypadku [[Nieparametryczne_widmo_mocy#Sygna.C5.82y_stochastyczne  | stacjonarnych procesów stochastycznych]], przebieg tej funkcji nie zależy od czasu. &lt;br /&gt;
Oznacza to, że obliczając funkcję autokorelacji sygnału pomiędzy chwilą czasu &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;x(t+\tau )&amp;lt;/math&amp;gt; otrzymamy tę samą wartość, jak dla przypadku obliczania funkcji autokorelacji pomiędzy momentami &amp;lt;math&amp;gt;x(t + T)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;x(t + T+\tau )&amp;lt;/math&amp;gt;, gdzie &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; to dowolny przedział czasu. Innymi słowy, funkcja autokorelacji procesu stacjonarnego zależy tylko od odstępu czasu pomiędzy próbkami &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt;, dla którego jest wyznaczana, a nie od konkretnej chwili czasu. Odrębną klasę sygnałów stanowią procesy niestacjonarne, w przypadku których funkcja autokorelacji będzie zależeć od czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; w którym jest obliczana. Estymator funkcji autokowariancji uzyskuje się poprzez obliczanie iloczynów wartości sygnału &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; w chwilach czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; czyli &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; i wartości sygnału &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; w chwili czasu ''t''+&amp;amp;tau; czyli &amp;lt;math&amp;gt;x(t+\tau)&amp;lt;/math&amp;gt; i uśredniając wartości iloczynów po czasie &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid79&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma (\tau) = \mathrm{cov}(x(t),x(t-\tau ))=\mathrm{E}[(x(t)-\mu )(x(t-\tau )-\mu )]&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(1)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid80&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\mu = \mathrm{E}[x(t)]&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(2)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W przypadku sygnałów ciągłych estymatę tę można zapisać w poniższy sposób:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid81&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma (\tau ) = \frac{1}{T}\int _0^{T}(x(t)-\mu )(x(t-\tau )-\mu )dt&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(3)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
natomiast dla sygnałów dyskretnych jako:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid82&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma (k) = \frac{1}{N-1}\sum _{i=1}^{N-|k|}(x(i+k)-x_s)(x(i)-x_s)&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(4)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid83&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
x_s = \frac{\sum _{i=1}^{N}x(i)}{N}&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(5)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcja autokowariancji może osiągać dowolne wartości, dlatego aby można było porównać przebieg tej funkcji np. pomiędzy dwoma sygnałami, wprowadzono wersję znormalizowaną tej funkcji &amp;amp;mdash; ''funkcję autokorelacji''. Normalizacja ta wygląda następująco:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid84&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\rho (k) = \frac{\gamma (\tau )}{\sigma^2}&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(6)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid85&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\sigma ^2 = \mathrm{E}[(x(t)-\mu )^2]&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(7)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wariancję sygnału (&amp;lt;math&amp;gt;\gamma (0)=\sigma ^2&amp;lt;/math&amp;gt;) można wyrazić przez funkcję autokowariancji dla przesunięcia &amp;lt;math&amp;gt;\tau =0&amp;lt;/math&amp;gt;.  Wynika z tego, że funkcja korelacji przyjmuje wartości z zakresu [&amp;amp;minus;1,&amp;amp;nbsp;1]. Ostatecznie estymator funkcji autokorelacji można zapisać jak poniżej:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid86&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\rho(k) = \frac{\gamma (k)}{\gamma (0)}&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(8)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcję autokorelacji estymuje się w celu określenia, w jakim stopniu wartości sygnału w danej chwili czasu wpływają na wartości sygnału w kolejnych chwilach czasu. Ma to kluczowe znaczenie przy rozpoznawaniu rodzaju procesów fizycznych odpowiedzialnego za generowanie sygnału. Funkcja ta zawsze mam maksimum dla przesunięcia &amp;lt;math&amp;gt;\tau =0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cechą charakterystyczną funkcji autokorelacji jest to, iż w przypadku sygnałów harmonicznych, przebieg funkcji ma charakter okresowy, z okresem takim samym jak okres badanego sygnału. W przypadku szumu, funkcja autokorelacji ma kształt funkcji delta Diraca.&lt;br /&gt;
&lt;br /&gt;
==Polecenie:==&lt;br /&gt;
Do policzenia funkcji autokorelacji posłużymy się funkcją biblioteczną &amp;lt;tt&amp;gt;numpy.correlate&amp;lt;/tt&amp;gt;. Funkcja ta, wbrew nazwie, oblicza wyłącznie splot swoich dwóch pierwszych argumentów wywołania. Musimy je więc przystosować do obliczenia wielkości zgodnie ze wzorem (4).&lt;br /&gt;
&lt;br /&gt;
Zaimplementuj funkcję do obliczania funkcji korelacji zgodnie ze wzorem (4). Funkcja powinna przyjmować jako parametry dwa wektory&amp;lt;!--i maksymalne przesunięcie wzajemne tych wektorów--&amp;gt;, a zwracać wektor zawierający ich funkcję autokorelacji. &lt;br /&gt;
&lt;br /&gt;
Wywołanie przykładowe:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
print koreluj(a,a)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
powinno dać wynik:&lt;br /&gt;
 [-0.5  0.   1.   0.  -0.5]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
# Średnia&lt;br /&gt;
mean = numpy.mean(data)&lt;br /&gt;
mean2 = numpy.mean(data2)&lt;br /&gt;
&lt;br /&gt;
# Wariancja&lt;br /&gt;
var = numpy.var(data)&lt;br /&gt;
var2 = numpy.var(data2)&lt;br /&gt;
&lt;br /&gt;
# Dane po odjęciu średnich&lt;br /&gt;
ndata = data - mean&lt;br /&gt;
ndata2 = data2 - mean2&lt;br /&gt;
&lt;br /&gt;
# Splot&lt;br /&gt;
acorr = numpy.correlate(ndata, ndata2, 'full')&lt;br /&gt;
&lt;br /&gt;
# Normalizacja kowariancji do korelacji i przez 1/N&lt;br /&gt;
acorr = acorr / numpy.sqrt(var*var2) / len(ndata)&lt;br /&gt;
&lt;br /&gt;
print(acorr)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{{hidden begin|title=Przykładowe rozwiązanie:}}--&amp;gt;&lt;br /&gt;
 &amp;lt;!-- &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
def koreluj_pol(x,y,max_tau):&lt;br /&gt;
    x = x - np.mean(x)&lt;br /&gt;
    y = y - np.mean(y)&lt;br /&gt;
    N= len(x)&lt;br /&gt;
    cor = np.zeros(max_tau+1)&lt;br /&gt;
    cor[0] = np.sum(x[:]*y[:]) &lt;br /&gt;
    for i in range(1,max_tau+1):&lt;br /&gt;
        cor[i] = np.sum(x[i:]*y[:-i])&lt;br /&gt;
        &lt;br /&gt;
    cor = cor /(N-1)&lt;br /&gt;
    return cor&lt;br /&gt;
&lt;br /&gt;
def koreluj(x,y,max_tau):&lt;br /&gt;
    cor = np.zeros(2*max_tau+1)    &lt;br /&gt;
    cor[max_tau:] = koreluj_pol(x,y,max_tau)&lt;br /&gt;
    tmp = koreluj_pol(y,x,max_tau)&lt;br /&gt;
    cor[:max_tau+1] = tmp[-1::-1]&lt;br /&gt;
    return cor    &lt;br /&gt;
    &lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    print koreluj(a,a,i)&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
b = np.array([-1,-2,-3])&lt;br /&gt;
&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    print koreluj(a,b,i)&lt;br /&gt;
    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zadanie 1: Pomiar sygnału EEG ==&lt;br /&gt;
&lt;br /&gt;
Zarejestruj 10 minut sygnału EEG, w trakcie których badana osoba będzie siedziała z otwartymi oczami oraz kolejne 10 minut w stanie czuwania z zamkniętymi oczami. Rejestrację należy wykonać na pełnym czepku 10-20 z częstością próbkowania 128 Hz. &lt;br /&gt;
&lt;br /&gt;
==Zadanie 2:  Funkcje autokowariancji i autokorelacji==&lt;br /&gt;
W tym zadaniu posłużymy się sygnałami zarejestrowanymi w punkcie 3. poprzedniego ćwiczenia. Zaobserwuj, na którym kanale rytm alfa osiąga najwyższą wartość. Następnie zaimplementuj w Pythonie następujące kroki:&lt;br /&gt;
&lt;br /&gt;
#	Wczytaj dane z wybranego kanału.&lt;br /&gt;
#	Oblicz funkcję autokorelacji dla sygnału zarejestrowanego w warunkach, gdy osoba badana siedziała z otwartymi oczami. Narysuj autokorelogram, to jest wykres wartości funkcji autokorelacji względem przesunięcia &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt;. Oś &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; wyskaluj w sekundach.&lt;br /&gt;
#	Powtórz krok 2, tym razem dla sygnału zebranego w warunkach czuwania z zamkniętymi oczami.&lt;br /&gt;
#	Porównaj autokorelogramy.&lt;br /&gt;
&lt;br /&gt;
=Związek autokorelacji z widmem sygnału=&lt;br /&gt;
==Wstęp==&lt;br /&gt;
Zgodnie z twierdzeniem Chinczyna, z którym zapoznaliśmy się na wykładzie z [[Twierdzenie_Wienera-Chinczyna|Analizy Sygnałów]], widmową gęstość mocy sygnału można policzyć jako transformatę Fouriera funkcji autokowariancji:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid93&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
S(f) = \int _{-\infty }^{\infty }\gamma (\tau )e^{-2\pi i f \tau}d\tau &amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(9)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	&amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; &amp;amp;mdash; częstość&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	&amp;lt;math&amp;gt;S(f)&amp;lt;/math&amp;gt; &amp;amp;mdash;  gęstość widmowa mocy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Poniższy kod ilustruje to twierdzenie:&lt;br /&gt;
&amp;lt;source lang = py&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
from numpy.fft import rfft,fft,fftfreq,fftshift&lt;br /&gt;
 &lt;br /&gt;
def widmo_mocy(s, Fs):&lt;br /&gt;
    '''Funkcja licąca widmo mocy metodą periodogramu,&lt;br /&gt;
	pobiera sygnał i częstość próbkowania&lt;br /&gt;
	zwraca widmo mocy i oś częstości&lt;br /&gt;
    '''&lt;br /&gt;
    S = fft(s)/np.sqrt(len(s))&lt;br /&gt;
    S_moc = S*S.conj()&lt;br /&gt;
    S_moc = S_moc.real&lt;br /&gt;
    F = fftfreq(len(s), 1/Fs)&lt;br /&gt;
    return (fftshift(S_moc),fftshift(F))&lt;br /&gt;
 &lt;br /&gt;
def sin(f = 1, T = 1, Fs = 128, phi =0 ):&lt;br /&gt;
    '''sin o zadanej częstości (w Hz), długości, fazie i częstości próbkowania&lt;br /&gt;
    Domyślnie wytwarzany jest sygnał reprezentujący &lt;br /&gt;
    1 sekundę sinusa o częstości 1Hz i zerowej fazie próbkowanego 128 Hz&lt;br /&gt;
    '''&lt;br /&gt;
    dt = 1.0/Fs&lt;br /&gt;
    t = np.arange(0,T,dt)&lt;br /&gt;
    s = np.sin(2*np.pi*f*t + phi)&lt;br /&gt;
    return (s,t)&lt;br /&gt;
 &lt;br /&gt;
# sygnał próbny będzie próbkowany z częstością FS&lt;br /&gt;
FS = 100.0&lt;br /&gt;
# sygnałem próbnym będzie sinusoida o częstości f &lt;br /&gt;
(s,t) = sin(f=10.5,Fs=FS)&lt;br /&gt;
# obliczamy moc i energię sygnału w dziedzinie czasu&lt;br /&gt;
moc_w_czasie = s**2&lt;br /&gt;
energia_w_czasie = np.sum(moc_w_czasie)&lt;br /&gt;
print 'energia w czasie: ', energia_w_czasie&lt;br /&gt;
 &lt;br /&gt;
# obliczamy widmo mocy sygnału i jego energię estymowaną w dziedzinie częstości&lt;br /&gt;
(moc_w_czestosci, F) = widmo_mocy(s, Fs=FS)&lt;br /&gt;
energia_w_czestosci = np.sum(moc_w_czestosci)&lt;br /&gt;
print 'energia w czestosci: ', energia_w_czestosci&lt;br /&gt;
 &lt;br /&gt;
# estymujemy funkcję autokorelacji sygnału&lt;br /&gt;
ak = 1./(2*len(s)-1)*np.correlate(s,s,'full')&lt;br /&gt;
&lt;br /&gt;
# estymujemy widmo mocy i energię sygnału z twierdzenia Chinczyna korzystając z funkcji fft:&lt;br /&gt;
moc_chi = np.abs(fft(ak))&lt;br /&gt;
energia_chin = sum(moc_chi)&lt;br /&gt;
print 'energia z tw. Chinczyna przez fft: ', energia_chin&lt;br /&gt;
 &lt;br /&gt;
# estymujemy widmo mocy i energię sygnału z twierdzenia Chinczyna korzystając z jawnej postaci transformaty Fouriera:&lt;br /&gt;
FF = np.linspace(-FS/2,FS/2,1000)&lt;br /&gt;
M = np.zeros(len(FF),dtype='complex')&lt;br /&gt;
 &lt;br /&gt;
for i,f in enumerate( FF):&lt;br /&gt;
    for tau in range(len(ak)):&lt;br /&gt;
        M[i] += ak[tau]*np.exp(2*np.pi*1j*f*(len(ak)-tau)/FS) &lt;br /&gt;
M = np.abs(M)&lt;br /&gt;
energia_chin_sum = np.sum(M)* (len(ak)/len(FF))&lt;br /&gt;
print 'energia z tw. Chinczyna przez sumowanie: ', energia_chin_sum&lt;br /&gt;
&lt;br /&gt;
# Rysunki&lt;br /&gt;
py.figure(1)&lt;br /&gt;
py.subplot(3,1,1)&lt;br /&gt;
py.plot(t,s)&lt;br /&gt;
py.title(u'Sygnal')&lt;br /&gt;
py.subplot(3,1,2)&lt;br /&gt;
py.plot(t,moc_w_czasie)&lt;br /&gt;
py.title(u'moc w czasie')&lt;br /&gt;
py.subplot(3,1,3)&lt;br /&gt;
py.plot(F,moc_w_czestosci)&lt;br /&gt;
py.title(u'moc w czestosci')&lt;br /&gt;
 &lt;br /&gt;
py.figure(2)&lt;br /&gt;
py.subplot(3,1,1)&lt;br /&gt;
py.title('f. autokowariancji')&lt;br /&gt;
py.plot(np.arange(-len(ak)/2,len(ak)/2,1)/FS ,ak)&lt;br /&gt;
py.subplot(3,1,2)&lt;br /&gt;
py.plot(fftshift(fftfreq(len(moc_chi),1./FS)),fftshift(moc_chi))&lt;br /&gt;
py.title('widmo mocy z Tw. Chinczyna przez fft')&lt;br /&gt;
py.subplot(3,1,3)&lt;br /&gt;
py.plot(FF,M)&lt;br /&gt;
py.title('widmo mocy z Tw. Chinczyna przez sumowanie')&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W wyniku powinniśmy zobaczyć w terminalu:&lt;br /&gt;
 energia w czasie:  50.0&lt;br /&gt;
 energia w czestosci:  50.0&lt;br /&gt;
 energia z tw. Chinczyna przez fft:  50.0&lt;br /&gt;
 energia z tw. Chinczyna przez sumowanie:  49.9501172217&lt;br /&gt;
&lt;br /&gt;
oraz powinny pojawić się rysunki:&lt;br /&gt;
[[Plik:Fig_chinczyn1.png|thumb 200 px|center]]&lt;br /&gt;
[[Plik:Fig_chinczyn2.png|thumb 200 px|center]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Polecenie ==&lt;br /&gt;
Zaimplementuj funkcję obliczającą transformację Fouriera dyskretyzując wzór (9) dla zadanego wektora częstości &amp;lt;tt&amp;gt;f&amp;lt;/tt&amp;gt; i zadanej częstości próbkowania sygnału (tutaj: 10).&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Wywołanie przykładowe:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
t= np.arange(0,1,0.1)&lt;br /&gt;
x = np.sin(2*np.pi*2*t)&lt;br /&gt;
f = np.arange(-5,5,1)&lt;br /&gt;
X,f = fourier(x,f,10.0)&lt;br /&gt;
print X&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Natomiast wywołanie:&lt;br /&gt;
&amp;lt;source lang ='python'&amp;gt;&lt;br /&gt;
t= np.arange(0,1,0.1)&lt;br /&gt;
x = np.sin(2*np.pi*2*t)&lt;br /&gt;
f = np.arange(-5,5,0.01)&lt;br /&gt;
X = fourier(x,f,10.0)&lt;br /&gt;
py.plot(f,np.abs(X))&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Powinno wytworzyć rysunek:&lt;br /&gt;
&lt;br /&gt;
[[Plik:Fourier_test.png]] &lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
import numpy as np&lt;br /&gt;
import pylab as py&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def koreluj_pol(x,y,max_tau):&lt;br /&gt;
    x = x - np.mean(x)&lt;br /&gt;
    y = y - np.mean(y)&lt;br /&gt;
    N= len(x)&lt;br /&gt;
    cor = np.zeros(max_tau+1)&lt;br /&gt;
    cor[0] = np.sum(x[:]*y[:]) &lt;br /&gt;
    for i in range(1,max_tau+1):&lt;br /&gt;
        cor[i] = np.sum(x[i:]*y[:-i])&lt;br /&gt;
        &lt;br /&gt;
    cor = cor /(N)&lt;br /&gt;
    return cor&lt;br /&gt;
&lt;br /&gt;
def koreluj(x,y,max_tau):&lt;br /&gt;
    cor = np.zeros(2*max_tau+1)    &lt;br /&gt;
    cor[max_tau:] = koreluj_pol(x,y,max_tau)&lt;br /&gt;
    tmp = koreluj_pol(y,x,max_tau)&lt;br /&gt;
    cor[:max_tau+1] = tmp[-1::-1]&lt;br /&gt;
    return cor  &lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
def fourier_chin(x, FF, FS):&lt;br /&gt;
    ak = koreluj(x,x,len(x)-1)&lt;br /&gt;
    M = np.zeros(len(FF),dtype='complex') &lt;br /&gt;
    for i,f in enumerate( FF):&lt;br /&gt;
        for tau in range(len(ak)):&lt;br /&gt;
	    M[i] += ak[tau]*np.exp(-2*np.pi*1j*f*( tau- len(x))/FS)&lt;br /&gt;
    #M/=np.sqrt(len(ak))&lt;br /&gt;
    return M&lt;br /&gt;
    &lt;br /&gt;
def fourier(ak, FF, FS):&lt;br /&gt;
   &lt;br /&gt;
    M = np.zeros(len(FF),dtype='complex') &lt;br /&gt;
    for i,f in enumerate( FF):&lt;br /&gt;
        for tau in range(len(ak)):&lt;br /&gt;
	    M[i] += ak[tau]*np.exp(-2*np.pi*1j*f*( tau)/FS)&lt;br /&gt;
    M/=np.sqrt(len(ak))&lt;br /&gt;
    return M&lt;br /&gt;
t= np.arange(0,1,0.05)&lt;br /&gt;
x = np.sin(2*np.pi*2*t)&lt;br /&gt;
f = np.arange(-5,5,0.01)&lt;br /&gt;
&lt;br /&gt;
X = fourier_chin(x,f,10.0)&lt;br /&gt;
Xf = fourier(x,f,10.0)&lt;br /&gt;
print X&lt;br /&gt;
py.plot(f,np.abs(X), f,np.abs(Xf)**2)&lt;br /&gt;
py.show()&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zadanie 3: Związek autokorelacji z widmem sygnału==&lt;br /&gt;
Oblicz gęstość widmową mocy sygnału zarejestrowanego w trakcie czuwania z zamkniętymi oczami, korzystając z twierdzenia Chinczyna oraz [[Nieparametryczne_widmo_mocy#Metoda_Welcha | metodą Welcha]].&lt;br /&gt;
Znajdź częstość rytmu &amp;amp;alpha; dla osoby, która była badana.&lt;br /&gt;
&lt;br /&gt;
==Funkcja kowariancji (wzajemnej)==&lt;br /&gt;
&lt;br /&gt;
W celu scharakteryzowania zależności wzajemnej dwóch sygnałów losowych, stosuje się funkcję kowariancji, zdefiniowaną w następujący sposób:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid98&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy} (\tau ) = \mathrm{cov}(x(t),y(t-\tau ))=\mathrm{E}[(x(t)-\mu _x)(y(t-\tau )-\mu _y)]&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid99&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\mu _x = \mathrm{E}[x(t)]\\&lt;br /&gt;
\mu _y = \mathrm{E}[y(t)]\\ \end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W przypadku sygnałów ciągłych estymatę tę można zapisać w poniższy sposób:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid100&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy} (\tau ) = \frac{1}{T}\int _0^{T}(x(t)-\mu_x)(y(t-\tau)-\mu_y)dt&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
natomiast dla sygnałów dyskretnych jako:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid101&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy}(k) = \frac{1}{N-1}\sum _{i=0}^{N-k}(x(i+k)-x_s)(y(i)-y_s)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W odróżnieniu od funkcji autokowariancji, funkcja kowariancji nie musi mieć maksimum dla przesunięcia &amp;lt;math&amp;gt;\tau =0&amp;lt;/math&amp;gt;. Ponadto posiada ona następującą cechę:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid102&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy}(-\tau ) = \gamma _{yx}(\tau )&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcję kowariancji można znormalizować:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid103&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\rho (\tau) = \frac{\mathrm{E}[(x(t)-\mu _x)(y(t-\tau )-\mu _y)]}{\sqrt{\mathrm{E}[(x(t)-\mu _x)^2]\mathrm{E}[(y(t)-\mu _y)^2]}} = \frac{\gamma _{xy}}{\sigma_x\sigma_y}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
Otrzymaną funkcję nazywamy funkcją korelacji.&lt;br /&gt;
Jednym z zastosowań funkcji korelacji jest wyznaczanie czasu przejścia sygnału przez dany układ liniowy. Funkcja korelacji pomiędzy sygnałem na wejściu układu i sygnałem na jego wyjściu osiągnie wartość maksymalną dla przesunięcia &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; równego czasowi, jaki potrzebował sygnał na pokonanie danego układu. Niestety, taka metoda wyznaczania opóźnienia obarczona jest pewną wadą &amp;amp;mdash; w przypadku gdy prędkość sygnału bądź jego droga zależą od częstości, wtedy na wykresie funkcji korelacji nie uzyskamy wyraźnego maksimum.&lt;br /&gt;
&lt;br /&gt;
=====Polecenie =====&lt;br /&gt;
Zaimplementuj funkcję obliczającą funkcję kowariancji dla różnych sygnałów ''x'' i ''y'' (równanie 13) skorzystaj przy tym z własności opisanej równaniem (14). &lt;br /&gt;
Przykładowe wywołanie:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
b = np.array([-1,-2,-3])&lt;br /&gt;
&lt;br /&gt;
print koreluj(a,b)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
powinno dać w wyniku:&lt;br /&gt;
 [ 0.5 0.  -1.   0.   0.5]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
{{hidden begin|title=Przykładowe rozwiązanie:}}&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import pylab as py&lt;br /&gt;
&lt;br /&gt;
def koreluj(x,y,max_tau):&lt;br /&gt;
    x = x - np.mean(x)&lt;br /&gt;
    y = y - np.mean(y)&lt;br /&gt;
    cor = np.zeros(2*max_tau+1)&lt;br /&gt;
    cor[max_tau] = np.sum(x[:]*y[:]) &lt;br /&gt;
    for i in range(1,max_tau+1):&lt;br /&gt;
        cor[max_tau+i] = np.sum(x[i:]*y[:-i])&lt;br /&gt;
        cor[max_tau-i] = np.sum(y[i:]*x[:-i])&lt;br /&gt;
    N= len(x)&lt;br /&gt;
    cor = cor /(N-1)&lt;br /&gt;
    return cor&lt;br /&gt;
&lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
b = np.array([-1,-2,-3])&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    print koreluj(a,b,i)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}} --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadanie 4===&lt;br /&gt;
Z danych zarejestrowanych w trakcie czuwania z zamkniętymi oczami wybierz sygnały z następujących kanałów: Fp1, P3, Pz, P4, Fp2, O1, O2.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Dla każdego kanału oblicz funkcję autokorelacji, zaś  dla każdej pary kanałów oblicz funkcję korelacji wzajemnej. Wyniki zaprezentuj w formie kwadratowej macierzy wykresów (za pomocą funkcji subplot, tak jak na przykładowym rys. (rys. &amp;lt;xr id=&amp;quot;uid9&amp;quot;&amp;gt; %i&amp;lt;/xr&amp;gt;)). Na przekątnej macierzy narysuj funkcję autokorelacji odpowiednich kanałów, poza przekątną &amp;amp;mdash; funkcję korelacji wzajemnej. Wskaż kanały, które są najbardziej skorelowane ze sobą. Czy możliwe jest wyznaczenie opóźnienia sygnału pomiędzy tymi kanałami?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Powtórz punkt 1, tym razem jednak funkcję autokorelacji i korelacji wzajemnej oblicz na sygnałach przefiltrowanych filtrem wąskopasmowym w paśmie alfa charakterystycznym dla badanej osoby. ([[%C4%86wiczenia_7#Funkcje_do_projektowania_filtr.C3.B3w_IIR_dost.C4.99pne_w_module_scipy.signal|przypomnienie konstrukcji filtrów]])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Oszacuj istotność statystyczną zależności między parami kanałów. Twoją hipotezą zerową jest brak istotnej korelacji pomiędzy sygnałami zarejestrowanymi przez dwie różne elektrody EEG. Hipoteza alternatywna to występowanie zależności pomiędzy tymi sygnałami. Podanie estymatorów wariancji funkcji korelacji jest bardzo trudne, dlatego jednym ze sposobów oszacowania progu powyżej którego wartość funkcji korelacji można byłoby uznać za istotną statystycznie, jest zastosowanie metody ''bootstrap''. Teoretycznie, funkcja korelacji policzona dla dwóch rzeczywistych, nieskorelowanych sygnałów, powinna wynosić 0 dla każdego przesunięcia &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt;. Tak jest jednak w przypadku sygnałów nieskończonych; w analizie sygnałów takowych nie spotkamy.&lt;br /&gt;
&lt;br /&gt;
Dokonując losowej zamiany kolejności próbek, możemy doprowadzić do wytworzenia sygnałów zależnych losowo, które jednak ze względu na skończony czas trwania, dadzą niezerową funkcję korelacji. Poziom losowych fluktuacji tej funkcji oszacujemy wykonując następujące kroki:&lt;br /&gt;
&amp;lt;ol type=&amp;quot;A&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Losowa zamiana kolejności próbek w analizowanych sygnałach. Jeżeli pomiędzy dwoma sygnałami istnieją jakieś zależności, losowa zamiana próbek doprowadzi do zniszczenia tych związków. W ten sposób uzyskujemy sygnały, które teoretycznie są nieskorelowane.&lt;br /&gt;
&amp;lt;li&amp;gt; Obliczenie funkcji  korelacji wzajemnej dla sygnałów policzonych w punkcie A.&lt;br /&gt;
&amp;lt;li&amp;gt; Powtórzenie kroków A i B wiele (np. 1000) razy.&lt;br /&gt;
&amp;lt;li&amp;gt; Oszacowanie 95% przedziału ufności dla wartości średniej funkcji korelacji wzajemnej dla danego przesunięcia &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; korzystając z otrzymanego w kroku C empirycznego rozkładu wartości tych funkcji dla sygnałów niezależnych.  &lt;br /&gt;
&amp;lt;li&amp;gt; Powtórzenie kroków A-D dla kolejnych przesunięć &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;li&amp;gt; Sprawdzenie, dla których przesunięć &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; funkcje autokorelacji i korelacji obliczone dla oryginalnych sygnałów uzyskały wartości wyższe niż wartości progowe oszacowane dla sygnałów o losowych zależnościach.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Procedura opisana powyżej ma jednak '''zasadniczą wadę'''. Staramy się w niej oszacować poziom przypadkowych korelacji pomiędzy dwoma sygnałami dla kolejnych przesunięć &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt;, co jest niczym innym jak wielokrotnym powtórzeniem pewnego testu. Obserwowanie korelacji dla wielu par kanałów równocześnie również prowadzi do zwiększenia szansy na zaobserwowanie ekstremalnie dużych fluktuacji.&lt;br /&gt;
Występuje tu zatem ''problem wielokrotnych porównań''.&lt;br /&gt;
Przypominamy, iż może to doprowadzić do przypadkowego uznania wyników jako &amp;amp;bdquo;istotnych&amp;amp;rdquo; statystycznie. Np. jeśli pojedynczy test wykonujemy na poziomie istotności 5% to dopuszczamy odrzucenie w 1 przypadku na 20 hipotezy zerowej pomimo, iż jest ona prawdziwa. Z drugiej jednak strony, jeśli powtórzymy wykonywany test 20 razy, to oczekujemy uzyskania 1 przypadku, w którym poziom ''p'' będzie mniejszy od 5% co jest przesłanką za odrzuceniem hipotezy zerowej. &lt;br /&gt;
&lt;br /&gt;
W przypadku wykonywania serii testów należałoby więc zastosować odpowiednie poprawki, np. [http://www.bmj.com/content/310/6973/170.full korektę Bonferroniego] czy [http://en.wikipedia.org/wiki/False_discovery_rate false discovery rate (FDR)]. Innym rozwiązaniem w analizowanym przez nas problemie jest zastosowanie tzw. statystyk wartości ekstremalnych, które prowadzą do następujących zmian w procedurze:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol type=&amp;quot;A&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;	Losowa zmiana kolejności próbek w analizowanych sygnałach (we wszystkich analizowanych kanałach). Jeżeli pomiędzy dwoma sygnałami istnieją jakieś zależności, losowa zamiana próbek doprowadzi do zniszczenia tych związków. W ten sposób uzyskujemy sygnały, które teoretycznie są nieskorelowane.&lt;br /&gt;
&amp;lt;li&amp;gt;	Obliczenie funkcji korelacji dla sygnałów otrzymanych w punkcie A.&lt;br /&gt;
&amp;lt;li&amp;gt;    Zapamiętanie maksymalnej wartości bezwzględnej funkcji korelacji z punktu B (maksimum bierzemy po wszystkich przesunięciach i po wszystkich parach kanałów; dla funkcji autokorelacji, ze względu na jej normalizację do 1 dla zerowego przesunięcia, tam maksymalnych wartości poszukujemy dla przesunięć innych niż 0).&lt;br /&gt;
&amp;lt;li&amp;gt;	Powtórzenie kroków A-C 1000 razy. Uzyskamy w ten sposób rozkład maksymalnych wartości funkcji korelacji możliwych do zaobserwowania dla sygnałów niezależnych.&lt;br /&gt;
&amp;lt;li&amp;gt;    Wyznaczenie 95 centyla rozkładu wartości maksymalnych.&lt;br /&gt;
&amp;lt;li&amp;gt;	Nałożenie na rysunki funkcji korelacji uzyskane w Zadaniu 2 poziomych linii symbolizujących poziom zależności dwóch sygnałów o losowych zależnościach i sprawdzenie, dla których przesunięć &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; wartości funkcji korelacji przekraczają estymowane progi istotności statystycznej.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Plik:Korelacje_wzajemne.png|700px|center|thumb|&amp;lt;figure id=&amp;quot;uid9&amp;quot; /&amp;gt;Przykład wyniku analizy korelacji wzajemnych dla sygnału niefiltrowanego z naniesionymi granicami możliwych fluktuacji.]]&lt;br /&gt;
&lt;br /&gt;
==Wzajemna gęstość widmowa sygnałów==&lt;br /&gt;
&lt;br /&gt;
Podobnie jak w przypadku twierdzenia Chinczyna dla pojedynczego sygnału, możliwe jest policzenie transformaty Fouriera funkcji kowariancji. Uzyskana w ten sposób wielkość nazywa się funkcją wzajemnej gęstości mocy widmowej sygnału:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid122&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
S_{xy}(f) = \int _{-\infty }^{\infty }\gamma_{xy}(\tau )e^{-2\pi i f \tau}d\tau &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W celu dalszego omówienia własności funkcji wzajemnej mocy widmowej sygnałów funkcję tę zapiszemy w postaci:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid123&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
S_{xy}(f) = |S_{xy}(f)|e^{i\phi _{xy}(f)}\\&lt;br /&gt;
\\&lt;br /&gt;
\phi _{xy} = \arg(S_{xy}) &lt;br /&gt;
\end{array} &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&amp;lt;!-- \mathrm{arc\,tg}\left[\frac{\mathrm{Im}(S_{xy}(f))}{\mathrm{Re}(S_{xy}(f))}\right]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wartość bezwzględna funkcji wzajemnej gęstości mocy widmowej osiąga największą wartość dla '''częstości''', w których sygnały &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;y(t)&amp;lt;/math&amp;gt; są ze sobą skorelowane. Funkcja wzajemnej mocy widmowej sygnałów pozbawiona jest zatem wady, która charakteryzowała funkcję korelacji, to jest problemu z wyznaczeniem czasu transmisji sygnału, w przypadku gdy czas ten zależał od częstości. Przy pomocy funkcji wzajemnej mocy widmowej, czas ten można oszacować przy pomocy fazy tej funkcji &amp;amp;mdash; &amp;lt;math&amp;gt;\phi _{xy}(f)&amp;lt;/math&amp;gt;. Jeśli funkcja wzajemnej mocy widmowej została wyznaczona pomiędzy sygnałami na wejściu i wyjściu układu liniowego, to faza ta reprezentuje przesunięcie fazowe sygnału przy przejściu przez układ. Czas tego przejścia można oszacować za pomocą następującej wyrażenia:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid124&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\tau = \frac{\phi _{xy}(f)}{2\pi f}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Podobnie jak w przypadku funkcji autokorelacji i korelacji wzajemnej, funkcję wzajemnej gęstości mocy widmowej można znormalizować:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid125&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
C_{xy}(f) = \frac{S_{xy}(f)}{\sqrt{S_x(f)S_y(f)}}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Znormalizowaną postać funkcji wzajemnej gęstości mocy widmowej nazywamy funkcją ''koherencji''. &lt;br /&gt;
Koherencja jest wielkością zespoloną. Faza koherencji odzwierciedla różnicę faz pomiędzy dwoma sygnałami. Moduł koherencji reprezentuje stopień synchronizacji sygnałów i zawiera się w przedziale od 0.0 do 1.0. Moduł tej funkcji zawiera się w przedziale od 0 do 1. Wartości 0 odpowiada brak synchronizacji pomiędzy sygnałami, zaś wartości 1 pełna synchronizacja dwóch przebiegów czasowych. Należy również zwrócić uwagę na nazewnictwo - często sam moduł koherencji określany jest jako koherencja, w literaturze anglojęzycznej moduł koherencji posiada jednak odrębną nazwę: Magnitude Square Coherence (MSC). Istotny jest również sposób estymacji modułu koherencji, który wyprowadzono w następnym rozdziale, zaś sam estymator reprezentuje wzór (36).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadanie 5===&lt;br /&gt;
Zaimplementuj funkcję obliczającą wzajemną gęstość widmową dla pary kanałów. &lt;br /&gt;
&amp;lt;!--Niech argumentami tej funkcji będą dwa wektory zawierające sygnały, zakres częstości, częstość próbkowania. --&amp;gt;&lt;br /&gt;
Oblicz i narysuj macierz gęstości widmowych (własnych i wzajemnych) dla kolejnych par kanałów (tych samych co w zadaniu 3). Wyniki zaprezentuj w postaci kwadratowej macierzy rysunków. Ponieważ są to funkcje zespolone, dobrze jest zaprezentować osobno ich wartość i fazę. Uzyskane wartości bezwzględne narysuj nad przekątną tej macierzy, a fazę pod przekątną.&lt;br /&gt;
&lt;br /&gt;
===Zadanie 6===&lt;br /&gt;
Przygotuj sygnał dwukanałowy, w którym jako pierwszy sygnał wybierz fragment sygnału EEG (z danych zebranych wcześniej) o długości 2000 próbek, a jako drugiego sygnału użyj tego samego fragmentu EEG, ale opóźnionego o wybraną liczbę (1 - 5) próbek. Oblicz widma wzajemne tych sygnałów i zaprezentuj ich fazy na rysunku. Na podstawie tych widm znajdź wartość przesunięcia czasowego tych sygnałów.&lt;br /&gt;
&lt;br /&gt;
Obliczenia powtórz w przypadku, gdy do drugiego sygnału dodany będzie szum o wariancji równej 0,25 wariancji oryginalnego sygnału.&lt;/div&gt;</summary>
		<author><name>Maciek</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG_2/EEG_wlasno%C5%9Bci_EEG_spoczynkowego&amp;diff=11179</id>
		<title>Pracownia EEG 2/EEG wlasności EEG spoczynkowego</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG_2/EEG_wlasno%C5%9Bci_EEG_spoczynkowego&amp;diff=11179"/>
		<updated>2024-11-22T15:57:20Z</updated>

		<summary type="html">&lt;p&gt;Maciek: /* Polecenie: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Pracownia EEG 2|Pracownia EEG 2]] / Własności EEG spoczynkowego: funkcja autokorelacji i widmo&lt;br /&gt;
&lt;br /&gt;
=Estymacja funkcji autokowariancji, autokorelacji i koherencji sygnału.=&lt;br /&gt;
==Wstęp==&lt;br /&gt;
Z funkcjami tymi spotkaliśmy się już na zajęciach z [[Ćwiczenia_4|analizy sygnałów]].&lt;br /&gt;
&lt;br /&gt;
Funkcja autokowariancji sygnału charakteryzuje liniową zależność wartości tego sygnału w danej określonej chwili czasu od wartości (tego samego sygnału) w innej chwili.&lt;br /&gt;
W przypadku [[Nieparametryczne_widmo_mocy#Sygna.C5.82y_stochastyczne  | stacjonarnych procesów stochastycznych]], przebieg tej funkcji nie zależy od czasu. &lt;br /&gt;
Oznacza to, że obliczając funkcję autokorelacji sygnału pomiędzy chwilą czasu &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;x(t+\tau )&amp;lt;/math&amp;gt; otrzymamy tę samą wartość, jak dla przypadku obliczania funkcji autokorelacji pomiędzy momentami &amp;lt;math&amp;gt;x(t + T)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;x(t + T+\tau )&amp;lt;/math&amp;gt;, gdzie &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; to dowolny przedział czasu. Innymi słowy, funkcja autokorelacji procesu stacjonarnego zależy tylko od odstępu czasu pomiędzy próbkami &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt;, dla którego jest wyznaczana, a nie od konkretnej chwili czasu. Odrębną klasę sygnałów stanowią procesy niestacjonarne, w przypadku których funkcja autokorelacji będzie zależeć od czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; w którym jest obliczana. Estymator funkcji autokowariancji uzyskuje się poprzez obliczanie iloczynów wartości sygnału &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; w chwilach czasu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; czyli &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; i wartości sygnału &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; w chwili czasu ''t''+&amp;amp;tau; czyli &amp;lt;math&amp;gt;x(t+\tau)&amp;lt;/math&amp;gt; i uśredniając wartości iloczynów po czasie &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid79&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma (\tau) = \mathrm{cov}(x(t),x(t-\tau ))=\mathrm{E}[(x(t)-\mu )(x(t-\tau )-\mu )]&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(1)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid80&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\mu = \mathrm{E}[x(t)]&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(2)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W przypadku sygnałów ciągłych estymatę tę można zapisać w poniższy sposób:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid81&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma (\tau ) = \frac{1}{T}\int _0^{T}(x(t)-\mu )(x(t-\tau )-\mu )dt&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(3)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
natomiast dla sygnałów dyskretnych jako:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid82&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma (k) = \frac{1}{N-1}\sum _{i=1}^{N-|k|}(x(i+k)-x_s)(x(i)-x_s)&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(4)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid83&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
x_s = \frac{\sum _{i=1}^{N}x(i)}{N}&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(5)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcja autokowariancji może osiągać dowolne wartości, dlatego aby można było porównać przebieg tej funkcji np. pomiędzy dwoma sygnałami, wprowadzono wersję znormalizowaną tej funkcji &amp;amp;mdash; ''funkcję autokorelacji''. Normalizacja ta wygląda następująco:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid84&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\rho (k) = \frac{\gamma (\tau )}{\sigma^2}&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(6)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid85&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\sigma ^2 = \mathrm{E}[(x(t)-\mu )^2]&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(7)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wariancję sygnału (&amp;lt;math&amp;gt;\gamma (0)=\sigma ^2&amp;lt;/math&amp;gt;) można wyrazić przez funkcję autokowariancji dla przesunięcia &amp;lt;math&amp;gt;\tau =0&amp;lt;/math&amp;gt;.  Wynika z tego, że funkcja korelacji przyjmuje wartości z zakresu [&amp;amp;minus;1,&amp;amp;nbsp;1]. Ostatecznie estymator funkcji autokorelacji można zapisać jak poniżej:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid86&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\rho(k) = \frac{\gamma (k)}{\gamma (0)}&lt;br /&gt;
&amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(8)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcję autokorelacji estymuje się w celu określenia, w jakim stopniu wartości sygnału w danej chwili czasu wpływają na wartości sygnału w kolejnych chwilach czasu. Ma to kluczowe znaczenie przy rozpoznawaniu rodzaju procesów fizycznych odpowiedzialnego za generowanie sygnału. Funkcja ta zawsze mam maksimum dla przesunięcia &amp;lt;math&amp;gt;\tau =0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cechą charakterystyczną funkcji autokorelacji jest to, iż w przypadku sygnałów harmonicznych, przebieg funkcji ma charakter okresowy, z okresem takim samym jak okres badanego sygnału. W przypadku szumu, funkcja autokorelacji ma kształt funkcji delta Diraca.&lt;br /&gt;
&lt;br /&gt;
==Polecenie:==&lt;br /&gt;
Do policzenia funkcji autokorelacji posłużymy się funkcją biblioteczną &amp;lt;tt&amp;gt;numpy.correlate&amp;lt;/tt&amp;gt;. Funkcja ta, wbrew nazwie, oblicza wyłącznie splot swoich dwóch pierwszych argumentów wywołania. Musimy je więc przystosować do obliczenia wielkości zgodnie ze wzorem (4).&lt;br /&gt;
&lt;br /&gt;
Zaimplementuj funkcję do obliczania funkcji korelacji zgodnie ze wzorem (4). Funkcja powinna przyjmować jako parametry dwa wektory&amp;lt;!--i maksymalne przesunięcie wzajemne tych wektorów--&amp;gt;, a zwracać wektor zawierający ich funkcję autokorelacji. &lt;br /&gt;
&lt;br /&gt;
Wywołanie przykładowe:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
print koreluj(a,a)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
powinno dać wynik:&lt;br /&gt;
 [-0.5  0.   1.   0.  -0.5]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
# Średnia&lt;br /&gt;
mean = numpy.mean(data)&lt;br /&gt;
mean2 = numpy.mean(data2)&lt;br /&gt;
&lt;br /&gt;
# Wariancja&lt;br /&gt;
var = numpy.var(data)&lt;br /&gt;
var2 = numpy.var(data2)&lt;br /&gt;
&lt;br /&gt;
# Dane po odjęciu średnich&lt;br /&gt;
ndata = data - mean&lt;br /&gt;
ndata2 = data2 - mean2&lt;br /&gt;
&lt;br /&gt;
# Splot&lt;br /&gt;
acorr = numpy.correlate(ndata, ndata2, 'full')&lt;br /&gt;
&lt;br /&gt;
# Normalizacja kowariancji do korelacji i przez 1/N&lt;br /&gt;
acorr = acorr / numpy.sqrt(var*var2) / len(ndata)&lt;br /&gt;
&lt;br /&gt;
print(acorr)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{{hidden begin|title=Przykładowe rozwiązanie:}}--&amp;gt;&lt;br /&gt;
 &amp;lt;!-- &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
def koreluj_pol(x,y,max_tau):&lt;br /&gt;
    x = x - np.mean(x)&lt;br /&gt;
    y = y - np.mean(y)&lt;br /&gt;
    N= len(x)&lt;br /&gt;
    cor = np.zeros(max_tau+1)&lt;br /&gt;
    cor[0] = np.sum(x[:]*y[:]) &lt;br /&gt;
    for i in range(1,max_tau+1):&lt;br /&gt;
        cor[i] = np.sum(x[i:]*y[:-i])&lt;br /&gt;
        &lt;br /&gt;
    cor = cor /(N-1)&lt;br /&gt;
    return cor&lt;br /&gt;
&lt;br /&gt;
def koreluj(x,y,max_tau):&lt;br /&gt;
    cor = np.zeros(2*max_tau+1)    &lt;br /&gt;
    cor[max_tau:] = koreluj_pol(x,y,max_tau)&lt;br /&gt;
    tmp = koreluj_pol(y,x,max_tau)&lt;br /&gt;
    cor[:max_tau+1] = tmp[-1::-1]&lt;br /&gt;
    return cor    &lt;br /&gt;
    &lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    print koreluj(a,a,i)&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
b = np.array([-1,-2,-3])&lt;br /&gt;
&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    print koreluj(a,b,i)&lt;br /&gt;
    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zadanie 1: Pomiar sygnału EEG ==&lt;br /&gt;
&lt;br /&gt;
Zarejestruj 10 minut sygnału EEG, w trakcie których badana osoba będzie siedziała z otwartymi oczami oraz kolejne 10 minut w stanie czuwania z zamkniętymi oczami. Rejestrację należy wykonać na pełnym czepku 10-20 z częstością próbkowania 128 Hz. &lt;br /&gt;
&lt;br /&gt;
==Zadanie 2:  Funkcje autokowariancji i autokorelacji==&lt;br /&gt;
W tym zadaniu posłużymy się sygnałami zarejestrowanymi w punkcie 3. poprzedniego ćwiczenia. Zaobserwuj, na którym kanale rytm alfa osiąga najwyższą wartość. Następnie zaimplementuj w Pythonie następujące kroki:&lt;br /&gt;
&lt;br /&gt;
#	Wczytaj dane z wybranego kanału.&lt;br /&gt;
#	Oblicz funkcję autokorelacji dla sygnału zarejestrowanego w warunkach, gdy osoba badana siedziała z otwartymi oczami. Narysuj autokorelogram, to jest wykres wartości funkcji autokorelacji względem przesunięcia &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt;. Oś &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; wyskaluj w sekundach.&lt;br /&gt;
#	Powtórz krok 2, tym razem dla sygnału zebranego w warunkach czuwania z zamkniętymi oczami.&lt;br /&gt;
#	Porównaj autokorelogramy.&lt;br /&gt;
&lt;br /&gt;
=Związek autokorelacji z widmem sygnału=&lt;br /&gt;
==Wstęp==&lt;br /&gt;
Zgodnie z twierdzeniem Chinczyna, z którym zapoznaliśmy się na wykładzie z [[Twierdzenie_Wienera-Chinczyna|Analizy Sygnałów]], widmową gęstość mocy sygnału można policzyć jako transformatę Fouriera funkcji autokowariancji:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid93&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
S(f) = \int _{-\infty }^{\infty }\gamma (\tau )e^{-2\pi i f \tau}d\tau &amp;lt;/math&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;(9)&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	&amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; &amp;amp;mdash; częstość&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	&amp;lt;math&amp;gt;S(f)&amp;lt;/math&amp;gt; &amp;amp;mdash;  gęstość widmowa mocy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Poniższy kod ilustruje to twierdzenie:&lt;br /&gt;
&amp;lt;source lang = py&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
from numpy.fft import rfft,fft,fftfreq,fftshift&lt;br /&gt;
 &lt;br /&gt;
def widmo_mocy(s, Fs):&lt;br /&gt;
    '''Funkcja licąca widmo mocy metodą periodogramu,&lt;br /&gt;
	pobiera sygnał i częstość próbkowania&lt;br /&gt;
	zwraca widmo mocy i oś częstości&lt;br /&gt;
    '''&lt;br /&gt;
    S = fft(s)/np.sqrt(len(s))&lt;br /&gt;
    S_moc = S*S.conj()&lt;br /&gt;
    S_moc = S_moc.real&lt;br /&gt;
    F = fftfreq(len(s), 1/Fs)&lt;br /&gt;
    return (fftshift(S_moc),fftshift(F))&lt;br /&gt;
 &lt;br /&gt;
def sin(f = 1, T = 1, Fs = 128, phi =0 ):&lt;br /&gt;
    '''sin o zadanej częstości (w Hz), długości, fazie i częstości próbkowania&lt;br /&gt;
    Domyślnie wytwarzany jest sygnał reprezentujący &lt;br /&gt;
    1 sekundę sinusa o częstości 1Hz i zerowej fazie próbkowanego 128 Hz&lt;br /&gt;
    '''&lt;br /&gt;
    dt = 1.0/Fs&lt;br /&gt;
    t = np.arange(0,T,dt)&lt;br /&gt;
    s = np.sin(2*np.pi*f*t + phi)&lt;br /&gt;
    return (s,t)&lt;br /&gt;
 &lt;br /&gt;
# sygnał próbny będzie próbkowany z częstością FS&lt;br /&gt;
FS = 100.0&lt;br /&gt;
# sygnałem próbnym będzie sinusoida o częstości f &lt;br /&gt;
(s,t) = sin(f=10.5,Fs=FS)&lt;br /&gt;
# obliczamy moc i energię sygnału w dziedzinie czasu&lt;br /&gt;
moc_w_czasie = s**2&lt;br /&gt;
energia_w_czasie = np.sum(moc_w_czasie)&lt;br /&gt;
print 'energia w czasie: ', energia_w_czasie&lt;br /&gt;
 &lt;br /&gt;
# obliczamy widmo mocy sygnału i jego energię estymowaną w dziedzinie częstości&lt;br /&gt;
(moc_w_czestosci, F) = widmo_mocy(s, Fs=FS)&lt;br /&gt;
energia_w_czestosci = np.sum(moc_w_czestosci)&lt;br /&gt;
print 'energia w czestosci: ', energia_w_czestosci&lt;br /&gt;
 &lt;br /&gt;
# estymujemy funkcję autokorelacji sygnału&lt;br /&gt;
ak = 1./(2*len(s)-1)*np.correlate(s,s,'full')&lt;br /&gt;
&lt;br /&gt;
# estymujemy widmo mocy i energię sygnału z twierdzenia Chinczyna korzystając z funkcji fft:&lt;br /&gt;
moc_chi = np.abs(fft(ak))&lt;br /&gt;
energia_chin = sum(moc_chi)&lt;br /&gt;
print 'energia z tw. Chinczyna przez fft: ', energia_chin&lt;br /&gt;
 &lt;br /&gt;
# estymujemy widmo mocy i energię sygnału z twierdzenia Chinczyna korzystając z jawnej postaci transformaty Fouriera:&lt;br /&gt;
FF = np.linspace(-FS/2,FS/2,1000)&lt;br /&gt;
M = np.zeros(len(FF),dtype='complex')&lt;br /&gt;
 &lt;br /&gt;
for i,f in enumerate( FF):&lt;br /&gt;
    for tau in range(len(ak)):&lt;br /&gt;
        M[i] += ak[tau]*np.exp(2*np.pi*1j*f*(len(ak)-tau)/FS) &lt;br /&gt;
M = np.abs(M)&lt;br /&gt;
energia_chin_sum = np.sum(M)* (len(ak)/len(FF))&lt;br /&gt;
print 'energia z tw. Chinczyna przez sumowanie: ', energia_chin_sum&lt;br /&gt;
&lt;br /&gt;
# Rysunki&lt;br /&gt;
py.figure(1)&lt;br /&gt;
py.subplot(3,1,1)&lt;br /&gt;
py.plot(t,s)&lt;br /&gt;
py.title(u'Sygnal')&lt;br /&gt;
py.subplot(3,1,2)&lt;br /&gt;
py.plot(t,moc_w_czasie)&lt;br /&gt;
py.title(u'moc w czasie')&lt;br /&gt;
py.subplot(3,1,3)&lt;br /&gt;
py.plot(F,moc_w_czestosci)&lt;br /&gt;
py.title(u'moc w czestosci')&lt;br /&gt;
 &lt;br /&gt;
py.figure(2)&lt;br /&gt;
py.subplot(3,1,1)&lt;br /&gt;
py.title('f. autokowariancji')&lt;br /&gt;
py.plot(np.arange(-len(ak)/2,len(ak)/2,1)/FS ,ak)&lt;br /&gt;
py.subplot(3,1,2)&lt;br /&gt;
py.plot(fftshift(fftfreq(len(moc_chi),1./FS)),fftshift(moc_chi))&lt;br /&gt;
py.title('widmo mocy z Tw. Chinczyna przez fft')&lt;br /&gt;
py.subplot(3,1,3)&lt;br /&gt;
py.plot(FF,M)&lt;br /&gt;
py.title('widmo mocy z Tw. Chinczyna przez sumowanie')&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W wyniku powinniśmy zobaczyć w terminalu:&lt;br /&gt;
 energia w czasie:  50.0&lt;br /&gt;
 energia w czestosci:  50.0&lt;br /&gt;
 energia z tw. Chinczyna przez fft:  50.0&lt;br /&gt;
 energia z tw. Chinczyna przez sumowanie:  49.9501172217&lt;br /&gt;
&lt;br /&gt;
oraz powinny pojawić się rysunki:&lt;br /&gt;
[[Plik:Fig_chinczyn1.png|thumb 200 px|center]]&lt;br /&gt;
[[Plik:Fig_chinczyn2.png|thumb 200 px|center]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Polecenie ==&lt;br /&gt;
Zaimplementuj funkcję obliczającą transformację Fouriera dyskretyzując wzór (9) dla zadanego wektora częstości &amp;lt;tt&amp;gt;f&amp;lt;/tt&amp;gt; i zadanej częstości próbkowania sygnału (tutaj: 10).&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Wywołanie przykładowe:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
t= np.arange(0,1,0.1)&lt;br /&gt;
x = np.sin(2*np.pi*2*t)&lt;br /&gt;
f = np.arange(-5,5,1)&lt;br /&gt;
X,f = fourier(x,f,10.0)&lt;br /&gt;
print X&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Natomiast wywołanie:&lt;br /&gt;
&amp;lt;source lang ='python'&amp;gt;&lt;br /&gt;
t= np.arange(0,1,0.1)&lt;br /&gt;
x = np.sin(2*np.pi*2*t)&lt;br /&gt;
f = np.arange(-5,5,0.01)&lt;br /&gt;
X = fourier(x,f,10.0)&lt;br /&gt;
py.plot(f,np.abs(X))&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Powinno wytworzyć rysunek:&lt;br /&gt;
&lt;br /&gt;
[[Plik:Fourier_test.png]] &lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
import numpy as np&lt;br /&gt;
import pylab as py&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def koreluj_pol(x,y,max_tau):&lt;br /&gt;
    x = x - np.mean(x)&lt;br /&gt;
    y = y - np.mean(y)&lt;br /&gt;
    N= len(x)&lt;br /&gt;
    cor = np.zeros(max_tau+1)&lt;br /&gt;
    cor[0] = np.sum(x[:]*y[:]) &lt;br /&gt;
    for i in range(1,max_tau+1):&lt;br /&gt;
        cor[i] = np.sum(x[i:]*y[:-i])&lt;br /&gt;
        &lt;br /&gt;
    cor = cor /(N)&lt;br /&gt;
    return cor&lt;br /&gt;
&lt;br /&gt;
def koreluj(x,y,max_tau):&lt;br /&gt;
    cor = np.zeros(2*max_tau+1)    &lt;br /&gt;
    cor[max_tau:] = koreluj_pol(x,y,max_tau)&lt;br /&gt;
    tmp = koreluj_pol(y,x,max_tau)&lt;br /&gt;
    cor[:max_tau+1] = tmp[-1::-1]&lt;br /&gt;
    return cor  &lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
def fourier_chin(x, FF, FS):&lt;br /&gt;
    ak = koreluj(x,x,len(x)-1)&lt;br /&gt;
    M = np.zeros(len(FF),dtype='complex') &lt;br /&gt;
    for i,f in enumerate( FF):&lt;br /&gt;
        for tau in range(len(ak)):&lt;br /&gt;
	    M[i] += ak[tau]*np.exp(-2*np.pi*1j*f*( tau- len(x))/FS)&lt;br /&gt;
    #M/=np.sqrt(len(ak))&lt;br /&gt;
    return M&lt;br /&gt;
    &lt;br /&gt;
def fourier(ak, FF, FS):&lt;br /&gt;
   &lt;br /&gt;
    M = np.zeros(len(FF),dtype='complex') &lt;br /&gt;
    for i,f in enumerate( FF):&lt;br /&gt;
        for tau in range(len(ak)):&lt;br /&gt;
	    M[i] += ak[tau]*np.exp(-2*np.pi*1j*f*( tau)/FS)&lt;br /&gt;
    M/=np.sqrt(len(ak))&lt;br /&gt;
    return M&lt;br /&gt;
t= np.arange(0,1,0.05)&lt;br /&gt;
x = np.sin(2*np.pi*2*t)&lt;br /&gt;
f = np.arange(-5,5,0.01)&lt;br /&gt;
&lt;br /&gt;
X = fourier_chin(x,f,10.0)&lt;br /&gt;
Xf = fourier(x,f,10.0)&lt;br /&gt;
print X&lt;br /&gt;
py.plot(f,np.abs(X), f,np.abs(Xf)**2)&lt;br /&gt;
py.show()&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zadanie 3: Związek autokorelacji z widmem sygnału==&lt;br /&gt;
Oblicz gęstość widmową mocy sygnału zarejestrowanego w trakcie czuwania z zamkniętymi oczami, korzystając z twierdzenia Chinczyna oraz [[Nieparametryczne_widmo_mocy#Metoda_Welcha | metodą Welcha]].&lt;br /&gt;
Znajdź częstość rytmu &amp;amp;alpha; dla osoby, która była badana.&lt;br /&gt;
&lt;br /&gt;
==Funkcja kowariancji (wzajemnej)==&lt;br /&gt;
&lt;br /&gt;
W celu scharakteryzowania zależności wzajemnej dwóch sygnałów losowych, stosuje się funkcję kowariancji, zdefiniowaną w następujący sposób:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid98&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy} (\tau ) = \mathrm{cov}(x(t),y(t-\tau ))=\mathrm{E}[(x(t)-\mu _x)(y(t-\tau )-\mu _y)]&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid99&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\mu _x = \mathrm{E}[x(t)]\\&lt;br /&gt;
\mu _y = \mathrm{E}[y(t)]\\ \end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W przypadku sygnałów ciągłych estymatę tę można zapisać w poniższy sposób:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid100&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy} (\tau ) = \frac{1}{T}\int _0^{T}(x(t)-\mu_x)(y(t-\tau)-\mu_y)dt&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
natomiast dla sygnałów dyskretnych jako:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid101&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy}(k) = \frac{1}{N-1}\sum _{i=0}^{N-k}(x(i+k)-x_s)(y(i)-y_s)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W odróżnieniu od funkcji autokowariancji, funkcja kowariancji nie musi mieć maksimum dla przesunięcia &amp;lt;math&amp;gt;\tau =0&amp;lt;/math&amp;gt;. Ponadto posiada ona następującą cechę:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid102&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\gamma _{xy}(-\tau ) = \gamma _{yx}(\tau )&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcję kowariancji można znormalizować:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid103&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\rho (\tau) = \frac{\mathrm{E}[(x(t)-\mu _x)(y(t-\tau )-\mu _y)]}{\sqrt{\mathrm{E}[(x(t)-\mu _x)^2]\mathrm{E}[(y(t)-\mu _y)^2]}} = \frac{\gamma _{xy}}{\sigma_x\sigma_y}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
Otrzymaną funkcję nazywamy funkcją korelacji.&lt;br /&gt;
Jednym z zastosowań funkcji korelacji jest wyznaczanie czasu przejścia sygnału przez dany układ liniowy. Funkcja korelacji pomiędzy sygnałem na wejściu układu i sygnałem na jego wyjściu osiągnie wartość maksymalną dla przesunięcia &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; równego czasowi, jaki potrzebował sygnał na pokonanie danego układu. Niestety, taka metoda wyznaczania opóźnienia obarczona jest pewną wadą &amp;amp;mdash; w przypadku gdy prędkość sygnału bądź jego droga zależą od częstości, wtedy na wykresie funkcji korelacji nie uzyskamy wyraźnego maksimum.&lt;br /&gt;
&lt;br /&gt;
=====Polecenie =====&lt;br /&gt;
Zaimplementuj funkcję obliczającą funkcję kowariancji dla różnych sygnałów ''x'' i ''y'' (równanie 13) skorzystaj przy tym z własności opisanej równaniem (14). &lt;br /&gt;
Przykładowe wywołanie:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
b = np.array([-1,-2,-3])&lt;br /&gt;
&lt;br /&gt;
print koreluj(a,b,2)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
powinno dać w wyniku:&lt;br /&gt;
 [ 0.5 0.  -1.   0.   0.5]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
{{hidden begin|title=Przykładowe rozwiązanie:}}&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import pylab as py&lt;br /&gt;
&lt;br /&gt;
def koreluj(x,y,max_tau):&lt;br /&gt;
    x = x - np.mean(x)&lt;br /&gt;
    y = y - np.mean(y)&lt;br /&gt;
    cor = np.zeros(2*max_tau+1)&lt;br /&gt;
    cor[max_tau] = np.sum(x[:]*y[:]) &lt;br /&gt;
    for i in range(1,max_tau+1):&lt;br /&gt;
        cor[max_tau+i] = np.sum(x[i:]*y[:-i])&lt;br /&gt;
        cor[max_tau-i] = np.sum(y[i:]*x[:-i])&lt;br /&gt;
    N= len(x)&lt;br /&gt;
    cor = cor /(N-1)&lt;br /&gt;
    return cor&lt;br /&gt;
&lt;br /&gt;
a = np.array([1,2,3])&lt;br /&gt;
b = np.array([-1,-2,-3])&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    print koreluj(a,b,i)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}} --&amp;gt;&lt;br /&gt;
===Zadanie 4===&lt;br /&gt;
Z danych zarejestrowanych w trakcie czuwania z zamkniętymi oczami wybierz sygnały z następujących kanałów: Fp1, P3, Pz, P4, Fp2, O1, O2.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Dla każdego kanału oblicz funkcję autokorelacji, zaś  dla każdej pary kanałów oblicz funkcję korelacji wzajemnej. Wyniki zaprezentuj w formie kwadratowej macierzy wykresów (za pomocą funkcji subplot, tak jak na przykładowym rys. (rys. &amp;lt;xr id=&amp;quot;uid9&amp;quot;&amp;gt; %i&amp;lt;/xr&amp;gt;)). Na przekątnej macierzy narysuj funkcję autokorelacji odpowiednich kanałów, poza przekątną &amp;amp;mdash; funkcję korelacji wzajemnej. Wskaż kanały, które są najbardziej skorelowane ze sobą. Czy możliwe jest wyznaczenie opóźnienia sygnału pomiędzy tymi kanałami?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Powtórz punkt 1, tym razem jednak funkcję autokorelacji i korelacji wzajemnej oblicz na sygnałach przefiltrowanych filtrem wąskopasmowym w paśmie alfa charakterystycznym dla badanej osoby. ([[%C4%86wiczenia_7#Funkcje_do_projektowania_filtr.C3.B3w_IIR_dost.C4.99pne_w_module_scipy.signal|przypomnienie konstrukcji filtrów]])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Oszacuj istotność statystyczną zależności między parami kanałów. Twoją hipotezą zerową jest brak istotnej korelacji pomiędzy sygnałami zarejestrowanymi przez dwie różne elektrody EEG. Hipoteza alternatywna to występowanie zależności pomiędzy tymi sygnałami. Podanie estymatorów wariancji funkcji korelacji jest bardzo trudne, dlatego jednym ze sposobów oszacowania progu powyżej którego wartość funkcji korelacji można byłoby uznać za istotną statystycznie, jest zastosowanie metody ''bootstrap''. Teoretycznie, funkcja korelacji policzona dla dwóch rzeczywistych, nieskorelowanych sygnałów, powinna wynosić 0 dla każdego przesunięcia &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt;. Tak jest jednak w przypadku sygnałów nieskończonych; w analizie sygnałów takowych nie spotkamy.&lt;br /&gt;
&lt;br /&gt;
Dokonując losowej zamiany kolejności próbek, możemy doprowadzić do wytworzenia sygnałów zależnych losowo, które jednak ze względu na skończony czas trwania, dadzą niezerową funkcję korelacji. Poziom losowych fluktuacji tej funkcji oszacujemy wykonując następujące kroki:&lt;br /&gt;
&amp;lt;ol type=&amp;quot;A&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Losowa zamiana kolejności próbek w analizowanych sygnałach. Jeżeli pomiędzy dwoma sygnałami istnieją jakieś zależności, losowa zamiana próbek doprowadzi do zniszczenia tych związków. W ten sposób uzyskujemy sygnały, które teoretycznie są nieskorelowane.&lt;br /&gt;
&amp;lt;li&amp;gt; Obliczenie funkcji  korelacji wzajemnej dla sygnałów policzonych w punkcie A.&lt;br /&gt;
&amp;lt;li&amp;gt; Powtórzenie kroków A i B wiele (np. 1000) razy.&lt;br /&gt;
&amp;lt;li&amp;gt; Oszacowanie 95% przedziału ufności dla wartości średniej funkcji korelacji wzajemnej dla danego przesunięcia &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; korzystając z otrzymanego w kroku C empirycznego rozkładu wartości tych funkcji dla sygnałów niezależnych.  &lt;br /&gt;
&amp;lt;li&amp;gt; Powtórzenie kroków A-D dla kolejnych przesunięć &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;li&amp;gt; Sprawdzenie, dla których przesunięć &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; funkcje autokorelacji i korelacji obliczone dla oryginalnych sygnałów uzyskały wartości wyższe niż wartości progowe oszacowane dla sygnałów o losowych zależnościach.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Procedura opisana powyżej ma jednak '''zasadniczą wadę'''. Staramy się w niej oszacować poziom przypadkowych korelacji pomiędzy dwoma sygnałami dla kolejnych przesunięć &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt;, co jest niczym innym jak wielokrotnym powtórzeniem pewnego testu. Obserwowanie korelacji dla wielu par kanałów równocześnie również prowadzi do zwiększenia szansy na zaobserwowanie ekstremalnie dużych fluktuacji.&lt;br /&gt;
Występuje tu zatem ''problem wielokrotnych porównań''.&lt;br /&gt;
Przypominamy, iż może to doprowadzić do przypadkowego uznania wyników jako &amp;amp;bdquo;istotnych&amp;amp;rdquo; statystycznie. Np. jeśli pojedynczy test wykonujemy na poziomie istotności 5% to dopuszczamy odrzucenie w 1 przypadku na 20 hipotezy zerowej pomimo, iż jest ona prawdziwa. Z drugiej jednak strony, jeśli powtórzymy wykonywany test 20 razy, to oczekujemy uzyskania 1 przypadku, w którym poziom ''p'' będzie mniejszy od 5% co jest przesłanką za odrzuceniem hipotezy zerowej. &lt;br /&gt;
&lt;br /&gt;
W przypadku wykonywania serii testów należałoby więc zastosować odpowiednie poprawki, np. [http://www.bmj.com/content/310/6973/170.full korektę Bonferroniego] czy [http://en.wikipedia.org/wiki/False_discovery_rate false discovery rate (FDR)]. Innym rozwiązaniem w analizowanym przez nas problemie jest zastosowanie tzw. statystyk wartości ekstremalnych, które prowadzą do następujących zmian w procedurze:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol type=&amp;quot;A&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;	Losowa zmiana kolejności próbek w analizowanych sygnałach (we wszystkich analizowanych kanałach). Jeżeli pomiędzy dwoma sygnałami istnieją jakieś zależności, losowa zamiana próbek doprowadzi do zniszczenia tych związków. W ten sposób uzyskujemy sygnały, które teoretycznie są nieskorelowane.&lt;br /&gt;
&amp;lt;li&amp;gt;	Obliczenie funkcji korelacji dla sygnałów otrzymanych w punkcie A.&lt;br /&gt;
&amp;lt;li&amp;gt;    Zapamiętanie maksymalnej wartości bezwzględnej funkcji korelacji z punktu B (maksimum bierzemy po wszystkich przesunięciach i po wszystkich parach kanałów; dla funkcji autokorelacji, ze względu na jej normalizację do 1 dla zerowego przesunięcia, tam maksymalnych wartości poszukujemy dla przesunięć innych niż 0).&lt;br /&gt;
&amp;lt;li&amp;gt;	Powtórzenie kroków A-C 1000 razy. Uzyskamy w ten sposób rozkład maksymalnych wartości funkcji korelacji możliwych do zaobserwowania dla sygnałów niezależnych.&lt;br /&gt;
&amp;lt;li&amp;gt;    Wyznaczenie 95 centyla rozkładu wartości maksymalnych.&lt;br /&gt;
&amp;lt;li&amp;gt;	Nałożenie na rysunki funkcji korelacji uzyskane w Zadaniu 2 poziomych linii symbolizujących poziom zależności dwóch sygnałów o losowych zależnościach i sprawdzenie, dla których przesunięć &amp;lt;math&amp;gt;\tau &amp;lt;/math&amp;gt; wartości funkcji korelacji przekraczają estymowane progi istotności statystycznej.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Plik:Korelacje_wzajemne.png|700px|center|thumb|&amp;lt;figure id=&amp;quot;uid9&amp;quot; /&amp;gt;Przykład wyniku analizy korelacji wzajemnych dla sygnału niefiltrowanego z naniesionymi granicami możliwych fluktuacji.]]&lt;br /&gt;
&lt;br /&gt;
==Wzajemna gęstość widmowa sygnałów==&lt;br /&gt;
&lt;br /&gt;
Podobnie jak w przypadku twierdzenia Chinczyna dla pojedynczego sygnału, możliwe jest policzenie transformaty Fouriera funkcji kowariancji. Uzyskana w ten sposób wielkość nazywa się funkcją wzajemnej gęstości mocy widmowej sygnału:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid122&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
S_{xy}(f) = \int _{-\infty }^{\infty }\gamma_{xy}(\tau )e^{-2\pi i f \tau}d\tau &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W celu dalszego omówienia własności funkcji wzajemnej mocy widmowej sygnałów funkcję tę zapiszemy w postaci:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid123&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
S_{xy}(f) = |S_{xy}(f)|e^{i\phi _{xy}(f)}\\&lt;br /&gt;
\\&lt;br /&gt;
\phi _{xy} = \arg(S_{xy}) &lt;br /&gt;
\end{array} &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&amp;lt;!-- \mathrm{arc\,tg}\left[\frac{\mathrm{Im}(S_{xy}(f))}{\mathrm{Re}(S_{xy}(f))}\right]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wartość bezwzględna funkcji wzajemnej gęstości mocy widmowej osiąga największą wartość dla '''częstości''', w których sygnały &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;y(t)&amp;lt;/math&amp;gt; są ze sobą skorelowane. Funkcja wzajemnej mocy widmowej sygnałów pozbawiona jest zatem wady, która charakteryzowała funkcję korelacji, to jest problemu z wyznaczeniem czasu transmisji sygnału, w przypadku gdy czas ten zależał od częstości. Przy pomocy funkcji wzajemnej mocy widmowej, czas ten można oszacować przy pomocy fazy tej funkcji &amp;amp;mdash; &amp;lt;math&amp;gt;\phi _{xy}(f)&amp;lt;/math&amp;gt;. Jeśli funkcja wzajemnej mocy widmowej została wyznaczona pomiędzy sygnałami na wejściu i wyjściu układu liniowego, to faza ta reprezentuje przesunięcie fazowe sygnału przy przejściu przez układ. Czas tego przejścia można oszacować za pomocą następującej wyrażenia:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid124&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\tau = \frac{\phi _{xy}(f)}{2\pi f}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Podobnie jak w przypadku funkcji autokorelacji i korelacji wzajemnej, funkcję wzajemnej gęstości mocy widmowej można znormalizować:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid125&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
C_{xy}(f) = \frac{S_{xy}(f)}{\sqrt{S_x(f)S_y(f)}}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Znormalizowaną postać funkcji wzajemnej gęstości mocy widmowej nazywamy funkcją ''koherencji''. &lt;br /&gt;
Koherencja jest wielkością zespoloną. Faza koherencji odzwierciedla różnicę faz pomiędzy dwoma sygnałami. Moduł koherencji reprezentuje stopień synchronizacji sygnałów i zawiera się w przedziale od 0.0 do 1.0. Moduł tej funkcji zawiera się w przedziale od 0 do 1. Wartości 0 odpowiada brak synchronizacji pomiędzy sygnałami, zaś wartości 1 pełna synchronizacja dwóch przebiegów czasowych. Należy również zwrócić uwagę na nazewnictwo - często sam moduł koherencji określany jest jako koherencja, w literaturze anglojęzycznej moduł koherencji posiada jednak odrębną nazwę: Magnitude Square Coherence (MSC). Istotny jest również sposób estymacji modułu koherencji, który wyprowadzono w następnym rozdziale, zaś sam estymator reprezentuje wzór (36).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadanie 5===&lt;br /&gt;
Zaimplementuj funkcję obliczającą wzajemną gęstość widmową dla pary kanałów. &lt;br /&gt;
&amp;lt;!--Niech argumentami tej funkcji będą dwa wektory zawierające sygnały, zakres częstości, częstość próbkowania. --&amp;gt;&lt;br /&gt;
Oblicz i narysuj macierz gęstości widmowych (własnych i wzajemnych) dla kolejnych par kanałów (tych samych co w zadaniu 3). Wyniki zaprezentuj w postaci kwadratowej macierzy rysunków. Ponieważ są to funkcje zespolone, dobrze jest zaprezentować osobno ich wartość i fazę. Uzyskane wartości bezwzględne narysuj nad przekątną tej macierzy, a fazę pod przekątną.&lt;br /&gt;
&lt;br /&gt;
===Zadanie 6===&lt;br /&gt;
Przygotuj sygnał dwukanałowy, w którym jako pierwszy sygnał wybierz fragment sygnału EEG (z danych zebranych wcześniej) o długości 2000 próbek, a jako drugiego sygnału użyj tego samego fragmentu EEG, ale opóźnionego o wybraną liczbę (1 - 5) próbek. Oblicz widma wzajemne tych sygnałów i zaprezentuj ich fazy na rysunku. Na podstawie tych widm znajdź wartość przesunięcia czasowego tych sygnałów.&lt;br /&gt;
&lt;br /&gt;
Obliczenia powtórz w przypadku, gdy do drugiego sygnału dodany będzie szum o wariancji równej 0,25 wariancji oryginalnego sygnału.&lt;/div&gt;</summary>
		<author><name>Maciek</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG_2/SSVEP_1&amp;diff=11134</id>
		<title>Pracownia EEG 2/SSVEP 1</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG_2/SSVEP_1&amp;diff=11134"/>
		<updated>2024-11-12T11:59:17Z</updated>

		<summary type="html">&lt;p&gt;Maciek: /* Analiza danych */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Pracownia EEG 2|Pracownia EEG 2]] / SSVEP&lt;br /&gt;
&lt;br /&gt;
=Wstęp=&lt;br /&gt;
===Potencjały wywołane stanu ustalonego (ang. ''Steady State Evoked Potentials'', ''SSEP'')===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Plik:ep_ssep.png|768px|thumb|right|&amp;lt;figure id=&amp;quot;fig:ep_ssep&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
Porównanie przebiegu bodźców stosowanych do rejestracji Potencjałów Wywołanych oraz Potencjałów Wywołanych Stanu ustalonego.]]&lt;br /&gt;
&lt;br /&gt;
Potencjały wywołane EEG, które mierzyliśmy na poprzednich zajęciach, są śladami reakcji mózgu na pewne specyficzne bodźce. Jak pamiętamy, były to podawane w pewnych odstępach czasu (zwykle około 1 s), krótkotrwałe (~20 ms) błyski światła. W trakcie bieżących zajęć będziemy kontynuowali pomiar czynności elektrycznej mózgu w trakcie oddziaływania na badanego pewnymi bodźcami, jednakże przebieg stymulacji zostanie zmieniony. W tym eksperymencie bodźcem będzie seria powtarzających się w sposób ściśle periodyczny błysków światła (&amp;lt;xr id=&amp;quot;fig:ep_ssep&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt;).&lt;br /&gt;
Bodźce o takim przebiegu mogą mieć również postać krótkotrwałych dźwięków (np. trzasków), czy też impulsów mechanicznych (np. rytmiczny nacisk na skórę). Ślad elektrycznej odpowiedzi mózgu na szybko powtarzające się bodźce nazywamy '''potencjałami wywołanymi stanu ustalonego''' (ang. ''Steady State Evoked Potentials'', ''SSEP''). W zależności od modalności bodźca (czyli zmysłu, który jest poddawany stymulacji) wyróżniamy:&lt;br /&gt;
* wzrokowe potencjały wywołane stanu ustalonego (ang. ''Steady State Visual Evoked Potentials'', ''SSVEP''), w przypadku gdy stymulacja odbywa się za pomocą fali świetlnej (Silberstein, 1995; Vialatte, 2010).&lt;br /&gt;
* słuchowe potencjały stanu ustalonego (ang. ''Auditory Steady State Evoked Response'', ''ASSR''), w przypadku gdy stymulacja odbywa się za pomocą fali dźwiękowej.&lt;br /&gt;
* czuciowe potencjały wywołane stanu ustalonego (ang. ''Steady-State Somatosensory Evoked Potentials'', ''SSSEP''), wywoływane przy pomocy bodźców mechanicznych.&lt;br /&gt;
W języku polskim brakuje zwrotów, za pomocą których można prawidłowo scharakteryzować niektóre parametry bodźców wywołujących odpowiedź SSEP. W związku z tym, na potrzeby niniejszych ćwiczeń zostanie wprowadzona następująca nomenklatura:&lt;br /&gt;
* składowa bodźca &amp;amp;mdash; przebieg bodźca w jednym okresie stymulacji, np. pojedynczy, krótkotrwały błysk światła, dźwięk lub impuls mechaniczny (patrz &amp;lt;xr id=&amp;quot;fig:ep_ssep&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt;),&lt;br /&gt;
* bodziec/stymulacja/pobudzenie &amp;amp;mdash; jest to ciąg o czasie trwania ''T'', złożony z kolejnych występujących po sobie składowych, powtarzających się co okres &amp;amp;tau; (patrz &amp;lt;xr id=&amp;quot;fig:ep_ssep&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt;).&lt;br /&gt;
Charakterystyczną cechą zjawiska SSEP jest wzrost mocy sygnału EEG w częstości, z którą powtarzane są składowe bodźca. Np. jeśli błysk światła występuje co &amp;amp;tau;=100 ms, możemy oczekiwać wzrostu mocy elektrycznej aktywności mózgu dla częstości 10 Hz oraz niejednokrotnie dla jej harmonicznych. Moc sygnału ulega dodatkowemu zwiększeniu, jeśli badana osoba koncentruje silnie swoją uwagę na bodźcu. Cecha ta wykorzystywana jest m. in. do budowania tzw. interfejsów mózg komputer, czyli systemów, umożliwiających człowiekowi komunikację z komputerem bez pośrednictwa mięśni.&lt;br /&gt;
&lt;br /&gt;
===Modulacja===&lt;br /&gt;
Analizując od strony fizycznej przebieg bodźców wywołujących zjawisko SSEP możemy zauważyć, iż mamy do czynienia z [[wikipl:Modulacja|procesem modulacji sygnału]], czyli chwilową zmianą jego parametrów. Niezależnie od tego, który z tych parametrów ulega zmianie, w procesie modulacji wyróżniamy dwa podstawowe sygnały &amp;amp;mdash; sygnał nośny oraz sygnał modulujący [[http://en.wikipedia.org/wiki/Modulation]]. W technice radiowej czy telewizyjnej sygnałem nośnym są fale elektromagnetyczne. W przypadku wywoływania zjawiska SSVEP sygnałem nośnym też jest fala elektromagnetyczna, ale o długości z zakresu światła widzialnego. Z kolei zjawisko ASSR powstaje na skutek stymulacji, w której falą nośną jest fala dźwiękowa o częstości od kilkuset do kilku tysięcy Hz. Sygnał, który zmienia parametry fali nośnej nazywamy sygnałem modulującym. Przebieg sygnału modulującego może mieć różny charakter, jednakże najczęściej stosowane są sygnały o kształcie sinusoidalnym lub prostokątnym. W przypadku modulacji za pomocą sygnału sinusoidalnego zmianie może ulec amplituda, częstość lub faza sygnału nośnego. Mówimy wtedy odpowiednio o modulacji amplitudowej (ang. ''Amplitude Modulation'', ''AM''), częstościowej (ang. ''Frequency Modulation'', ''FM'') lub fazowej (ang. ''Phase Modulation'', ''PM''). Modulacja FM i PM nie jest stosowana do wywoływania zjawiska SSEP, natomiast modulację AM wykorzystuje się do pomiaru ASSR, w związku z czym zostanie opisana szerzej.&lt;br /&gt;
&lt;br /&gt;
===Modulacja amplitudowa sygnałem sinusoidalnym===&lt;br /&gt;
&lt;br /&gt;
Niech:&lt;br /&gt;
&amp;lt;math&amp;gt;x(t) = A \sin(\Omega t)&amp;lt;/math&amp;gt;&lt;br /&gt;
będzie sygnałem nośnym o częstości &amp;amp;Omega; i amplitudzie ''A'', zaś &lt;br /&gt;
&amp;lt;math&amp;gt;y(t) = B \sin(\omega t+ \varphi)&amp;lt;/math&amp;gt;&lt;br /&gt;
będzie sygnałem modulującym o częstości &amp;amp;omega;, amplitudzie ''B'' i fazie początkowej &amp;amp;phi;. Sygnałem zmodulowanym amplitudowo nazywamy następujący sygnał:&lt;br /&gt;
&amp;lt;math&amp;gt;z(t) = A \sin(\Omega t) + B \sin(\omega t + \varphi)\cdot \sin(\Omega t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Korzystając ze wzorów trygonometrycznych, powyższy wzór można zapisać w postaci:&lt;br /&gt;
&amp;lt;math&amp;gt;z(t) = A \sin(\Omega t) + B \frac{\cos((\Omega - \omega) t+\varphi)}{2} - B \frac{\cos((\Omega + \omega) t+\varphi)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
Jak można zauważyć, energia sygnału zmodulowanego amplitudowo skupiona jest wokół trzech częstości:&lt;br /&gt;
* częstości nośnej &amp;lt;math&amp;gt;f_0=\Omega&amp;lt;/math&amp;gt;,&lt;br /&gt;
* częstości &amp;lt;math&amp;gt;f_1=\Omega - \omega&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;f_2=\Omega + \omega&amp;lt;/math&amp;gt;.&lt;br /&gt;
Część widma sygnału zmodulowanego skupioną w częstościach &amp;lt;math&amp;gt;f_1&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;f_2&amp;lt;/math&amp;gt;&lt;br /&gt;
nazywamy wstęgami bocznymi.&lt;br /&gt;
[[Plik:glebokosc_modulacji.png|600px|thumb|right|&amp;lt;figure id=&amp;quot;fig:glebokosc_modulacji&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
Maksymalna i minimalna amplituda sygnału zmodulowanego w systemie AM.]]&lt;br /&gt;
[[Plik:AM_signals.png|600px|thumb|right|&amp;lt;figure id=&amp;quot;fig:AM_signals&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
Przebieg sygnału zmodulowanego w systemie AM w zależności od głębokości modulacji.]]&lt;br /&gt;
Modulację amplitudową można scharakteryzować za pomocą tzw. współczynnika głębokości modulacji, zdefiniowanego w następujący sposób (patrz &amp;lt;xr id=&amp;quot;fig:glebokosc_modulacji&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt;):&lt;br /&gt;
&amp;lt;math&amp;gt;m=\frac{A_{max}-A_{min}}{A_{max}+A_{min}}&amp;lt;/math&amp;gt;&lt;br /&gt;
Powyższy wzór można w prosty sposób przekształcić do następującej postaci:&lt;br /&gt;
&amp;lt;math&amp;gt;m=\frac{A_{max}-A_{min}}{A_{max}+A_{min}} = \frac{B}{A}&amp;lt;/math&amp;gt;&lt;br /&gt;
Głębokość modulacji może osiągać dowolne wartości dodatnie, jednakże w praktyce współczynnik ten powinien zawierać się w granicy pomiędzy 0 a 1 (bądź od 0 do 100 %). W przypadku gdy głębokość modulacji osiąga wartość wyższą niż 1, sygnał zostaje zniekształcony (patrz &amp;lt;xr id=&amp;quot;fig:AM_signals&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt;) i nie ma praktycznego wykorzystania.&lt;br /&gt;
&lt;br /&gt;
===Modulacja amplitudowa falą prostokątną===&lt;br /&gt;
[[Plik:modulacja_fala_prostokatna.png|600px|thumb|right|&amp;lt;figure id=&amp;quot;fig:modulacja_fala_prostokatna&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
A. Przykład sygnału zmodulowanego amplitudowo fala sinusoidalną. B. Przebieg sygnału zmodulowanego falą prostokątną. Kolor niebieski &amp;amp;mdash; fala nośna, kolor czerwony &amp;amp;mdash; fala modulująca.]]&lt;br /&gt;
[[Plik:wypelnienie.png|600px|thumb|right|&amp;lt;figure id=&amp;quot;fig:wypelnienie&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
Współczynnik wypełnienia fali prostokątnej jest stosunkiem czasu trwania impulsu &amp;amp;tau; do okresu jego powtarzania ''T''.]]&lt;br /&gt;
W przypadku wywoływania zjawiska SSEP stosuje się bodźce, w których fala nośna (światło) zostaje zmodulowany sygnałem prostokątnym. Porównanie modulacji amplitudowej sygnałem o przebiegu sinusoidalnym i sygnałem o przebiegu prostokątnym zaprezentowano na rysunku &lt;br /&gt;
&amp;lt;xr id=&amp;quot;fig:modulacja_fala_prostokatna&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt;.&lt;br /&gt;
W przypadku modulacji falą prostokątną rozważamy następujące parametry:&lt;br /&gt;
* częstość modulacji, która równa jest odwrotności okresu powtarzania się impulsu prostokątnego (na &amp;lt;xr id=&amp;quot;fig:modulacja_fala_prostokatna&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt; okres ten jest równy ''T''),&lt;br /&gt;
* amplitudę modulacji,&lt;br /&gt;
* wypełnienie fali, które zdefiniowane jest w następujący sposób:&lt;br /&gt;
&amp;lt;math&amp;gt; d = \frac{\tau}{T}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Fizjologia zjawisk SSEP i SSVEP=&lt;br /&gt;
&lt;br /&gt;
==SSEP==&lt;br /&gt;
Potencjały Wywołane Stanu Ustalonego to typ odpowiedzi mózgu na bodziec powtarzany ze stałą częstotliwością. Efektem takiej stymulacji jest pojawienie się w określonych obszarach kory mózgowej częstotliwości korespondującej z częstotliwością podawanego bodźca.&lt;br /&gt;
&lt;br /&gt;
Stawianych jest kilka hipotez, z których trzy starają się tłumaczyć najbardziej podstawowy mechanizm pojawiania się tego zjawiska w mózgu: &lt;br /&gt;
* Pierwsza z nich mówi, iż powtarzany z określoną częstością bodziec wywołuje każdorazowo odpowiedź, a ich ciąg znajduje odbicie w rejestrowanym sygnale EEG (Lachowska, 2009; Rance, 2008). Zakłada się tutaj, iż do powstania odpowiedzi konieczne są niższe piętra przetwarzania informacji oraz brak specyficznego obszaru kory lub sieci neuronalnej odpowiedzialnej za obróbkę tego typu bodźców. Argumentów potwierdzających dostarczają tutaj badania na zwierzętach, gdzie rejestrowano SSEP z poszczególnych pięter układu nerwowego (Yoris, 1992; za: Rance, 2008). Słabe strony tej hipotezy ujawniają badania neuroobrazownia, w których rejestruje się aktywność w rejonach niezwiązanych z przetwarzaniem pojedynczego impulsu danej modalności (Pastor, 2003; Reyes, 2004). Sugeruje to, iż istnieje obszar lub sieć neuronów odpowiedzialna za przetwarzanie tego typu bodźca i jest ona aktywowana wraz z rejonami kory, których zadaniem jest odbiór i interpretacja danych dostarczanych przez poszczególne zmysły. &lt;br /&gt;
* Druga z tych hipotez mówi, iż w trakcie stymulacji dochodzi do synchronizacji odpalania potencjałów czynnościowych przez neurony, co przejawia się zwiększeniem siły odpowiedzi w danej częstotliwości na tle aktywności spontanicznej mózgu (Moratti, 2007). &lt;br /&gt;
* Trzecia hipoteza zakłada, że obserwowany w sygnale potencjał jest związany ze wzrostem amplitudy odpowiedzi aktywowanych neuronów (Nikulin, 2007; za: Vialatte, 2010).&lt;br /&gt;
&lt;br /&gt;
Żadne ze wspomnianych badań nie zostało przeprowadzone z myślą o pokazaniu&lt;br /&gt;
genezy indukowania potencjału SSEP, lecz dotyczyły wybranych bodźców i zagadnień&lt;br /&gt;
związanych z ich charakterystyką odpowiedzi. Na podstawie zebranych dotychczas danych trudno orzec o słuszności którejś z wyżej wymienionych hipotez.&lt;br /&gt;
&lt;br /&gt;
==SSVEP==&lt;br /&gt;
&lt;br /&gt;
Wzrokowe Potencjały Wywołane Stanu Ustalonego (SSVEP) powstają pod wpływem stymulacji bodźcem świetlnym powtarzanym ze stałą częstością. W trakcie stymulacji w sygnale EEG obserwowany jest wzrost mocy w częstościach związanych z częstością pulsującego światła. Charakterystyczne dla potencjałów SSVEP jest występowanie zarówno częstości podstawowej &amp;amp;mdash; analogicznej jak częstość stymulatora &amp;amp;mdash; jak i pierwszej i drugiej harmonicznej oraz subharmonicznych (Hermann, 2001; Pastor, 2003; Vialatte, 2008). W pracy (Regan, 1989; za: Silberstein, 1995) wyróżniono szereg komponentów, które są charakterystyczne dla SSVEP. W zależności od częstości stymulacji zaobserwowana została zmienność w kształcie oraz latencji charakterystycznych załamków SSVEP. Dla częstości wysokich od 25 do 60 Hz &amp;amp;mdash; charakterystyczna składowa fali pojawia się do 30 do 60 ms po bodźcu i odznacza się małą zmiennością międzyosobniczą. Wcześniejsze załamki (ok. 10 ms) są obserwowane, ich latencja wydaje się być zależna od wieku osoby. Przedział częstości niskich od 15 do 25 Hz &amp;amp;mdash; odznacza się obecnością swoistego komponentu od około 85 do 120 ms po bodźcu. W tym przypadku wariancja wewnątrz grupy jest większa w porównaniu do częstości wysokich. Najtrudniej trafnie wyodrębnić charakterystyczne składowe dla odpowiedzi na niskie częstotliwości stymulatora. Latencja w tym przypadku waha się od 135 do 350 ms. &lt;br /&gt;
&lt;br /&gt;
===Przestrzenna lokalizacja generatorów SSVEP.=== &lt;br /&gt;
Pomimo, iż powstanie SSVEP jest nierozerwalnie związane z okolicami wzrokowymi kory mózgowej (Bianciardi, 2009; Pastor, 2003; Silberstein, 1995), jego występowanie mapuje się również w innych rejonach mózgu. Wytyczenie obszarów odpowiedzialnych za generowanie potencjału zostało podjęte przy pomocy różnych metod mierzących aktywność mózgu. Oprócz EEG wykorzystano PET (Pastor, 2003), MEG (Fewcett, 2004; za: Vialatte, 2010) i fMRI (Bayram, 2011; Bianciardi, 2009; Parkes, 2003). Wyniki tych badań nie dają jednoznacznej odpowiedzi na stawiane pytanie, ale można na ich podstawie wskazać na kilka struktur, których aktywność wydaje się być znacząca i każdorazowo rejestrowana. Głównym obszarem generującym oscylujący potencjał jest pierwszorzędowa kora wzrokowa V1. Jej aktywacja zaznacza się w momencie stymulacji bodźcami świetlnymi bez względu na przedział częstotliwości i ich parametry. Różne badania donoszą natomiast o dodatkowych obszarach mających swój udział w generowaniu odpowiedzi mózgowej na pulsujący bodziec (V5, (Fawcett, 2004; za: Vialatte, 2010) kora czołowa i skroniowa, V2 (Sriniviasan, 2006, 2007; za: Vialatte, 2010). Badanie wykonane za pomocą PET (Pastor, 2003) przybliżyło szczegóły rozkładu aktywacji ośrodków korowych podczas generowania SSVEP. Oprócz zlokalizowania jego występowania w obszarach płatów potylicznych, skroniowych oraz ciemieniowych, dzięki użyciu różnych znaczników nakreślone zostały granice aktywności kory w zależności od częstotliwości stymulatora. Dla niskich częstotliwości (w badaniu reprezentowanych przez 5Hz) obserwuje się aktywność w polach Brodmanna (BA) 17 i 18 oraz w lewej półkuli móżdżku, dla częstości średnich pobudzony był obszar pierwszorzędowej kory wzrokowej oraz kory asocjacyjnej (BA 17 i 18). Nieco odmienne rezultaty otrzymano dla częstości 40 Hz, która pobudzała tylną część V1 oraz korę asocjacyjną prawej półkuli. Taki rozkład aktywacji przy wyżej&lt;br /&gt;
wymienionych częstościach może być związany z funkcjonalny podziałem V1 &amp;amp;mdash; obszar przedni pobudzany przez niskie i średnie częstości (&amp;lt;30 Hz) jest odpowiedzialny za widzenie peryferyjne, wtedy pobudzona była dość duża powierzchnia kory. 40 Hz aktywuje natomiast rejony odpowiedzialne za widzenie centralne, stąd mały, ograniczony do wybranych kolumn, obszar pobudzenia. Rejony, którym przypisane zostało generowanie SSVEP, nie ograniczały się do okolic wzrokowych. Oprócz okolicy V1 wymieniany jest również obszar V5, odpowiedzialny za detekcje ruchu, mający bezpośrednie połączenia z V1, inne okolice wzrokowe oraz kora czołowa. Niskoczęstotliwościowe SSVEP zauważano również na poziomie struktur śródmózgowia &amp;amp;mdash; w ciele kolankowatym bocznym, co zaowocowało hipotezą o podkorowej proweniencji takich potencjałów.&lt;br /&gt;
&lt;br /&gt;
Tak zróżnicowany obraz aktywności wywoływanych przez różne częstości SSVEP może wynikać z różnych funkcjonalnych i anatomicznych właściwości poszczególnych regionów. W układzie wzrokowym człowieka rozpoznane zostały 3 odmienne drogi przetwarzania informacji odpowiadającej tej modalności (Chatterjee, 2003; za: Vialatte, 2010; Gazzaniga, 2004; za: Vialatte, 2010). Każda z nich związana jest z innym typem czopków: odpowiadającymi na krótkie, średnie o długie fale. Droga ''Parvocellular'' (PC) mająca swój początek w ''midget retinal ganglion cells'' (RGCs) przetwarza informację o kolorze, kształcie oraz przestrzennym kontraście. Jest wyczulona szczególnie na przenoszenie informacji o kolorze czerwonym i zielonym, która jest przekazywana z czopków L i M (''long-'' i ''mediumwave''). Z kolei droga ''Magnocellular'' (MC), będąca dużo szybszym kanałem, bierze swój początek w ''parasol retinal ganglion cells''. Odpowiada ona za dostarczenie informacji o ruchu i głębi. Również korzysta z informacji z czopków M i L. Ostatnio odkryto trzeci z kanałów &amp;amp;mdash; drogę ''Koniocellular'' (KC) zaczynającą się w ''bistratisfied retina ganglion cells'', odpowiadający za percepcję kolorów błękitnego oraz żółtego. Niektórzy badacze wysuwają hipotezę, że wyłącznie tan kanał dostarcza informacji o kolorach, podczas gdy kanał PC odpowiada za dobrą rozdzielczość percepowanej informacji (Foxe, 2008; za: Vialatte, 2010; Chatterjee, 2003; za: Vialatte, 2010). Droga MC tworzy tzw. kanał brzuszny obróbki informacji a szlak KC i PC &amp;amp;mdash; kanały grzbietowe. Na pytanie o zależność pomiędzy rodzajem kanału a SSVEP żaden z badaczy nie udzielił wyczerpującej odpowiedzi. Podejrzewa się, iż w zależności od miejsca generowania SSVEP siła odpowiedzi będzie zależna od wyglądu bodźca. Możliwe, iż obszary kanału grzbietowego będą odznaczały się predylekcją do bodźców jednobarwnych, niejaskrawych, o dość dużych rozmiarach oraz migających z wysoką częstotliwością. Drogi KC i PC natomiast będą generować mocne SSVEP, jeżeli będą pobudzane przez kolorowe kontrastowe bodźce o małych rozmiarach w niskiej częstości. Odmienną hipotezę zaproponował McKeefry (McKeefry, 1996, za: Vialatte, 2010), który skojarzył drogi obróbki informacji z rodzajem komórek. W ten sposób upatruje on powstawanie pierwszej harmonicznej dzięki aktywności komórek tonicznych i drogi PC, a drugiej harmonicznej &amp;amp;mdash; dzięki komórkom fazowym i szlakowi MC. W świetle tych hipotez należałoby się spodziewać, iż siła odpowiedzi będzie zależeć od wyglądu stosowanego bodźca, lokalizacji rejestracji sygnału na głowie oraz częstości.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Zadanie 1==&lt;br /&gt;
&lt;br /&gt;
===Procedura 1 ===&lt;br /&gt;
W programie Psychopy przygotuj procedurę, w ramach której osoba badana będzie patrzeć na migający biały kwadrat na czarnym tle. Częstość migania ma być wybierana losowo z puli: 5, 12, 15, 20 Hz, wypełnienie ma wynosić 50%. Jedna próba ma trwać 5 s. Po 5-sekundowym okresie migania, powinna się pojawić przerwa o losowym czasie trwania od 3 do 7 sekund. Momenty pojawiania się poszczególnych częstości powinny być zapisywane w tagach. Każdego warunku należy zebrać po 30 powtórzeń.&lt;br /&gt;
&lt;br /&gt;
===Procedura 2 ===&lt;br /&gt;
W programie Psychopy przygotuj procedurę, w ramach której osoba badana będzie reagować na czerwony kwadrat pojawiający się wśród białych migających kwadratów na czarnym tle. Częstość migania ma wynosić 12 i 15 Hz, odpowiednia dla pierwszego i drugiego bloku, wypełnienie ma wynosić 50%. Jedna próba ma trwać 7 s, próby powtarzają się po 50 razy. W ramach próby badany patrzy migający z zadaną częstością kwadrat. Po czasie 2,5 lub 5,5 sekund kwadrat zmienia kolor na czerwony (na jedno błyśnięcie). Osoba ma jak najszybciej zareagować na moment zmiany koloru kwadratu. Po 7-sekundowym okresie migania, powinna się pojawić przerwa o losowym czasie trwania od 3 do 7 sekund. Momenty pojawiania się poszczególnych częstości powinny być zapisywane w tagach. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pomiar wykonujemy za pomocą następujących elektrod: Fp1, Fp2, Fpz, Cz, P3, Pz, P4, O1, O2 oraz jeśli twój czepek to umożliwia również elektrody P7 i P8. Jako elektrody referencyjne załóż elektrody M1 i M2. Częstość próbkowania: 256 Hz.&lt;br /&gt;
&lt;br /&gt;
===Analiza danych===&lt;br /&gt;
# Przefiltruj sygnały EEG w paśmie 1-45 Hz za pomocą procedury &amp;lt;tt&amp;gt;filtfilt&amp;lt;/tt&amp;gt;. Na podstawie tagów wyodrębnij sygnały EEG zarejestrowane w trakcie stymulacji z odpowiednimi częstościami.&lt;br /&gt;
# Dla każdej realizacji wyestymuj przy pomocy transformaty Fouriera widmo mocy sygnału EEG. Widma odpowiadające tej samej częstości stymulacji uśrednij ze sobą. Zaprezentuj widma otrzymane przy stymulacjach różnymi częstościami.&lt;br /&gt;
#Dla każdej częstości stymulacji wyznacz miarę odpowiedzi SSVEP (amplitudę widma odpowiadającą częstości stymulacji) wraz z 95% przedziałem ufności dla średniej. Można to zrobić np. metodą bootstrap. Dla każdej częstości stymulacji wyznacz także poziom tła na podstawie widm pochodzących ze stymulacji innymi częstościami. Np. dla stymulacji częstością 12 Hz poziom tła można wyznaczyć jako 95 centyl ze zbioru wartości widma w częstości 12 Hz dla stymulacji pozostałymi częstościami. &lt;br /&gt;
#Sporządź wykres odpowiedzi SSVEP od częstości z zaznaczeniem przedziałów ufności i poziomu tła. Znajdź częstości, dla których odpowiedź ta była najsilniejsza.&lt;br /&gt;
&lt;br /&gt;
=Koncepcja drgania uogólnionego. Transformacja Hilberta=&lt;br /&gt;
==Wstęp==&lt;br /&gt;
Sygnałem najczęściej występującym w przyrodzie oraz najczęściej stosowanym w technice jest sygnał harmoniczny o postaci:&lt;br /&gt;
&lt;br /&gt;
''x''(''t'') = ''A''sin(&amp;amp;omega;''t''+&amp;amp;phi;&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;),&amp;lt;br&amp;gt;&lt;br /&gt;
gdzie: &amp;lt;br&amp;gt;&lt;br /&gt;
''t'' &amp;amp;mdash; chwila czasu &amp;lt;br&amp;gt;&lt;br /&gt;
''A'' &amp;amp;mdash; amplituda sygnału,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;omega; &amp;amp;mdash; częstość sygnału,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;phi;&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; &amp;amp;mdash; faza początkowa sygnału.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Okazuje się, że istnieje szeroka klasa sygnałów rzeczywistych, które można przedstawić w postaci tzw. &lt;br /&gt;
drgania uogólnionego:&lt;br /&gt;
''x''(''t'') = ''A''(''t'')sin(&amp;amp;Omega;(''t'') &amp;amp;middot; ''t'')&lt;br /&gt;
&lt;br /&gt;
gdzie: &amp;lt;br&amp;gt;&lt;br /&gt;
''t'' &amp;amp;mdash; chwila czasu &amp;lt;br&amp;gt;&lt;br /&gt;
''A''(''t'') &amp;amp;mdash; amplituda chwilowa sygnału ''x''(''t'') (jego obwiednia),&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;Omega;(''t'') &amp;amp;mdash; częstość chwilowa sygnału ''x''(''t''),&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Do klasy sygnałów, które mogą być reprezentowane w postaci drgania uogólnionego, należą m.in. wszystkie sygnały o ograniczonej energii i ograniczonej mocy średniej przedziałami ciągłe i bez składowej stałej (tzw. sygnały przestrzeni ''L''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;).&lt;br /&gt;
W celu przedstawienia sygnału ''x''(''t'') jako drgania uogólnionego należy wpierw wyznaczyć jego ''sygnał analityczny'' ''z''(''t''), który zdefiniowany jest w następujący sposób:&lt;br /&gt;
&lt;br /&gt;
''z''(''t'') = ''x''(''t'') + ''ix''&amp;lt;sub&amp;gt;H&amp;lt;/sub&amp;gt;(''t'')&lt;br /&gt;
&lt;br /&gt;
gdzie: &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;i=\sqrt{-1}&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
''x''&amp;lt;sub&amp;gt;H&amp;lt;/sub&amp;gt;(''t'') &amp;amp;mdash; transformata Hilberta sygnału ''x''(''t'').&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Transformatę Hilberta ''x''&amp;lt;sub&amp;gt;H&amp;lt;/sub&amp;gt;(''t'') sygnału ''x''(''t'') i transformatę do niej odwrotną definiujemy jak poniżej:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
x_H(t) = \frac{1}{\pi}\int_{-\infty}^{\infty} \frac{x(\tau)}{t - \tau}d\tau&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
x(t) = -\frac{1}{\pi}\int_{-\infty}^{\infty} \frac{x_H(\tau)}{t - \tau}d\tau&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 '''Uwaga praktyczna:''' &lt;br /&gt;
 do wyznaczania sygnału analitycznego korzysta się z jego następującej własności:&lt;br /&gt;
 Widmo sygnału analitycznego odpowiadającego sygnałowi rzeczywistemu jest zerowe &lt;br /&gt;
 dla ujemnych częstości, zaś dla dodatnich częstości ma podwojoną amplitudę:&lt;br /&gt;
 ''x''&amp;lt;sub&amp;gt;''a''&amp;lt;/sub&amp;gt; = ''F''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;(''F''(''x'')&amp;amp;middot;2''U'')&lt;br /&gt;
 gdzie ''F'' &amp;amp;mdash; transformacja Fouriera, a ''U'' funkcja schodkowa.&lt;br /&gt;
 Metoda ta zaimplementowana jest w funkcji &amp;lt;tt&amp;gt;scipy.signal.hilbert&amp;lt;/tt&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Jak można zauważyć, sygnał analityczny jest funkcją zespoloną, w związku z czym można go przedstawić w postaci:&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
z(t) = \left|z(t)\right|e^{i\varphi(t)}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie (patrz równanie (3)):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\left|z(t)\right| = \sqrt{x^2(t) + x^2_H(t)} \\&lt;br /&gt;
\\&lt;br /&gt;
\varphi(t) = \mathrm{arc\,tg}(\frac{x_H(t)}{x(t)})&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wielkości te służą do wyznaczania chwilowej fazy &amp;amp;phi; (wzór powyżej), chwilowej amplitudy ''A'' (obwiedni) oraz chwilowej częstości &amp;amp;Omega; sygnału &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
A(t)=\left|z(t)\right| \\&lt;br /&gt;
\\&lt;br /&gt;
\Omega(t) = \frac{d\varphi(t)}{dt}&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
co umożliwia przedstawienie sygnału ''x''(''t'') w postaci drgania uogólnionego:&lt;br /&gt;
&amp;lt;math&amp;gt;x(t) = A(t) \sin(\Omega(t)\cdot t)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Porównując powyższy wzór ze wzorem na funkcję harmoniczną:&lt;br /&gt;
&amp;lt;math&amp;gt;x(t) = A \sin(\omega_0 t + \varphi_0)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
widzimy, że sygnały nieharmoniczne charakteryzują się zmienną w czasie amplitudą i częstością oraz nie mają określonej fazy początkowej. Ten ostatni parametr jednak również może być wyznaczony, pod warunkiem iż określimy go względem pewnej stałej w czasie częstości &amp;amp;omega;&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;(''t''):&lt;br /&gt;
&amp;lt;math&amp;gt;\varphi(t)=\omega_0\cdot t + \varphi_0(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie: &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\varphi_0(t)&amp;lt;/math&amp;gt; &amp;amp;mdash; faza chwilowa sygnału &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Faza chwilowa jest zatem zdefiniowana jednoznacznie, ale tylko względem określonej częstości &amp;lt;math&amp;gt;\omega_0&amp;lt;/math&amp;gt;. W przypadku gdy analizujemy sygnały szerokopasmowe, wyznaczenie fazy chwilowej jest możliwe po przefiltrowaniu sygnału filtrem pasmowo-przepustowym.&lt;br /&gt;
&lt;br /&gt;
===Zadanie 2===&lt;br /&gt;
W zebranych sygnałach SSVEP wybierz zapisy dla trzech różnych częstości stymulacji (po jednym dla każdej częstości). Do analizy wybierz trzy kanały EEG, dla których sygnał SSVEP jest a) bardzo wyraźny; b) widoczny, ale słabszy; c) w zasadzie niewidoczny. Do analizy wybierz fragmenty od 2 sekund przed rozpoczęciem stymulacji do 2 sekund po jej zakończeniu.&lt;br /&gt;
&lt;br /&gt;
Dla każdej wybranej częstości stymulacji wybrane kanały EEG przefiltruj filtrem wąskopasmowym przepuszczającym częstości skupione wokół tej częstości stymulacji. Do przefiltrowanych sygnałów zastosuj transformację Hilberta, wyznacz amplitudę i częstość chwilową. Wyznacz fazę chwilową dla &amp;amp;omega;&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; równej częstości stymulacji. Wypróbuj dwa sposoby filtrowania: &amp;amp;bdquo;w jedną stronę&amp;amp;rdquo; (&amp;lt;tt&amp;gt;filter&amp;lt;/tt&amp;gt;) i &amp;amp;bdquo;w obie strony&amp;amp;rdquo; (&amp;lt;tt&amp;gt;filtfilt&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Wyrysuj przefiltrowane sygnały wraz z wyliczoną amplitudą chwilową. Na rysunku zaznacz początek i koniec stymulacji. Narysuj też wykres zależności częstości chwilowej i fazy chwilowej od czasu.&lt;br /&gt;
&lt;br /&gt;
=Podsumowanie= &lt;br /&gt;
W ramach podsumowania uzupełnij poniższą tabelę &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Porównanie metod&lt;br /&gt;
|-&lt;br /&gt;
! . !! ERP !! moc widmowa FFT !! transformata Hilberta&lt;br /&gt;
|-&lt;br /&gt;
| ilość wymaganych danych || ... || ... || ... &lt;br /&gt;
|-&lt;br /&gt;
| założenia fizjologiczne || ... || ... || ...&lt;br /&gt;
|-&lt;br /&gt;
| przykłady aktywności mózgu, które analizujemy daną metodą || ... || ... || ...  &lt;br /&gt;
|-&lt;br /&gt;
| charakterystyka danych || ... || ... || ... &lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
=Ćwiczenia eksperymentalne=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Do rejestracji zjawiska SSVEP wykorzystamy ten sam zestaw eksperymentalny co w przypadku badania Potencjałów Wywołanych. Poniżej przypominamy schemat komunikacji w języku Python pomiędzy komputerem a mikrokontrolerem sterującym wyświetlaniem bodźców. Czcionką pogrubioną wyszczególniono fragment kodu, który jest niezbędny do wytworzenia szybko powtarzających się bodźców świetlnych.&lt;br /&gt;
* Po podłączeniu przejściówki USB/RS232 do komputera mikrokontrolera sprawdź jaki plik w katalogu &amp;lt;tt&amp;gt;/dev&amp;lt;/tt&amp;gt; został utworzony i przydzielony do urządzenia (typowo może to być &amp;lt;tt&amp;gt;ttyUSB0&amp;lt;/tt&amp;gt;). &lt;br /&gt;
* poproś osobę prowadzącą aby dodała cię do grupy plugdev&lt;br /&gt;
 sudo usermod -a -G dialout userName&lt;br /&gt;
* Zaimportuj bibliotekę do komunikacji z mikrokontrolerem (kod poniżej, trzeba go zapisać w bieżącym katalogu): &lt;br /&gt;
: &amp;lt;tt&amp;gt;import SerialPort as SP&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Otwórz plik powiązany z urządzeniem zewnętrznym:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp = SP.SerialPort(nazwa_pliku) &amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.open()&amp;lt;/tt&amp;gt;&lt;br /&gt;
gdzie przykładowa nazwa pliku wynosi &amp;lt;tt&amp;gt;/dev/ttyUSB0&amp;lt;/tt&amp;gt;.&lt;br /&gt;
* Po włączeniu zasilania mikrokontrolera, diody podłączone do niego i wykorzystywane w eksperymencie z potencjałami wywołanymi będą zapalone. Następujące polecenie zgasi obydwie diody:&lt;br /&gt;
: &amp;lt;tt&amp;gt;'''sp.blinkSSVEP([0, 0],1,1)'''&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Wydanie poniższego polecenia spowoduje, iż mikrokontroler będzie generował sygnał prostokątny zapalający i gaszący podłączoną do niego diodę numer 1, z częstością ''f'' Hz i współczynnikiem  wypełnieniem równym  &amp;lt;math&amp;gt;\frac{x}{x+y}&amp;lt;/math&amp;gt;, zaś dioda numer 2 pozostanie zgaszona:&lt;br /&gt;
: &amp;lt;tt&amp;gt;'''sp.blinkSSVEP([f, 0],x,y)'''&amp;lt;/tt&amp;gt;&lt;br /&gt;
Jednocześnie, moment pojawienia się każdej składowej bodźca (każdego impulsu świetlnego) zostanie przesłany na na 5-stykowe wejście AUX mikrokontrolera. Przykładowo jeśli chcemy aby dioda migała z częstością 10 Hz i współczynnikiem wypełnienia 0,5 wydajemy następujące polecenie:&lt;br /&gt;
: &amp;lt;tt&amp;gt;'''sp.blinkSSVEP([10, 0],1,1)'''&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Jeśli chcemy zakończyć komunikację z mikrokontrolerem piszemy:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.close()&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kod biblioteki do komunikacji z mikrokontrolerem:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: cp1250 -*-&lt;br /&gt;
import serial&lt;br /&gt;
import logging&lt;br /&gt;
import sys&lt;br /&gt;
import os&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
def to_hex_word(a):&lt;br /&gt;
    '''encodes a decimal number hexadecimally on two bytes'''&lt;br /&gt;
    return a.to_bytes(2,byteorder=sys.byteorder)&lt;br /&gt;
 &lt;br /&gt;
class SerialPort(object):&lt;br /&gt;
    def __init__(self, port_name):&lt;br /&gt;
        import serial&lt;br /&gt;
        try:&lt;br /&gt;
            self.port = serial.Serial(&lt;br /&gt;
                port=port_name,&lt;br /&gt;
                baudrate=9600,&lt;br /&gt;
                bytesize=serial.EIGHTBITS,&lt;br /&gt;
                parity=serial.PARITY_NONE,&lt;br /&gt;
                stopbits=serial.STOPBITS_ONE,&lt;br /&gt;
                xonxoff=False&lt;br /&gt;
                )&lt;br /&gt;
        except serial.SerialException as e:&lt;br /&gt;
            print(&amp;quot;Nieprawidłowa nazwa portu lub port zajęty.&amp;quot;)&lt;br /&gt;
            raise e&lt;br /&gt;
        self.close()&lt;br /&gt;
 &lt;br /&gt;
    def open(self):&lt;br /&gt;
        self.port.open()&lt;br /&gt;
 &lt;br /&gt;
    def close(self):&lt;br /&gt;
        self.port.close()&lt;br /&gt;
 &lt;br /&gt;
    def send(self, value):&lt;br /&gt;
        self.port.write(value)&lt;br /&gt;
 &lt;br /&gt;
    def blinkSSVEP(self,d, p1, p2):&lt;br /&gt;
        '''&lt;br /&gt;
        d = list of frequencies;&lt;br /&gt;
        p1:p2 = ratio LED_on_time/LED_off_time&lt;br /&gt;
        if you want i-th LED to be OFF all the time send  d[i] = 0&lt;br /&gt;
        if you want i-th LED to be ON all the time send  d[i] = -1&lt;br /&gt;
        in these two cases p1 and p2 do not matter&lt;br /&gt;
        '''&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        factor = float(p1) / float(p1 + p2)&lt;br /&gt;
 &lt;br /&gt;
        str = (3).to_bytes(1,byteorder=sys.byteorder) # 'SSVEP_RUN'&lt;br /&gt;
 &lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            # i-th LED OFF&lt;br /&gt;
            if d[i] == 0:                       &lt;br /&gt;
                str += to_hex_word(0) + to_hex_word(255) &lt;br /&gt;
            # i-th LED ON&lt;br /&gt;
            elif d[i] == -1:&lt;br /&gt;
                str += to_hex_word(255) + to_hex_word(0)&lt;br /&gt;
                #str = 'S'&lt;br /&gt;
                # i-th LED blinks d[i] times per second&lt;br /&gt;
                # p1:p2 = on_time:off_time in one blink&lt;br /&gt;
            else:&lt;br /&gt;
                period = int(clock/d[i])&lt;br /&gt;
                bright = int((clock/d[i]) * factor)&lt;br /&gt;
                dark = period - bright&lt;br /&gt;
                str += to_hex_word(bright) + to_hex_word(dark)&lt;br /&gt;
 &lt;br /&gt;
        self.send(str)&lt;br /&gt;
 &lt;br /&gt;
    def blinkP300(self,d):&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        str = (4).to_bytes(1,byteorder=sys.byteorder) # 'P300_RUN'&lt;br /&gt;
 &lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            period = int(clock*d[i]/1000.0)&lt;br /&gt;
            str += to_hex_word(period)&lt;br /&gt;
 &lt;br /&gt;
        self.send(str)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# -*- coding: cp1250 -*-&lt;br /&gt;
import serial&lt;br /&gt;
import logging&lt;br /&gt;
import sys&lt;br /&gt;
import os&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def to_hex_word(a):&lt;br /&gt;
    '''encodes a decimal number hexadecimally on two bytes'''&lt;br /&gt;
    return chr(a%256) + chr(a/256)&lt;br /&gt;
&lt;br /&gt;
class SerialPort(object):&lt;br /&gt;
    def __init__(self, port_name):&lt;br /&gt;
        import serial&lt;br /&gt;
        try:&lt;br /&gt;
            self.port = serial.Serial(&lt;br /&gt;
                port=port_name,&lt;br /&gt;
                baudrate=9600,&lt;br /&gt;
                bytesize=serial.EIGHTBITS,&lt;br /&gt;
                parity=serial.PARITY_NONE,&lt;br /&gt;
                stopbits=serial.STOPBITS_ONE,&lt;br /&gt;
                xonxoff=False&lt;br /&gt;
                )&lt;br /&gt;
        except serial.SerialException, e:&lt;br /&gt;
            print &amp;quot;Nieprawidłowa nazwa portu lub port zajęty.&amp;quot;&lt;br /&gt;
            raise e&lt;br /&gt;
        self.close()&lt;br /&gt;
        &lt;br /&gt;
    def open(self):&lt;br /&gt;
        self.port.open()&lt;br /&gt;
&lt;br /&gt;
    def close(self):&lt;br /&gt;
        self.port.close()&lt;br /&gt;
&lt;br /&gt;
    def send(self, value):&lt;br /&gt;
        self.port.write(value)&lt;br /&gt;
                           &lt;br /&gt;
    def blinkSSVEP(self,d, p1, p2):&lt;br /&gt;
        '''&lt;br /&gt;
        d = list of frequencies;&lt;br /&gt;
        p1:p2 = ratio LED_on_time/LED_off_time&lt;br /&gt;
        if you want i-th LED to be OFF all the time send  d[i] = 0&lt;br /&gt;
        if you want i-th LED to be ON all the time send  d[i] = -1&lt;br /&gt;
        in these two cases p1 and p2 do not matter&lt;br /&gt;
        '''&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        factor = float(p1) / float(p1 + p2)&lt;br /&gt;
    &lt;br /&gt;
        str = chr(3) # 'SSVEP_RUN'&lt;br /&gt;
&lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            # i-th LED OFF&lt;br /&gt;
            if d[i] == 0:                       &lt;br /&gt;
                str += to_hex_word(0) + to_hex_word(255) &lt;br /&gt;
            # i-th LED ON&lt;br /&gt;
            elif d[i] == -1:&lt;br /&gt;
                str += to_hex_word(255) + to_hex_word(0)&lt;br /&gt;
                #str = 'S'&lt;br /&gt;
                # i-th LED blinks d[i] times per second&lt;br /&gt;
                # p1:p2 = on_time:off_time in one blink&lt;br /&gt;
            else:&lt;br /&gt;
                period = clock/d[i]&lt;br /&gt;
                bright = int((clock/d[i]) * factor)&lt;br /&gt;
                dark = period - bright&lt;br /&gt;
                str += to_hex_word(bright) + to_hex_word(dark)&lt;br /&gt;
&lt;br /&gt;
        self.send(str)&lt;br /&gt;
&lt;br /&gt;
    def blinkP300(self,d):&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        str = chr(4) # 'P300_RUN'&lt;br /&gt;
&lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            period = int(clock*d[i]/1000.0)&lt;br /&gt;
            str += to_hex_word(period)&lt;br /&gt;
            print(period)&lt;br /&gt;
&lt;br /&gt;
        self.send(str)&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Ćwiczenie I: Wykreślenie krzywej odpowiedzi dla badanej osoby.==&lt;br /&gt;
W ogólności siła odpowiedź SSVEP maleje wraz ze wzrostem częstości, jednak każda osoba ma indywidualne preferencje co do częstości, z którymi powinien migać bodziec. Celem eksperymentu jest znalezienie zbioru częstości, dla których badana osoba reaguje najsilniej. Aby przeprowadzić eksperyment, wykonaj następujące kroki:&lt;br /&gt;
===Przygotowanie programu do sterowania eksperymentem===&lt;br /&gt;
Napisz program komputerowy, który będzie:&lt;br /&gt;
# wybierał losowo z jednakowym prawdopodobieństwem częstość ze zbioru częstości {4, 7, 10, 13, 16, 20, 25, 30, 35, 40} Hz&lt;br /&gt;
# uruchamiał miganie jednej diody podłączonej do zestawu eksperymentalnego z częstościami wybraną częstością  na czas 5 sek (wypełnienie 50%). Po 5-sekundowym okresie migania, powinna się pojawić przerwa o losowym czasie trwania od 3 do 7 sekund. Momenty pojawiania się poszczególnych częstości rejestruj w pliku. Będzie to potrzebne w dalszej części ćwiczenia do powiązania triggera z częstością stymulacji. &lt;br /&gt;
# Powtórz punkty 1-2, tak aby uzyskać 15 realizacji migania z każdą z częstości.&lt;br /&gt;
&lt;br /&gt;
Zarejestrowana liczba realizacji jednej częstości powinna wynosić minimum 30.  Zrealizowanie tego w jednej sesji zajęłoby około 50 minut. Jest to uciążliwe dla osoby badanej, dlatego dzielimy eksperyment na dwie sesje po 20 minut &amp;amp;mdash; powtarzamy punkt 3 dwukrotnie.&lt;br /&gt;
&lt;br /&gt;
===Wykonanie pomiarów===&lt;br /&gt;
# Nałóż czepek na głowę badanej osoby i umieść w nim następujące elektrody: Fp1, Fp2, Fpz, Cz, P3, Pz, P4, O1, O2 oraz jeśli twój czepek to umożliwia również elektrody P7 i P8. Jako elektrody referencyjne załóż elektrody A1, A2 lub M1 i M2. Częstość próbkowania: 1024 Hz.&lt;br /&gt;
# Wykonaj eksperyment zgodnie ze schematem podanym w poprzednim paragrafie.&lt;br /&gt;
&lt;br /&gt;
===Analiza danych===&lt;br /&gt;
# Przefiltruj sygnały EEG w paśmie 1-45 Hz za pomocą procedury &amp;lt;tt&amp;gt;filtfilt&amp;lt;/tt&amp;gt;. &lt;br /&gt;
# Na podstawie sygnału trigger oraz danych zapisanych w pliku wyodrębnij sygnały EEG zarejestrowane w trakcie stymulacji z odpowiednimi częstościami.&lt;br /&gt;
# Przeanalizuj dane na trzy sposoby:&lt;br /&gt;
#* Sposób I:&lt;br /&gt;
#**Dla każdej realizacji wyestymuj przy pomocy transformaty Fouriera widmo amplitudowe sygnału EEG. &lt;br /&gt;
#**Widma odpowiadające tej samej częstości stymulacji uśrednij ze sobą. &lt;br /&gt;
#**Zaprezentuj widma otrzymane przy stymulacjach różnymi częstościami.&lt;br /&gt;
#**Dla każdej częstości stymulacji wyznacz miarę odpowiedzi SSVEP (amplitudę widma odpowiadającą częstości stymulacji) wraz z 95% przedziałem ufności dla średniej. Można to zrobić np. metodą bootstrap. Dla każdej częstości stymulacji wyznacz także poziom tła na podstawie widm pochodzących ze stymulacji innymi częstościami. Np. dla stymulacji częstością 10 Hz poziom tła można wyznaczyć jako 95 centyl ze zbioru wartości widma w częstości 10 Hz dla stymulacji częstościami {4, 7, 13, 16, 20, 25, 30, 35, 40} Hz. &lt;br /&gt;
#**Sporządź wykres odpowiedzi SSVEP od częstości z zaznaczeniem przedziałów ufności i poziomu tła. Znajdź częstości, dla których odpowiedź ta była najsilniejsza.&lt;br /&gt;
#* Sposób II:&lt;br /&gt;
#**Uśrednij sygnały odpowiadające stymulacji tą samą częstością. &lt;br /&gt;
#**Obejrzyj uśrednione sygnały. (Zaprezentuj je).&lt;br /&gt;
#**Wyestymuj przy pomocy transformaty Fouriera widmo amplitudowe średniego sygnału EEG. &lt;br /&gt;
#**Dla każdej częstości stymulacji wyznacz miarę odpowiedzi SSVEP  wraz z 95% przedziałem ufności dla średniej. Dla każdej częstości stymulacji wyznacz także poziom tła.&lt;br /&gt;
#**Sporządź wykres odpowiedzi SSVEP od częstości. Znajdź częstości, dla których odpowiedź ta była najsilniejsza.&lt;br /&gt;
#* Sposób III:&lt;br /&gt;
#**Dla każdego powtórzenia o danej częstości oblicz transformatę Fouriera&lt;br /&gt;
#**Uśrednij zespolone transformaty&lt;br /&gt;
#**Wyestymuj widmo amplitudowe z uśrednionej transformaty Fouriera (oblicz jej moduł),  wraz z 95% przedziałem ufności dla średniej. Dla każdej częstości stymulacji wyznacz także poziom tła.&lt;br /&gt;
#**Sporządź wykres odpowiedzi SSVEP  od częstości. Znajdź częstości, dla których odpowiedź ta była najsilniejsza.&lt;br /&gt;
#*Porównaj opisane powyżej trzy metody. Przy porównaniu uwzględnij:&lt;br /&gt;
#**Średnie widma przy stymulacji określoną częstością.&lt;br /&gt;
#**Uzyskane krzywe odpowiedzi SSVEP i wyestymowane przedziały ufności.&lt;br /&gt;
#**Odstęp między poziomem odpowiedzi a poziomem tła.&lt;br /&gt;
#*Czy można wyciągnąć jakieś wnioski na temat związku między fazą bodźca a fazą odpowiedzi?&lt;br /&gt;
&lt;br /&gt;
= Ćwiczenie dla chętnych=&lt;br /&gt;
Proszę zaimplementować funkcję generujacą znaczniki (tagi) dla programu SVAROG. Tagi te powinny wskazywać momenty rozpoczęcia błyskania diody z określoną częstością. Następnie proszę uśrednić sygnały, korzystając z narzędzia do uśredniania potencjałów w SVAROGU (zakładka Tools-&amp;gt;Average evoked potentials), względem tak wskazanych momentów czasu. &lt;br /&gt;
&lt;br /&gt;
Aby wytworzyć tagi dla SVAROGA z poziomu pythona, można wzorować się na następującym kodzie:&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
 #!/usr/bin/env python&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
# Author:&lt;br /&gt;
#     Mateusz Kruszyński &amp;lt;mateusz.kruszynski@titanis.pl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
from obci.analysis.obci_signal_processing.tags import tags_file_writer as tags_writer&lt;br /&gt;
from obci.analysis.obci_signal_processing.tags import tag_utils&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    writer = tags_writer.TagsFileWriter('./nic.obci.tag')&lt;br /&gt;
    for i in range(5):&lt;br /&gt;
        tag = tag_utils.pack_tag_to_dict(float(i), float(i)+0.1, 'tekst', {})&lt;br /&gt;
        writer.tag_received(tag)&lt;br /&gt;
    writer.finish_saving(0.0)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Gdzie:&lt;br /&gt;
*writer - obiekt, który będzie zapisywał tagi do pliku zdefiniowanego w nim (w tym przykładzie &amp;quot;nic.obci.tag&amp;quot;), &lt;br /&gt;
*tag_utils.pack_tag_to_dict - to tworzy tag, pierwsza liczba to poczatek druga koniec tagu, pozniej jest tekst do taga i dodatkowe opcje, które można sprawdzić w helpie,&lt;br /&gt;
*writer.tag_received(tag) - to przekazuje taga do writera, &lt;br /&gt;
*writer.finish_saving - kończy operacje zapisywania jako argument podany jest czas pierwszej próbki&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Koncepcja drgania uogólnionego. Transformata Hilberta=&lt;br /&gt;
==Wstęp==&lt;br /&gt;
Sygnałem najczęściej występującym w przyrodzie oraz najczęściej stosowanym w technice jest sygnał harmoniczny o postaci:&lt;br /&gt;
&lt;br /&gt;
''x''(''t'') = ''A''sin(&amp;amp;omega;''t''+&amp;amp;phi;&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;),&amp;lt;br&amp;gt;&lt;br /&gt;
gdzie: &amp;lt;br&amp;gt;&lt;br /&gt;
''t'' &amp;amp;mdash; chwila czasu &amp;lt;br&amp;gt;&lt;br /&gt;
''A'' &amp;amp;mdash; amplituda sygnału,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;omega; &amp;amp;mdash; częstość sygnału,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;phi;&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; &amp;amp;mdash; faza początkowa sygnału.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Okazuje się, że istnieje szeroka klasa sygnałów rzeczywistych, które można przedstawić w postaci tzw. &lt;br /&gt;
drgania uogólnionego:&lt;br /&gt;
''x''(''t'') = ''A''(''t'')sin(&amp;amp;Omega;(''t'') &amp;amp;middot; ''t'')&lt;br /&gt;
&lt;br /&gt;
gdzie: &amp;lt;br&amp;gt;&lt;br /&gt;
''t'' &amp;amp;mdash; chwila czasu &amp;lt;br&amp;gt;&lt;br /&gt;
''A''(''t'') &amp;amp;mdash; amplituda chwilowa sygnału ''x''(''t'') (jego obwiednia),&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;Omega;(''t'') &amp;amp;mdash; częstość chwilowa sygnału ''x''(''t''),&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Do klasy sygnałów, które mogą być reprezentowane w postaci drgania uogólnionego, należą m.in. wszystkie sygnały o ograniczonej energii i ograniczonej mocy średniej przedziałami ciągłe i bez składowej stałej (tzw. sygnały przestrzeni ''L''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;).&lt;br /&gt;
W celu przedstawienia sygnału ''x''(''t'') jako drgania uogólnionego należy wpierw wyznaczyć jego ''sygnał analityczny'' ''z''(''t''), który zdefiniowany jest w następujący sposób:&lt;br /&gt;
&lt;br /&gt;
''z''(''t'') = ''x''(''t'') + ''ix''&amp;lt;sub&amp;gt;H&amp;lt;/sub&amp;gt;(''t'')&lt;br /&gt;
&lt;br /&gt;
gdzie: &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;i=\sqrt{-1}&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
''x''&amp;lt;sub&amp;gt;H&amp;lt;/sub&amp;gt;(''t'') &amp;amp;mdash; transformata Hilberta sygnału ''x''(''t'').&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Transformatę Hilberta ''x''&amp;lt;sub&amp;gt;H&amp;lt;/sub&amp;gt;(''t'') sygnału ''x''(''t'') i transformatę do niej odwrotną definiujemy jak poniżej:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
x_H(t) = \frac{1}{\pi}\int_{-\infty}^{\infty} \frac{x(\tau)}{t - \tau}d\tau&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
x(t) = -\frac{1}{\pi}\int_{-\infty}^{\infty} \frac{x_H(\tau)}{t - \tau}d\tau&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 '''Uwaga praktyczna:''' &lt;br /&gt;
 do wyznaczania sygnału analitycznego korzysta się z jego następującej własności:&lt;br /&gt;
 Widmo sygnału analitycznego odpowiadającego sygnałowi rzeczywistemu jest zerowe &lt;br /&gt;
 dla ujemnych częstości, zaś dla dodatnich częstości ma podwojoną amplitudę:&lt;br /&gt;
 ''x''&amp;lt;sub&amp;gt;''a''&amp;lt;/sub&amp;gt; = ''F''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;(''F''(''x'')&amp;amp;middot;2''U'')&lt;br /&gt;
 gdzie ''F'' &amp;amp;mdash; transformacja Fouriera, a ''U'' funkcja schodkowa.&lt;br /&gt;
 Metoda ta zaimplementowana jest w funkcji &amp;lt;tt&amp;gt;scipy.signal.hilbert&amp;lt;/tt&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Jak można zauważyć, sygnał analityczny jest funkcją zespoloną, w związku z czym można go przedstawić w postaci:&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
z(t) = \left|z(t)\right|e^{i\varphi(t)}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie (patrz równanie (3)):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\left|z(t)\right| = \sqrt{x^2(t) + x^2_H(t)} \\&lt;br /&gt;
\\&lt;br /&gt;
\varphi(t) = \mathrm{arc\,tg}(\frac{x_H(t)}{x(t)})&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wielkości te służą do wyznaczania chwilowej fazy &amp;amp;phi; (wzór powyżej), chwilowej amplitudy ''A'' (obwiedni) oraz chwilowej częstości &amp;amp;Omega; sygnału &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
A(t)=\left|z(t)\right| \\&lt;br /&gt;
\\&lt;br /&gt;
\Omega(t) = \frac{d\varphi(t)}{dt}&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
co umożliwia przedstawienie sygnału ''x''(''t'') w postaci drgania uogólnionego:&lt;br /&gt;
&amp;lt;math&amp;gt;x(t) = A(t) \sin(\Omega(t)\cdot t)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Porównując powyższy wzór ze wzorem na funkcję harmoniczną:&lt;br /&gt;
&amp;lt;math&amp;gt;x(t) = A \sin(\omega_0 t + \varphi_0)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
widzimy, że sygnały nieharmoniczne charakteryzują się zmienną w czasie amplitudą i częstością oraz nie mają określonej fazy początkowej. Ten ostatni parametr jednak również może być wyznaczony, pod warunkiem iż określimy go względem pewnej stałej w czasie częstości &amp;amp;omega;&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;(''t''):&lt;br /&gt;
&amp;lt;math&amp;gt;\varphi(t)=\omega_0\cdot t + \varphi_0(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie: &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\varphi_0(t)&amp;lt;/math&amp;gt; &amp;amp;mdash; faza chwilowa sygnału &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Faza chwilowa jest zatem zdefiniowana jednoznacznie, ale tylko względem określonej częstości &amp;lt;math&amp;gt;\omega_0&amp;lt;/math&amp;gt;. W przypadku gdy analizujemy sygnały szerokopasmowe, wyznaczenie fazy chwilowej jest możliwe po przefiltrowaniu sygnału filtrem pasmowo-przepustowym.&lt;br /&gt;
&lt;br /&gt;
==Ćwiczenia symulacyjne==&lt;br /&gt;
Proszę zaimplementować funkcje generujące następujące przebiegi czasowe (oznaczenia: ''F&amp;lt;sub&amp;gt;s&amp;lt;/sub&amp;gt;'' &amp;amp;mdash; częstość próbkowania, ''T'' &amp;amp;mdash; czas trwania w sekundach, [[%C4%86wiczenia_1#Sygna.C5.82y_testowe|analogicznie do tego]]):&lt;br /&gt;
* sinusoida o zadanej częstości ''f'' i fazie &amp;lt;math&amp;gt;\phi&amp;lt;/math&amp;gt;: &amp;lt;tt&amp;gt;y = sin(f, phi, Fs, T)&amp;lt;/tt&amp;gt;,&lt;br /&gt;
* funkcja Gabora o zadanym położeniu szerokości i częstości &amp;lt;tt&amp;gt;y = gabor(t0, sigma, omega, Fs, T)&amp;lt;/tt&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;g_1(t) = \exp\left(-\frac{(t-t_0)^2}{2 \sigma^2}\right)\cdot \cos\left(\omega(t-t_0) \right)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Ćwiczenie 1===&lt;br /&gt;
* Wygeneruj 2-sekundowy odcinek sygnału Gabora o pozycji w czasie ''t''&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; = 1 s, częstości 16 Hz, skali 0,1 s i częstości próbkowania 128 Hz.&lt;br /&gt;
* Wyznacz i narysuj amplitudę chwilową sygnału Gabora.&lt;br /&gt;
&lt;br /&gt;
===Ćwiczenie 2===&lt;br /&gt;
* Wygeneruj 2-sekundowy odcinek sygnału  o pozycji w czasie ''t''&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; = 1 s, częstości 20 Hz, skali 0,1 s.&lt;br /&gt;
* Wyznacz i narysuj amplitudę chwilową sygnału sinusoidalnego, o częstości 16 Hz i częstości próbkowania 128 Hz.&lt;br /&gt;
* Wyznacz i narysuj fazę chwilową sygnału sinusoidalnego, korzystając ze związku:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\varphi(t)=\omega_0\cdot t + \varphi_0(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Ćwiczenie 3===&lt;br /&gt;
Wygeneruj dwa sygnały sinusoidalne o tej samej częstości 32 Hz i częstości próbkowania 128 Hz, ale różnych fazach początkowych. Pierwszy sygnał powinien mieć fazę początkową równą 0, drugi sygnał sinusoidalny powinien mieć fazę początkową równą &amp;amp;pi;/4. Za pomocą transformaty Hilberta wyznacz różnicę faz symulowanych sygnałów.&lt;br /&gt;
===Ćwiczenie 4===&lt;br /&gt;
To ćwiczenie jest ku przestrodze. &lt;br /&gt;
Wytwórz sygnał będący sumą dwóch sinusoid: jednej o częstości 30 i drugiej o częstości  32 Hz. Wykreśl przebieg sygnału i jego amplitudy chwilowej.&lt;br /&gt;
&lt;br /&gt;
==Ćwiczenia na danych pomiarowych==&lt;br /&gt;
&lt;br /&gt;
===Ćwiczenie 1===&lt;br /&gt;
W zebranych sygnałach SSVEP wybierz zapisy dla trzech różnych częstości stymulacji (po jednym dla każdej częstości). Do analizy wybierz trzy kanały EEG, dla których sygnał SSVEP jest a) bardzo wyraźny; b) widoczny, ale słabszy; c) w zasadzie niewidoczny. Do analizy wybierz fragmenty od 2 sekund przed rozpoczęciem stymulacji do 2 sekund po jej zakończeniu.&lt;br /&gt;
&lt;br /&gt;
Dla każdej wybranej częstości stymulacji wybrane kanały EEG przefiltruj filtrem wąskopasmowym przepuszczającym częstości skupione wokół tej częstości stymulacji. Do przefiltrowanych sygnałów zastosuj transformację Hilberta, wyznacz amplitudę i częstość chwilową. Wyznacz fazę chwilową dla &amp;amp;omega;&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; równej częstości stymulacji. Wypróbuj dwa sposoby filtrowania: &amp;amp;bdquo;w jedną stronę&amp;amp;rdquo; (&amp;lt;tt&amp;gt;filter&amp;lt;/tt&amp;gt;) i &amp;amp;bdquo;w obie strony&amp;amp;rdquo; (&amp;lt;tt&amp;gt;filtfilt&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Wyrysuj przefiltrowane sygnały wraz z wyliczoną amplitudą chwilową. Do rysunku dodaj wykres sygnału triggera aby widać było początek i koniec stymulacji. Narysuj też wykres zależności częstości chwilowej i fazy chwilowej od czasu.&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
=Bibliografia=&lt;br /&gt;
# Silberstein, R. (1995). Steady-state visually evoked potentials, brain resonances, and cognitive processes. W: Nunez, P. (red.), Neocortical Dynamics and Human EEG Rhythms (272-303). Oxford University Press, Oxford.&lt;br /&gt;
# Vialatte, F., Maurice, M., Dauwels, J. i Cichocki, A. (2010). Steady- state visually evoked  potentials: Focus on essential paradigms and future perspectives. Progress in Neurobiology, 90, 418-438.&lt;br /&gt;
# Lachowska, M., Morawski, K., Delgado, R. i Niemczyk, K. (2009). Postępy w audiologii. Słuchowe potencjały wywołane stanu ustalonego. Otorynolaryngologia, 8(1), 1-7.&lt;br /&gt;
# Rance, G. (red.) (2008). The Auditory Steady-State Response: Generation, Recording and Clinical Application. Plural Publishing, San Diego.&lt;br /&gt;
# Scherer, R., Muller-Putz, G. i Pfurtscheller, G. (2009). Flexibility and practicality: Graz Brain-Computer Interface approach. Internationl Review of Neurobiology, 86.&lt;br /&gt;
# Pastor, M., Artieda, J., Arbizu,J., Valencia, M. i Masdeu, J. (2003). Human cerebral activation during steady-state visual-evoked responses. Journal of Neuroscience, 23(37), 621-627.&lt;br /&gt;
# Moratti, S., Clementz, B., Gao, Y., Ortiz, T. i Keil, A. (2007). Neural mechanisms of evoked oscillations: stability and interaction with transient events. Human Brain Mapping, 28(12), 1318-1333.&lt;br /&gt;
# [http://durka.name/papers/OpenBCI_and_BCI_Appliance.pdf Artykuł o BCI Appliance z prostą funkcją detekcji SSVEP] P. J. Durka, R. Kuś, J. Ż̇ygierewicz, M. Michalska, P. Milanowski, M. Łabę̨cki, T. Spustek, D. Laszuk, A. Duszyk, M. Kruszyński. User-centered design of brain-computer interfaces: OpenBCI.pl and BCI Appliance. Bulletin of the Polish Academy of Sciences, vol. 60, No 3, september 2012, pp. 427-433&lt;/div&gt;</summary>
		<author><name>Maciek</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG_2/SSVEP_1&amp;diff=11109</id>
		<title>Pracownia EEG 2/SSVEP 1</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG_2/SSVEP_1&amp;diff=11109"/>
		<updated>2024-11-05T10:52:12Z</updated>

		<summary type="html">&lt;p&gt;Maciek: /* Koncepcja drgania uogólnionego. Transformata Hilberta */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Pracownia EEG 2|Pracownia EEG 2]] / SSVEP&lt;br /&gt;
&lt;br /&gt;
=Wstęp=&lt;br /&gt;
===Potencjały wywołane stanu ustalonego (ang. ''Steady State Evoked Potentials'', ''SSEP'')===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Plik:ep_ssep.png|768px|thumb|right|&amp;lt;figure id=&amp;quot;fig:ep_ssep&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
Porównanie przebiegu bodźców stosowanych do rejestracji Potencjałów Wywołanych oraz Potencjałów Wywołanych Stanu ustalonego.]]&lt;br /&gt;
&lt;br /&gt;
Potencjały wywołane EEG, które mierzyliśmy na poprzednich zajęciach, są śladami reakcji mózgu na pewne specyficzne bodźce. Jak pamiętamy, były to podawane w pewnych odstępach czasu (zwykle około 1 s), krótkotrwałe (~20 ms) błyski światła. W trakcie bieżących zajęć będziemy kontynuowali pomiar czynności elektrycznej mózgu w trakcie oddziaływania na badanego pewnymi bodźcami, jednakże przebieg stymulacji zostanie zmieniony. W tym eksperymencie bodźcem będzie seria powtarzających się w sposób ściśle periodyczny błysków światła (&amp;lt;xr id=&amp;quot;fig:ep_ssep&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt;).&lt;br /&gt;
Bodźce o takim przebiegu mogą mieć również postać krótkotrwałych dźwięków (np. trzasków), czy też impulsów mechanicznych (np. rytmiczny nacisk na skórę). Ślad elektrycznej odpowiedzi mózgu na szybko powtarzające się bodźce nazywamy '''potencjałami wywołanymi stanu ustalonego''' (ang. ''Steady State Evoked Potentials'', ''SSEP''). W zależności od modalności bodźca (czyli zmysłu, który jest poddawany stymulacji) wyróżniamy:&lt;br /&gt;
* wzrokowe potencjały wywołane stanu ustalonego (ang. ''Steady State Visual Evoked Potentials'', ''SSVEP''), w przypadku gdy stymulacja odbywa się za pomocą fali świetlnej (Silberstein, 1995; Vialatte, 2010).&lt;br /&gt;
* słuchowe potencjały stanu ustalonego (ang. ''Auditory Steady State Evoked Response'', ''ASSR''), w przypadku gdy stymulacja odbywa się za pomocą fali dźwiękowej.&lt;br /&gt;
* czuciowe potencjały wywołane stanu ustalonego (ang. ''Steady-State Somatosensory Evoked Potentials'', ''SSSEP''), wywoływane przy pomocy bodźców mechanicznych.&lt;br /&gt;
W języku polskim brakuje zwrotów, za pomocą których można prawidłowo scharakteryzować niektóre parametry bodźców wywołujących odpowiedź SSEP. W związku z tym, na potrzeby niniejszych ćwiczeń zostanie wprowadzona następująca nomenklatura:&lt;br /&gt;
* składowa bodźca &amp;amp;mdash; przebieg bodźca w jednym okresie stymulacji, np. pojedynczy, krótkotrwały błysk światła, dźwięk lub impuls mechaniczny (patrz &amp;lt;xr id=&amp;quot;fig:ep_ssep&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt;),&lt;br /&gt;
* bodziec/stymulacja/pobudzenie &amp;amp;mdash; jest to ciąg o czasie trwania ''T'', złożony z kolejnych występujących po sobie składowych, powtarzających się co okres &amp;amp;tau; (patrz &amp;lt;xr id=&amp;quot;fig:ep_ssep&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt;).&lt;br /&gt;
Charakterystyczną cechą zjawiska SSEP jest wzrost mocy sygnału EEG w częstości, z którą powtarzane są składowe bodźca. Np. jeśli błysk światła występuje co &amp;amp;tau;=100 ms, możemy oczekiwać wzrostu mocy elektrycznej aktywności mózgu dla częstości 10 Hz oraz niejednokrotnie dla jej harmonicznych. Moc sygnału ulega dodatkowemu zwiększeniu, jeśli badana osoba koncentruje silnie swoją uwagę na bodźcu. Cecha ta wykorzystywana jest m. in. do budowania tzw. interfejsów mózg komputer, czyli systemów, umożliwiających człowiekowi komunikację z komputerem bez pośrednictwa mięśni.&lt;br /&gt;
&lt;br /&gt;
===Modulacja===&lt;br /&gt;
Analizując od strony fizycznej przebieg bodźców wywołujących zjawisko SSEP możemy zauważyć, iż mamy do czynienia z [[wikipl:Modulacja|procesem modulacji sygnału]], czyli chwilową zmianą jego parametrów. Niezależnie od tego, który z tych parametrów ulega zmianie, w procesie modulacji wyróżniamy dwa podstawowe sygnały &amp;amp;mdash; sygnał nośny oraz sygnał modulujący [[http://en.wikipedia.org/wiki/Modulation]]. W technice radiowej czy telewizyjnej sygnałem nośnym są fale elektromagnetyczne. W przypadku wywoływania zjawiska SSVEP sygnałem nośnym też jest fala elektromagnetyczna, ale o długości z zakresu światła widzialnego. Z kolei zjawisko ASSR powstaje na skutek stymulacji, w której falą nośną jest fala dźwiękowa o częstości od kilkuset do kilku tysięcy Hz. Sygnał, który zmienia parametry fali nośnej nazywamy sygnałem modulującym. Przebieg sygnału modulującego może mieć różny charakter, jednakże najczęściej stosowane są sygnały o kształcie sinusoidalnym lub prostokątnym. W przypadku modulacji za pomocą sygnału sinusoidalnego zmianie może ulec amplituda, częstość lub faza sygnału nośnego. Mówimy wtedy odpowiednio o modulacji amplitudowej (ang. ''Amplitude Modulation'', ''AM''), częstościowej (ang. ''Frequency Modulation'', ''FM'') lub fazowej (ang. ''Phase Modulation'', ''PM''). Modulacja FM i PM nie jest stosowana do wywoływania zjawiska SSEP, natomiast modulację AM wykorzystuje się do pomiaru ASSR, w związku z czym zostanie opisana szerzej.&lt;br /&gt;
&lt;br /&gt;
===Modulacja amplitudowa sygnałem sinusoidalnym===&lt;br /&gt;
&lt;br /&gt;
Niech:&lt;br /&gt;
&amp;lt;math&amp;gt;x(t) = A \sin(\Omega t)&amp;lt;/math&amp;gt;&lt;br /&gt;
będzie sygnałem nośnym o częstości &amp;amp;Omega; i amplitudzie ''A'', zaś &lt;br /&gt;
&amp;lt;math&amp;gt;y(t) = B \sin(\omega t+ \varphi)&amp;lt;/math&amp;gt;&lt;br /&gt;
będzie sygnałem modulującym o częstości &amp;amp;omega;, amplitudzie ''B'' i fazie początkowej &amp;amp;phi;. Sygnałem zmodulowanym amplitudowo nazywamy następujący sygnał:&lt;br /&gt;
&amp;lt;math&amp;gt;z(t) = A \sin(\Omega t) + B \sin(\omega t + \varphi)\cdot \sin(\Omega t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Korzystając ze wzorów trygonometrycznych, powyższy wzór można zapisać w postaci:&lt;br /&gt;
&amp;lt;math&amp;gt;z(t) = A \sin(\Omega t) + B \frac{\cos((\Omega - \omega) t+\varphi)}{2} - B \frac{\cos((\Omega + \omega) t+\varphi)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
Jak można zauważyć, energia sygnału zmodulowanego amplitudowo skupiona jest wokół trzech częstości:&lt;br /&gt;
* częstości nośnej &amp;lt;math&amp;gt;f_0=\Omega&amp;lt;/math&amp;gt;,&lt;br /&gt;
* częstości &amp;lt;math&amp;gt;f_1=\Omega - \omega&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;f_2=\Omega + \omega&amp;lt;/math&amp;gt;.&lt;br /&gt;
Część widma sygnału zmodulowanego skupioną w częstościach &amp;lt;math&amp;gt;f_1&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;f_2&amp;lt;/math&amp;gt;&lt;br /&gt;
nazywamy wstęgami bocznymi.&lt;br /&gt;
[[Plik:glebokosc_modulacji.png|600px|thumb|right|&amp;lt;figure id=&amp;quot;fig:glebokosc_modulacji&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
Maksymalna i minimalna amplituda sygnału zmodulowanego w systemie AM.]]&lt;br /&gt;
[[Plik:AM_signals.png|600px|thumb|right|&amp;lt;figure id=&amp;quot;fig:AM_signals&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
Przebieg sygnału zmodulowanego w systemie AM w zależności od głębokości modulacji.]]&lt;br /&gt;
Modulację amplitudową można scharakteryzować za pomocą tzw. współczynnika głębokości modulacji, zdefiniowanego w następujący sposób (patrz &amp;lt;xr id=&amp;quot;fig:glebokosc_modulacji&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt;):&lt;br /&gt;
&amp;lt;math&amp;gt;m=\frac{A_{max}-A_{min}}{A_{max}+A_{min}}&amp;lt;/math&amp;gt;&lt;br /&gt;
Powyższy wzór można w prosty sposób przekształcić do następującej postaci:&lt;br /&gt;
&amp;lt;math&amp;gt;m=\frac{A_{max}-A_{min}}{A_{max}+A_{min}} = \frac{B}{A}&amp;lt;/math&amp;gt;&lt;br /&gt;
Głębokość modulacji może osiągać dowolne wartości dodatnie, jednakże w praktyce współczynnik ten powinien zawierać się w granicy pomiędzy 0 a 1 (bądź od 0 do 100 %). W przypadku gdy głębokość modulacji osiąga wartość wyższą niż 1, sygnał zostaje zniekształcony (patrz &amp;lt;xr id=&amp;quot;fig:AM_signals&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt;) i nie ma praktycznego wykorzystania.&lt;br /&gt;
&lt;br /&gt;
===Modulacja amplitudowa falą prostokątną===&lt;br /&gt;
[[Plik:modulacja_fala_prostokatna.png|600px|thumb|right|&amp;lt;figure id=&amp;quot;fig:modulacja_fala_prostokatna&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
A. Przykład sygnału zmodulowanego amplitudowo fala sinusoidalną. B. Przebieg sygnału zmodulowanego falą prostokątną. Kolor niebieski &amp;amp;mdash; fala nośna, kolor czerwony &amp;amp;mdash; fala modulująca.]]&lt;br /&gt;
[[Plik:wypelnienie.png|600px|thumb|right|&amp;lt;figure id=&amp;quot;fig:wypelnienie&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
Współczynnik wypełnienia fali prostokątnej jest stosunkiem czasu trwania impulsu &amp;amp;tau; do okresu jego powtarzania ''T''.]]&lt;br /&gt;
W przypadku wywoływania zjawiska SSEP stosuje się bodźce, w których fala nośna (światło) zostaje zmodulowany sygnałem prostokątnym. Porównanie modulacji amplitudowej sygnałem o przebiegu sinusoidalnym i sygnałem o przebiegu prostokątnym zaprezentowano na rysunku &lt;br /&gt;
&amp;lt;xr id=&amp;quot;fig:modulacja_fala_prostokatna&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt;.&lt;br /&gt;
W przypadku modulacji falą prostokątną rozważamy następujące parametry:&lt;br /&gt;
* częstość modulacji, która równa jest odwrotności okresu powtarzania się impulsu prostokątnego (na &amp;lt;xr id=&amp;quot;fig:modulacja_fala_prostokatna&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt; okres ten jest równy ''T''),&lt;br /&gt;
* amplitudę modulacji,&lt;br /&gt;
* wypełnienie fali, które zdefiniowane jest w następujący sposób:&lt;br /&gt;
&amp;lt;math&amp;gt; d = \frac{\tau}{T}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Fizjologia zjawisk SSEP i SSVEP=&lt;br /&gt;
&lt;br /&gt;
==SSEP==&lt;br /&gt;
Potencjały Wywołane Stanu Ustalonego to typ odpowiedzi mózgu na bodziec powtarzany ze stałą częstotliwością. Efektem takiej stymulacji jest pojawienie się w określonych obszarach kory mózgowej częstotliwości korespondującej z częstotliwością podawanego bodźca.&lt;br /&gt;
&lt;br /&gt;
Stawianych jest kilka hipotez, z których trzy starają się tłumaczyć najbardziej podstawowy mechanizm pojawiania się tego zjawiska w mózgu: &lt;br /&gt;
* Pierwsza z nich mówi, iż powtarzany z określoną częstością bodziec wywołuje każdorazowo odpowiedź, a ich ciąg znajduje odbicie w rejestrowanym sygnale EEG (Lachowska, 2009; Rance, 2008). Zakłada się tutaj, iż do powstania odpowiedzi konieczne są niższe piętra przetwarzania informacji oraz brak specyficznego obszaru kory lub sieci neuronalnej odpowiedzialnej za obróbkę tego typu bodźców. Argumentów potwierdzających dostarczają tutaj badania na zwierzętach, gdzie rejestrowano SSEP z poszczególnych pięter układu nerwowego (Yoris, 1992; za: Rance, 2008). Słabe strony tej hipotezy ujawniają badania neuroobrazownia, w których rejestruje się aktywność w rejonach niezwiązanych z przetwarzaniem pojedynczego impulsu danej modalności (Pastor, 2003; Reyes, 2004). Sugeruje to, iż istnieje obszar lub sieć neuronów odpowiedzialna za przetwarzanie tego typu bodźca i jest ona aktywowana wraz z rejonami kory, których zadaniem jest odbiór i interpretacja danych dostarczanych przez poszczególne zmysły. &lt;br /&gt;
* Druga z tych hipotez mówi, iż w trakcie stymulacji dochodzi do synchronizacji odpalania potencjałów czynnościowych przez neurony, co przejawia się zwiększeniem siły odpowiedzi w danej częstotliwości na tle aktywności spontanicznej mózgu (Moratti, 2007). &lt;br /&gt;
* Trzecia hipoteza zakłada, że obserwowany w sygnale potencjał jest związany ze wzrostem amplitudy odpowiedzi aktywowanych neuronów (Nikulin, 2007; za: Vialatte, 2010).&lt;br /&gt;
&lt;br /&gt;
Żadne ze wspomnianych badań nie zostało przeprowadzone z myślą o pokazaniu&lt;br /&gt;
genezy indukowania potencjału SSEP, lecz dotyczyły wybranych bodźców i zagadnień&lt;br /&gt;
związanych z ich charakterystyką odpowiedzi. Na podstawie zebranych dotychczas danych trudno orzec o słuszności którejś z wyżej wymienionych hipotez.&lt;br /&gt;
&lt;br /&gt;
==SSVEP==&lt;br /&gt;
&lt;br /&gt;
Wzrokowe Potencjały Wywołane Stanu Ustalonego (SSVEP) powstają pod wpływem stymulacji bodźcem świetlnym powtarzanym ze stałą częstością. W trakcie stymulacji w sygnale EEG obserwowany jest wzrost mocy w częstościach związanych z częstością pulsującego światła. Charakterystyczne dla potencjałów SSVEP jest występowanie zarówno częstości podstawowej &amp;amp;mdash; analogicznej jak częstość stymulatora &amp;amp;mdash; jak i pierwszej i drugiej harmonicznej oraz subharmonicznych (Hermann, 2001; Pastor, 2003; Vialatte, 2008). W pracy (Regan, 1989; za: Silberstein, 1995) wyróżniono szereg komponentów, które są charakterystyczne dla SSVEP. W zależności od częstości stymulacji zaobserwowana została zmienność w kształcie oraz latencji charakterystycznych załamków SSVEP. Dla częstości wysokich od 25 do 60 Hz &amp;amp;mdash; charakterystyczna składowa fali pojawia się do 30 do 60 ms po bodźcu i odznacza się małą zmiennością międzyosobniczą. Wcześniejsze załamki (ok. 10 ms) są obserwowane, ich latencja wydaje się być zależna od wieku osoby. Przedział częstości niskich od 15 do 25 Hz &amp;amp;mdash; odznacza się obecnością swoistego komponentu od około 85 do 120 ms po bodźcu. W tym przypadku wariancja wewnątrz grupy jest większa w porównaniu do częstości wysokich. Najtrudniej trafnie wyodrębnić charakterystyczne składowe dla odpowiedzi na niskie częstotliwości stymulatora. Latencja w tym przypadku waha się od 135 do 350 ms. &lt;br /&gt;
&lt;br /&gt;
===Przestrzenna lokalizacja generatorów SSVEP.=== &lt;br /&gt;
Pomimo, iż powstanie SSVEP jest nierozerwalnie związane z okolicami wzrokowymi kory mózgowej (Bianciardi, 2009; Pastor, 2003; Silberstein, 1995), jego występowanie mapuje się również w innych rejonach mózgu. Wytyczenie obszarów odpowiedzialnych za generowanie potencjału zostało podjęte przy pomocy różnych metod mierzących aktywność mózgu. Oprócz EEG wykorzystano PET (Pastor, 2003), MEG (Fewcett, 2004; za: Vialatte, 2010) i fMRI (Bayram, 2011; Bianciardi, 2009; Parkes, 2003). Wyniki tych badań nie dają jednoznacznej odpowiedzi na stawiane pytanie, ale można na ich podstawie wskazać na kilka struktur, których aktywność wydaje się być znacząca i każdorazowo rejestrowana. Głównym obszarem generującym oscylujący potencjał jest pierwszorzędowa kora wzrokowa V1. Jej aktywacja zaznacza się w momencie stymulacji bodźcami świetlnymi bez względu na przedział częstotliwości i ich parametry. Różne badania donoszą natomiast o dodatkowych obszarach mających swój udział w generowaniu odpowiedzi mózgowej na pulsujący bodziec (V5, (Fawcett, 2004; za: Vialatte, 2010) kora czołowa i skroniowa, V2 (Sriniviasan, 2006, 2007; za: Vialatte, 2010). Badanie wykonane za pomocą PET (Pastor, 2003) przybliżyło szczegóły rozkładu aktywacji ośrodków korowych podczas generowania SSVEP. Oprócz zlokalizowania jego występowania w obszarach płatów potylicznych, skroniowych oraz ciemieniowych, dzięki użyciu różnych znaczników nakreślone zostały granice aktywności kory w zależności od częstotliwości stymulatora. Dla niskich częstotliwości (w badaniu reprezentowanych przez 5Hz) obserwuje się aktywność w polach Brodmanna (BA) 17 i 18 oraz w lewej półkuli móżdżku, dla częstości średnich pobudzony był obszar pierwszorzędowej kory wzrokowej oraz kory asocjacyjnej (BA 17 i 18). Nieco odmienne rezultaty otrzymano dla częstości 40 Hz, która pobudzała tylną część V1 oraz korę asocjacyjną prawej półkuli. Taki rozkład aktywacji przy wyżej&lt;br /&gt;
wymienionych częstościach może być związany z funkcjonalny podziałem V1 &amp;amp;mdash; obszar przedni pobudzany przez niskie i średnie częstości (&amp;lt;30 Hz) jest odpowiedzialny za widzenie peryferyjne, wtedy pobudzona była dość duża powierzchnia kory. 40 Hz aktywuje natomiast rejony odpowiedzialne za widzenie centralne, stąd mały, ograniczony do wybranych kolumn, obszar pobudzenia. Rejony, którym przypisane zostało generowanie SSVEP, nie ograniczały się do okolic wzrokowych. Oprócz okolicy V1 wymieniany jest również obszar V5, odpowiedzialny za detekcje ruchu, mający bezpośrednie połączenia z V1, inne okolice wzrokowe oraz kora czołowa. Niskoczęstotliwościowe SSVEP zauważano również na poziomie struktur śródmózgowia &amp;amp;mdash; w ciele kolankowatym bocznym, co zaowocowało hipotezą o podkorowej proweniencji takich potencjałów.&lt;br /&gt;
&lt;br /&gt;
Tak zróżnicowany obraz aktywności wywoływanych przez różne częstości SSVEP może wynikać z różnych funkcjonalnych i anatomicznych właściwości poszczególnych regionów. W układzie wzrokowym człowieka rozpoznane zostały 3 odmienne drogi przetwarzania informacji odpowiadającej tej modalności (Chatterjee, 2003; za: Vialatte, 2010; Gazzaniga, 2004; za: Vialatte, 2010). Każda z nich związana jest z innym typem czopków: odpowiadającymi na krótkie, średnie o długie fale. Droga ''Parvocellular'' (PC) mająca swój początek w ''midget retinal ganglion cells'' (RGCs) przetwarza informację o kolorze, kształcie oraz przestrzennym kontraście. Jest wyczulona szczególnie na przenoszenie informacji o kolorze czerwonym i zielonym, która jest przekazywana z czopków L i M (''long-'' i ''mediumwave''). Z kolei droga ''Magnocellular'' (MC), będąca dużo szybszym kanałem, bierze swój początek w ''parasol retinal ganglion cells''. Odpowiada ona za dostarczenie informacji o ruchu i głębi. Również korzysta z informacji z czopków M i L. Ostatnio odkryto trzeci z kanałów &amp;amp;mdash; drogę ''Koniocellular'' (KC) zaczynającą się w ''bistratisfied retina ganglion cells'', odpowiadający za percepcję kolorów błękitnego oraz żółtego. Niektórzy badacze wysuwają hipotezę, że wyłącznie tan kanał dostarcza informacji o kolorach, podczas gdy kanał PC odpowiada za dobrą rozdzielczość percepowanej informacji (Foxe, 2008; za: Vialatte, 2010; Chatterjee, 2003; za: Vialatte, 2010). Droga MC tworzy tzw. kanał brzuszny obróbki informacji a szlak KC i PC &amp;amp;mdash; kanały grzbietowe. Na pytanie o zależność pomiędzy rodzajem kanału a SSVEP żaden z badaczy nie udzielił wyczerpującej odpowiedzi. Podejrzewa się, iż w zależności od miejsca generowania SSVEP siła odpowiedzi będzie zależna od wyglądu bodźca. Możliwe, iż obszary kanału grzbietowego będą odznaczały się predylekcją do bodźców jednobarwnych, niejaskrawych, o dość dużych rozmiarach oraz migających z wysoką częstotliwością. Drogi KC i PC natomiast będą generować mocne SSVEP, jeżeli będą pobudzane przez kolorowe kontrastowe bodźce o małych rozmiarach w niskiej częstości. Odmienną hipotezę zaproponował McKeefry (McKeefry, 1996, za: Vialatte, 2010), który skojarzył drogi obróbki informacji z rodzajem komórek. W ten sposób upatruje on powstawanie pierwszej harmonicznej dzięki aktywności komórek tonicznych i drogi PC, a drugiej harmonicznej &amp;amp;mdash; dzięki komórkom fazowym i szlakowi MC. W świetle tych hipotez należałoby się spodziewać, iż siła odpowiedzi będzie zależeć od wyglądu stosowanego bodźca, lokalizacji rejestracji sygnału na głowie oraz częstości.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Zadanie 1==&lt;br /&gt;
&lt;br /&gt;
===Procedura 1 ===&lt;br /&gt;
W programie Psychopy przygotuj procedurę, w ramach której osoba badana będzie patrzeć na migający biały kwadrat na czarnym tle. Częstość migania ma być wybierana losowo z puli: 5, 12, 15, 20 Hz, wypełnienie ma wynosić 50%. Jedna próba ma trwać 5 s. Po 5-sekundowym okresie migania, powinna się pojawić przerwa o losowym czasie trwania od 3 do 7 sekund. Momenty pojawiania się poszczególnych częstości powinny być zapisywane w tagach. Każdego warunku należy zebrać po 30 powtórzeń.&lt;br /&gt;
&lt;br /&gt;
===Procedura 2 ===&lt;br /&gt;
W programie Psychopy przygotuj procedurę, w ramach której osoba badana będzie reagować na czerwony kwadrat pojawiający się wśród białych migających kwadratów na czarnym tle. Częstość migania ma wynosić 12 i 15 Hz, odpowiednia dla pierwszego i drugiego bloku, wypełnienie ma wynosić 50%. Jedna próba ma trwać 7 s, próby powtarzają się po 50 razy. W ramach próby badany patrzy migający z zadaną częstością kwadrat. Po czasie 2,5 lub 5,5 sekund kwadrat zmienia kolor na czerwony (na jedno błyśnięcie). Osoba ma jak najszybciej zareagować na moment zmiany koloru kwadratu. Po 7-sekundowym okresie migania, powinna się pojawić przerwa o losowym czasie trwania od 3 do 7 sekund. Momenty pojawiania się poszczególnych częstości powinny być zapisywane w tagach. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pomiar wykonujemy za pomocą następujących elektrod: Fp1, Fp2, Fpz, Cz, P3, Pz, P4, O1, O2 oraz jeśli twój czepek to umożliwia również elektrody P7 i P8. Jako elektrody referencyjne załóż elektrody M1 i M2. Częstość próbkowania: 256 Hz.&lt;br /&gt;
&lt;br /&gt;
===Analiza danych===&lt;br /&gt;
# Przefiltruj sygnały EEG w paśmie 1-45 Hz za pomocą procedury &amp;lt;tt&amp;gt;filtfilt&amp;lt;/tt&amp;gt;. Na podstawie tagów wyodrębnij sygnały EEG zarejestrowane w trakcie stymulacji z odpowiednimi częstościami.&lt;br /&gt;
# Dla każdej realizacji wyestymuj przy pomocy transformaty Fouriera widmo amplitudowe sygnału EEG. Widma odpowiadające tej samej częstości stymulacji uśrednij ze sobą. Zaprezentuj widma otrzymane przy stymulacjach różnymi częstościami.&lt;br /&gt;
#Dla każdej częstości stymulacji wyznacz miarę odpowiedzi SSVEP (amplitudę widma odpowiadającą częstości stymulacji) wraz z 95% przedziałem ufności dla średniej. Można to zrobić np. metodą bootstrap. Dla każdej częstości stymulacji wyznacz także poziom tła na podstawie widm pochodzących ze stymulacji innymi częstościami. Np. dla stymulacji częstością 12 Hz poziom tła można wyznaczyć jako 95 centyl ze zbioru wartości widma w częstości 12 Hz dla stymulacji pozostałymi częstościami. &lt;br /&gt;
#Sporządź wykres odpowiedzi SSVEP od częstości z zaznaczeniem przedziałów ufności i poziomu tła. Znajdź częstości, dla których odpowiedź ta była najsilniejsza.&lt;br /&gt;
&lt;br /&gt;
=Koncepcja drgania uogólnionego. Transformacja Hilberta=&lt;br /&gt;
==Wstęp==&lt;br /&gt;
Sygnałem najczęściej występującym w przyrodzie oraz najczęściej stosowanym w technice jest sygnał harmoniczny o postaci:&lt;br /&gt;
&lt;br /&gt;
''x''(''t'') = ''A''sin(&amp;amp;omega;''t''+&amp;amp;phi;&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;),&amp;lt;br&amp;gt;&lt;br /&gt;
gdzie: &amp;lt;br&amp;gt;&lt;br /&gt;
''t'' &amp;amp;mdash; chwila czasu &amp;lt;br&amp;gt;&lt;br /&gt;
''A'' &amp;amp;mdash; amplituda sygnału,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;omega; &amp;amp;mdash; częstość sygnału,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;phi;&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; &amp;amp;mdash; faza początkowa sygnału.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Okazuje się, że istnieje szeroka klasa sygnałów rzeczywistych, które można przedstawić w postaci tzw. &lt;br /&gt;
drgania uogólnionego:&lt;br /&gt;
''x''(''t'') = ''A''(''t'')sin(&amp;amp;Omega;(''t'') &amp;amp;middot; ''t'')&lt;br /&gt;
&lt;br /&gt;
gdzie: &amp;lt;br&amp;gt;&lt;br /&gt;
''t'' &amp;amp;mdash; chwila czasu &amp;lt;br&amp;gt;&lt;br /&gt;
''A''(''t'') &amp;amp;mdash; amplituda chwilowa sygnału ''x''(''t'') (jego obwiednia),&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;Omega;(''t'') &amp;amp;mdash; częstość chwilowa sygnału ''x''(''t''),&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Do klasy sygnałów, które mogą być reprezentowane w postaci drgania uogólnionego, należą m.in. wszystkie sygnały o ograniczonej energii i ograniczonej mocy średniej przedziałami ciągłe i bez składowej stałej (tzw. sygnały przestrzeni ''L''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;).&lt;br /&gt;
W celu przedstawienia sygnału ''x''(''t'') jako drgania uogólnionego należy wpierw wyznaczyć jego ''sygnał analityczny'' ''z''(''t''), który zdefiniowany jest w następujący sposób:&lt;br /&gt;
&lt;br /&gt;
''z''(''t'') = ''x''(''t'') + ''ix''&amp;lt;sub&amp;gt;H&amp;lt;/sub&amp;gt;(''t'')&lt;br /&gt;
&lt;br /&gt;
gdzie: &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;i=\sqrt{-1}&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
''x''&amp;lt;sub&amp;gt;H&amp;lt;/sub&amp;gt;(''t'') &amp;amp;mdash; transformata Hilberta sygnału ''x''(''t'').&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Transformatę Hilberta ''x''&amp;lt;sub&amp;gt;H&amp;lt;/sub&amp;gt;(''t'') sygnału ''x''(''t'') i transformatę do niej odwrotną definiujemy jak poniżej:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
x_H(t) = \frac{1}{\pi}\int_{-\infty}^{\infty} \frac{x(\tau)}{t - \tau}d\tau&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
x(t) = -\frac{1}{\pi}\int_{-\infty}^{\infty} \frac{x_H(\tau)}{t - \tau}d\tau&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 '''Uwaga praktyczna:''' &lt;br /&gt;
 do wyznaczania sygnału analitycznego korzysta się z jego następującej własności:&lt;br /&gt;
 Widmo sygnału analitycznego odpowiadającego sygnałowi rzeczywistemu jest zerowe &lt;br /&gt;
 dla ujemnych częstości, zaś dla dodatnich częstości ma podwojoną amplitudę:&lt;br /&gt;
 ''x''&amp;lt;sub&amp;gt;''a''&amp;lt;/sub&amp;gt; = ''F''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;(''F''(''x'')&amp;amp;middot;2''U'')&lt;br /&gt;
 gdzie ''F'' &amp;amp;mdash; transformacja Fouriera, a ''U'' funkcja schodkowa.&lt;br /&gt;
 Metoda ta zaimplementowana jest w funkcji &amp;lt;tt&amp;gt;scipy.signal.hilbert&amp;lt;/tt&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Jak można zauważyć, sygnał analityczny jest funkcją zespoloną, w związku z czym można go przedstawić w postaci:&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
z(t) = \left|z(t)\right|e^{i\varphi(t)}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie (patrz równanie (3)):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\left|z(t)\right| = \sqrt{x^2(t) + x^2_H(t)} \\&lt;br /&gt;
\\&lt;br /&gt;
\varphi(t) = \mathrm{arc\,tg}(\frac{x_H(t)}{x(t)})&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wielkości te służą do wyznaczania chwilowej fazy &amp;amp;phi; (wzór powyżej), chwilowej amplitudy ''A'' (obwiedni) oraz chwilowej częstości &amp;amp;Omega; sygnału &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
A(t)=\left|z(t)\right| \\&lt;br /&gt;
\\&lt;br /&gt;
\Omega(t) = \frac{d\varphi(t)}{dt}&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
co umożliwia przedstawienie sygnału ''x''(''t'') w postaci drgania uogólnionego:&lt;br /&gt;
&amp;lt;math&amp;gt;x(t) = A(t) \sin(\Omega(t)\cdot t)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Porównując powyższy wzór ze wzorem na funkcję harmoniczną:&lt;br /&gt;
&amp;lt;math&amp;gt;x(t) = A \sin(\omega_0 t + \varphi_0)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
widzimy, że sygnały nieharmoniczne charakteryzują się zmienną w czasie amplitudą i częstością oraz nie mają określonej fazy początkowej. Ten ostatni parametr jednak również może być wyznaczony, pod warunkiem iż określimy go względem pewnej stałej w czasie częstości &amp;amp;omega;&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;(''t''):&lt;br /&gt;
&amp;lt;math&amp;gt;\varphi(t)=\omega_0\cdot t + \varphi_0(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie: &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\varphi_0(t)&amp;lt;/math&amp;gt; &amp;amp;mdash; faza chwilowa sygnału &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Faza chwilowa jest zatem zdefiniowana jednoznacznie, ale tylko względem określonej częstości &amp;lt;math&amp;gt;\omega_0&amp;lt;/math&amp;gt;. W przypadku gdy analizujemy sygnały szerokopasmowe, wyznaczenie fazy chwilowej jest możliwe po przefiltrowaniu sygnału filtrem pasmowo-przepustowym.&lt;br /&gt;
&lt;br /&gt;
===Zadanie 2===&lt;br /&gt;
W zebranych sygnałach SSVEP wybierz zapisy dla trzech różnych częstości stymulacji (po jednym dla każdej częstości). Do analizy wybierz trzy kanały EEG, dla których sygnał SSVEP jest a) bardzo wyraźny; b) widoczny, ale słabszy; c) w zasadzie niewidoczny. Do analizy wybierz fragmenty od 2 sekund przed rozpoczęciem stymulacji do 2 sekund po jej zakończeniu.&lt;br /&gt;
&lt;br /&gt;
Dla każdej wybranej częstości stymulacji wybrane kanały EEG przefiltruj filtrem wąskopasmowym przepuszczającym częstości skupione wokół tej częstości stymulacji. Do przefiltrowanych sygnałów zastosuj transformację Hilberta, wyznacz amplitudę i częstość chwilową. Wyznacz fazę chwilową dla &amp;amp;omega;&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; równej częstości stymulacji. Wypróbuj dwa sposoby filtrowania: &amp;amp;bdquo;w jedną stronę&amp;amp;rdquo; (&amp;lt;tt&amp;gt;filter&amp;lt;/tt&amp;gt;) i &amp;amp;bdquo;w obie strony&amp;amp;rdquo; (&amp;lt;tt&amp;gt;filtfilt&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Wyrysuj przefiltrowane sygnały wraz z wyliczoną amplitudą chwilową. Na rysunku zaznacz początek i koniec stymulacji. Narysuj też wykres zależności częstości chwilowej i fazy chwilowej od czasu.&lt;br /&gt;
&lt;br /&gt;
=Podsumowanie= &lt;br /&gt;
W ramach podsumowania uzupełnij poniższą tabelę &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Porównanie metod&lt;br /&gt;
|-&lt;br /&gt;
! . !! ERP !! moc widmowa FFT !! transformata Hilberta&lt;br /&gt;
|-&lt;br /&gt;
| ilość wymaganych danych || ... || ... || ... &lt;br /&gt;
|-&lt;br /&gt;
| założenia fizjologiczne || ... || ... || ...&lt;br /&gt;
|-&lt;br /&gt;
| przykłady aktywności mózgu, które analizujemy daną metodą || ... || ... || ...  &lt;br /&gt;
|-&lt;br /&gt;
| charakterystyka danych || ... || ... || ... &lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
=Ćwiczenia eksperymentalne=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Do rejestracji zjawiska SSVEP wykorzystamy ten sam zestaw eksperymentalny co w przypadku badania Potencjałów Wywołanych. Poniżej przypominamy schemat komunikacji w języku Python pomiędzy komputerem a mikrokontrolerem sterującym wyświetlaniem bodźców. Czcionką pogrubioną wyszczególniono fragment kodu, który jest niezbędny do wytworzenia szybko powtarzających się bodźców świetlnych.&lt;br /&gt;
* Po podłączeniu przejściówki USB/RS232 do komputera mikrokontrolera sprawdź jaki plik w katalogu &amp;lt;tt&amp;gt;/dev&amp;lt;/tt&amp;gt; został utworzony i przydzielony do urządzenia (typowo może to być &amp;lt;tt&amp;gt;ttyUSB0&amp;lt;/tt&amp;gt;). &lt;br /&gt;
* poproś osobę prowadzącą aby dodała cię do grupy plugdev&lt;br /&gt;
 sudo usermod -a -G dialout userName&lt;br /&gt;
* Zaimportuj bibliotekę do komunikacji z mikrokontrolerem (kod poniżej, trzeba go zapisać w bieżącym katalogu): &lt;br /&gt;
: &amp;lt;tt&amp;gt;import SerialPort as SP&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Otwórz plik powiązany z urządzeniem zewnętrznym:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp = SP.SerialPort(nazwa_pliku) &amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.open()&amp;lt;/tt&amp;gt;&lt;br /&gt;
gdzie przykładowa nazwa pliku wynosi &amp;lt;tt&amp;gt;/dev/ttyUSB0&amp;lt;/tt&amp;gt;.&lt;br /&gt;
* Po włączeniu zasilania mikrokontrolera, diody podłączone do niego i wykorzystywane w eksperymencie z potencjałami wywołanymi będą zapalone. Następujące polecenie zgasi obydwie diody:&lt;br /&gt;
: &amp;lt;tt&amp;gt;'''sp.blinkSSVEP([0, 0],1,1)'''&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Wydanie poniższego polecenia spowoduje, iż mikrokontroler będzie generował sygnał prostokątny zapalający i gaszący podłączoną do niego diodę numer 1, z częstością ''f'' Hz i współczynnikiem  wypełnieniem równym  &amp;lt;math&amp;gt;\frac{x}{x+y}&amp;lt;/math&amp;gt;, zaś dioda numer 2 pozostanie zgaszona:&lt;br /&gt;
: &amp;lt;tt&amp;gt;'''sp.blinkSSVEP([f, 0],x,y)'''&amp;lt;/tt&amp;gt;&lt;br /&gt;
Jednocześnie, moment pojawienia się każdej składowej bodźca (każdego impulsu świetlnego) zostanie przesłany na na 5-stykowe wejście AUX mikrokontrolera. Przykładowo jeśli chcemy aby dioda migała z częstością 10 Hz i współczynnikiem wypełnienia 0,5 wydajemy następujące polecenie:&lt;br /&gt;
: &amp;lt;tt&amp;gt;'''sp.blinkSSVEP([10, 0],1,1)'''&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Jeśli chcemy zakończyć komunikację z mikrokontrolerem piszemy:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.close()&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kod biblioteki do komunikacji z mikrokontrolerem:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: cp1250 -*-&lt;br /&gt;
import serial&lt;br /&gt;
import logging&lt;br /&gt;
import sys&lt;br /&gt;
import os&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
def to_hex_word(a):&lt;br /&gt;
    '''encodes a decimal number hexadecimally on two bytes'''&lt;br /&gt;
    return a.to_bytes(2,byteorder=sys.byteorder)&lt;br /&gt;
 &lt;br /&gt;
class SerialPort(object):&lt;br /&gt;
    def __init__(self, port_name):&lt;br /&gt;
        import serial&lt;br /&gt;
        try:&lt;br /&gt;
            self.port = serial.Serial(&lt;br /&gt;
                port=port_name,&lt;br /&gt;
                baudrate=9600,&lt;br /&gt;
                bytesize=serial.EIGHTBITS,&lt;br /&gt;
                parity=serial.PARITY_NONE,&lt;br /&gt;
                stopbits=serial.STOPBITS_ONE,&lt;br /&gt;
                xonxoff=False&lt;br /&gt;
                )&lt;br /&gt;
        except serial.SerialException as e:&lt;br /&gt;
            print(&amp;quot;Nieprawidłowa nazwa portu lub port zajęty.&amp;quot;)&lt;br /&gt;
            raise e&lt;br /&gt;
        self.close()&lt;br /&gt;
 &lt;br /&gt;
    def open(self):&lt;br /&gt;
        self.port.open()&lt;br /&gt;
 &lt;br /&gt;
    def close(self):&lt;br /&gt;
        self.port.close()&lt;br /&gt;
 &lt;br /&gt;
    def send(self, value):&lt;br /&gt;
        self.port.write(value)&lt;br /&gt;
 &lt;br /&gt;
    def blinkSSVEP(self,d, p1, p2):&lt;br /&gt;
        '''&lt;br /&gt;
        d = list of frequencies;&lt;br /&gt;
        p1:p2 = ratio LED_on_time/LED_off_time&lt;br /&gt;
        if you want i-th LED to be OFF all the time send  d[i] = 0&lt;br /&gt;
        if you want i-th LED to be ON all the time send  d[i] = -1&lt;br /&gt;
        in these two cases p1 and p2 do not matter&lt;br /&gt;
        '''&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        factor = float(p1) / float(p1 + p2)&lt;br /&gt;
 &lt;br /&gt;
        str = (3).to_bytes(1,byteorder=sys.byteorder) # 'SSVEP_RUN'&lt;br /&gt;
 &lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            # i-th LED OFF&lt;br /&gt;
            if d[i] == 0:                       &lt;br /&gt;
                str += to_hex_word(0) + to_hex_word(255) &lt;br /&gt;
            # i-th LED ON&lt;br /&gt;
            elif d[i] == -1:&lt;br /&gt;
                str += to_hex_word(255) + to_hex_word(0)&lt;br /&gt;
                #str = 'S'&lt;br /&gt;
                # i-th LED blinks d[i] times per second&lt;br /&gt;
                # p1:p2 = on_time:off_time in one blink&lt;br /&gt;
            else:&lt;br /&gt;
                period = int(clock/d[i])&lt;br /&gt;
                bright = int((clock/d[i]) * factor)&lt;br /&gt;
                dark = period - bright&lt;br /&gt;
                str += to_hex_word(bright) + to_hex_word(dark)&lt;br /&gt;
 &lt;br /&gt;
        self.send(str)&lt;br /&gt;
 &lt;br /&gt;
    def blinkP300(self,d):&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        str = (4).to_bytes(1,byteorder=sys.byteorder) # 'P300_RUN'&lt;br /&gt;
 &lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            period = int(clock*d[i]/1000.0)&lt;br /&gt;
            str += to_hex_word(period)&lt;br /&gt;
 &lt;br /&gt;
        self.send(str)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# -*- coding: cp1250 -*-&lt;br /&gt;
import serial&lt;br /&gt;
import logging&lt;br /&gt;
import sys&lt;br /&gt;
import os&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def to_hex_word(a):&lt;br /&gt;
    '''encodes a decimal number hexadecimally on two bytes'''&lt;br /&gt;
    return chr(a%256) + chr(a/256)&lt;br /&gt;
&lt;br /&gt;
class SerialPort(object):&lt;br /&gt;
    def __init__(self, port_name):&lt;br /&gt;
        import serial&lt;br /&gt;
        try:&lt;br /&gt;
            self.port = serial.Serial(&lt;br /&gt;
                port=port_name,&lt;br /&gt;
                baudrate=9600,&lt;br /&gt;
                bytesize=serial.EIGHTBITS,&lt;br /&gt;
                parity=serial.PARITY_NONE,&lt;br /&gt;
                stopbits=serial.STOPBITS_ONE,&lt;br /&gt;
                xonxoff=False&lt;br /&gt;
                )&lt;br /&gt;
        except serial.SerialException, e:&lt;br /&gt;
            print &amp;quot;Nieprawidłowa nazwa portu lub port zajęty.&amp;quot;&lt;br /&gt;
            raise e&lt;br /&gt;
        self.close()&lt;br /&gt;
        &lt;br /&gt;
    def open(self):&lt;br /&gt;
        self.port.open()&lt;br /&gt;
&lt;br /&gt;
    def close(self):&lt;br /&gt;
        self.port.close()&lt;br /&gt;
&lt;br /&gt;
    def send(self, value):&lt;br /&gt;
        self.port.write(value)&lt;br /&gt;
                           &lt;br /&gt;
    def blinkSSVEP(self,d, p1, p2):&lt;br /&gt;
        '''&lt;br /&gt;
        d = list of frequencies;&lt;br /&gt;
        p1:p2 = ratio LED_on_time/LED_off_time&lt;br /&gt;
        if you want i-th LED to be OFF all the time send  d[i] = 0&lt;br /&gt;
        if you want i-th LED to be ON all the time send  d[i] = -1&lt;br /&gt;
        in these two cases p1 and p2 do not matter&lt;br /&gt;
        '''&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        factor = float(p1) / float(p1 + p2)&lt;br /&gt;
    &lt;br /&gt;
        str = chr(3) # 'SSVEP_RUN'&lt;br /&gt;
&lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            # i-th LED OFF&lt;br /&gt;
            if d[i] == 0:                       &lt;br /&gt;
                str += to_hex_word(0) + to_hex_word(255) &lt;br /&gt;
            # i-th LED ON&lt;br /&gt;
            elif d[i] == -1:&lt;br /&gt;
                str += to_hex_word(255) + to_hex_word(0)&lt;br /&gt;
                #str = 'S'&lt;br /&gt;
                # i-th LED blinks d[i] times per second&lt;br /&gt;
                # p1:p2 = on_time:off_time in one blink&lt;br /&gt;
            else:&lt;br /&gt;
                period = clock/d[i]&lt;br /&gt;
                bright = int((clock/d[i]) * factor)&lt;br /&gt;
                dark = period - bright&lt;br /&gt;
                str += to_hex_word(bright) + to_hex_word(dark)&lt;br /&gt;
&lt;br /&gt;
        self.send(str)&lt;br /&gt;
&lt;br /&gt;
    def blinkP300(self,d):&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        str = chr(4) # 'P300_RUN'&lt;br /&gt;
&lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            period = int(clock*d[i]/1000.0)&lt;br /&gt;
            str += to_hex_word(period)&lt;br /&gt;
            print(period)&lt;br /&gt;
&lt;br /&gt;
        self.send(str)&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Ćwiczenie I: Wykreślenie krzywej odpowiedzi dla badanej osoby.==&lt;br /&gt;
W ogólności siła odpowiedź SSVEP maleje wraz ze wzrostem częstości, jednak każda osoba ma indywidualne preferencje co do częstości, z którymi powinien migać bodziec. Celem eksperymentu jest znalezienie zbioru częstości, dla których badana osoba reaguje najsilniej. Aby przeprowadzić eksperyment, wykonaj następujące kroki:&lt;br /&gt;
===Przygotowanie programu do sterowania eksperymentem===&lt;br /&gt;
Napisz program komputerowy, który będzie:&lt;br /&gt;
# wybierał losowo z jednakowym prawdopodobieństwem częstość ze zbioru częstości {4, 7, 10, 13, 16, 20, 25, 30, 35, 40} Hz&lt;br /&gt;
# uruchamiał miganie jednej diody podłączonej do zestawu eksperymentalnego z częstościami wybraną częstością  na czas 5 sek (wypełnienie 50%). Po 5-sekundowym okresie migania, powinna się pojawić przerwa o losowym czasie trwania od 3 do 7 sekund. Momenty pojawiania się poszczególnych częstości rejestruj w pliku. Będzie to potrzebne w dalszej części ćwiczenia do powiązania triggera z częstością stymulacji. &lt;br /&gt;
# Powtórz punkty 1-2, tak aby uzyskać 15 realizacji migania z każdą z częstości.&lt;br /&gt;
&lt;br /&gt;
Zarejestrowana liczba realizacji jednej częstości powinna wynosić minimum 30.  Zrealizowanie tego w jednej sesji zajęłoby około 50 minut. Jest to uciążliwe dla osoby badanej, dlatego dzielimy eksperyment na dwie sesje po 20 minut &amp;amp;mdash; powtarzamy punkt 3 dwukrotnie.&lt;br /&gt;
&lt;br /&gt;
===Wykonanie pomiarów===&lt;br /&gt;
# Nałóż czepek na głowę badanej osoby i umieść w nim następujące elektrody: Fp1, Fp2, Fpz, Cz, P3, Pz, P4, O1, O2 oraz jeśli twój czepek to umożliwia również elektrody P7 i P8. Jako elektrody referencyjne załóż elektrody A1, A2 lub M1 i M2. Częstość próbkowania: 1024 Hz.&lt;br /&gt;
# Wykonaj eksperyment zgodnie ze schematem podanym w poprzednim paragrafie.&lt;br /&gt;
&lt;br /&gt;
===Analiza danych===&lt;br /&gt;
# Przefiltruj sygnały EEG w paśmie 1-45 Hz za pomocą procedury &amp;lt;tt&amp;gt;filtfilt&amp;lt;/tt&amp;gt;. &lt;br /&gt;
# Na podstawie sygnału trigger oraz danych zapisanych w pliku wyodrębnij sygnały EEG zarejestrowane w trakcie stymulacji z odpowiednimi częstościami.&lt;br /&gt;
# Przeanalizuj dane na trzy sposoby:&lt;br /&gt;
#* Sposób I:&lt;br /&gt;
#**Dla każdej realizacji wyestymuj przy pomocy transformaty Fouriera widmo amplitudowe sygnału EEG. &lt;br /&gt;
#**Widma odpowiadające tej samej częstości stymulacji uśrednij ze sobą. &lt;br /&gt;
#**Zaprezentuj widma otrzymane przy stymulacjach różnymi częstościami.&lt;br /&gt;
#**Dla każdej częstości stymulacji wyznacz miarę odpowiedzi SSVEP (amplitudę widma odpowiadającą częstości stymulacji) wraz z 95% przedziałem ufności dla średniej. Można to zrobić np. metodą bootstrap. Dla każdej częstości stymulacji wyznacz także poziom tła na podstawie widm pochodzących ze stymulacji innymi częstościami. Np. dla stymulacji częstością 10 Hz poziom tła można wyznaczyć jako 95 centyl ze zbioru wartości widma w częstości 10 Hz dla stymulacji częstościami {4, 7, 13, 16, 20, 25, 30, 35, 40} Hz. &lt;br /&gt;
#**Sporządź wykres odpowiedzi SSVEP od częstości z zaznaczeniem przedziałów ufności i poziomu tła. Znajdź częstości, dla których odpowiedź ta była najsilniejsza.&lt;br /&gt;
#* Sposób II:&lt;br /&gt;
#**Uśrednij sygnały odpowiadające stymulacji tą samą częstością. &lt;br /&gt;
#**Obejrzyj uśrednione sygnały. (Zaprezentuj je).&lt;br /&gt;
#**Wyestymuj przy pomocy transformaty Fouriera widmo amplitudowe średniego sygnału EEG. &lt;br /&gt;
#**Dla każdej częstości stymulacji wyznacz miarę odpowiedzi SSVEP  wraz z 95% przedziałem ufności dla średniej. Dla każdej częstości stymulacji wyznacz także poziom tła.&lt;br /&gt;
#**Sporządź wykres odpowiedzi SSVEP od częstości. Znajdź częstości, dla których odpowiedź ta była najsilniejsza.&lt;br /&gt;
#* Sposób III:&lt;br /&gt;
#**Dla każdego powtórzenia o danej częstości oblicz transformatę Fouriera&lt;br /&gt;
#**Uśrednij zespolone transformaty&lt;br /&gt;
#**Wyestymuj widmo amplitudowe z uśrednionej transformaty Fouriera (oblicz jej moduł),  wraz z 95% przedziałem ufności dla średniej. Dla każdej częstości stymulacji wyznacz także poziom tła.&lt;br /&gt;
#**Sporządź wykres odpowiedzi SSVEP  od częstości. Znajdź częstości, dla których odpowiedź ta była najsilniejsza.&lt;br /&gt;
#*Porównaj opisane powyżej trzy metody. Przy porównaniu uwzględnij:&lt;br /&gt;
#**Średnie widma przy stymulacji określoną częstością.&lt;br /&gt;
#**Uzyskane krzywe odpowiedzi SSVEP i wyestymowane przedziały ufności.&lt;br /&gt;
#**Odstęp między poziomem odpowiedzi a poziomem tła.&lt;br /&gt;
#*Czy można wyciągnąć jakieś wnioski na temat związku między fazą bodźca a fazą odpowiedzi?&lt;br /&gt;
&lt;br /&gt;
= Ćwiczenie dla chętnych=&lt;br /&gt;
Proszę zaimplementować funkcję generujacą znaczniki (tagi) dla programu SVAROG. Tagi te powinny wskazywać momenty rozpoczęcia błyskania diody z określoną częstością. Następnie proszę uśrednić sygnały, korzystając z narzędzia do uśredniania potencjałów w SVAROGU (zakładka Tools-&amp;gt;Average evoked potentials), względem tak wskazanych momentów czasu. &lt;br /&gt;
&lt;br /&gt;
Aby wytworzyć tagi dla SVAROGA z poziomu pythona, można wzorować się na następującym kodzie:&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
 #!/usr/bin/env python&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
# Author:&lt;br /&gt;
#     Mateusz Kruszyński &amp;lt;mateusz.kruszynski@titanis.pl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
from obci.analysis.obci_signal_processing.tags import tags_file_writer as tags_writer&lt;br /&gt;
from obci.analysis.obci_signal_processing.tags import tag_utils&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    writer = tags_writer.TagsFileWriter('./nic.obci.tag')&lt;br /&gt;
    for i in range(5):&lt;br /&gt;
        tag = tag_utils.pack_tag_to_dict(float(i), float(i)+0.1, 'tekst', {})&lt;br /&gt;
        writer.tag_received(tag)&lt;br /&gt;
    writer.finish_saving(0.0)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Gdzie:&lt;br /&gt;
*writer - obiekt, który będzie zapisywał tagi do pliku zdefiniowanego w nim (w tym przykładzie &amp;quot;nic.obci.tag&amp;quot;), &lt;br /&gt;
*tag_utils.pack_tag_to_dict - to tworzy tag, pierwsza liczba to poczatek druga koniec tagu, pozniej jest tekst do taga i dodatkowe opcje, które można sprawdzić w helpie,&lt;br /&gt;
*writer.tag_received(tag) - to przekazuje taga do writera, &lt;br /&gt;
*writer.finish_saving - kończy operacje zapisywania jako argument podany jest czas pierwszej próbki&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Koncepcja drgania uogólnionego. Transformata Hilberta=&lt;br /&gt;
==Wstęp==&lt;br /&gt;
Sygnałem najczęściej występującym w przyrodzie oraz najczęściej stosowanym w technice jest sygnał harmoniczny o postaci:&lt;br /&gt;
&lt;br /&gt;
''x''(''t'') = ''A''sin(&amp;amp;omega;''t''+&amp;amp;phi;&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;),&amp;lt;br&amp;gt;&lt;br /&gt;
gdzie: &amp;lt;br&amp;gt;&lt;br /&gt;
''t'' &amp;amp;mdash; chwila czasu &amp;lt;br&amp;gt;&lt;br /&gt;
''A'' &amp;amp;mdash; amplituda sygnału,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;omega; &amp;amp;mdash; częstość sygnału,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;phi;&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; &amp;amp;mdash; faza początkowa sygnału.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Okazuje się, że istnieje szeroka klasa sygnałów rzeczywistych, które można przedstawić w postaci tzw. &lt;br /&gt;
drgania uogólnionego:&lt;br /&gt;
''x''(''t'') = ''A''(''t'')sin(&amp;amp;Omega;(''t'') &amp;amp;middot; ''t'')&lt;br /&gt;
&lt;br /&gt;
gdzie: &amp;lt;br&amp;gt;&lt;br /&gt;
''t'' &amp;amp;mdash; chwila czasu &amp;lt;br&amp;gt;&lt;br /&gt;
''A''(''t'') &amp;amp;mdash; amplituda chwilowa sygnału ''x''(''t'') (jego obwiednia),&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;Omega;(''t'') &amp;amp;mdash; częstość chwilowa sygnału ''x''(''t''),&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Do klasy sygnałów, które mogą być reprezentowane w postaci drgania uogólnionego, należą m.in. wszystkie sygnały o ograniczonej energii i ograniczonej mocy średniej przedziałami ciągłe i bez składowej stałej (tzw. sygnały przestrzeni ''L''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;).&lt;br /&gt;
W celu przedstawienia sygnału ''x''(''t'') jako drgania uogólnionego należy wpierw wyznaczyć jego ''sygnał analityczny'' ''z''(''t''), który zdefiniowany jest w następujący sposób:&lt;br /&gt;
&lt;br /&gt;
''z''(''t'') = ''x''(''t'') + ''ix''&amp;lt;sub&amp;gt;H&amp;lt;/sub&amp;gt;(''t'')&lt;br /&gt;
&lt;br /&gt;
gdzie: &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;i=\sqrt{-1}&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
''x''&amp;lt;sub&amp;gt;H&amp;lt;/sub&amp;gt;(''t'') &amp;amp;mdash; transformata Hilberta sygnału ''x''(''t'').&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Transformatę Hilberta ''x''&amp;lt;sub&amp;gt;H&amp;lt;/sub&amp;gt;(''t'') sygnału ''x''(''t'') i transformatę do niej odwrotną definiujemy jak poniżej:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
x_H(t) = \frac{1}{\pi}\int_{-\infty}^{\infty} \frac{x(\tau)}{t - \tau}d\tau&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
x(t) = -\frac{1}{\pi}\int_{-\infty}^{\infty} \frac{x_H(\tau)}{t - \tau}d\tau&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 '''Uwaga praktyczna:''' &lt;br /&gt;
 do wyznaczania sygnału analitycznego korzysta się z jego następującej własności:&lt;br /&gt;
 Widmo sygnału analitycznego odpowiadającego sygnałowi rzeczywistemu jest zerowe &lt;br /&gt;
 dla ujemnych częstości, zaś dla dodatnich częstości ma podwojoną amplitudę:&lt;br /&gt;
 ''x''&amp;lt;sub&amp;gt;''a''&amp;lt;/sub&amp;gt; = ''F''&amp;lt;sup&amp;gt;&amp;amp;minus;1&amp;lt;/sup&amp;gt;(''F''(''x'')&amp;amp;middot;2''U'')&lt;br /&gt;
 gdzie ''F'' &amp;amp;mdash; transformacja Fouriera, a ''U'' funkcja schodkowa.&lt;br /&gt;
 Metoda ta zaimplementowana jest w funkcji &amp;lt;tt&amp;gt;scipy.signal.hilbert&amp;lt;/tt&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Jak można zauważyć, sygnał analityczny jest funkcją zespoloną, w związku z czym można go przedstawić w postaci:&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
z(t) = \left|z(t)\right|e^{i\varphi(t)}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie (patrz równanie (3)):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\left|z(t)\right| = \sqrt{x^2(t) + x^2_H(t)} \\&lt;br /&gt;
\\&lt;br /&gt;
\varphi(t) = \mathrm{arc\,tg}(\frac{x_H(t)}{x(t)})&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wielkości te służą do wyznaczania chwilowej fazy &amp;amp;phi; (wzór powyżej), chwilowej amplitudy ''A'' (obwiedni) oraz chwilowej częstości &amp;amp;Omega; sygnału &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
A(t)=\left|z(t)\right| \\&lt;br /&gt;
\\&lt;br /&gt;
\Omega(t) = \frac{d\varphi(t)}{dt}&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
co umożliwia przedstawienie sygnału ''x''(''t'') w postaci drgania uogólnionego:&lt;br /&gt;
&amp;lt;math&amp;gt;x(t) = A(t) \sin(\Omega(t)\cdot t)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Porównując powyższy wzór ze wzorem na funkcję harmoniczną:&lt;br /&gt;
&amp;lt;math&amp;gt;x(t) = A \sin(\omega_0 t + \varphi_0)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
widzimy, że sygnały nieharmoniczne charakteryzują się zmienną w czasie amplitudą i częstością oraz nie mają określonej fazy początkowej. Ten ostatni parametr jednak również może być wyznaczony, pod warunkiem iż określimy go względem pewnej stałej w czasie częstości &amp;amp;omega;&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;(''t''):&lt;br /&gt;
&amp;lt;math&amp;gt;\varphi(t)=\omega_0\cdot t + \varphi_0(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie: &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\varphi_0(t)&amp;lt;/math&amp;gt; &amp;amp;mdash; faza chwilowa sygnału &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Faza chwilowa jest zatem zdefiniowana jednoznacznie, ale tylko względem określonej częstości &amp;lt;math&amp;gt;\omega_0&amp;lt;/math&amp;gt;. W przypadku gdy analizujemy sygnały szerokopasmowe, wyznaczenie fazy chwilowej jest możliwe po przefiltrowaniu sygnału filtrem pasmowo-przepustowym.&lt;br /&gt;
&lt;br /&gt;
==Ćwiczenia symulacyjne==&lt;br /&gt;
Proszę zaimplementować funkcje generujące następujące przebiegi czasowe (oznaczenia: ''F&amp;lt;sub&amp;gt;s&amp;lt;/sub&amp;gt;'' &amp;amp;mdash; częstość próbkowania, ''T'' &amp;amp;mdash; czas trwania w sekundach, [[%C4%86wiczenia_1#Sygna.C5.82y_testowe|analogicznie do tego]]):&lt;br /&gt;
* sinusoida o zadanej częstości ''f'' i fazie &amp;lt;math&amp;gt;\phi&amp;lt;/math&amp;gt;: &amp;lt;tt&amp;gt;y = sin(f, phi, Fs, T)&amp;lt;/tt&amp;gt;,&lt;br /&gt;
* funkcja Gabora o zadanym położeniu szerokości i częstości &amp;lt;tt&amp;gt;y = gabor(t0, sigma, omega, Fs, T)&amp;lt;/tt&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;g_1(t) = \exp\left(-\frac{(t-t_0)^2}{2 \sigma^2}\right)\cdot \cos\left(\omega(t-t_0) \right)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Ćwiczenie 1===&lt;br /&gt;
* Wygeneruj 2-sekundowy odcinek sygnału Gabora o pozycji w czasie ''t''&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; = 1 s, częstości 16 Hz, skali 0,1 s i częstości próbkowania 128 Hz.&lt;br /&gt;
* Wyznacz i narysuj amplitudę chwilową sygnału Gabora.&lt;br /&gt;
&lt;br /&gt;
===Ćwiczenie 2===&lt;br /&gt;
* Wygeneruj 2-sekundowy odcinek sygnału  o pozycji w czasie ''t''&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; = 1 s, częstości 20 Hz, skali 0,1 s.&lt;br /&gt;
* Wyznacz i narysuj amplitudę chwilową sygnału sinusoidalnego, o częstości 16 Hz i częstości próbkowania 128 Hz.&lt;br /&gt;
* Wyznacz i narysuj fazę chwilową sygnału sinusoidalnego, korzystając ze związku:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\varphi(t)=\omega_0\cdot t + \varphi_0(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Ćwiczenie 3===&lt;br /&gt;
Wygeneruj dwa sygnały sinusoidalne o tej samej częstości 32 Hz i częstości próbkowania 128 Hz, ale różnych fazach początkowych. Pierwszy sygnał powinien mieć fazę początkową równą 0, drugi sygnał sinusoidalny powinien mieć fazę początkową równą &amp;amp;pi;/4. Za pomocą transformaty Hilberta wyznacz różnicę faz symulowanych sygnałów.&lt;br /&gt;
===Ćwiczenie 4===&lt;br /&gt;
To ćwiczenie jest ku przestrodze. &lt;br /&gt;
Wytwórz sygnał będący sumą dwóch sinusoid: jednej o częstości 30 i drugiej o częstości  32 Hz. Wykreśl przebieg sygnału i jego amplitudy chwilowej.&lt;br /&gt;
&lt;br /&gt;
==Ćwiczenia na danych pomiarowych==&lt;br /&gt;
&lt;br /&gt;
===Ćwiczenie 1===&lt;br /&gt;
W zebranych sygnałach SSVEP wybierz zapisy dla trzech różnych częstości stymulacji (po jednym dla każdej częstości). Do analizy wybierz trzy kanały EEG, dla których sygnał SSVEP jest a) bardzo wyraźny; b) widoczny, ale słabszy; c) w zasadzie niewidoczny. Do analizy wybierz fragmenty od 2 sekund przed rozpoczęciem stymulacji do 2 sekund po jej zakończeniu.&lt;br /&gt;
&lt;br /&gt;
Dla każdej wybranej częstości stymulacji wybrane kanały EEG przefiltruj filtrem wąskopasmowym przepuszczającym częstości skupione wokół tej częstości stymulacji. Do przefiltrowanych sygnałów zastosuj transformację Hilberta, wyznacz amplitudę i częstość chwilową. Wyznacz fazę chwilową dla &amp;amp;omega;&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; równej częstości stymulacji. Wypróbuj dwa sposoby filtrowania: &amp;amp;bdquo;w jedną stronę&amp;amp;rdquo; (&amp;lt;tt&amp;gt;filter&amp;lt;/tt&amp;gt;) i &amp;amp;bdquo;w obie strony&amp;amp;rdquo; (&amp;lt;tt&amp;gt;filtfilt&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Wyrysuj przefiltrowane sygnały wraz z wyliczoną amplitudą chwilową. Do rysunku dodaj wykres sygnału triggera aby widać było początek i koniec stymulacji. Narysuj też wykres zależności częstości chwilowej i fazy chwilowej od czasu.&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
=Bibliografia=&lt;br /&gt;
# Silberstein, R. (1995). Steady-state visually evoked potentials, brain resonances, and cognitive processes. W: Nunez, P. (red.), Neocortical Dynamics and Human EEG Rhythms (272-303). Oxford University Press, Oxford.&lt;br /&gt;
# Vialatte, F., Maurice, M., Dauwels, J. i Cichocki, A. (2010). Steady- state visually evoked  potentials: Focus on essential paradigms and future perspectives. Progress in Neurobiology, 90, 418-438.&lt;br /&gt;
# Lachowska, M., Morawski, K., Delgado, R. i Niemczyk, K. (2009). Postępy w audiologii. Słuchowe potencjały wywołane stanu ustalonego. Otorynolaryngologia, 8(1), 1-7.&lt;br /&gt;
# Rance, G. (red.) (2008). The Auditory Steady-State Response: Generation, Recording and Clinical Application. Plural Publishing, San Diego.&lt;br /&gt;
# Scherer, R., Muller-Putz, G. i Pfurtscheller, G. (2009). Flexibility and practicality: Graz Brain-Computer Interface approach. Internationl Review of Neurobiology, 86.&lt;br /&gt;
# Pastor, M., Artieda, J., Arbizu,J., Valencia, M. i Masdeu, J. (2003). Human cerebral activation during steady-state visual-evoked responses. Journal of Neuroscience, 23(37), 621-627.&lt;br /&gt;
# Moratti, S., Clementz, B., Gao, Y., Ortiz, T. i Keil, A. (2007). Neural mechanisms of evoked oscillations: stability and interaction with transient events. Human Brain Mapping, 28(12), 1318-1333.&lt;br /&gt;
# [http://durka.name/papers/OpenBCI_and_BCI_Appliance.pdf Artykuł o BCI Appliance z prostą funkcją detekcji SSVEP] P. J. Durka, R. Kuś, J. Ż̇ygierewicz, M. Michalska, P. Milanowski, M. Łabę̨cki, T. Spustek, D. Laszuk, A. Duszyk, M. Kruszyński. User-centered design of brain-computer interfaces: OpenBCI.pl and BCI Appliance. Bulletin of the Polish Academy of Sciences, vol. 60, No 3, september 2012, pp. 427-433&lt;/div&gt;</summary>
		<author><name>Maciek</name></author>
		
	</entry>
</feed>