Główną ideą regresji jest wyjaśnianie, przewidywanie, prognozowanie danych dla pewnej zmiennej (określanej jako zmienna zależna, objaśniana, wyjaśniana) na podstawie innych zmiennych (zmienne niezależne, predyktory, zmienne objaśniające, zmienne wyjaśniające).
Budowa liniowego modelu zależności między dwoma zmiennymi składa się z trzech etapów:
Określenie czy między zmiennymi istnieje zależność.
Budowa modelu.
Analiza wynków modelu (w tym ocena dopasowania modelu).
Po zbudowaniu modelu oraz ocenie dopasowania modelu można go wykorzystać do wykonania predykcji.
<- readRDS("dane/dane2007.rds") dane
library(ggplot2)
ggplot(dane, aes(x=tg5cm, y=tg10cm)) + geom_point() +
coord_fixed(ratio = 1) +
xlab("tg5cm: Temperatura gruntu na 5cm [C]") +
ylab("tg10cm: Temperatura gruntu na 10cm [C]") +
geom_smooth() +
geom_abline(color = 'grey') +
theme_bw()
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'
cor(dane$tg5cm, dane$tg10cm, use= "complete.obs", method = "pearson")
## [1] 0.9985322
W R do budowy modelu liniowego służy funkcja lm()
. Obowiązkowo należy podać 2 argumenty:
<- lm(formula = tg10cm ~ tg5cm, data = dane) model_lm
Funkcja lm()
dopasowuje model liniowy, wyznacza oceny współczynników \(\beta\) oraz wylicza wartości reszt. Wynikiem działania funkcji jest obiekt klasy lm, który będzie przechowywał informacje o dopasowanym modelu. Do ważniejszych informacji należą:
str(model_lm)
$coefficients model_lm
## (Intercept) tg5cm
## 0.2291464 0.9604959
#to samo uzyskamy podając model_lm$coeff
W przypadku regresji linowej funkcja regresji przyjmuje postać funkcji liniowej:
\[y = ax + b\] gdzie,
W wyniku otrzymamy wartości dwóch współczynników regresji:
współczynnika mówiącego o nachyleniu prostej regresji - określa o ile jednostek przeciętnie wzrośnie (lub zmaleje gdy współczynnik ten ma wartość ujemną) wartość zmiennej zależnej (objaśnianej, przewidywanej), gdy wartość zmiennej niezależnej (objaśniającej, predyktorów) wzrośnie o jedną jednostkę.
wyraz wolny - Intercept
W efekcie otrzymamy równanie modelu regresji dla zależności między temperaturą gruntu na 5 i 10 cm.
\[tg10cm = 0.960496 *tg5cm + 0.229146\] Interpretacja: W przykładzie - na każdy 1C wzrostu temperatury gruntu na 5 cm (tg5cm) przeciętnie przypada wzrost temperatury gruntu na 10 cm o 0.96C.
summary(model_lm)
##
## Call:
## lm(formula = tg10cm ~ tg5cm, data = dane)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2.46323 -0.23488 -0.01063 0.26094 0.94909
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.229146 0.036519 6.275 9.98e-10 ***
## tg5cm 0.960496 0.002734 351.257 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.4108 on 363 degrees of freedom
## Multiple R-squared: 0.9971, Adjusted R-squared: 0.9971
## F-statistic: 1.234e+05 on 1 and 363 DF, p-value: < 2.2e-16
Podsumowanie wyników modelu regresji składa się z kilku elementów:
$call model_lm
Call:
lm(formula = tg10cm ~ tg5cm, data = dane)
Do oceny poprawności dopasowania modelu wykorzystuje się reszty (tzw.residua). Reszty wyznacza się jako różnicę wartości obserwowanej Y a wartości oszacowanej z modelu Ŷ.
Statystyki reszt – Min – minimum, 1Q – pierwszy kwartyl, Median – mediana, 3Q – trzeci kwartyl, Max – maksimum.
## Residuals:
## Min 1Q Median 3Q Max
## -2.46323 -0.23488 -0.01063 0.26094 0.94909
Interpretacja wyników:
mean(model_lm$residuals)
## [1] 2.839496e-17
= summary(model_lm)
smr $coefficients smr
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.229146 0.036519 6.275 9.98e-10 ***
## tg5cm 0.960496 0.002734 351.257 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Tabela współczynniki zawiera następujące informacje dla każdego współczynnika:
Interpretacja:
Residual standard error: 0.4108 on 363 degrees of freedom
Z 66% prawdopodobieństwem możemy stwierdzić, że wartość rzeczywista nie będzie się różnić od prognozowanej o więcej niż ±0.4108 C.
Zatem: 99,71% zmienności zmiennej tg10cm jest wyjaśniona przez zmienność zmiennej tg5cm.
Multiple R-squared: 0.9971, Adjusted R-squared: 0.9971
– wartość poziomu istotności całego modelu Model jest wysoko istotny
## F-statistic: 1.234e+05 on 1 and 363 DF, p-value: < 2.2e-16
Stworzenie ramki danych zawierającej wyniki modelu
#ramka danych zawierająca dane użyte do budowy modelu
<- model_lm$model model_df
#reszty - różnica między warrtością obserwowaną Y a wartością oszacowaną z modelu Ŷ.
$reszty <- model_lm$residuals model_df
#wartości oszacowane przez model
$fitted <- model_lm$fitted.values model_df
head(model_df)
## tg10cm tg5cm reszty fitted
## 1 5.0 5.1 -0.1276753 5.127675
## 2 4.5 4.1 0.3328206 4.167179
## 3 4.5 4.2 0.2367710 4.263229
## 4 4.8 4.6 0.1525727 4.647427
## 5 5.5 5.2 0.2762752 5.223725
## 6 5.6 5.2 0.3762752 5.223725
Mając dopasowany model liniowy możemy zastosować go do predykcji wartości \(y\) dla zadanych wartości \(X\). W poniższym przykładzie zastosujemy model liniowy do predykcji wartości tg10cm dla roku 2009.
Obiekt model_lm
zawiera liniowy model zależności pomiędzy temperaturą gruntu na 5cm i temperaturą gruntu na 10 cm, zbudowany na podstawie danych z 2007 roku. Równanie regresji ma postać:
\[tg10cm = 0.960496 *tg5cm - 0.229146\] Znając zatem wartości temperatury gruntu na 5 cm w roku 2009, możemy oszacować wartości temperatury gruntu na 10 cm w 2009 roku.
Do wykonania predykcji w R służy funkcja predict()
. W funkcji tej musimy podać 2 argumenty: 1) obiekt modelu; 2) zbiór danych zawierający zmienne zależne (objaśniające). Nazwy kolumn muszą być zgodne z nazwami zmiennych zależnych użytych do budowy modelu.
<- read.csv("dane/tg5cm_2009.csv")
dane2009 head(dane2009)
## ID tg5cm
## 1 1 -2.0
## 2 2 -3.9
## 3 3 -2.2
## 4 4 -1.1
## 5 5 -3.2
## 6 6 -3.8
Kolumna tg5cm zawiera wartości temperatury gruntu na 5 cm. Wartości te zostaną użyte do oszacowania wartości temperatury gruntu na 10cm.
<- predict(model_lm, dane2009)
p head(p)
## 1 2 3 4 5 6
## -1.691845 -3.516787 -1.883944 -0.827399 -2.844440 -3.420738
Predykcja może także zostać wykonana dla wybranych wartości.
#new to data.frame zawierajaca zmienne niezależne (objasniajace)
<- data.frame(tg5cm = c(-3, 4, 10))
new <- predict(model_lm, new)
p p
## 1 2 3
## -2.652341 4.071130 9.834105