在 R 中使用具有多项式回归的预测时出错

Error using Predict with Polynomial regressions in R

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

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 个值

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

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

你可以做的是减少过度拟合/消除排名不足的是拟合较低次数的多项式,在这种情况下,两个警告都会消失。

试试这个来消除这两个警告:

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