在R中,如何从`nls`模型对象中提取帽子/投影/影响矩阵或值?

hjzp0vay  于 2023-06-03  发布在  其他
关注(0)|答案(1)|浏览(139)

对于lmglm类型的对象,甚至是lmer类型的对象,可以使用R函数hatvalues()从模型中提取帽子值。但是,显然这不适用于nls对象。我已经用谷歌搜索了所有的方法,但我找不到一种方法来获得这些值。难道nls根本没有创建一个帽子矩阵,或者从非线性最小二乘模型中产生的帽子值只是不可靠吗?
可重复的示例:

xs = rep(1:10, times = 10)
ys = 3 + 2*exp(-0.5*xs)
for (i in 1:100) {
xs[i] = rnorm(1, xs[i], 2)
}
df1 = data.frame(xs, ys)
nls1 = nls(ys ~ a + b*exp(d*xs), data=df1, start=c(a=3, b=2, d=-0.5))
dohp0rv5

dohp0rv51#

有一个很好的article(On the outlier Detection in Nonlinear Regression),其中帽子矩阵近似于在估计点计算的梯度矩阵。
在您的案例中:

# gradient of the model function at the current parameter values
V <- nls1$m$gradient()

# tangent plane leverage matrix (it plays a similar role as the Hat matrix)
H <- V %*% solve(t(V) %*% V) %*% t(V)

# 'hat' values for nls
nls1.hat_values <- diag(H)

如果你遵循这个article,你可以更快地计算H

Q1 <- qr.Q(qr(V)) # V is the same matrix as above
H <- Q1 %*% t(Q1)

由于H可能很大,如果你只想要帽子值,你可以跳过矩阵乘法。我们只需要H矩阵的对角线。

###
#' Approximation of hat values for nls.
#'
#' @param model An 'nls' object
#' @param ... Additional parameters (ignored)
#' @return Vector of approximated hat values
###
hatvalues.nls <- function(model, ...) {
  stopifnot(is(model, 'nls'))
  list(...) # ignore additional parameters
  V <- model$m$gradient()
  Q1 <- qr.Q(qr(V))
  rowSums(Q1*Q1)
}

相关问题