【问题标题】:Error using Predict with Polynomial regressions in R [duplicate]在R中使用带有多项式回归的预测时出错[重复]
【发布时间】:2017-04-11 20:18:05
【问题描述】:

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

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

【问题讨论】:

  • 你的 predict.lm 代码在哪里?
  • my_pred
  • 抱歉忘记粘贴了
  • 找不到第一个警告的原因,但第二个是由于:if (p &lt; ncol(X) &amp;&amp; !(missing(newdata) || is.null(newdata))); warning("prediction from a rank-deficient fit may be misleading")(在predict.lm)其中p &lt;- object$rank 和X &lt;- model.matrix(Terms, m, contrasts.arg = object$contrasts)。仅使用 degree=10 时,警告对我来说消失了,这对您来说似乎不是解决方案。
  • Phann,感谢您的努力和洞察力

标签: r lm


【解决方案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 

【讨论】:

  • @Q007 更新解决方案
  • Sandipan,非常感谢您的努力和帮助我学习。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2018-10-19
  • 2016-11-10
  • 1970-01-01
  • 2016-12-06
  • 2019-01-24
  • 2019-07-29
  • 2015-10-13
相关资源
最近更新 更多