2016-07-08 2 views
1

Пробовал предсказать будущее значение выборки с использованием полиномиальной регрессии в R. Значения y в образце формируют волновой рисунок. НапримерПредсказать будущие значения с использованием полиномиальной регрессии в 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 

Но когда график строится для будущих значений результирующие y значения полностью отличается от того, что ожидалось. Вместо волнового шаблона получался график, в котором значения y продолжают увеличиваться.

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

Пробовал разные степени полиномиальной регрессии, но предсказанные результаты для futurY были сильно отличается от того, что ожидалось

Ниже приводится пример кода R, который был использован для получения результатов

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) 

Является ли это правильной методикой для прогнозирования неизвестных будущих значений y или я должен использовать другие методы, такие как прогнозирование?

+1

Попытка предсказать с помощью полинома пятого порядка обречена на неудачу или путаницу. Возможно, вам захочется выполнить поиск по установке триггерных функций. –

ответ

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)) 

С вашего графика у меня есть фаза и период сигнала. Есть лучшие способы расчета этого автоматически.

# Phase and period 
fase = 1 
per = 10 

В функции линейной модели я поставил уравнения треугольного сигнала.

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

Где черная линия исходный сигнал, синие круги предсказание для исходных точек и зеленые круги предсказание для новых данных.

График показывает идеальное соответствие модели, поскольку в данных нет шума. В реальном наборе данных вы можете найти его так, чтобы пригонка выглядела не так хорошо.

+0

щедрым из вас, чтобы не торопиться! Тем не менее, вы могли бы предупредить OP, что полисы подходят для интерполяции, паршивые для экстраполяции (предсказания), и пришло время перейти к лучшим подходам. – welch

+0

Спасибо, что положили в свое время. Это помогло мне указать на правильное направление. Поэтому я могу подтвердить, что полиномиальная регрессия не может быть использована для таких случаев. – sisusisu

+0

Спасибо @sisusisu. Когда у вас есть сигналы, которые показывают повторяющиеся циклы, полиномиальная регрессия может быть не лучшим вариантом. Тригонометрические функции математических рядов могут быть тем, что вы ищете. –

Смежные вопросы