2015-02-20 4 views
1

Новое для R.R: Предел/Установленные значения прогнозируемых результатов по линейной модели

Необходимо ограничить диапазон значений, которые можно предсказать.

df.Train <- data.frame(S=c(1,2,2,2,1),L=c(1,2,3,3,1),M=c(400,450,400,700,795),V=c(423,400,555,600,800),G=c(4,3.2,2,2.7,3.4), stringsAsFactors=FALSE) 
m.Train <- lm(G~S+L+M+V,data=df.Train) 
df.Test <- data.frame(S=c(1,2,1,2,1),L=c(1,2,3,1,1),M=c(400,450,500,800,795),V=c(423,475,555,600,555), stringsAsFactors=FALSE) 
round(predict(m.Train, df.Test, type="response"),digits=1) 
#seq(0,4,.1) #Predicted values should fall in this range 

Я экспериментировал с параметрами pred(), но не повезло. Есть ли опция в прогнозе? Должен ли я ограничивать это в модели?

Спасибо

ответ

2

Есть способы, чтобы превратить ваш переменный отклик, G по этому поводу, но там должны быть хорошим поводом, чтобы сделать это. Например, если вы хотите, чтобы результат был вероятностью между 0 и 1, а ваша переменная ответа была двоичной (0,1), вам нужна логистическая регрессия.

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

Установка вышеуказанного сбоку, если вы действительно заботитесь о предсказании и не заботитесь о модели или трансформации (но почему бы вам не волновать?), Похоже, что ваши данные могут использовать обобщенную линейную модель quasipossion которые могли бы обеспечить выход вам нужно:

df.Train <- data.frame(S=c(1,2,2,2,1),L=c(1,2,3,3,1),M=c(400,450,400,700,795),V=c(423,400,555,600,800),G=c(4,3.2,2,2.7,3.4), stringsAsFactors=FALSE) 
m.Train <- glm(G~S+L+M+V,data=df.Train, family=quasipoisson) 
df.Test <- data.frame(S=c(1,2,1,2,1),L=c(1,2,3,1,1),M=c(400,450,500,800,795),V=c(423,475,555,600,555), stringsAsFactors=FALSE) 

> predict(m.Train, df.Test, type="response") 
     1  2  3  4  5 
4.000000 2.840834 3.062754 3.615447 4.573276 
#probably not as good as you want 

модели с помощью log ссылки по умолчанию, который гарантирует, что значения будут положительными. Нет никакой гарантии, что модель не будет прогнозировать значения больше 4, но поскольку вы кормили ее значениями менее 4 (ваша переменная G), то, скорее всего, большинство прогнозов будет следовать за этим распределением (как в этом примере). Тогда вам может понадобиться рассмотреть вопрос о том, как обрабатывать прогнозы, которые выше 4.

В целом вы должны тщательно подумать, какую модель выбрать и какое преобразование ответа. Например, модель яда выше, например, используется для данных подсчета. Тем не менее, вы никогда не должны манипулировать прогнозами самостоятельно, поэтому, если в конце концов вы выберете модель lm, убедитесь, что вы используете прогнозы, которые она дает.

EDIT

Похоже, в вашем случае нелинейной регрессии может быть то, что вам нужно. Проблема с использованием линейной модели, такой как lm, заключается в том, что предсказания могут быть больше, чем максимальные наблюдаемые случаи и меньше, чем мин наблюдаемых случаев. В этом случае выполнение линейной регрессии может оказаться неприемлемым. Существуют алгоритмы, которые будут никогда предскажите значение больше, чем максимальное или меньшее, чем мин. Такой случай может быть лучше подходит в вашем случае. Один из этих алгоритмов к-ближайших соседей, например:

library(FNN) 
> knn.reg(df.Train[1:4], test=df.Test[1:4], y=df.Train[5], k=3) 
Prediction: 
[1] 3.066667 3.066667 3.066667 2.700000 3.100000 

Как вы можете видеть, что прогнозы никогда не пойдет выше 4. Это сказал КНН является алгоритм локального решения так снова вам нужно исследовать, будет ли это хороший подход или нет для вашей проблемы и ваших данных. С точки зрения прогнозов, хотя это определенно подтверждает ваши условия. Knn - очень простой алгоритм, который полагается на расстояния между точками для расчета прогнозов.

Надеюсь, что это поможет :)

+1

Благодарим вас за подробный ответ. В этом случае G имеет шкалу от 0,0 до 4,0.Если я правильно понимаю, нет возможности ограничить модель lm или предсказать диапазон значений для законных прогнозов? – MMDG

+0

Определенно нет, если вы используете 'lm'. Вы не можете предсказать в течение интервала с помощью 'lm'. Вы можете делать интервальные прогнозы с помощью 'glm', преобразовывая переменную ответа, то есть' G' в вашем случае, но преобразования, которые вы можете сделать, ограничены, как вы можете видеть [здесь] (http://data.princeton.edu/R/glms .html). Чтобы иметь возможность прогнозировать в течение этого интервала, было бы лучше посмотреть 'optim' для оценки коэффициентов в соответствии с вашими условиями. – LyzandeR

+0

И ты рад :). Рад был помочь :). – LyzandeR

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