library(car)
## Loading required package: carData
library(np)
## Nonparametric Kernel Methods for Mixed Datatypes (version 0.60-17)
## [vignette("np_faq",package="np") provides answers to frequently asked questions]
## [vignette("np",package="np") an overview]
## [vignette("entropy_np",package="np") an overview of entropy-based methods]
library(KernSmooth)
## KernSmooth 2.23 loaded
## Copyright M. P. Wand 1997-2009
library(magrittr)
library(tibble)
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ purrr 1.0.2
## ✔ forcats 1.0.0 ✔ readr 2.1.5
## ✔ ggplot2 3.5.1 ✔ stringr 1.5.1
## ✔ lubridate 1.9.3 ✔ tidyr 1.3.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ tidyr::extract() masks magrittr::extract()
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ✖ dplyr::recode() masks car::recode()
## ✖ purrr::set_names() masks magrittr::set_names()
## ✖ purrr::some() masks car::some()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(ggplot2)
library(splines)
library(MASS)
##
## Attaching package: 'MASS'
##
## The following object is masked from 'package:dplyr':
##
## select
Celem niniejszego raportu jest przedstawienie procesu analizy danych za pomocą modelu LOESS (ang. Locally Estimated Scatterplot Smoothing), a także interpretacja uzyskanych wyników. LOESS to nieliniowa metoda wygładzania danych, która pozwala na elastyczne modelowanie zależności między zmiennymi bez potrzeby przyjmowania konkretnej funkcji regresji. W szczególności model ten sprawdza się w analizie danych złożonych, gdzie relacje pomiędzy zmiennymi mogą być niestabilne lub nieprzewidywalne.
data("Prestige")
y<-Prestige$prestige
x<-Prestige$income
lm<-y~x
fit <- locpoly(Prestige$income, Prestige$prestige,
degree=0, bandwidth=900) %>% as.tibble
## Warning: `as.tibble()` was deprecated in tibble 2.0.0.
## ℹ Please use `as_tibble()` instead.
## ℹ The signature and semantics have changed, see `?as_tibble`.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
ggplot(Prestige) +
geom_point(aes(x=income,y=prestige))+
geom_line(data=fit, aes(x=x,y=y), col='blue')
smr <- loess(prestige ~ income, data=Prestige)
ggplot(Prestige) +
geom_point(aes(x=income,y=prestige)) +
ggtitle("Prestige ~ income (Loess, span=0.75)") +
geom_line(aes(x=income, y=fitted(smr)),
col='blue')
ggplot(Prestige) +
geom_point(aes(x=x,y=y)) +
geom_smooth(aes(x=x,y=y), method='loess',
span=0.55)
## `geom_smooth()` using formula = 'y ~ x'
Ponieważ metoda LOESS opiera się na lokalnych modelach liniowych, możliwe jest obliczenie błędów standardowych dla wartości dopasowanych w każdym punkcie. Dzięki temu możemy wyznaczyć punktowe przedziały ufności, które pokazują zakres, w jakim z dużym prawdopodobieństwem znajduje się rzeczywista wartość. W praktyce te przedziały ufności są często wizualizowane automatycznie za pomocą funkcji takich jak geom_smooth, co pozwala na intuicyjne przedstawienie niepewności modelu na wykresie.
smr <- smooth.spline(
Prestige$income,
Prestige$prestige,
cv=TRUE)
## Warning in smooth.spline(Prestige$income, Prestige$prestige, cv = TRUE):
## cross-validation with non-unique 'x' values seems doubtful
smr <- data.frame(x=smr$x,y=smr$y)
ggplot(Prestige) +
geom_point(aes(x=income,y=prestige)) +
ggtitle("Prestige ~ income (Sploty interpolujące, lambda wybrana przez CV)") +
geom_line(data=smr, aes(x=x, y=y), col='blue')
W przedstawionym przykładzie model LOESS został zastosowany w celu:
1. Analizy zależności między dochodem (income) a prestiżem zawodowym (prestige): Model pozwala uchwycić główny trend w danych, pokazując, jak dochód wpływa na prestiż zawodowy.
2. Wygładzenia danych bez nadmiernego dopasowania: Dzięki zastosowaniu optymalnego parametru wygładzania (lambda), dobranego za pomocą walidacji krzyżowej, model skutecznie opisuje trend bez ryzyka dopasowania do szumu w danych.
3. Lepszej interpretacji wyników: Wygładzona linia na wykresie przedstawia kluczową relację między zmiennymi, ułatwiając zrozumienie i przewidywanie potencjalnych wartości. W ten sposób wizualizacja staje się czytelniejsza i bardziej pomocna w analizie danych.
fit <- lm(prestige ~ ns(income, df=10), Prestige)
ggplot(Prestige) +
geom_point(aes(x=income,y=prestige)) +
ggtitle("Prestige ~ income (Naturalne sploty, 10 df)") +
geom_line(aes(x=income, y=fitted(fit)), col='blue')
ggplot(Prestige) +
geom_point(aes(x=x,y=y)) +
geom_smooth(aes(x=x,y=y), method='gam',
formula = y ~ s(x,k=12))
W dolnym zakresie zmiennej x, szary obszar jest stosunkowo wąski, co sugeruje większą pewność modelu w opisie trendu. W wyższym zakresie zmiennej x, szary obszar się poszerza, co wskazuje, że model jest mniej pewny przewidywań. Może to wynikać z mniejszej liczby obserwacji lub bardziej zróżnicowanego zachowania danych.
data("mcycle")
fit <- locpoly(mcycle$times, mcycle$accel,
degree=0, bandwidth=900) %>% as.tibble
ggplot(mcycle) +
geom_point(aes(x=times,y=accel))+
geom_line(data=fit, aes(x=x,y=y), col='purple')
Powyższy wykres nie jest liniowy.
smr_2 <- loess(accel ~ times,span=0.45, data=mcycle)
ggplot(mcycle) +
geom_point(aes(x=times,y=accel)) +
ggtitle("Accel ~ times (Loess, span=0.45)") +
geom_line(aes(x=times, y=fitted(smr_2)),
col='purple ')
ggplot(mcycle) +
geom_point(aes(x=times,y=accel)) +
geom_smooth(aes(x=times,y=accel), method='loess',
span=0.55)
## `geom_smooth()` using formula = 'y ~ x'
smr_3 <- smooth.spline(
mcycle$accel,
mcycle$times,
cv=TRUE)
## Warning in smooth.spline(mcycle$accel, mcycle$times, cv = TRUE):
## cross-validation with non-unique 'x' values seems doubtful
smr_3 <- data.frame(x=smr_3$times,y=smr_3$accel)
ggplot(mcycle) +
geom_point(aes(x=times,y=accel)) +
ggtitle("accel ~ times (Sploty interpolujące, lambda wybrana przez CV)") +
geom_line(data=mcycle, aes(x=times, y=accel), col='purple')
Wnioski:
W przypadku metody LOESS szerokość pasma (parametr span) jest kluczowym elementem wpływającym na dopasowanie modelu. Mniejszy span powoduje, że model bierze pod uwagę jedynie najbliższe punkty, co pozwala uchwycić szczegóły, ale jednocześnie zwiększa ryzyko nadmiernego dopasowania (overfitting) – model może reagować na szum w danych. Z kolei większy span uwzględnia szerszy zakres punktów, co prowadzi do gładszego dopasowania, ale może nie oddawać bardziej złożonych wzorców (underfitting). W przypadku naturalnych splotów elastyczność dopasowania jest kontrolowana przez liczbę węzłów lub stopnie swobody – im więcej węzłów, tym bardziej szczegółowe dopasowanie. W GAM szerokość pasma odpowiada liczbie węzłów, gdzie większa liczba węzłów pozwala uchwycić bardziej złożone zależności, ale ich nadmiar może również prowadzić do nadmiernego dopasowania. Natomiast w przypadku splotów interpolujących nie można regulować szerokości pasma, ponieważ funkcja przechodzi dokładnie przez każdy punkt danych, co sprawia, że brak tu możliwości kontroli dopasowania.
Dla metody LOESS liczba lokalnych regresji jest kontrolowana przez parametr span. Mniejszy span oznacza więcej lokalnych dopasowań, co zwiększa szczegółowość i pozwala uchwycić drobne zmiany, ale jednocześnie może uwypuklać szumy w danych. Z kolei większy span zmniejsza liczbę lokalnych dopasowań, co prowadzi do bardziej ogólnego trendu. W naturalnych splotach liczba lokalnych dopasowań zależy od liczby węzłów – większa liczba węzłów pozwala na bardziej szczegółowe odwzorowanie danych, podobnie jak mniejszy span w LOESS, natomiast mniejsza liczba węzłów daje gładsze dopasowanie. W GAM liczba lokalnych regresji jest związana z liczbą węzłów i gładkością regulowaną przez algorytm, co pozwala na automatyczne dostosowanie równowagi między szczegółowością a prostotą dopasowania. W splotach interpolujących nie występuje pojęcie lokalnych regresji, ponieważ metoda ta opiera się na globalnym dopasowaniu, wymuszając przejście przez każdy punkt danych.
Metoda LOESS zazwyczaj zapewnia bardziej szczegółowe i lokalne dopasowanie w porównaniu do innych metod, szczególnie przy niskim parametrze span. W przypadku większego span, wyniki mogą być zbliżone do tych uzyskiwanych innymi technikami. Naturalne sploty z kolei zapewniają bardziej globalne dopasowanie niż LOESS, zwłaszcza na krańcach przedziału, gdzie wymuszają liniowość. W porównaniu do GAM, naturalne sploty są bardziej ograniczone, ponieważ GAM pozwala na większą elastyczność i lepsze odwzorowanie złożonych wzorców. Sploty interpolujące dają wyniki znacznie różniące się od pozostałych metod, ponieważ funkcja musi przechodzić dokładnie przez każdy punkt danych. Może to prowadzić do nienaturalnych oscylacji i bardziej chaotycznych rezultatów, zwłaszcza gdy dane są zaszumione.
Metoda LOESS jest bardzo dokładna w uchwyceniu lokalnych wzorców w danych, ale jej dokładność zależy od odpowiedniego ustawienia szerokości pasma. Niewłaściwy dobór span może skutkować nadmiernym dopasowaniem lub niedopasowaniem do danych. Naturalne sploty są dokładne w przypadku umiarkowanie złożonych zależności i mniej podatne na szumy niż LOESS, co czyni je odpowiednimi dla bardziej stabilnych danych. GAM jest najdokładniejszy w modelowaniu złożonych i nieliniowych zależności, dzięki automatycznej regulacji gładkości, co czyni go bardziej wszechstronnym w porównaniu z LOESS i naturalnymi splotami. Natomiast sploty interpolujące są dokładne tylko w idealnych warunkach, przy czystych danych. W praktyce jednak ich wrażliwość na szumy sprawia, że rzadko są najbardziej precyzyjnym rozwiązaniem w realnych zastosowaniach.