我在R中有数据,所以我想测试各种型号的数据。我已将数据分为2组80%培训和20%测试。所以现在我要做的是在线性模型上训练训练数据集并在测试数据集上进行预测。
到目前为止我还没有这个。
temp<-lm(formula = cityMpg ~ peakRpm+horsePower+wheelBase , data=train)
temp_test<- predict(temp,test)
plot(temp_test)
在这里,我得到散点图。现在我只想在这个散点图中找到一条线。 当我使用abline(temp_test)时,我收到一个错误。 我希望线路是自动的,我不希望指定坐标。 得到错误:
Error in int_abline(a = a, b = b, h = h, v = v, untf = untf, ...) :
invalid a=, b= specification
答案 0 :(得分:1)
如上所述,这对于多维模型来说有点棘手。
获取一些数据(您忽略了包含可重现的示例:请参阅http://tinyurl.com/reproducible-000 ...)
library(foreign)
dat <- read.arff(url("http://www.cs.umb.edu/~rickb/files/UCI/autos.arff"))
分为训练和测试数据集:
train <- dat[1:150,]
test <- dat[151:nrow(dat),]
R的变量名有点尴尬(破折号被解释为减号运算符,因此我们必须使用反引号来保护名称):
fit <- lm(`city-mpg` ~ `peak-rpm`+horsepower+`wheel-base`,data=train)
temp_test <- predict(fit,test)
绘制预测与峰值RPM的对比:
par(las=1,bty="l") ## cosmetic
plot(test[["peak-rpm"]],temp_test,xlab="peak rpm",ylab="predicted")
为了添加线,我们必须根据其他参数的一些基线值调整截距:我们将使用均值(另一种选择是在拟合模型之前将所有预测变量居中):
cf <- coef(fit)
abline(a=cf["(Intercept)"]+
mean(test$horsepower)*cf["horsepower"]+
mean(test$`wheel-base`)*cf["`wheel-base`"],
b=coef(fit)["`peak-rpm`"])
另一种方法是使用predict()
:
newdat <- with(test,
data.frame(horsepower=mean(horsepower),
"wheel-base"=mean(`wheel-base`),
"peak-rpm"=seq(min(`peak-rpm`),
max(`peak-rpm`),
length=41),
check.names=FALSE))
newdat["city-mpg"] <- predict(fit,newdat)
with(newdat,lines(`peak-rpm`,`city-mpg`,col=4))
(对于一条直线来说,41分是愚蠢的 - 我们本来只能使用2分 - 但是如果你想绘制弯曲的东西,比如置信区间或非线性拟合,那么效果会很好。)
或者你可以适合边缘模型,但实际拟合线有些不同(如果所有预测变量彼此正交,它将只相同):
fit2 <- lm(`city-mpg` ~ `peak-rpm`,data=train)
abline(fit2,col="red")