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
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.
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" .
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.
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'.
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)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With