3

我在 R 中有一个数据,所以我想测试各种模型的数据。我将数据分成两组,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
4

1 回答 1

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")

在此处输入图像描述

于 2013-10-25T20:04:47.873 回答