2012-03-22 7 views
12

나는 선험적 인 기대를 따르지 않을 수도있는 매개 변수 추정치가있는 모델의 산출물로 작업하고 있습니다. 필자는 이러한 유틸리티 예상치를 이러한 기대치와 부합하도록 만드는 함수를 작성하고자합니다. 이렇게하려면이 함수는 시작 값과 새 추정값 간의 제곱의 편차 합계를 최소화해야합니다. 우리는 선천적 expections을 가지고 있기 때문에, 최적화는 다음과 같은 제약 조건이 적용되어야한다 :제약 조건을 사용하여 최적화

B0 < B1 
B1 < B2 
... 
Bj < Bj+1 

는 예를 들어, 원시 매개 변수 추정은 아래 B2 및 B3에 대한 flipflopped된다. DeltaDelta^2 열은 원래 매개 변수 추정과 새 계수 간의 편차를 보여줍니다. 열 Delta^2을 최소화하려고합니다. 내가 Excel의 해 찾기 일련의 제약을 제공하는이 문제 최적화 얼마나 Excel에서 이것을 코딩 표시했습니다 ?optim?constrOptim을 통해 읽은 후

Beta BetaRaw Delta Delta^2 BetaNew 
B0  1.2  0  0   1.2 
B1  1.3  0  0   1.3 
B2  1.6  -0.2  0.04  1.4 
B3  1.4  0  0   1.4 
B4  2.2  0  0   2.2 

을, 나는이를 설정하는 방법을 grok 수 할 수 아니에요 R. 나는 조금 밀도가 높을 것이라고 확신하지만 올바른 방향으로 몇 가지 포인터를 사용할 수 있습니다!

3/24/2012 - 첫 번째 대답을 번역 할만큼 영리하지 않아서 현상금을 추가했습니다.

올바른 경로에 있어야하는 R 코드가 있습니다.

betas <- c(1.2,1.3,1.6,1.4,2.2) 

가 나는 기능은 우리가 원래 베타의를 통과하면, 손실이 0이어야 작동 표시하려면 다음 함수 등이 b0 <= b1 <= b2 <= b3 <= b4

f <- function(x) { 
    x1 <- x[1] 
    x2 <- x[2] 
    x3 <- x[3] 
    x4 <- x[4] 
    x5 <- x[5] 

loss <- (x1 - betas[1])^2 + 
     (x2 - betas[2])^2 + 
     (x3 - betas[3])^2 + 
     (x4 - betas[4])^2 + 
     (x5 - betas[5])^2  

    return(loss) 
} 

을 최소화하려면 다음 베타로 시작한다고 가정 :

어떤 임의의 입력이
> f(betas) 
[1] 0 

그리고 비교적 큰 :

012,394을 내가 Excel에서 계산할 수 있었다 값에 9,932,671,915,

최소화 : 목적이 차하고 제약 선형, 당신이 solve.QP을 사용할 수 있습니다

> f(c(1.2,1.3,1.4,1.4,2.2)) 
[1] 0.04 
+1

리플렉션에서 실제로는 로지스틱 회귀 (http : //en.wikipedia.org/wiki/Ordered_logit). 패키지'MASS'에서'polr' 함수는 이러한 문제를 해결할 수 있습니다. http://www.stat.washington.edu/quinn/classes/536/S/polrexample.html에 예제가 있습니다. Kenneth Train은 "Discrete Choice Methods with Simulation" – Andrie

+0

@Andrie에서 자신의 저서를 잘 설명합니다. 아마도 모닝 커피가 필요 하겠지만, polr 예제와 여기에서해야 할 일 사이에 점을 연결하는 데 어려움을 겪고 있습니다. 'polr()'을 사용하면 비례 배제 비율을 예측하는 것이 목표가 아닌가? 나는 케인 트레인 (Ken Train)의 책을 내 책꽂이 (먼지를 모으는 것)에 앉아서 소용돌이 치게 할 것이다. 고맙습니다. – Chase

+0

@Andrie +1 기차입니다. 온라인에서도 PDF 형식으로 사용할 수 있습니다. –

답변

10

1 입니다.

그것은, 우리가 지난 시즌, sum(beta^2) 때문에

sum((b-betas)^2) = sum(b^2) - 2 * sum(b*betas) + sum(beta^2) 
        = t(b) %*% t(b) - 2 * t(b) %*% betas + sum(beta^2). 

을 최소화하는 b을 원하는 제약 여기

t(Amat) %*% b >= bvec. 

에서

(1/2) * t(b) %*% Dmat %*% b - t(dvec) %*% b 

을 최소화 b

발견 , 일정 , 우리는 그것을 놓을 수있다,,우리가 제약

b[1] <= b[2] 
b[2] <= b[3] 
... 
b[n-1] <= b[n] 

즉있다

Dmat = diag(n) 
dvec = betas. 

설정할 수

-b[1] + b[2]      >= 0 
     - b[2] + b[3]    >= 0 
       ... 
        - b[n-1] + b[n] >= 0 

되도록 t(Amat)

[ -1 1    ] 
[ -1 1    ] 
[  -1 1   ] 
[    ...  ] 
[    -1 1 ] 

bvec가 제로이고 .

이렇게하면 다음과 같은 코드가 생성됩니다.

# Sample data 
betas <- c(1.2, 1.3, 1.6, 1.4, 2.2) 

# Optimization 
n <- length(betas) 
Dmat <- diag(n) 
dvec <- betas 
Amat <- matrix(0,nr=n,nc=n-1) 
Amat[cbind(1:(n-1), 1:(n-1))] <- -1 
Amat[cbind(2:n,  1:(n-1))] <- 1 
t(Amat) # Check that it looks as it should 
bvec <- rep(0,n-1) 
library(quadprog) 
r <- solve.QP(Dmat, dvec, Amat, bvec) 

# Check the result, graphically 
plot(betas) 
points(r$solution, pch=16) 

2. 동일한 방법을 사용할 수 constrOptim

(목적 함수는 임의적 일 수 있지만, 제약들은 선형 일 필요). 예를 들어 당신이 비 제약 최적화 문제로 문제 을 reparametrize 경우 optim을 사용할 수 있습니다 더 일반적으로

3. ,

b[1] = exp(x[1]) 
b[2] = b[1] + exp(x[2]) 
... 
b[n] = b[n-1] + exp(x[n-1]). 

몇 가지 사례가있다 here 또는 there .

+0

응답에 감사드립니다. 나는 내가 필요로하는 모든 것이 위에 담겨 있음을 안다. 그러나 나는 그것을 보지 않고있다. 구체적으로, 1) 제약 조건과 제약 조건 2) b_0과 추정치 간의 편차를 계산하는 함수는 어디에서 입력해야합니까? – Chase

+0

이것은'? solve.QP'에 설명되어 있습니다. 최소화하는'b'를 찾습니다. '(1/2) * t (b) % * % Dmat % * % b - t (dvec) % * % b ' 't (Amat) % * % b> = bvec' 인 제약 조건하에. 'solve.QP'의 처음 두 인수는 목적 함수, 마지막 두 개의 제약을 정의합니다. "그냥"이 양식 아래에 문제를 넣어야합니다 ... –

+0

흠, 괜찮아요. 도움말 페이지에 대한 제 해석을 확인하는 데 도움이됩니다. 나는 단지'Dmat'와'Amat'을 어떻게 설정해야 하는지를보기 위해 행렬에서 충분히 잘 생각하지 않는다고 생각합니다. 나는 이것을 계속 생각할 것입니다. 감사! – Chase

0

좋아,이 양식을 시작하지만 여전히 몇 가지 버그가 있습니다. @ 조란과의 대화에서 대화를 기반으로, 값이 순서가 맞지 않으면 손실 함수를 임의로 큰 값으로 설정하는 조건을 포함 할 수 있습니다. 첫 번째 두 개의 계수간에 불일치가 발생하지만 이후에는 그렇지 않은 경우에는 작동하는 것으로 보입니다. 나는 그것이 왜 그렇게 될지 파싱하는 데 어려움을 겪고있다.

기능 최소화하기 위해 예를 작업

f <- function(x, x0) { 
    x1 <- x[1] 
    x2 <- x[2] 
    x3 <- x[3] 
    x4 <- x[4] 
    x5 <- x[5] 

loss <- (x1 - x0[1])^2 + 
     (x2 - x0[2])^2 + 
     (x3 - x0[3])^2 + 
     (x4 - x0[4])^2 + 
     (x5 - x0[5])^2  

    #Make sure the coefficients are in order 
    if any(diff(c(x1,x2,x3,x4,x5)) > 0) loss = 10000000 

    return(loss) 
} 

는 (일종의, 손실이 b0 = 1.24 경우 최소화 할 것 같다?) :

> betas <- c(1.22, 1.24, 1.18, 1.12, 1.10) 
> optim(betas, f, x0 = betas)$par 
[1] 1.282 1.240 1.180 1.120 1.100 

비 작동 예 (참고 세 번째 요소 여전히 초보다 큽니다.

> betas <- c(1.20, 1.15, 1.18, 1.12, 1.10) 
> optim(betas, f, x0 = betas)$par 
[1] 1.20 1.15 1.18 1.12 1.10 
+0

원래의 질문에서와 같이 숫자가 증가 할 때'> (0 (diff (x)) <0)', 이 아닌'> 0 '이 아닌 경우 페널티가 필요할 수 있습니다. –

+1

제약 조건 위반에 대한 패널티가 일정하기 때문에 최적화 알고리즘은 어떤 방향으로 잘못된 솔루션을 수정하여 개선 할 지 알 수 없으며 은 손실 ​​함수가 계속 나타나기 때문에 은 현재 값을 짝수 높으면 로컬 최소값입니다. 벌칙의 진폭에 따라 벌칙을 적용 할 수 있습니다. 'f <- function (x, x0) { loss <- sum ((x-x0)^2); if (임의 (diff (x) <0)) { 손실 <- 손실 + 1e9 * 합계 (pmax (0, -diff (x))) }; 손실 }; 낙관적 인 (베타, f, x0 = 베타) $ 파' –

관련 문제