2016-11-28 113 views
1

我有两列的数据帧错误多项式回归使用预测中的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个值

+0

哪里是你predict.lm代码? –

+0

my_pred <-predict(poly_tr,valid_poly_data) 警告信息: 1: 'newdata' 有50行,但发现变量具有150行 2:在predict.lm(poly_tr,valid_poly_data): 预测从秩亏配合可能会误导 – Q007

+0

对不起,我忘了粘贴它 – Q007

回答

1

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

第二个警告仍然存在,因为您正在拟合一个非常高度的多项式,这是一个缺乏等级的拟合(也很有可能过度拟合您的训练数据,因此该模型可能不是一般化/有用的) 。

为了减少过度拟合/消除等级不足,你可以做些什么来拟合一个较低次数的多项式,在这种情况下,这两个警告都将消失。

尝试使用此方法摆脱两个警告:

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 
+0

@ Q007更新了解决方案 –

+1

Sandipan,非常感谢您的努力并帮助我学习。不胜感激! – Q007