使用mtcars
数据集,我正在尝试确定mpg
作为hp
和wt
函数的折线回归拟合,断点仅来自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值进行比较)。我想在功能的使用中我缺少一些简单的东西。
修改
进一步澄清:我希望仅使用mpg
和hp
之间的分段关系,但仍以线性方式包含wt
。怎么能这样做?
我尝试在hp_thresh
的输入中使用segmented()
,以便仅为hp
创建断开的关系,但我收到此错误:"错误的条款数量seg.Z
或psi
"。
答案 0 :(得分:1)
你正在做的事情正确,但是你误解了broken.lines()
输出的含义(用你的符号fted$fit
)。不应期望这些值与mpg
一致。
您可以通过向seg.Z
仅提供那些您想要折线的变量来保持某些因变量的线性关系。
您正在为mpg
创建一个模型,作为两个变量hp
和wt
的函数。在这两个变量中,模型是分段线性的。请务必注意,为了预测mpg
的值,您需要指定 ,hp
和wt
。
如果参数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
进行比较,则必须对两个变量hp
和wt
使用相同的值。你也可以用预测来做到这一点:
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
的线性关系断开。