对于lm
或glm
类型对象,甚至是lmer
类型对象,您可以使用R函数hatvalues()
从模型中提取帽值。但是,这显然不适用于nls
个对象。我用Google搜索了每一个方向,但我找不到获得这些价值的方法。 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))
答案 0 :(得分:3)
有一个很好的AWS::NoValue
(在离群值非线性检测中)
回归)其中帽子矩阵由计算的梯度矩阵近似
估计点。
在你的情况下:
# 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)
}