Przykładowy zbiór danych: Boston z biblioteki MASS (zrodlo:http://lib.stat.cmu.edu/datasets/boston)
library(MASS)
head(Boston)
## crim zn indus chas nox rm age dis rad tax ptratio black
## 1 0.00632 18 2.31 0 0.538 6.575 65.2 4.0900 1 296 15.3 396.90
## 2 0.02731 0 7.07 0 0.469 6.421 78.9 4.9671 2 242 17.8 396.90
## 3 0.02729 0 7.07 0 0.469 7.185 61.1 4.9671 2 242 17.8 392.83
## 4 0.03237 0 2.18 0 0.458 6.998 45.8 6.0622 3 222 18.7 394.63
## 5 0.06905 0 2.18 0 0.458 7.147 54.2 6.0622 3 222 18.7 396.90
## 6 0.02985 0 2.18 0 0.458 6.430 58.7 6.0622 3 222 18.7 394.12
## lstat medv
## 1 4.98 24.0
## 2 9.14 21.6
## 3 4.03 34.7
## 4 2.94 33.4
## 5 5.33 36.2
## 6 5.21 28.7
Przypuśćmy, ze wpływy każdej rozpatrywanej zmiennej objaśniającej na zmienną objaśnianą jest liniowy i nie zależy od wartości innych zmiennych. Wartość \(y_i\) traktujemy jako wartość zmiennej losowej \(Y_i\).
Liniowy model regresji wielokrotnej:
\(Y_i=\alpha_0+\alpha_1 * x_{1,i} + \alpha_2 * x_{2,i} + \dots + \alpha_{m,i} * x_{m,i} + \epsilon_i\),
gdzie:
\(\alpha_0, \dots, \alpha_m\) nieznane parametry,
\(\epsilon_i\) dla \(i=1,\dots, n\) błędy losowe o takim samym rozkładzie mającym wartość średnią 0 i nieznaną, stałą wariancję \(\sigma^2\)
\(n\) liczba obserwacji
\(m\) liczba zmiennych niezależnych
\(p=m+1\) liczba parametrów modelu
train.idx <-sample (1:nrow(Boston), 0.7*nrow(Boston), replace = FALSE)
train<-Boston[train.idx, ]
test<-Boston[-train.idx, ]
nrow(train)
## [1] 354
nrow(test)
## [1] 152
#
#model$fitted.values
#plot(model$fitted.values, df$medv)
#plot(model)
#model.matrix.default()
model<-lm(medv~age, data=train)
summary(model)
##
## Call:
## lm(formula = medv ~ age, data = train)
##
## Residuals:
## Min 1Q Median 3Q Max
## -15.083 -5.116 -1.774 2.160 31.341
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 30.93089 1.19615 25.859 < 2e-16 ***
## age -0.12272 0.01601 -7.665 1.76e-13 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 8.35 on 352 degrees of freedom
## Multiple R-squared: 0.143, Adjusted R-squared: 0.1406
## F-statistic: 58.75 on 1 and 352 DF, p-value: 1.757e-13
Model:
* Wartości współczynników (estymatory)
* Błąd standardowy współczynników
* Wartość statystyki t
* p-value dla współczynników
Ocena jakości modelu
* Istotność parametrów
* Wartość współczynnika \(R^2\)
\(SST=\sum_{i=1}^{n}(y_i-\overline{y})^2\)
y_mean <-mean(train$medv)
SST <- sum((train$medv - y_mean)^2)
SST
## [1] 28635.53
\(SST = SSE + SSR\)
Równość powyższa zachodzi w sytuacji, gdy \(y_i\) oznaczają wartości przewidywane obliczne na podstawie prostej MNK i nie musi być spełniona dla innej prostej przybliżającej chmurę punktów.
Indeks zmienności wartości \(y_i\) nie wyjaśnionej przez zależność liniową.
SSE <- sum ((train$medv - model$fitted.values )^2)
SSE
## [1] 24539.58
SSE <-sum(model$residuals^2)
SSE
## [1] 24539.58
SSR <- sum (( model$fitted.values - y_mean )^2)
SSR
## [1] 4095.951
SSE + SSR
## [1] 28635.53
R2<- SSR/SST
R2
## [1] 0.1430374
n<-nrow(train)
p<-2
R2_adj<- 1 - (1-R2)*(n-1)/(n-p)
R2_adj
## [1] 0.1406028
\(MSR=\frac{SSR}{m}\)
MSR<- SSR/(1)
MSR
## [1] 4095.951
Nieobciążony estymator wariancji \(\sigma^2\)
\(MSE=\frac{SSE}{n-p}\)
MSE<- SSE/(n-p)
MSE
## [1] 69.71472
Badanie liniowej zależności pomiędzy zmienną celu a zbiorem zmiennych objaśniających traktyowanych jako całość. Hipoteza zerowa: \(H_{0}: \alpha_1=\alpha_2=\dots=\alpha_m=0\)
Hipoteza alternatywna: \(H_{1}:\) istnieje przynajmniej jeden współczynnik \(\alpha_i \ne 0\)
Statystyka F:
\(F=\frac{MSR}{MSE}\)
ma rozkład F-Snedeckora z parametrami p-1, n-m.
F<-MSR/MSE
F
## [1] 58.75303
Rozkład gęstości i dystrybuanta:
F<-MSR/MSE
F
## [1] 58.75303
par(mfrow=c(1,2))
plot(seq(0,20,0.1), df(seq(0,20,0.1),p-1,n-p), xlab="X", ylab="f(x)" )
plot(seq(0,20,0.1), pf(seq(0,20,0.1),p-1,n-p),xlab="X", ylab="F(x)" )
Obszar krytyczny: \({F: F \ge f_{1-\alpha, p-1, n-p}}\)
na poziomie istotności 0.05:
qf(0.95, p-1, n-p)
## [1] 3.868012
Ponieważ F nie wpada do przedziału krytycznego, zatem hipotezę zerową należy odrzucić.
Jaki jest graniczny poziom istotności, przy którym hipoteza zerowa zostałaba odrzucona ?
pf(F, p-1, n-p, lower.tail=FALSE)
## [1] 1.757375e-13
Współczynniki i błędy standardowe współczynników:
alfa<-model$coefficients
alfa
## (Intercept) age
## 30.9308895 -0.1227233
alfa_se<-sqrt(diag(vcov(model)))
alfa_se
## (Intercept) age
## 1.19615087 0.01601076
\(t_i=\frac{\alpha_i}{SE_{\alpha_{i}}}\)
t<-alfa/alfa_se
t
## (Intercept) age
## 25.858686 -7.665052
Hipoteza zerowa: \(H_{0}: \alpha_i=0\)
Hipoteza alternatywna: \(H_{1}: \alpha_i \neq 0\)
Statystyka testowa t przy ma przy prawdziwości hipotezy H0 rozkład \(T_{n-2}\)
plot(seq(-5,5,0.1), dt(seq(-5,5,0.1), df=n-p), xlab="x", ylab="f(x)", main="Gęstość rozkładu T-Studenta")
Obszar krytyczny:
\(\{{t: |{t}| \ge t_{{1-\frac{\alpha}{2}},n-p}}\}\)
Obszar krytyczny na poziomie istotności 0.05 (granica):
t_gr<-qt(1-0.05/2, df=n-p)
t_gr
## [1] 1.966726
Ponieważ wartość statystyki t wpada do obszru krytycznego, hipotezę zerową należy odrzucić. Oznacza, to że nie ma podstaw do wnioskowania, że parametr jest nieistotny.
p_value<-2*pt(-abs(t), df=n-p, lower.tail=TRUE)
p_value
## (Intercept) age
## 2.223914e-83 1.757375e-13
\(e_i=y_i-\hat{y_i}\)
#wartości prognozowane oraz reszty
y_pred<- model$fitted.values
head(y_pred)
## 461 110 246 150 334 68
## 19.88579 19.73853 22.31571 19.28445 26.25513 28.30461
#Reszty
head(model$residuals)
## 461 110 246 150 334 68
## -3.4857935 -0.3385256 -3.8157146 -3.8844494 -4.0551322 -6.3046111
y<-train$medv
e<- y - y_pred
head(e)
## 461 110 246 150 334 68
## -3.4857935 -0.3385256 -3.8157146 -3.8844494 -4.0551322 -6.3046111
Wpływ (leverage, hat-value):
\(h_i=\frac{1}{n} + \frac{ ( x_i-\overline{x})^2}{\sum_{j=1}^{n} (x_j - \overline{x})^2 }\)
Hat-Matrix H - projekcja Y na wartości przewidywane
\(\hat{y_i}=h_{1,j}* y_1 + h_{2,j}*y_2+ \dots + h_{n,j} *y_n = \sum_{i=1}^n h_{i,j}*y_i\)
age_mean<-mean(train$age)
n<-nrow(train)
h <- 1/n + (train$age - age_mean)^2/sum((train$age - age_mean)^2)
head(h)
## [1] 0.004388676 0.004575964 0.002827347 0.005220099 0.006422025 0.011288801
plot(h)
abline(2/n,0)
Obserwacje odstające:
\(h_i > \frac{2*p}{n}\)
h<-hatvalues(model)
head(h)
## 461 110 246 150 334 68
## 0.004388676 0.004575964 0.002827347 0.005220099 0.006422025 0.011288801
plot(h, rstandard(model), xlab ="Leverage", ylab="Standardized residuals", main="Residuals vs Leverage")
\(D_i=\frac{\sum_{j=1}^{n}(\hat{Y_j}-\hat{Y_{j(i)}}) }{m*S^2}\),
gdzie
\(\hat{Y_{j(i)}}\) jest wartością przewidywaną dla j-tej obserwacji, obliczoną na podstawie danych z usuniętą obserwacją i-tą.
Diagram Cooke’a
d<-cooks.distance(model)
head(d)
## 461 110 246 150 334
## 3.858360e-04 3.795725e-06 2.969174e-04 5.708594e-04 7.672266e-04
## 68
## 3.292085e-03
plot(d)
Rozrzut punktów wokół wartości prognozowanych, sprawdzenie stałości wariancji składnika losowego (wykres scale-location)
plot(model$fitted.values, model$residuals, xlab="Fitted values", ylab=" SQRT standardized residuals")
plot( model$fitted.values, sqrt(rstandard(model)), xlab="Fitted values", ylab="Residuals")
## Warning in sqrt(rstandard(model)): wyprodukowano wartości NaN
\(e_{i}^{'}=\frac{e_i}{MSE*\sqrt{1-h_i}}\)
e_std <- rstandard(model)
head(e_std)
## 461 110 246 150 334 68
## -0.41840272 -0.04063733 -0.45764473 -0.46644853 -0.48723873 -0.75938382
e_std <- e/(MSE*sqrt(1-h))
head(e_std)
## 461 110 246 150 334
## -0.050110907 -0.004867018 -0.054810811 -0.055865217 -0.058355200
## 68
## -0.090949245
eq<-quantile(e_std, seq(0.01,0.99, 0.01))
tq<-qnorm(seq(0.01,0.99, 0.01))
plot(tq, eq, xlab="Theoretical quantiles", ylab="Standardized residuals quantiles")
par(mfrow=c(2,2))
plot(model)
model<-lm(medv~age+lstat+rad+crim, data=train)
summary(model)
##
## Call:
## lm(formula = medv ~ age + lstat + rad + crim, data = train)
##
## Residuals:
## Min 1Q Median 3Q Max
## -10.291 -3.947 -1.444 1.897 24.906
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 33.27788 0.90548 36.752 <2e-16 ***
## age 0.03196 0.01470 2.174 0.0304 *
## lstat -0.96199 0.06042 -15.923 <2e-16 ***
## rad -0.07221 0.05013 -1.440 0.1507
## crim -0.05193 0.05227 -0.993 0.3212
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 6.062 on 349 degrees of freedom
## Multiple R-squared: 0.5522, Adjusted R-squared: 0.547
## F-statistic: 107.6 on 4 and 349 DF, p-value: < 2.2e-16
y_pred_test<- predict(model, test)
plot(y_pred_test, test$medv, xlab="Actual", ylab="Predicted")
abline(0,1)
*MAE - Mean Absolute Error
\(MAE = \frac{1}{n}{\sum_{j=1}^{n}|y_j-\hat{y_j}|}\)
MAE <- (sum(abs(y_pred_test - test$medv)) / nrow(test))
MAE
## [1] 4.591432
\(RMSE = \sqrt {\frac{1}{n}\sum_{j=1}^{n}(y_j-\hat{y_j})^2}\)
RMSE <- sqrt (sum((y_pred_test - test$medv)^2) / nrow(test))
RMSE
## [1] 6.404864