2016-08-26 13 views
0

lm 또는 glm 유형의 객체 또는 lmer 유형의 객체의 경우 R 함수 hatvalues()을 사용하여 모델에서 해트 값을 추출 할 수 있습니다. 그러나 이것은 분명히 nls 개체에서는 작동하지 않습니다. 나는 모든 방법으로 봤지만,이 값을 얻을 수있는 방법을 찾을 수 없습니다. nls은 단순히 모자 행렬을 만들지 않습니까, 아니면 어떻게 든 비현실적 인 최소 제곱 모형에서 생성 된 모자 값입니까?R에서 모자/투영/영향 행렬 또는`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

안녕하세요 @ lmo,이 예제를 이제 기본 R 인 'nls'에 맞게 수정했습니다. 죄송합니다. – Bajcz

+0

최종 답변과는 거리가 먼이 [wikipedia post] (https://en.wikipedia.org/wiki/Projection_matrix)는 모자 행렬 구성에 도움이되는 평가 도구로 비선형 최소 제곱을 언급하지 않습니다. 나는 이것이'nls' 객체에 대한'hatvalues' 메소드의 부재와 함께이 계산이 적절한 방법이 아니거나 nls를 추정 할 수 없다는 것을 의미한다고 생각합니다. [crossValidated] (http://stats.stackexchange.com/)이 경로를 따라 나아가는 데 더 적합 할 것입니다. – lmo

+0

의견을 주셔서 감사합니다 - 중재자가 그렇게 할 수 있다고 생각한다면이 질문을 crossValidated로 마이그레이션하는 것이 좋습니다. (직접 할 수 있다고 생각하지 않습니까?) – Bajcz

답변

2

A가 좋은 article 모자 행렬 구배 행렬에 의해 근사한다 (비선형 회귀 아웃 라이어 검출시) 추정 시점에서 계산을 있다.

귀하의 경우

:

# 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) 
}