Celem ćwiczenia jest zapoznanie się z funkcją lm()
wykonującą regresję liniową w R.
Zacznijmy od wczytania poniższej funkcji generującej prostą ramkę danych:
generujDane <- function(n, a, b, sigma) {
x <- runif(n)
y <- a * x + b + sigma * rnorm(n)
plot(y ~ x, t="p", xlab="X", ylab="Y", main="Regression Data")
abline(b, a, lty="dashed")
data.frame(X=x, Y=y)
}
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.
Regresja <- generujDane(50, 3, -2, 1)
Wyznacz współczynniki regresji liniowej, wyświetl zmienną model
i porównaj współczynniki z prawdziwymi wartościami a, b.
model <- lm(Y ~ X, Regresja)
model
Przypisz współczynniki do zmiennej coeffs
i wyznacz wektor $\hat{Y}$ (ozn. Yp
) wartości zmiennej objaśnianej wyznaczone z modelu liniowego.
coeffs <- model$coefficients
Yp <- Regresja$X * coeffs[2] + coeffs[1]
Wyznacz i wyświetl podsumowanie modelu. Zinterpretuj wypisywane wartości
modelSummary = summary(model)
modelSummary
Do poszczególnych elementów podsumowania można uzyskać dostęp poprzez funkcje:
modelSummary$coefficients
modelSummary$r.squared
F <- modelSummary$fstatistic
F
Sprawdź, czy model jest istotny statystycznie za pomocą statystyki F i porównaj z p-wartością zwracaną przez modelSummary
:
1 - pf(F[1], F[2], F[3])
Wyznacz również SST, SSE i SSR:
yMean <- mean(Regresja$Y)
SST <- sum((Regresja$Y - yMean)^2)
SSR <- sum((Yp - yMean)^2)
SSE <- sum((Regresja$Y - Yp)^2)
SST - SSR - SSE
Na koniec możesz wyświetlić wykresy diagnostyczne:
plot(model)
Czyszczenie przestrzeni roboczej (usunięcie wszystkich zmiennych, funkcji, itp.)
rm(list = ls())
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:
Zaczynamy od załadowania danych wykonując poniższy kod:
Dane <- read.csv(url("http://www.cs.put.poznan.pl/wkotlowski/siad/9-cw2.csv"), sep=";")
Dane te zawierają informację o płci, czasie działania leku (x
) i aktywności enzymu (y
). Wyświetl tabelę z danymi:
Dane
Wyznacz współczynnik korelacji Pearsona:
wspKor <- cor(Dane$x, Dane$y)
wspKor
Korzystajac z funkcji plot
utwórz wykres rozrzutu dla tych danych. Opisz odpowiednio osie wykresu. Wyznacz funkcję regresji i dodaj ją do wykresu:
plot(Dane$y ~ Dane$x, main = "Dane medyczne", xlab = "x (aktywność enzymu)", ylab = "y (czas działania leku)")
model <- lm(y ~ x, Dane)
abline(model)
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:
model.summary = summary(model)
F <- model.summary$fstatistic
pValue <- 1 - pf(F[1], F[2], F[3])
model.summary
pValue
Czy odrzucenie części danych mogłoby poprawić wyniki?
DaneK <- Dane[Dane$plec == "k",]
plot(DaneK$y ~ DaneK$x, main = "Dane medyczne (kobiety)", xlab = "x (aktywność enzymu)", ylab = "y (czas działania leku)")
model <- lm(y ~ x, DaneK)
abline(model)
summary(model)
DaneM <- Dane[Dane$plec == "m",]
plot(DaneM$y ~ DaneM$x, main = "Dane medyczne (mezczyzni)", xlab = "x (aktywność enzymu)", ylab = "y (czas działania leku)")
model <- lm(y ~ x, DaneM)
abline(model)
summary(model)
Czyścimy przestrzeń roboczą:
rm(list = ls())
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.
Wczytaj i wyświetl dane z pliku:
Programy <- read.csv(url("http://www.cs.put.poznan.pl/wkotlowski/siad/9-cw3.csv"), sep=";")
Programy
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
attach(Programy)
Np. wyznaczenie współczynnika korelacji Pearsona wygląda teraz tak:
wspKor <- cor(rozmiar, czas)
wspKor
Utwórz wykres rozrzutu (czas w funkcji rozmiaru), oblicz funkcję regresji i dodaj ją do wykresu:
plot(czas ~ rozmiar, main = "Programy", xlab = "rozmiar", ylab = "czas")
model <- lm(czas ~ rozmiar)
abline(model)
Sprawdź, czy wynik jest istotny na poziomie istotności alfa=0.05 za pomocą funkcji summary
model.summary = summary(model)
F <- model.summary$fstatistic
pValue <- 1 - pf(F[1], F[2], F[3])
pValue
Zinterpretuj współczynniki modelu
model
Odłącz ramkę danych od ścieżki i wyczyść przestrzeń roboczą:
detach(Programy)
rm(list = ls())
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.
Wczytaj dane z pliku 9-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)
Ekonom <- read.csv(url("http://www.cs.put.poznan.pl/wkotlowski/siad/9-cw4.csv"), sep=";")
Ekonom
Utwórz model liniowy zmiennej Exports
w funkcji pozostałych zmiennych:
model <- lm(Exports ~ ., Ekonom) # skrócony zapis dla lm(Exports ~ M1 + Lend + Price + Exchange, Ekonom)
model
Wyświetl podsumowanie modelu:
modelSummary <- summary(model)
modelSummary
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.
Odrzucamy więc zmienne nieistotne statystycznie i pozostawiamy tylko Exports
, M1
i Price
Ekonom2 <- Ekonom[, c("Exports", "M1", "Price")]
Ponownie wykonujemy analizę regresji:
model <- lm(Exports ~ ., Ekonom2)
model
summary(model)