我有一个使用分段包的拟合模型。 这由 1 个分段变量和一些分类变量组成。 问题是,当我使用模型进行预测时,它仅使用分段变量进行预测。
可以使用以下代码重新创建问题:
`n=10
x=rep(seq(-3,3,l=n), 2)
z=c(rep(1, 10), rep(0, 10))
set.seed(1515)
y <- (x<0)*x/2 + 1 + 0.5*z + rnorm(x,sd=0.15)
segm <- segmented(lm(y ~ x + as.factor(z)), ~ x, psi=0.5)
newdf <- data.frame(expand.grid(x=seq(-3, 3, 0.5), z=c("1", "0")))
newdf$p1 <- predict(segm, newdata = newdf)
plot(newdf$x, newdf$p1)`
您可以看到,无论 z 变量值如何,预测函数都会返回完全相同的值。
我本来希望包含 z 变量的影响。 我尝试使用
type="terms"
提取预测的组成部分,这是包文档中的内容,但这似乎也不起作用:
Error in match.arg(type) : 'arg' should be one of “link”, “response”
在我的版本中,(我知道评论中的一些无法复制问题)问题似乎是当函数识别要包含在预测中的变量和相应系数时(您可以使用
debugonce(predict.segmented)
继续操作,直到第 150-151 行:
nomiOK <- intersect(names(estcoef.noV), colnames(X.noV))
X.noV
的列名称是newdata
中的变量名称,estcoef.noV
的名称是系数名称。数据中,变量是z
,但对应的系数名称是z1
,所以这是行不通的。这里有几个例子来展示它是如何运作的。
这是一种让它发挥作用的方法。首先,我们将构建您的数据:
library(segmented)
n=10
x=rep(seq(-3,3,l=n), 2)
z=as.factor(c(rep(1, 10), rep(0, 10)))
set.seed(1515)
y <- (x<0)*x/2 + 1 + 0.5*(z == 2) + rnorm(x,sd=0.15)
dat <- data.frame(x=x, z=z, y=y)
现在,使用相同的
segmented()
调用,但将用作 segmented()
输入的线性模型保存为对象 - 您可以内联执行此操作。
segm <- segmented(lmod <- lm(y ~ x + z, data=dat), ~ x, psi=0.5)
像以前一样生成新数据,使
z
成为适当的因子。
newdf <- data.frame(expand.grid(y = 0,
x=seq(-3, 3, 0.5),
z=factor(1:2, labels=c(0,1))))
这就是差异所在 - 您还需要使用新数据框作为数据来为输入线性模型制作模型矩阵。请注意,您必须将因变量的值放入新数据框中,但它们可以是任何值,因为它们不用于构建模型矩阵。这就是为什么我在上面使用
y=0
。
X <- model.matrix(lmod, data=newdf)
现在,将
newer
中尚不存在的所有列附加到 X
。您需要执行此操作,因为该函数会检查公式中的所有变量是否都存在(例如,z
必须位于数据中),但稍后当计算完成时,z1
也必须存在。
newdf <- cbind(newdf, X[,setdiff(colnames(X), names(newdf))])
现在,预测将会有所不同。
newdf$p1 <- predict(segm, newdata = newdf)
newdf
#> y x z (Intercept) z1 p1
#> 1 0 -3.0 0 1 0 -0.64454838
#> 2 0 -2.5 0 1 0 -0.35157664
#> 3 0 -2.0 0 1 0 -0.05860491
#> 4 0 -1.5 0 1 0 0.23436683
#> 5 0 -1.0 0 1 0 0.52733857
#> 6 0 -0.5 0 1 0 0.82031030
#> 7 0 0.0 0 1 0 0.92298030
#> 8 0 0.5 0 1 0 0.93049974
#> 9 0 1.0 0 1 0 0.93801918
#> 10 0 1.5 0 1 0 0.94553862
#> 11 0 2.0 0 1 0 0.95305805
#> 12 0 2.5 0 1 0 0.96057749
#> 13 0 3.0 0 1 0 0.96809693
#> 14 0 -3.0 1 1 1 -0.61113654
#> 15 0 -2.5 1 1 1 -0.31816481
#> 16 0 -2.0 1 1 1 -0.02519307
#> 17 0 -1.5 1 1 1 0.26777866
#> 18 0 -1.0 1 1 1 0.56075040
#> 19 0 -0.5 1 1 1 0.85372214
#> 20 0 0.0 1 1 1 0.95639214
#> 21 0 0.5 1 1 1 0.96391157
#> 22 0 1.0 1 1 1 0.97143101
#> 23 0 1.5 1 1 1 0.97895045
#> 24 0 2.0 1 1 1 0.98646989
#> 25 0 2.5 1 1 1 0.99398933
#> 26 0 3.0 1 1 1 1.00150877
创建于 2024-01-18,使用 reprex v2.0.2