使用R中的预测函数获取警告

时间:2017-01-24 11:49:40

标签: r predict

我有400个观察数据集,我将其划分为2个单独的集合,一个用于训练(300个观察),一个用于测试(100个观察)。我正在尝试创建一个阶梯函数回归,问题是一旦我尝试使用该模型以便从测试集中预测值我得到一个警告:

  

警告讯息:' newdata'有100行,但找到的变量有300行

我想要预测的变量是Income,解释变量叫Age

这是代码:

fit=lm(Income∼cut (training$Age ,4) ,data=training)
predict(fit,test)

我没有根据测试数据得到100个预测,而是根据训练数据得到警告标志和300个预测。

我读到其他人有这个问题,通常答案与数据集和模型中变量的名称有关,但我不认为这是问题,因为在使用时一个简单的简单回归我没有得到警告:

lm.fit=lm(Income~Age,data = training)
predict(lm.fit,test)

1 个答案:

答案 0 :(得分:2)

这里存在许多问题,因此需要几个步骤才能得到一个好的答案。您没有提供数据,因此我将使用其他数据获取相同类型的错误消息。内置数据集光圈有4个连续变量。我会在这里任意选择两个,然后像你的那样应用代码

MyData = iris[,3:4]
set.seed(2017)         # for reproducibility
T = sample(150, 100)
training = MyData[ T, ]
test     = MyData[-T, ]

fit=lm(Petal.Width ~ cut(training$Petal.Length, 4), data=training)
predict(fit,test)
Warning message:
'newdata' had 50 rows but variables found have 100 rows 

所以我得到了同样的错误。

cut正在将连续变量Petal.Length更改为4个级别的因子。您在因子上构建了模型,但是当您尝试预测新值时,您只是传递了test,它仍然具有连续值(数据中的Age;我的Petal.Length)。尝试评估predict语句,我们需要评估cut(test$Petal.Length, 4)作为流程的一部分。看看这意味着什么。

C1 = cut(training$Petal.Length, 4)
C2 = cut(test$Petal.Length, 4)
levels(C1)
[1] "(0.994,2.42]" "(2.42,3.85]"  "(3.85,5.28]"  "(5.28,6.71]" 
levels(C2)
[1] "(1.09,2.55]" "(2.55,4]"    "(4,5.45]"    "(5.45,6.91]"

水平完全不同。您的模型无法在这些不同级别上使用。您可以看到C1的bin边界,因此很容易使用这些边界并对测试数据进行分区。

levels(C1)
"[0.994,2.42]" "(2.42,3.85]"  "(3.85,5.28]"  "(5.28,6.71]"
CutPoints = c(0.994, 2.42, 3.85, 5.28, 6.71) 
C2 = cut(test$Petal.Length, breaks=CutPoints, include.lowest=TRUE)

但经过仔细检查,你会发现这不起作用。只需打印出相关的数据

C2[42:46]
[1] (5.28,6.71] (5.28,6.71]  <NA> (3.85,5.28] (3.85,5.28]

C2 [44]未定义。为什么?测试集中的一个值超出了训练集的值范围,因此它不属于任何bin。

test$Petal.Length[44]
[1] 6.9

所以你真正需要做的是没有下限或上限。

## cut the training data to get cut points
C1 = cut(training$Petal.Length, 4)
levels(C1)
"[0.994,2.42]" "(2.42,3.85]"  "(3.85,5.28]"  "(5.28,6.71]"
CutPoints = c(-Inf, 2.42, 3.85, 5.28, Inf)

使用分箱数据

创建新的data.frames可能最简单
Binned.training = training
Binned.training$Petal.Length = cut(training$Petal.Length, CutPoints)
Binned.test = test
Binned.test$Petal.Length = cut(test$Petal.Length, CutPoints)

fit=lm(Petal.Width ~ Petal.Length, data=Binned.training)
predict(fit,Binned.test)
## No errors

这适用于您的测试数据以及将来获得的任何数据。