This question already has an answer here:
I have read few answers on this here but I am afraid I have not been able to figure out an answer.
My R code is:
colors <- bmw[bmw$Channel=="Colors" & bmw$Hour=20,]
colors_test <- tail(colors, 89)
colors_train <- head(colors, 810)
colors_train_agg <- aggregate(colors_train$Impressions, list(colors_train$`Position of Ad in Break`), FUN=mean, na.rm=TRUE)
colnames(colors_train_agg) <- c("ad_position", "avg_impressions")
lm_colors <- lm(colors_train_agg$avg_impressions ~ poly(colors_train_agg$ad_position, 12))
summary(lm_colors)
colors_test_agg <- aggregate(colors_test$Impressions, list(colors_test$`Position of Ad in Break`), FUN=mean, na.rm=TRUE)
colnames(colors_test_agg) <- c("ad_position", "avg_impressions")
new.df <- data.frame(colors_test_agg$ad_position)
colnames(new.df) <- c("ad_position")
colors_test_test <- predict(lm_colors, newdata=new.df)
So I have exactly the same column names for both training and test data. I still get the warning:
Warning message:
'newdata' had 15 rows but variables found have 22 rows
Can some one suggest what is wrong? Also, I want to know if I am even doing it the right way.
Also, some pointers on how to calculate accuracy of the model will be greatly appreciated. Thanks!
solution :
lm_colors <- lm(avg_impressions ~ poly(ad_position, 13), data=colors_train_agg)
Reason :
you can compare yourselves how model.matrix()
generates the matrix to score the data inside predict()
. So when we pass model(df$var1~df$var2)
, model.matrix()
looks for df$var1
and df$var2
to generate the matrix- but this has dimensions of training data (df). Problem of having different names in the model
and in newdata
go through below steps( if you are interested in knowing the cause) :
model1 <- lm(var1~var2, data = df)
model2 <- lm(df$var1~df$var2)
debug(predict)
predict(model1, newdata = df1)
predict(model2, newdata = df1)
来源:https://stackoverflow.com/questions/40978688/r-warning-newdata-had-15-rows-but-variables-found-have-22-rows