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

How to fit with a broken line in only one of two dependent variables?

使用 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。怎么做到的?

我尝试在 segmented() 的输入中使用 hp_thresh 以便仅针对 hp 建立断开的关系,但我收到此错误:"A wrong number of terms in seg.Z or psi".

总结

你做的是对的,但是你误解了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")

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

绘制分段线性关系

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

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

请注意,对于 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")

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

如您所见,mpg 的模型线性依赖于 wt,但与 hp.

的线性关系断开