Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Predict() - Maybe I'm not understanding it

Tags:

r

lm

predict

I posted earlier today about an error I was getting with using the predict function. I was able to get that corrected, and thought I was on the right path.

I have a number of observations (actuals) and I have a few data points that I want to extrapolate or predict. I used lm to create a model, then I tried to use predict with the actual value that will serve as the predictor input.

This code is all repeated from my previous post, but here it is:

df <- read.table(text = '      Quarter Coupon      Total 1   "Dec 06"  25027.072  132450574 2   "Dec 07"  76386.820  194154767 3   "Dec 08"  79622.147  221571135 4   "Dec 09"  74114.416  205880072 5   "Dec 10"  70993.058  188666980 6   "Jun 06"  12048.162  139137919 7   "Jun 07"  46889.369  165276325 8   "Jun 08"  84732.537  207074374 9   "Jun 09"  83240.084  221945162 10  "Jun 10"  81970.143  236954249 11  "Mar 06"   3451.248  116811392 12  "Mar 07"  34201.197  155190418 13  "Mar 08"  73232.900  212492488 14  "Mar 09"  70644.948  203663201 15  "Mar 10"  72314.945  203427892 16  "Mar 11"  88708.663  214061240 17  "Sep 06"  15027.252  121285335 18  "Sep 07"  60228.793  195428991 19  "Sep 08"  85507.062  257651399 20  "Sep 09"  77763.365  215048147 21  "Sep 10"  62259.691  168862119', header=TRUE)  str(df) 'data.frame':   21 obs. of  3 variables:  $ Quarter   : Factor w/ 24 levels "Dec 06","Dec 07",..: 1 2 3 4 5 7 8 9 10 11 ...  $ Coupon: num  25027 76387 79622 74114 70993 ...  $ Total: num  132450574 194154767 221571135 205880072 188666980 ... 

Code:

model <- lm(df$Total ~ df$Coupon, data=df)  > model  Call: lm(formula = df$Total ~ df$Coupon)  Coefficients: (Intercept)    df$Coupon     107286259         1349  

Predict code (based on previous help):

(These are the predictor values I want to use to get the predicted value)

Quarter = c("Jun 11", "Sep 11", "Dec 11") Total = c(79037022, 83100656, 104299800) Coupon = data.frame(Quarter, Total)  Coupon$estimate <- predict(model, newdate = Coupon$Total) 

Now, when I run that, I get this error message:

Error in `$<-.data.frame`(`*tmp*`, "estimate", value = c(60980.3823396919,  :    replacement has 21 rows, data has 3 

My original data frame that I used to build the model had 21 observations in it. I am now trying to predict 3 values based on the model.

I either don't truly understand this function, or have an error in my code.

Help would be appreciated.

Thanks

like image 212
mikebmassey Avatar asked Jan 27 '12 03:01

mikebmassey


People also ask

What is the predict function in R?

The predict() function in R is used to predict the values based on the input data. All the modeling aspects in the R program will make use of the predict() function in its own way, but note that the functionality of the predict() function remains the same irrespective of the case.

How does predict LM work?

predict. lm produces a vector of predictions or a matrix of predictions and bounds with column names fit , lwr , and upr if interval is set. For type = "terms" this is a matrix with a column per term and may have an attribute "constant" .

How do I predict test data in R?

Predicting the target values for new observations is implemented the same way as most of the other predict methods in R. In general, all you need to do is call predict ( predict. WrappedModel() ) on the object returned by train() and pass the data you want predictions for.

How do you predict regression?

We can use the regression line to predict values of Y given values of X. For any given value of X, we go straight up to the line, and then move horizontally to the left to find the value of Y. The predicted value of Y is called the predicted value of Y, and is denoted Y'.


1 Answers

First, you want to use

model <- lm(Total ~ Coupon, data=df) 

not model <-lm(df$Total ~ df$Coupon, data=df).

Second, by saying lm(Total ~ Coupon), you are fitting a model that uses Total as the response variable, with Coupon as the predictor. That is, your model is of the form Total = a + b*Coupon, with a and b the coefficients to be estimated. Note that the response goes on the left side of the ~, and the predictor(s) on the right.

Because of this, when you ask R to give you predicted values for the model, you have to provide a set of new predictor values, ie new values of Coupon, not Total.

Third, judging by your specification of newdata, it looks like you're actually after a model to fit Coupon as a function of Total, not the other way around. To do this:

model <- lm(Coupon ~ Total, data=df) new.df <- data.frame(Total=c(79037022, 83100656, 104299800)) predict(model, new.df) 
like image 153
Hong Ooi Avatar answered Sep 23 '22 19:09

Hong Ooi