为什么R的预测分段包不包括其他协变量的影响?

问题描述 投票:0回答:1

我有一个使用分段包的拟合模型。 这由 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”

r segment
1个回答
0
投票

在我的版本中,(我知道评论中的一些无法复制问题)问题似乎是当函数识别要包含在预测中的变量和相应系数时(您可以使用

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

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.