Przygotowanie danych

W niniejszym projekcie zajmiemy się problematyką zastosowania logarytmów w statystyce. W tym celu skorzystamy z danych airquality, które są wbudowane w base R (bez dodatkowych pakietów). Zbiór airquality zawiera m.in. zmienną Ozone – stężenie ozonu (ppb) w Nowym Jorku. Od razu wyliczymy nową zmienną lnOzone która będzie zlogarytmowaną zmienną Ozone. Na początek porównajmy obie te zmienne.

data(airquality)
df = airquality %>% 
  as_tibble() %>% 
  filter(!is.na(Ozone)) %>% 
  mutate(lnOzone = log(Ozone))%>% 
  pivot_longer(c("Ozone", "lnOzone"), names_to = "data", values_to = "value")  

df %>% 
  ggplot(aes(0,value ))+
  geom_boxplot()+
  geom_violin(alpha=0.2, fill="red")+
  facet_wrap(vars(data), scales="free")

df %>% group_by(data) %>% 
  summarise(
    min = min(value),
    q1 = quantile(value, .25),
    median = median(value),
    mean = mean(value),
    q3 = quantile(value, .75),
    max = max(value),
    var = var(value),
    kurtoza = kurtosis(value),
    shapiro.p = shapiro.test(value)$p
)
## # A tibble: 2 × 10
##   data      min    q1 median  mean    q3    max      var kurtoza    shapiro.p
##   <chr>   <dbl> <dbl>  <dbl> <dbl> <dbl>  <dbl>    <dbl>   <dbl>        <dbl>
## 1 Ozone       1 18     31.5  42.1  63.2  168    1088.      1.11  0.0000000279
## 2 lnOzone     0  2.89   3.45  3.42  4.15   5.12    0.749   0.776 0.0147

Podstawowe statystyki

Wariancja

Skupmy się najpierw na wariancji. To jest kluczowy punkt.

Ozone:

  • wariancja ogromna, silnie zależna od poziomu średniej
  • klasyczny objaw heteroscedastyczności

lnOzone:

  • wariancja mała i „geometrycznie sensowna”
  • skala danych została ustabilizowana

Wniosek: Logarytm zmienił strukturę błędu z multiplikatywnej na addytywną.

Kurtoza

Przyjmijmy roboczo:

  • kurtoza ≈ 0 → zbliżona do normalnej

Tu:

  • Ozone: 1.11 → wyraźnie „spiczasty”, ciężkie ogony
  • lnOzone: 0.776 → znacznie bliżej normalności

To nie jest cud, tylko: logarytm ścina prawy ogon, który był odpowiedzialny za nadmiar masy w ogonach.

Test Shapiro–Wilka

Formalnie poziom p-value nie pozwala nam przyjąć hipotezy zerowej o normalności rozkładu w żadnym z przypadków. Możemy jedynie zauważyć, że p-value wzrosło z ~10⁻⁸ do ~10⁻² co jest ogromną poprawą jakości danych, nawet jeśli formalnie H₀ nadal jest odrzucana.

Transformacja logarytmiczna zmiennej Ozone istotnie zmniejszyła asymetrię rozkładu, ustabilizowała wariancję oraz przybliżyła rozkład do normalnego.

Wykres kwantylowo-kwantylowy Q-Q

Q–Q plot porównuje empiryczne kwantyle danych z teoretycznymi kwantylami rozkładu normalnego. Im bliżej prostej, tym bliżej normalności.

Odchylenia:

S-kształt → skośność

odjazdy w ogonach → ciężkie ogony / obserwacje ekstremalne

krzywizna → zła transformacja skali

df %>% 
  ggplot(aes(sample = value)) +
  stat_qq() +
  stat_qq_line() +
  facet_wrap(vars(data), scales = "free") +
  labs(title = "Q–Q plot: Ozone vs ln(Ozone)")

Prawy panel: Ozone (bez transformacji)

Tu widać kilka rzeczy bardzo wyraźnie:

  1. Silna krzywizna
  • punkty w środkowej części są „ściśnięte”
  • górny ogon odjeżdża mocno w górę
  1. Prawy ogon znacznie cięższy niż normalny
  • wysokie stężenia ozonu są:
    • rzadsze
    • znacznie „dalej” niż przewidywałby rozkład normalny
  1. Dolny ogon też nie jest liniowy
  • co oznacza, że problem nie dotyczy tylko ekstremów

📌 Wniosek
Rozkład Ozone nie tylko nie jest normalny, ale też:

  • ma złą geometrię dla modeli addytywnych,
  • generuje heteroscedastyczne reszty,
  • łamie kluczowe założenia regresji liniowej.

Lewy panel: lnOzone (po logarytmizacji)

Tu obraz jest radykalnie inny:

  1. Środek rozkładu leży niemal idealnie na prostej
  • to najważniejsze z punktu widzenia estymacji
  1. Odchylenia pojawiają się głównie w ogonach i są:
  • symetryczne
  • umiarkowane
  1. Brak systematycznej krzywizny
  • nie widać S-kształtu
  • nie widać „lejka”

📌 Wniosek
lnOzone jest:

  • bliskie normalnemu w centrum rozkładu,
  • wystarczająco dobre do:
    • regresji,
    • testów średnich,
    • interpretacji parametrów.

Podsumowując

  • dla Ozone:

    • odchylenia są systematyczne
    • więc transformacja jest konieczna
  • dla lnOzone:

    • odchylenia są lokalne i losowe
    • więc transformacja jest adekwatna

Wykresy Q–Q jednoznacznie wskazują, że transformacja logarytmiczna zmiennej Ozone istotnie poprawia zgodność rozkładu z normalnym, eliminując silną prawoskośność oraz ciężki prawy ogon obserwowany w danych surowych.

Porównanie Maj - Sierpień

df2 <- airquality %>% 
  as_tibble() %>% 
  filter(!is.na(Ozone), Month %in% c(5, 8)) %>% 
  mutate(
    lnOzone = log(Ozone),
    Month = factor(Month, labels = c("May", "Aug"))
  )

ggplot(df2, aes(Month, lnOzone)) +
  geom_violin(fill = "gray80") +
  geom_boxplot(width = 0.2) +
  labs(title = "ln(Ozone): May vs August")

Odczyt wizualny (violin + boxplot)

Ten wykres mówi bardzo dużo i mówi to czytelnie:

  • Maj (May):

    • niższy poziom centralny (median, mean)

    • większa koncentracja obserwacji w okolicach ~2.5–3.2

  • Sierpień (Aug):

-    wyraźnie przesunięty rozkład w górę

-   środek rozkładu ok. \~3.8–4.1

Najważniejsze:

  • przesunięcie jest globalne, a nie wynika z kilku ekstremów

  • kształty violinów są podobne → różnica dotyczy poziomu, nie tylko wariancji

To już samo w sobie uzasadnia test porównawczy.

Test t-Studenta (Welcha) na lnOzone

t.test(lnOzone ~ Month, data = df2)
## 
##  Welch Two Sample t-test
## 
## data:  lnOzone by Month
## t = -4.3542, df = 48.503, p-value = 6.881e-05
## alternative hypothesis: true difference in means between group May and group Aug is not equal to 0
## 95 percent confidence interval:
##  -1.5102754 -0.5562632
## sample estimates:
## mean in group May mean in group Aug 
##          2.812076          3.845345

Co to dokładnie znaczy?

  • różnica średnich jest wyraźna i stabilna

  • przedział ufności nie obejmuje zera

  • znak ujemny → May < August

To jest klasyczny przypadek, w którym:

  • dane po transformacji spełniają założenia wystarczająco dobrze,

  • Welch t-test jest najlepszym wyborem parametrycznym.

Kluczowy moment: interpretacja na skali oryginalnej

Ponieważ test był na logarytmach, różnica średnich:

\(\Delta = 3.845 − 2.812 \approx 1.03\)

oznacza:

\(\exp(1.03) \approx 2.8\)

📌 Interpretacja praktyczna

Średni poziom ozonu w sierpniu jest około 2.8 raza wyższy niż w maju.

To jest bardzo silny efekt, nie tylko „istotny statystycznie”.

Test Wilcoxona na Ozone (bez logarytmu)

wilcox.test(Ozone ~ Month, data = df2)
## Warning in wilcox.test.default(x = DATA[[1L]], y = DATA[[2L]], ...): nie można
## obliczyć dokładnej wartości prawdopodobieństwa z powtórzonymi wartościami
## 
##  Wilcoxon rank sum test with continuity correction
## 
## data:  Ozone by Month
## W = 127.5, p-value = 0.0001208
## alternative hypothesis: true location shift is not equal to 0

p-value = 0.0001208

I to jest dokładnie to, czego należało się spodziewać.

Dlaczego oba testy są istotne?

Bo:

  • różnica między miesiącami jest duża
  • i dotyczy całego rozkładu, nie tylko średniej

Wilcoxon mówi:

„Niezależnie od kształtu rozkładu, obserwacje z sierpnia są systematycznie większe niż z maja.”

Dane surowe są silnie skośne, ale różnica między miesiącami jest na tyle wyraźna, że wykrywa ją nawet test nieparametryczny.

Po transformacji logarytmicznej możliwe jest zastosowanie testu parametrycznego, który dodatkowo umożliwia interpretację różnicy w kategoriach względnych (ilorazów).

Porównanie wysoka - niska temperatura

Rozdzielmy teraz dane na dwa podzbiory:

  1. Dane dla których temperatura była większa lub równa medianie temperatury (High temp)

  2. Dane dla których temperatura była niższa niż mediana temperatury (Low temp)

df3 <- airquality %>% 
  as_tibble() %>% 
  filter(!is.na(Ozone)) %>% 
  mutate(
    lnOzone = log(Ozone),
    TempGroup = if_else(Temp >= median(Temp, na.rm = TRUE),
                        "High temp", "Low temp")
  )

ggplot(df3, aes(TempGroup, lnOzone)) +
  geom_violin(fill = "gray80") +
  geom_boxplot(width = 0.2) +
  labs(title = "ln(Ozone): High vs Low")

Odczyt wizualny (violin + boxplot)

Z wykresu ln(Ozone): High vs Low widać jednoznacznie:

  • High temp:

    • wyraźnie wyższy poziom centralny (median, mean)
    • rozkład przesunięty w górę niemal w całości
  • Low temp:

    • niższy poziom centralny
    • większa koncentracja w okolicach ~2.5–3.0

Kluczowa obserwacja:

Rozkłady są do siebie podobne kształtem, ale przesunięte względem siebie.

To dokładnie ta sytuacja, w której:

  • testy porównawcze są uzasadnione,
  • różnica dotyczy poziomu, a nie tylko ogonów.

Test t-Studenta (Welcha) na lnOzone

t.test(lnOzone ~ TempGroup, data = df3)
## 
##  Welch Two Sample t-test
## 
## data:  lnOzone by TempGroup
## t = 9.5139, df = 113.17, p-value = 4.015e-16
## alternative hypothesis: true difference in means between group High temp and group Low temp is not equal to 0
## 95 percent confidence interval:
##  0.9086325 1.3865825
## sample estimates:
## mean in group High temp  mean in group Low temp 
##                3.972533                2.824925

To jest wynik bardzo mocny statystycznie:

  • p-value ekstremalnie małe,
  • przedział ufności szeroki, ale daleko od zera,
  • różnica średnich stabilna i jednoznaczna.

Interpretacja na skali oryginalnej (najważniejszy moment)

Różnica średnich logarytmów:

\(\Delta = 3.973 - 2.825 \approx 1.15\)

Po powrocie na skalę oryginalną:

\(\exp(1.15) \approx 3.16\)

📌 Interpretacja praktyczna

Przy wysokiej temperaturze średni poziom ozonu jest około trzykrotnie wyższy niż przy niskiej temperaturze.

To nie jest subtelny efekt — to silna zależność fizyczno-chemiczna, zgodna z mechanizmem fotochemicznego powstawania ozonu.

Test Wilcoxona na Ozone

wilcox.test(Ozone ~ TempGroup, data = df3)
## 
##  Wilcoxon rank sum test with continuity correction
## 
## data:  Ozone by TempGroup
## W = 3041, p-value = 5.536e-14
## alternative hypothesis: true location shift is not equal to 0

Znów:

  • test nieparametryczny potwierdza różnicę,
  • niezależnie od kształtu rozkładu.

To dokładnie to, czego oczekujemy przy:

  • dużym,
  • globalnym przesunięciu rozkładu.

Zarówno analiza wizualna, jak i testy statystyczne jednoznacznie wskazują, że wysoka temperatura wiąże się z istotnie wyższym poziomem ozonu. Po transformacji logarytmicznej możliwe jest ilościowe ujęcie tego efektu — średnie stężenie ozonu przy wysokiej temperaturze jest około trzykrotnie wyższe niż przy temperaturze niskiej.

Modele regresji liniowej

Zbudujmy dwa modele regresji liniowej.

  1. Model addytywny (surowy) Ozone ~ Temp + Wind
dfw = df %>% pivot_wider(names_from  = data, values_from = value)
lmlnOzone <- lm(lnOzone ~ Temp + Wind, data = dfw)
lmOzone <- lm(Ozone ~ Temp + Wind, data = dfw)
summary(lmOzone)
## 
## Call:
## lm(formula = Ozone ~ Temp + Wind, data = dfw)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -41.251 -13.695  -2.856  11.390 100.367 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -71.0332    23.5780  -3.013   0.0032 ** 
## Temp          1.8402     0.2500   7.362 3.15e-11 ***
## Wind         -3.0555     0.6633  -4.607 1.08e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 21.85 on 113 degrees of freedom
## Multiple R-squared:  0.5687, Adjusted R-squared:  0.5611 
## F-statistic:  74.5 on 2 and 113 DF,  p-value: < 2.2e-16
  1. Model multiplikatywny (log-liniowy) ln(Ozone) ~ Temp + Wind
summary(lmlnOzone)
## 
## Call:
## lm(formula = lnOzone ~ Temp + Wind, data = dfw)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -2.34415 -0.25774  0.03003  0.35048  1.18640 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -0.531932   0.608901  -0.874  0.38419    
## Temp         0.057384   0.006455   8.889 1.13e-14 ***
## Wind        -0.052534   0.017128  -3.067  0.00271 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.5644 on 113 degrees of freedom
## Multiple R-squared:  0.5821, Adjusted R-squared:  0.5747 
## F-statistic: 78.71 on 2 and 113 DF,  p-value: < 2.2e-16

Interpretacja modelu na surowych danych (lmOzone)

Temp = 1.84

Wind = -3.06

Co to znaczy DOSŁOWNIE?

  • +1°C temperatury
    średnio +1.84 ppb ozonu, niezależnie od aktualnego poziomu

  • +1 jednostka wiatru
    średnio −3.06 ppb ozonu, niezależnie od aktualnego poziomu

Dlaczego to jest problematyczne?

Bo model mówi absurdalne rzeczy typu:

  • przy bardzo niskim ozonie: −3 ppb → wartości ujemne
  • przy wysokim ozonie: efekt wiatru taki sam jak przy niskim

📌 Ten model zakłada stały, addytywny wpływ, co:

  • jest fizycznie wątpliwe,
  • generuje heteroscedastyczne reszty,
  • źle skaluje się dla ekstremów.

Interpretacja modelu log-liniowego (lmlnOzone) — TU JEST KLUCZ

Temp = 0.0574

Wind = -0.0525

To są współczynniki logarytmiczne, czyli efekty względne.

Temperatura

\(\beta_{Temp}=0.0574\)

To znaczy:

\(\ln(Ozone + 1°C) - \ln(Ozone) = 0.0574 \cdot ln(Ozone+1°C)−ln(Ozone)=0.0574\)

Po przejściu na skalę oryginalną:

\(\exp(0.0574) \approx 1.059\)

📌 Interpretacja praktyczna

Każdy wzrost temperatury o 1°C zwiększa średni poziom ozonu o około 5.9%.

Wiatr

\(\beta_{Wind}=-0.0525\)\(\exp(-0.0525) \approx 0.949\)

📌 Interpretacja praktyczna

Każdy wzrost prędkości wiatru o 1 jednostkę zmniejsza średni poziom ozonu o około 5%.

To jest:

  • fizycznie sensowne,
  • skaluje się z poziomem ozonu,
  • nie prowadzi do wartości ujemnych.

Model ln(Ozone) ~ Temp + Wind zakłada, że czynniki meteorologiczne wpływają na ozon w sposób względny (procentowy), a nie addytywny, co prowadzi do stabilniejszej wariancji reszt i interpretowalnych parametrów.

Równanie zamykające

Z modelu logarytmicznego:

\(\widehat{Ozone} = \exp(-0.53) \cdot \exp(0.057 \cdot Temp) \cdot \exp(-0.053 \cdot Wind)\)

Czyli:

  • temperatura zwiększa
  • wiatr tłumi
  • efekt jest multiplikatywny

Ostateczny werdykt (bez wahania)

  • Statystycznie: oba modele istotne
  • Metodologicznie: tylko ln(Ozone) jest poprawny
  • Interpretacyjnie: tylko model log-liniowy ma sens

Wizualizaja modeli regresji

plotlnOzone = dfw %>% ggplot(aes(Temp, Wind, colour = lnOzone))+
  geom_point(size = 5)+
  labs(title = "lm lnOzone ~ Temp + Win")

plotOzone = dfw %>% ggplot(aes(Temp, Wind, colour = Ozone))+
  geom_point(size = 5)+
  labs(title = "lm Ozone ~ Temp + Win")

grid.arrange(plotlnOzone,  plotOzone,  ncol = 2)

Co jest wspólne w obu panelach (ważne na start)

W obu wykresach widać ten sam fizyczny mechanizm:

  • Temperatura (Temp)
    → im wyższa, tym wyższy poziom ozonu
  • Wiatr (Wind)
    → im silniejszy, tym niższy poziom ozonu

Czyli:

  • gradient kolorów rośnie w prawo (Temp ↑),
  • gradient maleje ku górze (Wind ↑).

To potwierdza:

  • znak współczynników w obu modelach,
  • sensowność doboru zmiennych.

Lewy panel: lnOzone (model log-liniowy)

Tu jest kluczowa różnica jakościowa.

Co widać:

  1. Płynny, niemal liniowy gradient koloru

    • brak „plam” ekstremalnych
    • brak punktów dominujących skalę
  2. Jednorodna dynamika zmian

    • podobny kontrast kolorów przy różnych poziomach Temp/Wind
    • brak eksplozji wariancji
  3. Brak dominacji pojedynczych obserwacji

    • każdy punkt „waży” podobnie wizualnie

📌 Interpretacja

Zależność ln(Ozone) od Temp i Wind jest bliska liniowej w całym zakresie danych.

To dokładnie tłumaczy:

  • dobre zachowanie reszt,
  • stabilną wariancję,
  • sensowną interpretację procentową.

Prawy panel: Ozone (model surowy)

Tutaj dokładnie widać, dlaczego ten model jest problematyczny.

Co widać:

  1. Kilka punktów o bardzo wysokim Ozone dominuje skalę

    • „przepalają” legendę kolorów
    • reszta punktów zlewa się wizualnie
  2. Brak jednorodnego gradientu

    • przy niskich wartościach trudno odróżnić zmiany
    • przy wysokich – gwałtowne skoki
  3. Silna heteroscedastyczność wizualna

    • im większe Ozone, tym większy rozrzut

📌 Interpretacja

Model addytywny jest „ciągnięty” przez kilka ekstremalnych obserwacji i nie opisuje równomiernie całej przestrzeni danych.

To jest wizualny dowód, że:

logarytmizacja nie była zabiegiem kosmetycznym, tylko poprawą geometrii problemu.

W przestrzeni Temp–Wind zależność logarytmu stężenia ozonu wykazuje jednolity, liniowy charakter, podczas gdy model na danych surowych jest zdominowany przez obserwacje ekstremalne i charakteryzuje się niestabilną wariancją.

Diagnostyka modeli - rezydua kolejnych obserwacji

diaglnOzone = diagPlot(lmlnOzone)
diagOzone = diagPlot(lmOzone)

grid.arrange(diaglnOzone$rvn,  diagOzone$rvn,  ncol = 2)

Ten wykres odpowiada na trzy pytania naraz:

  1. Skala reszt – jak duże są błędy modelu?
  2. Jednorodność wariancji – czy rozrzut jest stabilny?
  3. Struktura – czy reszty nie tworzą wzorca w czasie / indeksie?

Lewy panel: lnOzone ~ Temp + Wind

Co widać bardzo wyraźnie:

  • Zdecydowana większość reszt mieści się w przedziale ±1
  • pojedyncze obserwacje dochodzą do ok. ±2
  • brak wyraźnego trendu lub wzorca w kolejności obserwacji
  • rozrzut jest symetryczny wokół zera

📌 Interpretacja statystyczna

  • reszty mają sensowną, jednorodną skalę
  • brak oznak heteroscedastyczności
  • brak autokorelacji „widocznej gołym okiem”
  • model dobrze opisuje większość obserwacji

To dokładnie odpowiada:

  • niskiej wartości residual standard error (~0.56),
  • poprawnym wykresom Q–Q reszt,
  • stabilnemu zachowaniu modelu w całej przestrzeni danych.

Prawy panel: Ozone ~ Temp + Wind

Tutaj różnica jest uderzająca.

Co widać:

  • reszty rozciągają się nawet do ±100

  • większość punktów mieści się w przedziale ±25, ale:

    • to i tak jest olbrzymia skala błędu
  • kilka obserwacji (np. 82) dominuje cały wykres

  • rozrzut reszt rośnie wraz z poziomem dopasowania (co już widzieliśmy wcześniej)

📌 Interpretacja statystyczna

  • model generuje błędy zależne od poziomu zmiennej
  • klasyczna heteroscedastyczność
  • kilka ekstremów „ciągnie” estymację
  • model nie skaluje się poprawnie dla wysokich wartości ozonu

To idealnie tłumaczy:

  • duży Residual Standard Error (~21.9),
  • problemy z interpretacją współczynników addytywnych,
  • słabą czytelność relacji na wykresach.

W modelu log-liniowym błędy są względne, stabilne i jednorodne, natomiast w modelu na danych surowych błędy rosną wraz z poziomem zmiennej i są zdominowane przez obserwacje ekstremalne.

Dlaczego to jest „ostateczny dowód”

Testy, R², p-value można czasem dyskutować.
Reszt nie da się oszukać.

Jeżeli:

  • reszty są małe,
  • losowe,
  • symetryczne,
  • bez struktury,

to model jest praktycznie użyteczny.

I dokładnie to widać dla lnOzone ~ Temp + Wind.

Podsumowanie

Analiza reszt jednoznacznie wskazuje, że model log-liniowy zapewnia stabilną skalę błędu i jednorodne dopasowanie w całym zakresie danych, podczas gdy model na danych surowych charakteryzuje się dużymi, niestabilnymi resztami i wyraźną heteroscedastycznością.

Diagnostyka modeli - rezydua w funkcji wart. dopasowanych

grid.arrange(diaglnOzone$rvf,  diagOzone$rvf,  ncol = 2)
## `geom_smooth()` using formula = 'y ~ x'
## `geom_smooth()` using formula = 'y ~ x'

Ten wykres („reszty vs wartości dopasowane”):

Sprawdza:

  1. Liniowość relacji
  2. Homoscedastyczność
  3. Poprawność transformacji skali

Czyli odpowiada na pytanie:

Czy model systematycznie się myli w pewnych zakresach wartości?

2. Lewy panel: lnOzone ~ Temp + Wind

Co nowego tu widać:

  • Reszty są rozłożone wokół zera w całym zakresie fitted

  • Loess:

    • delikatnie faluje,
    • ale nie ma silnej struktury

To oznacza:

  • brak istotnej nieliniowości,
  • transformacja logarytmiczna wystarczająco „wyprostowała” relację,
  • ewentualne krzywizny są drugorzędne.

📌 To jest odpowiedź na inne pytanie niż poprzedni wykres:

Czy model liniowy w ogóle ma sens w tej skali?

Odpowiedź: tak.

3. Prawy panel: Ozone ~ Temp + Wind

Tutaj wykres jest bardzo informatywny, nawet jeśli „na pierwszy rzut oka” przypomina poprzedni.

Co widać bardzo wyraźnie:

  1. Wyraźny wzór U / S

    • Loess pokazuje systematyczne odchylenia:

      • niedoszacowanie w środku,
      • przeszacowanie na krańcach
  2. Rosnąca wariancja reszt

    • rozrzut wyraźnie rośnie wraz z fitted
    • klasyczna heteroscedastyczność
  3. Ekstremy skupione po jednej stronie

    • kilka obserwacji „ciągnie” krzywą

📌 To mówi coś innego niż „reszty vs index”:

Model jest strukturalnie źle postawiony – nawet po uwzględnieniu Temp i Wind.

Najważniejszy szczegół: krzywizna loess

To jest subtelne, ale bardzo ważne:

  • w lnOzone:

    • krzywizna jest mała
    • można ją zignorować lub opisać jako „drugiego rzędu”
  • w Ozone:

    • krzywizna jest systematyczna

    • to sygnał:

      • brak transformacji,
      • brak nieliniowego składnika,
      • zła skala modelu

Wykres reszt w funkcji wartości dopasowanych wskazuje, że model log-liniowy nie wykazuje istotnej nieliniowości ani heteroscedastyczności, podczas gdy model na danych surowych charakteryzuje się wyraźną strukturą reszt i niestabilną wariancją.