Kolokwium I - podsumowanie

Plik zawiera przykłady z laboratoriów, wzory oraz elementy teorii.


Generowanie danych

Generowanie macierzy o kolumnach z danego rozkładu

Przykład macierzy 10x2 z kolumnami z rozkładu normalnego:

X = matrix(0, nrow=10, ncol=2)
X[,1] = rnorm(10,0,1)
X[,2] = rnorm(10,0,1)

Generowanie wektora zer

Wektor zer o długości 10

rep(0, 10)

Generowanie punktów z rozkładu

Generowanie chmury punktów \(y_{i} = x_{i} + \varepsilon\), gdzie \(x_{i}\) to punkty z zakresu [0; 10] odległe o 0:1, natomiast \(\varepsilon_{i}\) to zmienne losowe z rozkładu normalnego o średniej \(\mu\) = 0 i odchyleniu standardowym = 3

xi <- seq(0, 10, by = 0.1)
yi <- xi + rnorm(length(xi), mean=0, sd=3)

Wgrywanie i wyświetalnie danych

Wgrywanie obrazka

M <- as.matrix(read.csv("obrazek.csv"))
image(M,  asp = TRUE, col = c("white", "black"), xaxt = "n", yaxt = "n")

Wyświetlanie dwóch obrazków obok siebie

par(mfrow = c(2, 2)) # c(liczba wierszy, liczba kolumn)

Rozkłady macierzy

Rozkład SVD (Singular Value Decomposition)

\(X = U D V^T\)

svd_decomp = svd(X)

U = svd_decomp$u
D = diag(svd_decomp$d) # domyślnie D zwracane jest jako wektor
V = svd_decomp$v

all.equal(U %*% D %*% t(V), X)

Ten rozkład można wykorzystać np do kompresji obrazków, przez uwzględnienie jedynie części wartości osobliwych na diagonali. Poniższa funkcja właśnie w ten sposób konwertuje macierz pikseli \(M\).

generate_compressed <- function(M, compression_level=0.01) {
  svd_zebra <- svd(M)
  
  U <- svd_zebra$u
  V <- svd_zebra$v
  d <- svd_zebra$d
  
  number_of_observations <- floor(length(d)*compression_level)
  
  diag <- diag(c(d[1:number_of_observations], numeric(length(d) - number_of_observations)))
  
  compressed <- U %*% diag %*% t(V)
}

Wartości osobliwe (singular values)

Wartości osobliwe (singular values) to wartości na przekątnej macierzy \(D\) (inaczej \(\Sigma\)) w rozkładzie SVD. Są one zdefiniowane jako pierwiastki kwadratowe wartości własnych macierzy \(X^TX\)

Rozkład spektralny

\(Σ = V D V^T\)

Σ = t(X) %*% X

eigen_decomp = eigen(Σ)
V = eigen_decomp$vectors
D = diag(eigen$values)

all.equal(V %*% D %*% t(V), Σ)

Rozkład QR

\(X = QR\), gdzie \(Q\) to macierz ortogonalna (\(Q^T = Q^{-1}\)), a \(R\) macierz trójkątna górna.

Głównie wykorzystywaliśmy go do sprawniejszego wyznaczania estymatora \(\hat \beta_{MNK}\) Metoda ta jest wygodna, gdy macierz \(X\) jest nieodwracalna, czyli posiada liniowo zależne kolumny.

QR <- qr(X)

R <- qr.R(QR)
Q <- qr.Q(QR)

# beta
beta <- backsolve(R, t(Q) %*% y)

R² - współczynnik determinacji

NIE jest to miara dopasowania modelu.

\(R^2 = 1 - \frac{SSE}{SST} = \frac{SSR}{SST}\)

  • \(SST = \sum_{i=1}^{n} (y_i - \bar{y})^2\) (sum of squares total - całkowita zmienność modelu)

  • \(SSE = \sum_{i=1}^{n} (y_i - \hat{y_i})^2\) (sum of squares error - zmienność niewyjaśniana przez model)

  • \(SSR = \sum_{i=1}^{n} (\hat{y_i} - \bar{y})^2\) (sum of squares regression - zmienność wyjaśniana przez model)

Duża wartość \(R^2\) nie oznacza, że model jest dobry. Wysokie wartości \(R^2\) mogą być spowodowane nadmierną liczbą zmiennych objaśniających, które nie są istotne statystycznie. Wtedy \(R^2\) będzie duże, ale model będzie słaby. Analogicznie jeżeli model jest dobrze dopasowany, ale wariancja błędów spora \(R^2\) będzie małe. \(R^2\) nie nadaje się również do selekcji zmiennych, gdyż \(SSE\) od liczby zmiennych modelu jest liniowe. Ale jeżeli \(R^2\) jest duże, to znaczy, że model wyjaśnia dużą częśc zmienności danych.

Ponadto \(R^2 = Cor(y, \hat{y})^2\) (korelacja między rzeczywistymi wartościami a wartościami przewidywanymi przez model)

# Sposób 1
SSR = sum((modelinho$fitted.values - mean(y))^2)
SST = sum((y - mean(y))^2) 
rsqrd <- SSR/SST

# Sposób 2
cor(y, modelinho$fitted.values)^2 
modelinho = lm(y ~ x) # model liniowy

# Szybkie obliczenie R^2
summary(modelinho)$r.squared

# Obliczenie z definicji
SST = sum((y - mean(y))^2) 
SSR = sum((modelinho$fitted.values - mean(y))^2)
SSE = sum((y - modelinho$fitted.values)^2)

R2 = SSR/SST

Adjusted (skorygowane) \(R^2\)

\(R^2_{adj} = 1 - \frac{SSE/(n-|i|)}{SST/(n-1)} = 1 - \frac{\hat\sigma_i}{\hat\sigma^2_{null}}\) gdzie \(i\) to zmienne w modelu, model pełny \(|i|=p\)

nie ma uzasadnienia metodologicznego, ale jest używane w praktyce nie jest rosnące w zależności od liczby zmiennych tak jak \(R^2\), może zostać w ostateczności wykorzystane do selekcji zmiennych

Mozna to liczyc z definicji albo wziac z summary(mod)

# wzór na adj R^2
SST = sum((y - mean(y))^2)        
SSE = sum((y - mod$fitted.values)^2)
n=nrow(X)
p=ncol(X)
R2_adj <- 1-((SSE/(n-p))/(SST/(n-1)))

Model liniowy

Stworzenie modelu oraz predykcja

modelinho = lm(y ~ x) # model liniowy

# sposób I
predict(modelinho, newdata = data.frame(x = 21.37))

# sposób II
coef(modelinho)[1] + coef(modelinho)[2]*21.37

Macierz eksperymentu

# Model liniowy gdzie zmienna Variable opisywana jest przez wszystkie pozostałe zmienne
modelinho = lm(Variable ~ ., data = dane)
# Macierz eksperymentu
X = model.matrix(modelinho)

Sposób bez modelu:

X # nasza macierz bez interceptu
intercept <- rep(1, nrow(X))
x_intercept <- cbind(intercept, X)
x_intercept <- as.matrix(X)

Interpretacja summary()

lm(formula = Price ~ ., data = dane)

Residuals:
     Min       1Q   Median       3Q      Max 
-12.7630  -4.0514   0.5389   2.3899  12.9855 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)  
(Intercept) 13.712572   9.514111   1.441   0.1677  
Bedroom     -7.756208   3.109374  -2.494   0.0232 *
Space        0.011626   0.008981   1.295   0.2128  
Room         5.097706   2.764303   1.844   0.0827 .
Lot          0.228063   0.195434   1.167   0.2593  
Tax          0.003374   0.006859   0.492   0.6291  
Bathroom     5.718372   4.276867   1.337   0.1988  
Garage       3.613603   2.064997   1.750   0.0982 .
Condition   -2.162027   4.137400  -0.523   0.6080  

Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 7.337 on 17 degrees of freedom
Multiple R-squared:  0.7688,    Adjusted R-squared:   0.66 
F-statistic: 7.065 on 8 and 17 DF,  p-value: 0.0003757
  • Residuals: rozkład rezyduów. Powinniśmy mieć medianę bliską zera, rozkład symetryczny \((Q3-Q2 \approx Q2-Q1)\). Średnia w modelu z interceptem zawsze równa 0

  • Estimate: w MNK każda \(\beta_{i}\) ma rozkład normalny. “Estimate” to estymatory każdej z \(\beta_{i}\) (i tym samym średnie rozkładu)

  • Std. Error: pierwiastek z wariancji rozkładu estymatora

  • t value: wartość statystyki t, służącej do testowania dla każdego współczynnika hipotezy \(\mathbb{H}_{0}\), że dany współczynnik jest rowny 0

  • Pr(>|t|): p-wartość testu; jeśli poniżej poziomu istotności, to możemy stwierdzić, że istotnie współczynnik jest różny od zera

  • RSE: podniesiony do kwadratu daje estymator wariancji naszego błędu, jako że zakładamy, że \(\mathcal{E} \sim \mathbf{N}(0, \sigma^2)\)

  • R^2: współczynnik determinancji (procent wyjaśnionej wariancji)

  • Adjusted R^2: dostosowany \(R^2\), który jest odpowiednio pomniejszony ze względu na liczbę zmiennych w modelu (ponieważ zwiększenie ich liczby może jedynie zwiększać \(R^2\))

  • F-statistic: wartość statystyki F, służącej do testowania \(\mathbb{H}_{0}\), że wszystkie współczynniki \(\beta_{i}\) są równe 0. Alternatywna hipoteza to taka, że przynajmniej jeden z nich jest niezerowy; de facto porównanie naszego modelu z modelem zerowym, w którym jest tylko intercept

Estymatory parametrów β

Naszym zadaniem jest przybliżenie wektora \(Y\) przez kombinację liniową kolumn macierz \(X\).

Estymator \(\hat \beta_{MNK}\)

Szukamy takiego wektora \(\hat \beta_{MNK}\), który minimalizuje sumę kwadratów błędów: \[ Crit(b) = ||Y-Xb||^2 = (Y-Xb)^T(Y-Xb) = \sum_{i=1}^n |Y_i - \sum_{j=0}^{p-1} b_j x_{ij}|^2\]

Interpretacja geometryczna jest taka, że szukamy w hiperpłaszczyznie rozpiętej na kolumnach wektora \(X\) takiego wektora \(Xb_{MNK}\), który jest najbliżej wektora \(Y\). że jego odległość od wektora \(Y\) jest najmniejsza.

modelinho = lm(y ~ ., data = dane)
X = model.matrix(modelinho)
# X to macierz eksperymentu

solve(t(X) %*% X, t(X) %*% y) # parametry z definicji
coef(mod) # parametry z funkcji wbudowanej

Wartość \(\beta\) można wyznaczyć również za pomocą rozkładu \(QR\) macierzy \(X\).

X <- model.matrix(modelinho)
QR <- qr(X)

R <- qr.R(QR)
Q <- qr.Q(QR)


beta <- backsolve(R, t(Q) %*% y)

y_hat <- Q %*% t(Q) %*% y

Wyjaśnienie: \[ \beta = (X^TX)^{-1}X^Ty = (QR)^{-1}X^Ty = (R^TQ^TQR)^{-1}X^Ty = (R^TR)^{-1}R^TQ^Ty = R^{-1}Q^Ty \]

Dodatkowo \[ R^{-1} = (R^TR)^{-1}R^T \]

Kilka faktów

Na ogół zakładamy, że nasz model regresji liniowej ma postać: \[ Y = X\beta + \varepsilon \] gdzie \(\varepsilon \sim \mathbf{N}(0, \sigma^2I)\)
Estymator MNK jest nieobciążony, czyli \(E(\hat \beta_{MNK}) = \beta\)
Wariancja MNK wynosi \(\Sigma_{\hat \beta_{MNK}} = \sigma^2(X'X)^{-1}\)

Estymator wariancji błędów σ^2

Estymator wariancji błędow to \(\frac{SSE}{degf}\), gdzie \(degf\) to liczba stopni swobody, czyli \(n-(p-1)\).
UWAGA: Jeśli mamy kolumnę z jedynkami, to mamy \(p\) predyktorów i już nie odejmujemy jedynki, zatem \(degf = n-p\)

Jest to estymator nieobciążony.

SSE = sum(modelinho$residuals^2)
degf = nrow(X) - ncol(X) # bo w macierzy X mamy juz kolumne jedynek
SSE/degf # z definicji

summary(modelinho)$sigma^2 # z funkcji wbudowanej

Wariancja estymatora \(\hat \beta_{MNK}\)

Wariancja \(\hat \beta\)

Wariancja \(\hat \beta\) to \(\sigma^2(X'X)^{-1}\)
Aby wyznaczyć tę wartość należy użyć wzoru: \(\Sigma_{HA} = H\Sigma_A H'\)

xtx_inv <- solve(t(X) %*% X) # funkcja solve odwraca macierz
xtx_inv <- solve(R) %*% t(solve(R)) # alternatywny sposób wyznaczenia (X'X)^-1
sigma2 <- SSE / (n-p)

beta_var <- sigma2 * xtx_inv

Wariancja \(\hat \beta_i\)

beta_var_i = beta_var[i,i]
# lub
beta_var_i = sigma2 * diag(xtx_inv)[i]

Na ogół nie znamy rzeczywistej wariancji \(\sigma^2\), dlatego zamiast niej stosujemy estymator \(s^2 = \hat \sigma^2 = \frac{SSE}{degf}\) Korzystamy tutaj z błędu standardowego \[ SE_{hat \beta_i}^2 = s^2 (X'X)^{-1}_{ii} = s^2 (1-h_{ii})1\]

Testy istotności współczynników

Tutaj zakładamy, że obserwacje pochodzą z modelu liniowego i \(\varepsilon \sim \mathbf{N}(0, \sigma^2I)\)
w praktyce przed przystąpieniem do testowania konieczne jest przeprowadzenie diagnostyki dopasowania modelu liniowego.

Test istotności pojedynczego współczynnika

Czyli t-statystyka oraz jej p-value dla zmiennej objaśniającej

Interpretacja hipotezy zerowej: predyktor o indeksie i nie ma istotnego wpływu na \(Y\) jeżeli w modelu są pozostałe predyktory.

Przy założeniu hipotezy zerowej poniższa statystyka ma rozkład t-Studenta z \(n-p\) stopniami swobody: statystyka t = \(\frac{\beta}{SE(\beta)}\)

p-value: prawdopodobieństwo, że statystyka przyjmie wartość bardziej sprzyjającą odrzuceniu. W przypadku statystyki t, p-value = P(T > |t|)

A p-value measures the probability of obtaining the observed results, assuming that the null hypothesis is true

Czyli istotne wzory to: \[ t = \frac{\hat \beta}{SE(\hat \beta)} \] \[ SE(\hat \beta) = \sqrt{\frac{SSE}{degf} (X'X)^{-1}}\] \[ p = 2 * min[P(T > t), P(T<t)] \]

Liczenie t-stat i p-value z definicji:

QR <- qr(X)
R <- qr.R(QR)
Q <- qr.Q(QR)
beta <- backsolve(R, t(Q) %*% Y)

xtx_inv <- solve(R)%*%t(solve(R))

SSE <- sum((Y - mod$fitted.values)^2)
df <- length(Y) - ncol(X)

sigma2 <- SSE / df

se_beta <- sqrt(sigma2 * diag(xtx_inv))

t <- beta / se_beta
p_val <- 2 * pmin(pt(t, nrow(X) - ncol(X)), 1 - pt(t, nrow(X) - ncol(X)))

Z funkcji wbudowanych:

t_builtin <- summary(mod)$coefficients[,3]

Test istotności zmiennych niebędących interceptem: f-statystyka

Służy do testowania \(\mathbb{H}_{0}\), że wszystkie współczynniki \(\beta_{i}\) są równe 0. Porównanie naszego modelu z modelem zerowym, w którym jest tylko intercept.

\[ F = \frac{\frac{SSR}{p-1}}{\frac{SSE}{(n-p)}} = \frac{SSR}{SSE} \frac{n-p}{p-1}\]

Z definicji

n = length(y)
p = length(mod$coefficients)
SSR <- sum((mod$fitted.values - mean(y))^2)
SSE <- sum((y - mod$fitted.values)^2)

Fstat <- (SSR/(p-1)) / (SSE/(n-p))

Funkcje wbudowane:

summary(mod)$fstatistic[1]

p-wartość statystyki F

min(1 - pf(summary(mod)$fstatistic[1], p-1, n-p), pf(summary(mod)$fstatistic[1], p-1, n-p))

Rezydua

Rezydua tradycyjne to po prostu reszty z modelu, czyli \(e = y_i - \hat y_i\). Niestety jak się okazuje nie wszystkie rezydua mają taką samą wariancję: \[ Var(e_i) = \sigma^2(1-h_{ii}) \]

Rezydua studentyzowane

i-te rezyduum dzielimy przez pierwiastek z jego błąd standardowy: \(|r_i| = |\frac{e_i}{\sqrt{SE(e_i)}| = |\frac{e_i}{\sqrt{s^2(1-h_{ii})}}|\)

xtx_inv <- solve(t(X) %*% X)
sigma2 <- SSE/(n - p)

r <- e / sqrt(sigma2 * (1 - diag(xtx_inv)))

# funkcja wbudowana
r <- rstandard(modelinho)

Rezydua modyfikowane studentyzowane

Zdarza się tak, że duża wartość jednego rezyduum może znacząco wpłynąć na wartość \(s^2\), dlatego stosuje się rezydua modyfikowane studentyzowane. Chcąc ocenić, czy i−ta obserwacja jest odstająca, usuwamy ją ze zbioru danych

Rezyduum modyfikowane można wyznaczyć bez koniecznosci ponownego dopasowania modelu: \[ e_{i,-i} = \frac{e_i}{1-h_{ii}} \] \[ Var(e_{i,-i}) = \frac{\sigma^2}{1-h_{ii}} \] \[t_i = r_i\sqrt{\frac{n-p-1}{n-p-r_{i}^2}}\] Więcej wzorów i dokładniejsze objaśnienie tutaj

t <- rstudent(modelinho)

Studentyzowane rezyduum modyfikowane mają rozkład t-Studenta z \(n-p-1\) stopniami swobody.

Diagnostyka dopasowania modelu

Wykres indeksowy rezyduów

Według wykładu najważniejsza metoda sprawdzania dopasowania modelu, powinien być sprawdzany na początku.

e <- model$residuals
plot(1:length(e), e)
abline(0,0)

Na tym wykresie dla modelu dobrze dopasowanego powinna być widoczna chmura punktów rozrzucona losowo wokół prostej \(y=0\).

Wykres częściowej regresji

Jeżeli model jest źle wyspecyfikowany, to na wykresie częściowej regresji powinna być widoczna zależność nieliniowa między rezyduami a zmienną objaśniającą.
Wykres cześciowej regresji jest dwuwymiarowym wykresem rozproszenia \(e_{Y|X_{-j}}\) względem \(e_{x_j|x_{-j}}\).

model_y = lm(y~.-j, data=d)
model_j = lm(j~.-y, data=d) # zaleznosc j od innych zmiennych objasniajacych (nie wliczamy w to y!)

plot(model_j$residuals, model_y$residuals) # tutaj argumenty podawane są (x,y) 
abline(lm(model_y$residuals~model_j$residuals)) # tutaj (y~x)
# na osi y rezydua modelu gdzie Y objaśniany jest wszystkimi zmiennymi oprócz Xj

# weyfikacja z funkcjami wbudowanymi
car::avPlot(modelinho) # oryginalny model, y opisywane wszystkimi zmiennymi

Na tym wykresie prosta MNK ma dokładne nachylenie równe \(\beta_{j,MNK}\). Na tej podstawie również można wnioskować na temat istotności danej zmiennej.

Interpretacja: Ten wykres mówi nam, jaka jest relacja pomiedzy zmienną objasniającą j a zmienną objasnianą y, jeśli pozbędziemy się wpływu wszystkich pozostałych zmiennych objasniających.
chcemy sprawdzić, czy zmienna j wnosi cos do modelu. Trenujemy dwa modele - oba zależą od wszystkich zmiennych objaśniających oprócz j. W pierwszym objaśnianą jest oryginalny y, w drugim j. Potem bierzemy rezydua, bo rezydua to ta część zmienności, która nie jest wyjaśniana przez zmienne objaśniające. Po wyplotowaniu tego mamy wplyw zmiennej j na y przy założeniu, że wartości pozostałych zmiennych objaśniających są ustalone. Jeśli prosta jest bliska poziomej (nachylenie bliskie 0) to znaczy że zmienna j jest nieistotna

Wykres częściowych rezyduów

Na tym wykresie można lepiej zaobserwować nieliniowości względem badanej zmiennej/skupienia od wykresu częściowej regresji.

\[ y-\sum_{i\neq j}\hat\beta_i x_i = x_j \hat \beta_j + e \text{ versus }x_j\]

# funkcje wbudowane
library(faraway)
prplot(model, i) # i to numer zmiennej ktora badamy

# z definicji
plot(model$res + d$i[-outliers]*model$coefficients[i] ~ d$i[-outliers])

Na tym wykresie można też czasami zaobserwować klastry, które są grupami o różnych cechach. Tzw. paradoks Simpsona - zależność może zmieniać swój charakter w zależności od tego, czy rozważamy podzbiory danych, czy całość.

Współczynnik korelacji estymatorów zmiennych

Może się znacząco różnić (nawet znakiem) od współczynnika korelacji zmiennych, np. ze względu na paradoks Simpsona (?)

summary(m2, cor=T)

Przekształcenia predyktorów

Ogólnie chcemy przkształcać \(X\) lub \(y\) tak, aby spełniały założenia modelu liniowego.

Metoda Boxa-Coxa

Ta metoda pozwala nam znaleźć taką trasformację \(h(Y)\), ze \(h(Y)\) jest generowane przez model liniowy. Przeszukujemy rodzinę parametryczną funkcji \((g_{\lambda}(.))_{\lambda \geq 0}\), zdefiniowanej jako:

\[ g_{\lambda} (y) = \frac{y^{\lambda}-1}{\lambda} \] dla\(\lambda >0\) oraz równa \(log(y)\) dla \(\lambda = 0\).

library(MASS)

boxcox1 = boxcox(modelinho, lambda = seq(0,1, length.out=100)) 
# dopasowujemy 100 modeli dla lambda # rysuje przy okazji wykres
# estymatora największej wiarogodności + przedział ufności

lambda = boxcox1$x[which(boxcox1$y == max(boxcox1$y))]

mlambda <- lm((y^lambda)~x, data=d)

Zmienne heteroskedastyczne

Jeżeli wariancja błędów nie jest stała, to mamy do czynienia z heteroskedastycznością.
Aby poradzić sobie z tym problemem możemy odpowiednio zmodyfikować funkcje kryterialną, tak aby uwzględniała różnice w wariancji.

Estymator Metodą Ważonych Najmniejszych Kwadratów (MWNK)

Jeżeli \(\varepsilon \sim \mathbf{N}(0, \sigma^2 W)\), gdzie \(W = diag(sigma_1^2, sigma_2^2, \dots, sigma_n^2)\) \[ Crit(b) = \sum_{i=1}^n \frac{1}{\sigma_i^2} |Y_i - x_ib|^2\] Sens ważenia jest taki, że obserwacje, które mają większą wariancje powinny mieć mniejszy wpływ na estymator \(\hat \beta\). \[ \hat{\beta}_{MWNK} = (X'WX)^{-1}X'WY \]

rez <- residuals(mod)

W <- 1 / lm(abs(rez) ~ mod$fitted.values)$fitted.values^2 # wagi

# wizualizacja żeby sprawdzić jak wygląda rozkład rezyduów
plot(mod$fitted.values, abs(rez))

# nowy model, pozbyliśmy się heteroskedastyczności
mod_weighted <- lm(y ~ x, weights = w)

# możemy teraz zobaczyć, że nie ma już heteroskedastyczności
plot(1:length(rez), rstudent(mod_weighted))

Metoda Uogólnionych Najmniejszych Kwadratów (MUNK)

W tym przypadku rozważamy ogólny przypadek macierzy kowariancji błędów, redukując ten problem do takiego, który już znamy i potrafimy rozwiązać przy pomocy MNK.

Jeżeli \(\Sigma_{\varepsilon} = \sigma^2 \Sigma\) to \(\Sigma^{-1/2} \varepsilon \sim \mathbf{N}(0, \sigma^2 I)\) Wobec tego jeżeli weźmiemy \(Y_1 = \Sigma^{-1/2} Y\) oraz \(X_1 = \Sigma^{-1/2} X\) to otrzymamy model liniowy z błędami o stałej wariancji, który możemy rozwiązać za pomocą MNK.

\(\beta_{MUNK} = (X'\Sigma^{-1}X) ^{-1} X'\Sigma^{-1}Y\)

Łatwo sprawdzić, że \(\Sigma_{\hat \beta_{MUNK}} = \sigma^2 (X'\Sigma^{-1}X)^{-1}\)

Obserwacje odstające i wpływowe

Obserwacja \((y_i, x_i)\) jest wpływowa jeżeli \(y_i\) nie ma rozkładu \(N(x_i^T\beta, \sigma^2)\).

Sposoby wykrywania obserwacji odstających:

Rezydua studentyzowane lub modyfikowane studentyzowane lub modyfikowane

Można np. przeanalizować wykres indeksowy rezyduów. Wykres kwantylowy też pozwala wykryć nietypowe rezydua.

Wzory podane w zakładce Rezydua

Heurystyczna metoda \(r_i \geq 2\) lub \(t_i \geq 2\)

res <- rstudent(modelinho) # rezydua studentyzowane modyfikowane
res2 <- rstandard(modelinho) # rezydua studentyzowane
outliers = which(abs(res) >= 2) # tutaj dostajemy obserwacje odstające
model_res = lm(Y~., data=d, subset = -outliers)

Rezydua modyfikowane mają rozkład tstudenta z \(n-p-1\) stopniami swobody. Wobec tego można zastosować test tstudenta, aby sprawdzić czy rezydua są odstające. Uwaga! jeżeli sprawdzamy czy rezyduum o najwiekszej wartosci \(t\) jest odstające na zadanym poziomie istotności \(\alpha\), to powinniśmy sprawdzić czy \(t > t_{n-p-1, 1-\alpha/n}\). Jest to problem wielokrotnych powtórzeń. Tę operację nazywamy poprawką Bonferroniego.

Jeżeli wybieramy, np. pierwszą obserwację (wybor obserwacji jest niezalezny od danych) to możemy zastosować zwykły test tstudenta.

REZYDUA MODYFIKOWANE NIESTUDENTYZOWANE

X<- model.matrix(mod)
res <- mod$residuals
res_mod <- res/(1-hatvalues(mod))

odległość Cooka


## Odległość Cooka
Oceniamy wpływ usunięcia i -tej obserwacji na prognozę wszystkich obserwacji.
Obserwacja jest wpływowa jeżeli jej usunięcie znacząco zmienia parametry modelu.

$$D_i = \frac{\|X b_{-i} - \hat{Y}\|}{ps^2}$$
$$D_i = \frac{r_i^2 h_{ii}}{p(1-h_{ii})}$$

```{}
# funkcja wbudowana
cooks.distance(modelinho) 
plot(modelinho, 4) # wykres cooka

bigcook <- which(cooks.distance(modelinho)>=1) # jedna z heurystyk

mod2 <- lm(Savings ~ .-Country, data = s, subset=-bigcook)

Macierz rzutu

Wpływ i-tej obserwacji \(h_{ii}\) to ita wartość na przekątnej macierzy daszkowej \(H\).

Intuicja wyjaśniona tutaj

Ponadto \(h_{ii}=\frac{d\hat{y_i}}{dy}\)

p = ncol(data)
n = nrow(data)
which(hatvalues(model) > 2*p/n)

# hatvalues z definicji
diag(X %*% solve(t(X) %*% X) %*% t(X)) # to samo co hatvalues(mod)

Przyjmuje się heurystyczne kryterium \(h_{ii} \geq \frac{2p}{n}\), gdyż średnia wartość \(h_{..} = \frac{p}{n}\).

Podsumowanie heurystyk

Obserwacje odstające

  • \(|r_i| = |\frac{e_i}{SE(e_i)}| = |\frac{e_i}{s^2(1-h_{ii})}| \geq 2\) (rezydua studentyzowane)
  • \(|t_i| = |\frac{e_{i,-i}}{SE(e_{i,-i})}| = |\frac{e_i}{s_{-i}\sqrt{1-h_{ii}}}| \geq 2\) (modyfikowane rezydua studentyzowane)

Obserwacje wpływowe

  • \(h_{ii} \geq \frac{2p}{n}\) (większe od podwojonej średniej \(h_{ii}\))
  • \(D_i \geq 1\)
  • \(D_i \geq \frac{4}{n-p-1}\)
  • \(D_i \geq \frac{4}{n}\)

Selekcja zmiennych

Metody funkcji kryterialnej

BIC i AIC

Selekcja zmiennych następuje przez zminimalizowanie funkcji straty dla \(i \in \{1,2, \dots p-1\}\) - podzbioru wszystkich współczynników, które będą brane pod uwagę przez model:

  • \(AIC(i)\) = \(nlog(\frac{SSE(i)}{n})\) + \(2| \hat{i}|\)

  • \(BIC(i)\) = \(nlog(\frac{SSE(i)}{n})\) + \(| \hat{i}| log n\)

gdzie \(\hat{i}\) = #i, a logarytmy sa naturalne

Poszukiwanie optymalnego zbioru zmiennych odbywa się za pomocą algorytmu zachłannego. Możemy odpoowiednio zwiększać liczbę zmiennych branych pod uwagę, startując z pustego zbioru zmiennych lub zmniejszać ich liczbę, startując ze zbioru wszystkich zmiennych.

m_full = lm(Variable~., data=d)

s_sel_AIC = step(m_full, direction="backward", k=2)
s_sel_BIC = step(m_full, direction="backward", k=log(nrow(d)))

sposób backwards jest lepszy matematycznie, ale obliczeniowo może być gorszy (liczymy większe modele, bo maja wiecej zmiennych). W niektórych przypadkach nie będzie się nawet dało wykorzystać tej metody, np. gdy \(n<p\).


m_null = lm(Variable~1, data=d)

s_for_AIC = step(m_null, scope= list(lower=m_null, upper=m_full), direction="forward", k=2)
s_for_BIC = step(m_null, scope= list(lower=m_null, upper=m_full), direction="forward", k=log(nrow(d)))

Kryterium Mallowsa

Chcemy aby bylo mozliwie najmniejsze. Mniejsze Kryt Mallowsa to lepszy model

SSE <- sum(model$residuals^2)
sigma2 <- summary(model)$sigma^2
SSE + sigma2 * 2 * ncol(model.matrix(model))

Wybieranie modelu na podstawie t-statystyk

fullmod <- lm(R ~ ., data = usc) # startujemy z pełnego modelu
tstat <- summary(fullmod)$coef[, "t value"][-1] # bez Interceptu
tstat <- tstat[order(tstat, decreasing = T)]
features <- names(tstat)
p <- length(features)

mods <- list()
# puste wektory do przechowywania wartości AIC, BIC, SSE
aic <- numeric(p) 
bic <- numeric(p)
sse <- numeric(p)
n <- nrow(usc)

for(i in 1:p)
{
  m <- as.formula(paste("R ~ ", paste(features[1:i], collapse = "+"))) 
  mods[[i]] <- lm(m, data = usc)
  # liczymy z definicji
  sse[i] <- sum(mods[[i]]$res^2)
  aic[i] <- n*log(sse[i]/n) + 2*i
  bic[i] <- n*log(sse[i]/n) + i*log(n)
}

plot(1:p, aic, col = "red", type = "b")
lines(1:p, bic, col = "blue", type = "b")
legend("bottomleft", c("AIC","BIC"), col = c("red", "blue"), lty = c(1, 1))

Przedziały ufności

Przedział ufności

Estymatory w MNK mają rozkład normalny.

Przykładowo, poniżej liczymy przedział ufności dla \(\hat{\beta}_4\)

alpha <- 0.05

n <- nrow(X)
degf <- n - ncol(X)
SE <- summary(m)$coefficients[4,2]
c(-1, 1) * qt(1 - alpha/2, degf) * SE  + coef(m)[4]

Bootstraponowy przedział ufności

liczymy boostraponowy przedział ufności dla estymatora \(\hat{\beta}_4\)

n <- 1000
incomes_boot <- numeric()
B <- 1000
for(i in 1:B) {
  indexes <- sample(1:nrow(X), n, replace=T)
  chosen_sample <- X[indexes,2:ncol(X)]
  chosen_results <- Y[indexes]
  
  m_boot <- lm (chosen_results ~ chosen_sample)
  incomes_boot[i] <- coef(m_boot)[4]
}

incomes_boot_mean <- mean(incomes_boot)
se_boot <- sqrt(1/(B-1) * sum((incomes_boot - incomes_boot_mean)^2))

alpha <- 0.05
left <- coef(m)[4] - qnorm(1 - alpha/2) * se_boot
right <-  coef(m)[4] + qnorm(1 - alpha/2) * se_boot
c(left, right)

incomes_boot
# mozna tez
c(-1, 1) * qnorm(1 - alpha/2) * se_boot + coef(m)[4]

Pozostałe

Estymator MNK ma rozkład normalny.
MNK jest Najlepszym Liniowym Nieobciążonym Estymatorem (BLUE, Best Linear Unbiased Estimator)
(przy założeniu, że \(Y \sim \mathbf{N}(X\beta, \sigma^2I)\))

Detekcja liniowej zależność między kolumnami w macierzy

plm::detect.lindep(X)