Regresia liniară locală în R – locfit() vs locpoly() (Programare, R, Regresie, Netezire)

utilizator1870614 a intrebat.

Încerc să înțeleg comportamentele diferite ale acestor două funcții de netezire atunci când primesc intrări aparent echivalente. Înțelegerea mea a fost că locpoly ia doar un argument de lățime de bandă fixă, în timp ce locfit poate include, de asemenea, o parte variabilă în parametrul său de netezire (o fracție de vecini apropiați, „nn„). Am crezut că setarea acestei părți variabile la zero în locfit ar trebui să facă ca „h” să acționeze ca lățimea de bandă fixă utilizată în locpolydar, în mod evident, nu este cazul.

Un exemplu de lucru:

library(KernSmooth)
library(locfit)
set.seed(314)

n <- 100
x <- runif(n, 0, 1)
eps <- rnorm(n, 0, 1)
y <- sin(2 * pi * x) + eps

plot(x, y)
lines(locpoly(x, y, bandwidth=0.05, degree=1), col=3)
lines(locfit(y ~ lp(x, nn=0, h=0.05, deg=1)), col=4)

Produce acest grafic:

locpoly dă linia verde netedă, iar locfit dă linia albastră ondulată. În mod clar, locfit are o lățime de bandă „efectivă” mai mică aici, chiar dacă parametrul presupus al lățimii de bandă are aceeași valoare pentru fiecare.

Ce fac aceste funcții în mod diferit?

Comentarii

  • Cumva, atunci când lățimea de bandă h este schimbată la 0,10 în lines(locfit(y ~ lp(x, nn=0, h=0.05, deg=1)), col=4) ambele funcții de netezire sunt aproape identice –  > Por KenHBS.
  • ați văzut această discuție? –  > Por Eric Fail.
2 răspunsuri
znr

Cei doi parametri reprezintă amândoi o netezire, dar o fac în două moduri diferite.

Locpoly’s lățime de bandă este relativ la scara axei x aici. De exemplu, dacă ați modificat linia x <- runif(n, 0, 1) la x <- runif(n, 0, 10), veți vedea că linia verde a locpoly devine mult mai zigzagată, în ciuda faptului că aveți în continuare același număr de puncte (100).

Locfit’s smoothing h, este independent de scară și, în schimb, se bazează pe o proporție a datelor. Valoarea 0,05 înseamnă că 5% din datele cele mai apropiate de poziția respectivă sunt utilizate pentru a ajusta curba. Prin urmare, schimbarea scalei nu ar modifica linia.

Acest lucru explică, de asemenea, observația făcută în comentariu, conform căreia schimbarea valorii lui h la 0,1 face ca cele două să arate aproape identice. Acest lucru are sens, deoarece ne putem aștepta ca o lățime de bandă de 0,05 să conțină aproximativ 10% din date dacă avem 100 de puncte distribuite uniform de la 0 la 1.

Printre sursele mele se numără documentația pentru pachetul locfit și pagina documentația pentru funcția locpoly.

Comentarii

  • Ambele linii își schimbă netezimea atunci când se modifică scara x. Documentația pentru locfit::lp contrazice, de asemenea, acest răspuns. –  > Por wmay.
wmay

Am modificat puțin codul dvs. pentru a putea vedea mai clar care este lățimea reală a ferestrelor:

library(KernSmooth)
library(locfit)
x <- seq(.1, .9, length.out = 80)
y <- rep(0:1, each = 40)
plot(x, y)
lines(locpoly(x, y, bandwidth=0.1, degree=1), col=3)
lines(locfit(y ~ lp(x, nn=0, h=0.1, deg=1)), col=4)

Argumentul h din locfit pare a fi o lățime de jumătate de fereastră. locpoly‘s bandwidth face în mod clar altceva.

Documentația lui KernSmooth este foarte ambiguă, dar judecând după codul sursă (aici și aici), se pare că lățimea de bandă este deviația standard a unei funcții de densitate normală. Să sperăm că acest lucru este explicat în Kernel Smoothing pe care o citează.