如何仅在两个因变量中的一个中使用虚线?

时间:2016-04-13 19:16:42

标签: r linear-regression lm non-linear-regression

使用mtcars数据集,我正在尝试确定mpg作为hpwt函数的折线回归拟合,断点仅来自hp。这是代码:

mpg = mtcars$mpg
wt = mtcars$wt
hp = mtcars$hp

reg = lm (mpg ~ hp +wt)

hp_thresh = 150
wt_thresh = 3

library(segmented)
seg.o = segmented (reg,seg.Z=~hp+wt, psi=list (hp=hp_thresh, wt=wt_thresh))
fted = broken.line (seg.o, term="hp") # mpg fit for hp breakpoints

fted$fit值没有意义(将它们与mpg值进行比较)。我想在功能的使用中我缺少一些简单的东西。

修改

进一步澄清:我希望仅使用mpghp之间的分段关系,但仍以线性方式包含wt。怎么能这样做?

我尝试在hp_thresh的输入中使用segmented(),以便仅为hp创建断开的关系,但我收到此错误:"错误的条款数量seg.Zpsi"。

1 个答案:

答案 0 :(得分:1)

摘要

你正在做的事情正确,但是你误解了broken.lines()输出的含义(用你的符号fted$fit)。不应期望这些值与mpg一致。

您可以通过向seg.Z仅提供那些您想要折线的变量来保持某些因变量的线性关系。

broken.line()做什么

您正在为mpg创建一个模型,作为两个变量hpwt的函数。在这两个变量中,模型是分段线性的。请务必注意,为了预测mpg的值,您需要指定 hpwt

如果参数broken.line()中指定的变量之一发生变化,函数mpg用于计算term的预测。您可以按如下方式为变量hp执行此操作:

fted = broken.line (seg.o, term="hp")

但请记住:为了预测,您还需要为wt指定一个值。您在fted$fit中获得的值实际上是在wt保持为零的情况下计算的。

如果要从模型中获取预测,可以使用predict()来检查这个,这是要使用的函数:

pred <- predict(seg.o, data.frame(hp = hp, wt = 0))
pred - fted$fit
##  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 
##  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0

从模型

创建预测

如果您想将模型预测与mpg进行比较,则必须对两个变量hpwt使用相同的值。你也可以用预测来做到这一点:

pred <- predict(seg.o, data.frame(hp = hp, wt = wt))
plot(hp, mpg)
points(hp, pred, col = "red")

enter image description here

如您所见,以这种方式生成的值或多或少与mpg一致。通过这种方式,您应该检查模型的质量,而不是使用broken.line()

绘制分段线性关系

您还可以查看mpg与其中一个变量之间的分段线性关系。您已在fted中计算了这些值,但您也可以直接从seg.o绘制,如下所示:

plot(seg.o, term = "hp")
points(hp, fted$fit, col = "red")

enter image description here

请注意,同样适用于plot(),您需要指定要更改的变量(此处为hp)。另一个再次保持为零。我还添加了来自fted$fit的点,以向您显示该图实际上等同于broken.line计算的内容。

仅为一个变量

拟合一条虚线

如果你想只在一个因变量中拟合一条虚线并保持其他变量的线性关系,你只需要在seg.Z中指定那些你想要用虚线表示的变量。您要求仅使用hp的折线,可按以下步骤操作:

seg.o2 <- segmented(reg, seg.Z = ~hp, psi = list(hp = hp_thresh))

这表明这是有效的,我预测模型中只有一个变量变化和绘图。

改变hp,保持wt已修复:

pred_hp <- predict(seg.o2, data.frame(hp = 50:300, wt = 0))
plot(50:300, pred_hp, type = "l")

enter image description here

改变wt,保持hp已修复:

pred_wt <- predict(seg.o2, data.frame(wt = seq(1.5, 5.5, by = 0.1), hp = 0))
plot(seq(1.5, 5.5, by = 0.1), pred_wt, type = "l")

enter image description here

正如您所看到的,mpg的模型线性地取决于wt,但与hp的线性关系断开。