【问题标题】:How to fit with a broken line in only one of two dependent variables?如何仅在两个因变量之一中拟合虚线?
【发布时间】:2016-04-13 19:16:42
【问题描述】:

使用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 建立断开的关系,但我收到此错误:“seg.Zpsi 中的术语数量错误”。

【问题讨论】:

  • segmented()broken.line() 来自哪里?
  • 请不要编辑问题,使现有答案变得毫无意义。您首先询问了对broken.lines() 输出的解释。我试图保留这部分并将您更清晰的问题添加为明确标记的编辑。这样,我的答案作为原始问题的答案仍然有效。我现在将添加编辑的答案。
  • Stibu - 我明白,会更加小心。请注意,我的说明仅针对问题的前两行,我在其中特别询问“尝试确定 mpg 的折线回归拟合作为 hp 和 wt 的函数,断点仅来自 hp”。感谢您的详细回复。谢谢。

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


【解决方案1】:

总结

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

您可以通过仅向seg.Z 提供您希望有虚线的那些变量来保持某些因变量的线性关系。

break.line() 的作用

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

如果参数term 中指定的变量之一发生变化,则函数broken.line() 用于计算mpg 的预测值。您对变量 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,以进行拟合。你也可以用 predict 来做到这一点:

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 的线性关系断开。

【讨论】:

  • 谢谢,您的详细回复很有道理。但我仍然不确定 - 当我有两个解释变量但有兴趣获得一个但不排除第二个的分段关系时,我如何获得拟合。更新了原始问题。
猜你喜欢
  • 2021-11-08
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-23
相关资源
最近更新 更多