带断点的 nls 模型的语法

机器算法验证 r 回归 nls
2022-04-15 16:09:09

于是,传奇继续……

所以我试图拟合模型 其中是观察变量,和其他参数是估计的。我不认为我可以用分段包做到这一点,因为断点不在预测变量中,但我认为我应该能够相当简单地作为非线性最小二乘回归来做到这一点?我对 nls 语法不太好,因此将不胜感激

Runoff={β0+β1Pcpif (Ant+Pcp)<Thold;β2+β3Pcpif (Ant+Pcp)Thold;
PcpAntThold

1个回答

一般来说,这是一个令人讨厌的问题,我们不应该像nlsin那样应用自动优化器R 然而,通过观察模型是线性的,并且满足普通最小二乘 (OLS) 估计的假设,它很容易解决,条件是 的值ThreshThresh因此,您可以通过在合理的值范围内系统地变化来可靠地搜索解决方案。


为了说明,R我在使用等效模型时模拟了这种形式的一些数据

Y=β0+β1x1+β2I(x2<τ)+β3x1I(x2<τ)+ε

其中是系数(但与问题中的不同!),是指示函数,是阈值参数,表示 的值表示 的值的零均值正态分布β0,,β3Iτx1Pcpx2Pcp + Antεσ2

请注意,时,(β0,β1)x2τ(β0+β2,β1+β3)

的估计值是最小化 OLS 残差平方和的值(通常不是唯一的)。这相当于最大似然解。为了说明找到这个估计值的难度有多大,我绘制了残差平方和与的试验值的关系图图中左侧的图显示了此配置文件的示例。的最佳值用垂直的红色虚线标记。它的锯齿状、局部常数、不可微分模式使得几乎任何通用优化器几乎不可能可靠地找到最小值。(它很容易陷入远离全局最小值的局部最小值。我申请了τττoptimize将此问题作为检查,在某些示例中,这正是发生的情况。)

鉴于的这个估计,该模型是线性的并且可以通过 OLS 拟合。这种拟合显示在右手图中。处交叉的斜线组成,真实阈值为在这个数据集中,几乎不相关。它们之间的强相关性将使估计不可靠。τ±1(0,1)1/3x1x2

数字

橙色方块和蓝色圆圈分别区分情况。这两个数据子集分别用直线拟合。x2<τx2τ

通过用负对数似然替换残差平方和并应用标准 MLE 方法来获得参数的置信区域并检验关于它们的假设,可以获得完整的最大似然解。


#
# Create a dataset with a specified model.
#
n <- 80
beta <- c(1,1,0,-2)
threshold <- -1/3
sigma <- 1
x1 <- seq(1-n,n-1,2)/n
set.seed(17)
x2 <- rnorm(n)
i <- x2 < threshold
x <- cbind(1, x1, i, x1*i)
y <- x %*% beta + rnorm(n, sd=sigma)
#
# Display the SSR profile for the threshold.
#
f <- function(threshold) lm(y ~ x1*I(x2 < threshold))
z <- seq(-1,1,0.5/n)*2*sd(x2)                   # Search range
w <- sapply(z, function(z) sum(resid(f(z))^2))  # Sum of squares of residuals

par(mfrow=c(1,2))
plot(z, w, lwd=2, type="l", xlab="Threshold", ylab="SSR",main="Profile")
t.opt <- (z[which.min(w)] + z[length(z)+1 - which.min(rev(w))])/2
abline(v=t.opt, lty=3, lwd=3, col="Red")
#
# Fit the model to the data.
#
fit <- f(t.opt)
#
# Report and display the fit.
#
summary(fit)
plot(x1, y, pch=ifelse(x2 < t.opt, 21, 22), bg=ifelse(x2 < t.opt, "Blue", "Orange"),
     main="Data and Fit")
b <- coef(fit)
abline(b[c(1,2)], col="Orange", lwd=3, lty=1)
abline(b[c(1,2)] + b[c(3,4)], col="Blue", lwd=3, lty=1)