Polinom regresszió illesztése R-ben

. (Akkor jelentse probléma A tartalom ezen az oldalon van)szeretné megosztani a tartalmat R-bloggerek? kattintson ide, ha van blogja, vagy ide, ha nincs.

a x és y két változó közötti lineáris kapcsolat az egyik leggyakoribb, hatékony és egyszerű feltételezés, amikor megpróbálják kitalálni a kapcsolatukat. Néha azonban a valódi mögöttes kapcsolat ennél összetettebb, és ez az, amikor a polinom regresszió segít.

lássunk egy példát a közgazdaságtanból: Tegyük fel, hogy egy bizonyos termékből q mennyiséget szeretne vásárolni. Ha az egységár p, akkor teljes összeget fizetne y. Ez egy tipikus példa a lineáris kapcsolatra. A teljes ár és mennyiség egyenesen arányos. A telek azt írnánk valami ilyesmi:

p <- 0.5q <- seq(0,100,1)y <- p*qplot(q,y,type='l',col='red',main='Linear relationship')

a telek így fog kinézni:
linear-relationship

Nos, ez jó közelítése a y és q közötti valódi kapcsolatnak, azonban a vásárlás és az eladás során érdemes figyelembe venni néhány más releváns információt, mint például: Vásárlás jelentős mennyiségben valószínű, hogy mi lehet kérni, és kap kedvezményt, vagy vásárol egyre több és több bizonyos jó lehet, hogy nyomja fel az árat.
ez egy olyan forgatókönyvhöz vezethet, mint ez, ahol a teljes költség már nem a mennyiség lineáris függvénye:

y <- 450 + p*(q-10)^3plot(q,y,type='l',col='navy',main='Nonlinear relationship',lwd=3)

Rplot02
a polinom regresszióval az n > 1 rendű modelleket illeszthetjük az adatokhoz, és megpróbálhatjuk modellezni a nemlineáris kapcsolatokat.

hogyan illeszkedjünk egy polinom regresszióhoz

először mindig emlékezzen a set.seed(n) használatára, amikor ál-véletlen számokat generál. Ezzel a véletlenszám-generátor mindig ugyanazokat a számokat generálja.

set.seed(20)

prediktor (q). Használja seq generáló egyenlő távolságra szekvenciák gyors

q <- seq(from=0, to=20, by=0.1)

érték megjósolni (y):

y <- 500 + 0.4 * (q-10)^3

némi zaj keletkezik, és hozzáadódik a valós jelhez (y):

noise <- rnorm(length(q), mean=10, sd=80)noisy.y <- y + noise

a zajos jel ábrázolása:

plot(q,noisy.y,col='deepskyblue4',xlab='q',main='Observed data')lines(q,y,col='firebrick1',lwd=3)

ez a szimulált megfigyelt adatok diagramja. A szimulált adatpontok a kék pontok, míg a piros vonal a jel (a jel egy szakkifejezés, amelyet gyakran használnak annak az Általános trendnek a jelzésére, amelyet észlelünk).
Rplot03
a modell kell valami ilyesmi: y = a*q + b*q2 + c*q3 + költség

nézzük illik segítségével R. amikor illeszkedő polinomok akkor sem használja

model <- lm(noisy.y ~ poly(q,3))

vagy

model <- lm(noisy.y ~ x + I(X^2) + I(X^3))

azonban vegye figyelembe, hogy q, I(q^2) és I(q^3) korrelál, és a korrelált változók problémákat okozhatnak. A poly() használatával elkerülheti ezt ortogonális polinomok előállításával, ezért az első opciót fogom használni.

summary(model)Call:lm(formula = noisy.y ~ poly(q, 3))Residuals: Min 1Q Median 3Q Max -212.326 -51.186 4.276 61.485 165.960 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 513.615 5.602 91.69 <2e-16 ***poly(q, 3)1 2075.899 79.422 26.14 <2e-16 ***poly(q, 3)2 -108.004 79.422 -1.36 0.175 poly(q, 3)3 864.025 79.422 10.88 <2e-16 ***---Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1Residual standard error: 79.42 on 197 degrees of freedomMultiple R-squared: 0.8031,Adjusted R-squared: 0.8001 F-statistic: 267.8 on 3 and 197 DF, p-value: 0 

a confint() függvény használatával megkaphatjuk modellünk paramétereinek konfidencia intervallumait.
konfidencia intervallumok modellparaméterekhez:

confint(model, level=0.95) 2.5 % 97.5 %(Intercept) 502.5676 524.66261poly(q, 3)1 1919.2739 2232.52494poly(q, 3)2 -264.6292 48.62188poly(q, 3)3 707.3999 1020.65097

telek felszerelt vs maradványok. Ha a modell jól illeszkedik, a maradék telken nem szabad egyértelmű mintát mutatni

plot(fitted(model),residuals(model))

Rplot04
összességében a modell jól illeszkedik, amint azt az R négyzet 0, 8 jelzi. Az első és harmadik rendű kifejezések együtthatói statisztikailag szignifikánsak, ahogy vártuk. Most a predict() függvény segítségével megkaphatjuk az illesztett értékeket és a konfidencia intervallumokat, hogy mindent összevethessünk az adatainkkal.

előre jelzett értékek és konfidencia intervallumok:

predicted.intervals <- predict(model,data.frame(x=q),interval='confidence', level=0.99)

sorok hozzáadása a meglévő telekhoz:

lines(q,predicted.intervals,col='green',lwd=3)lines(q,predicted.intervals,col='black',lwd=1)lines(q,predicted.intervals,col='black',lwd=1)

jelmagyarázat hozzáadása:

legend("bottomright",c("Observ.","Signal","Predicted"), col=c("deepskyblue4","red","green"), lwd=3)

itt van a telek:
Rplot05
láthatjuk, hogy modellünk tisztességes munkát végzett az adatok illesztésében, ezért elégedettek lehetünk vele.

figyelmeztetés: a polinomok hatékony eszközök, de visszaüthetnek: ebben az esetben tudtuk, hogy az eredeti jelet egy harmadik fokú polinom segítségével generáltuk, azonban a valós adatok elemzésekor általában keveset tudunk róla, ezért óvatosnak kell lennünk, mert a magas rendű polinomok használata (n > 4) túlillesztéshez vezethet. A túlillesztés akkor történik, amikor a modell a jel helyett a zajt veszi fel: annak ellenére, hogy a modell egyre jobban illeszkedik a meglévő adatokhoz, ez rossz lehet, ha új adatokat próbál megjósolni, és félrevezető eredményekhez vezet.

a lényeg a teljes kódot ebben a példában megtalálható itt.

Köszönjük, hogy elolvasta ezt a bejegyzést, hagyjon megjegyzést alább, ha bármilyen kérdése van.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.