2016-07-08 5 views
1

Wurde versucht, den zukünftigen Wert einer Stichprobe mithilfe der polynomialen Regression in R vorherzusagen. Die y-Werte in der Stichprobe bilden ein Wellenmuster. Zum BeispielVorhersage von zukünftigen Werten mit polynomieller Regression in R

x = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 
y= 1,2,3,4,5,4,3,2,1,0,1,2,3,4,5,4 

Aber wenn der Graph ist für zukünftige Werte der resultierenden y Werte aus ganz andere waren aufgetragen, was erwartet wurde. Anstelle eines Wellenmusters wurde ein Graph erhalten, bei dem die Werte immer weiter anwachsen.

futurY = 17,18,19,20,21,22 

verschiedene Grade der Polynomregression versucht, aber die vorhergesagten Ergebnisse für futurY waren aus völlig anders, was

Es folgt die Probe R-Code erwartet wurde, die verwendet wurde, die Ergebnisse

dfram <- data.frame('x'=c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16)) 
dfram$y <- c(1,2,3,4,5,4,3,2,1,0,1,2,3,4,5,4) 
plot(dfram,dfram$y,type="l", lwd=3) 
pred <- data.frame('x'=c(17,18,19,20,21,22)) 
myFit <- lm(y ~ poly(x,5), data=dfram) 
newdata <- predict(myFit, pred) 
print(newdata) 
plot(pred[,1],data.frame(newdata)[,1],type="l",col="red", lwd=3) 
zu erhalten

Ist dies die richtige Technik für die Vorhersage der unbekannten zukünftigen y-Werte ODER sollte ich andere Techniken wie Prognose verwenden?

+1

Der Versuch, mit einem Polynom fünfter Ordnung vorauszusagen, ist für Versagen oder Verwirrung verdammt. Vielleicht möchten Sie ein wenig nach trigonometrischen Funktionen suchen. –

Antwort

1
# Reproducing your data frame 
dfram <- data.frame("x" = c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16), 
        "y" = c(1,2,3,4,5,4,3,2,1,0,1,2,3,4,5,4)) 

Von Ihrem Diagramm habe ich die Phase und die Periode des Signals. Es gibt bessere Möglichkeiten, dies automatisch zu berechnen.

# Phase and period 
fase = 1 
per = 10 

In der linearen Modellfunktion habe ich die dreieckigen Signalgleichungen gesetzt.

fit <- lm(y ~ I((((trunc((x-fase)/(per/2))%%2)*2)-1) * (x-fase)%%(per/2)) 
      + I((((trunc((x-fase)/(per/2))%%2)*2)-1) * ((per/2)-((x-fase)%%(per/2)))) 
      ,data=dfram) 

# Predict the old data 
p_olddata <- predict(fit,type="response") 

# Predict the new data 
newdata <- data.frame('x'=c(17,18,19,20,21,22)) 
p_newdata <- predict(fit,newdata,type="response") 

# Ploting Old and new data 
plot(x=c(dfram$x,newdata$x), 
    y=c(p_olddata,p_newdata), 
    col=c(rep("blue",length(p_olddata)),rep("green",length(p_olddata))), 
    xlab="x", 
    ylab="y") 
lines(dfram) 

enter image description here

Wo die schwarze Linie das ursprüngliche Signal ist, sind die blauen Kreise die Vorhersage für die ursprünglichen Punkte und die grünen Kreise sind die Vorhersage für die neuen Daten.

Das Diagramm zeigt eine perfekte Anpassung an das Modell, da in den Daten kein Rauschen vorhanden ist. In einem realen Datensatz können Sie es finden, so dass die Passform nicht so schön aussieht.

+0

großzügig von dir, die Zeit zu nehmen! Dennoch könnten Sie OP warnen, dass Polys für die Interpolation in Ordnung sind, für die Extrapolation (Vorhersage), und es ist Zeit, zu besseren Ansätzen überzugehen. – welch

+0

Danke für deine Zeit. Dies half mir, auf die richtige Richtung zu zeigen. Also kann ich bestätigen, dass die polynomiale Regression für solche Fälle nicht verwendet werden kann. – sisusisu

+0

Danke @sisusisu. Wenn Sie Signale haben, die sich wiederholende Zyklen zeigen, ist die polynome Regression möglicherweise nicht die beste Option. Trigonometrische Funktionen mathematischer Reihen können das sein, wonach Sie suchen. –

Verwandte Themen