我将数据集分为2个数据帧:训练(具有830行)和测试(200行)。列名称相同且顺序相同。
我建立了一个自然样条曲线模型来预测单个变量水泥的强度。
当我尝试使用该模型对测试集进行预测时,我没有得到预期的200个预测,而是得到830个预测。我不知道为什么会这样。我已经浏览了帮助页面和网络,但没有找到任何可解决此问题的方法。
我检查了test $ cement的尺寸,它确实只有200个条目。
这是我的代码:
library(tidyverse)
library(caret)
library(splines)
attach(train)
fit1 <- lm(strength~ns(cement, 4), data = train)
summary(fit1)
pred1 <- predict(fit1, newdata = data.frame(test$cement), se=T)
pred1
detach(train)
我也尝试了以下预测版本:
pred2 <-fit1%>%预测(test $ cement)
->给我一个错误,说它不理解%>%
pred =预测.bSpline(fit1,newdata = test $ cement,se = T)
和
pred =预测.bSpline2(fit1,newdata = test $ cement,se = T)
->两者都告诉我,尽管我同时打开了样条线和splines2库,但它们找不到函数predict.bSpline或predict.bSpline2。
predict.ns似乎不存在。
任何帮助将不胜感激。
答案 0 :(得分:1)
我没有您的数据,但您应该尝试通过整个数据框测试:
pred1 <- predict(fit1, newdata = test, se=T)
我相信“
我认为预报.ns预报.b样条线覆盖了预报功能-查找它的文档。尽管我从未使用过样条线对象,但我读过的书建议您只使用带有常规“预测”功能的该库中的对象类型。
答案 1 :(得分:1)
我认为我们需要查看可重复的数据集示例,因为我认为这可能会引起您的问题。当我使用以下代码时,我会得到正确的结果:
library(dplyr)
library(splines)
train <- sample_frac(mtcars, .8)
test <- setdiff(mtcars, train)
fit1 <- lm(mpg~ns(wt, 4), data = train)
pred1 <- predict(fit1, newdata = test, se=T)
pred1
仅考虑caret
,就可以确保在创建训练/测试拆分(createDataPartition(list = FALSE)
)时没有创建列表对象
此外,我不会使用attach
。 IT部门会花更多时间写出所有变量名,但是有时您会得到奇怪的结果,这可能就是您正在发生的事情。我将重新启动您的R会话,删除附件,然后重试。
不是最好的解决方案,但我会尝试一下。