{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## Statystyka i Analiza danych\n", "# Laboratorium 10 - Korelacja i regresja (część 2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Ćwiczenie 1: Regresja liniowa w R\n", "\n", "Celem ćwiczenia jest zapoznanie się z funkcją `lm()` wykonującą regresję liniową w R.\n", "\n", "Zacznijmy od wczytania poniższej funkcji generującej prostą ramkę danych:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "generujDane <- function(n, a, b, sigma) {\n", " x <- runif(n)\n", " y <- a * x + b + sigma * rnorm(n)\n", " plot(y ~ x, t=\"p\", xlab=\"X\", ylab=\"Y\", main=\"Regression Data\")\n", " abline(b, a, lty=\"dashed\")\n", " data.frame(X=x, Y=y)\n", "}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Użyj powyższej funkcji aby wygenerować zbiór danych `Regresja` składający się z 50 obserwacji z prawdziwymi współczynnikami *a=3*, *b=-2* i szumem *sigma=1*." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "Regresja <- # -- wypełnij --" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Wyznacz współczynniki regresji liniowej, wyświetl zmienną `model` i porównaj współczynniki z prawdziwymi wartościami *a*, *b*." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "model <- lm(Y ~ X, Regresja)\n", "model" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Przypisz współczynniki do zmiennej `coeffs` i wyznacz wektor $\\hat{Y}$ (ozn. `Yp`) wartości zmiennej objaśnianej wyznaczone z modelu liniowego." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "coeffs <- model$coefficients\n", "\n", "Yp <- # -- wypełnij --" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Wyznacz i wyświetl podsumowanie modelu. Zinterpretuj wypisywane wartości" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "modelSummary <- summary(model)\n", "modelSummary" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Do poszczególnych elementów podsumowania można uzyskać dostęp poprzez funkcje:\n", "\n", "- współczynniki modelu z błędami standardowymi, wartościami statystyki *t* i jej *p*-wartościami:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "modelSummary$coefficients" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- Współczynnik determinacji $R^2$:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "modelSummary$r.squared" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- Statystyka $F$:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "F <- modelSummary$fstatistic\n", "F" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Sprawdź, czy model jest istotny statystycznie za pomocą statystyki *F* i porównaj z *p*-wartością zwracaną przez `modelSummary`:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "1 - pf(F[1], F[2], F[3])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Wyznacz również SST, SSE i SSR:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "yMean <- mean(Regresja$Y)\n", "SST <- # -- wypełnij --\n", "SSR <- # -- wypełnij --\n", "SSE <- # -- wypełnij --\n", "SST - SSR - SSE" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Na koniec możesz wyświetlić wykresy diagnostyczne:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "plot(model)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Czyszczenie przestrzeni roboczej (usunięcie wszystkich zmiennych, funkcji, itp.)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "rm(list = ls())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Ćwiczenie 2: Dane medyczne\n", "\n", "Wysunięto hipotezę, że istnieje związek pomiędzy czasem działania pewnego leku u chorych na zaburzenia układu krążenia a aktywnością pewnego enzymu. Losowa próba dała następujące wyniki (patrz tabela). Dla zmiennych *x* i *y* należy:\n", " - wyliczyć współczynnik korelacji Pearsona\n", " - utworzyć wykres rozrzutu \n", " - obliczyć funkcję regresji i dodaj do wykresu linię trendu\n", " - Czy odrzucenie danych o pewnych obserwacjach mogłoby poprawić wyniki?\n", " - Czy jeszcze jakaś transformacja zbioru danych pozwoliłaby na dalsze polepszenie wyników ?\n", "\n", "Zaczynamy od załadowania danych wykonując poniższy kod:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "Dane <- read.csv(url(\"http://www.cs.put.poznan.pl/swilk/siad/10-cw2.csv\"), sep=\";\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Dane te zawierają informację o płci, czasie działania leku (`x`) i aktywności enzymu (`y`). Wyświetl tabelę z danymi:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [ "Dane" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Wyznacz współczynnik korelacji Pearsona:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "wspKor <- # -- wypełnij --\n", "wspKor" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Korzystajac z funkcji `plot` utwórz wykres rozrzutu dla tych danych. Opisz odpowiednio osie wykresu. Wyznacz funkcję regresji i dodaj ją do wykresu:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "plot( # -- wypełnij --\n", "model <- # -- wypełnij --\n", "abline(model)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Sprawdź, czy wynik jest istotny na poziomie istotności *alfa=0.05* za pomocą funkcji `summary` lub ręcznie wyznaczając *p*-wartość statystyki *F*:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Czy odrzucenie części danych mogłoby poprawić wyniki?" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "DaneK <- Dane[Dane$plec == \"k\",]\n", "\n", "# -- wykonaj analizę regresji dla tego zbioru danych" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [ "DaneM <- Dane[Dane$plec == \"m\",]\n", "\n", "# -- wykonaj analizę regresji dla tego zbioru danych" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Czyścimy przestrzeń roboczą:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "rm(list = ls())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Ćwiczenie 3: Szacowanie czasu pracy programistów\n", "\n", "Baza danych historycznych obejmuje oszacowane przez programistów czasy pracy oraz faktyczny rozmiar programu. Sprawdź, czy te dwie zmienne są zależne i przeprowadź analizę regresji. Powyższe zadanie ilustruje jeden z elementów metody PSP.\n", "\n", "Wczytaj i wyświetl dane z pliku:\n", " " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "Programy <- read.csv(url(\"http://www.cs.put.poznan.pl/swilk/siad/10-cw3.csv\"), sep=\";\")\n", "Programy" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Teraz dołączymy `Programy` do ścieżki przeszukiwania nazw zmiennych. Dzięki temu możemy odwoływać się do zmiennych w `Programy` bez konieczności każdorazowego zaznaczania ramki danych" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "attach(Programy)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Np. wyznaczenie współczynnika korelacji Pearsona wygląda teraz tak:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "wspKor <- cor(rozmiar, czas)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Utwórz wykres rozrzutu (czas w funkcji rozmiaru), oblicz funkcję regresji i dodaj ją do wykresu:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Sprawdź, czy wynik jest istotny na poziomie istotności *alfa=0.05* za pomocą funkcji `summary`" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Zinterpretuj współczynniki modelu" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "model" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Odłącz ramkę danych od ścieżki i wyczyść przestrzeń roboczą:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "detach(Programy)\n", "rm(list = ls())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Ćwiczenie 4: Analiza regresji wielu zmiennych (wieloraka)\n", "\n", "Zadanie demonstracyjne, które pokaże przykład analizy regresji wielu zmiennych i różnicę między testem *t* na istotoność zmiennych w modelu, a globalnym testem *F*.\n", "\n", "Wczytaj dane z pliku 10-cw4.csv i wyświetl tabelę danych. Jest to zbiór danych ekonomicznych, gdzie `Exports` jest zmienną objaśnianą (*Y*), a pozostałe są zmiennymi objaśniającymi (*X*)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "Ekonom <- read.csv(url(\"http://www.cs.put.poznan.pl/swilk/siad/10-cw4.csv\"), sep=\";\")\n", "Ekonom" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Utwórz model liniowy zmiennej `Exports` w funkcji pozostałych zmiennych:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "model <- lm(Exports ~ ., Ekonom) # skrócony zapis dla lm(Exports ~ M1 + Lend + Price + Exchange, Ekonom)\n", "model" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Wyświetl podsumowanie modelu:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "O ile sam model jest istotny statystycznie na poziomie *alfa=0.05* (*p*-wartość statystyki *F < 2.2e-16*), o tyle niektóre ze zmiennych nie są istotne statystycznie (*p*-wartość statystyki *t < 0.05*). Poniższa analiza może nam posłużyć do selekcji zmiennych istotnych statystycznie.\n", "\n", "Odrzucamy więc zmienne nieistotne statystycznie i pozostawiamy tylko `Exports`, `M1` i `Price`" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ponownie wykonujemy analizę regresji:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "R", "language": "R", "name": "ir" }, "language_info": { "codemirror_mode": "r", "file_extension": ".r", "mimetype": "text/x-r-source", "name": "R", "pygments_lexer": "r", "version": "3.6.3" } }, "nbformat": 4, "nbformat_minor": 2 }