在R中使用带有多项式回归的Predict时出错

时间:2016-11-28 07:00:42

标签: r lm

我有一个包含两列的数据框

var_1<-seq(1:252)
var_2<-runif(1:252)*1000

my_new_df<-data.frame(var_1,var_2)
names(my_new_df)<-c("Time_values","Count")

train_poly_data<-my_new_df[1:150,c("Time_values","Count")] # training data set
valid_poly_data<-my_new_df[151:200,c("Time_values","Count")] # validation data set

test_poly_data<-my_new_df[201:252,c("Time_values","Count")] # test data set

#obtain a polymomial regression model with 20 Degrees
poly_tr<-lm(train_poly_data$Count ~ poly(train_poly_data$Time_values,degree=20,raw = TRUE))
summary(poly_tr)

#getting the following warnings
Warning messages:
1: 'newdata' had 50 rows but variables found have 150 rows 
2: In predict.lm(poly_tr, valid_poly_data) :
  prediction from a rank-deficient fit may be misleading

这是我需要做的,

我需要在训练,验证,测试数据集中分割数据帧 接下来,我想使用训练数据使用多项式回归,并使用验证数据验证它

但我继续得到错误,我将如何解决这个问题,我也有兴趣找到多项式的最佳程度,因为我想看看随机选取的多项式度数20是否有点正确?

任何建议或帮助指出我的错误都将随时欢迎。

如何修复此警告?我确实知道警告被抛出,因为我们在训练数据集中有150个值,在验证数据集中有50个值

1 个答案:

答案 0 :(得分:1)

第一个警告将消失,您需要在运行预测之前将验证数据转换为与训练数据相同的格式,以确保训练/验证数据具有完全相同的回归量/预测变量集。 / p>

第二个警告仍然存在,因为你拟合一个非常高度的多项式,它是一个等级不足的拟合(也很可能过度拟合你的训练数据,所以模型可能不具有推广性/有用性)。

为了减少过度拟合/消除等级不足,你可以做的是适应较低度的多项式,在这种情况下,两个警告都会消失。

尝试这样做以消除两个警告:

my_new_df<-data.frame(var_1,var_2)
names(my_new_df)<-c("Time_values","Count") 

n <- 10 # lower degree polynomial
# first generate all the polynomial regressors on the entire data
my_new_df <- cbind.data.frame(my_new_df[-1], poly(my_new_df$Time_values, degree=n, raw=TRUE))
names(my_new_df)[-1] <- paste0('X', names(my_new_df)[-1])

train_poly_data<-my_new_df[1:150,] # training data set
valid_poly_data<-my_new_df[151:200,] # validation data set

test_poly_data<-my_new_df[201:252,] # test data set

#obtain a polymomial regression model with n Degrees
poly_tr<-lm(Count ~ ., train_poly_data)
summary(poly_tr)
pred <- predict(poly_tr, newdata=valid_poly_data)
pred


 # 151          152          153          154          155          156           
 # 796.5672     982.6862    1219.7434    1517.9844    1889.2235    2347.0258