2017-11-09 12 views
0

임의의 pdf 함수 (예 : pnorm, punif, pbinom 등)에 대한 2 차 오차를 최소화하는 매개 변수를 찾기 위해 R에서 함수를 구현하고 있습니다. 설계는 사용자가 densit 함수 (예 : meansdpnorm)에서 확률, 경험적 분위, 함수 이름 (densit) 및 매개 변수 이름 목록 (params)을 제공하도록 설계되었습니다. 인스턴스의 존재 q1, q2 및 -1.644854, 0이 q3 및 1.644854 및 p1, p2 0.05 같 p3, 0.5, 0.95 들어, 함수 meansd는 대략 0과 1은 각각 회수한다.optim()의 표현식 평가 중 오류

optim에 이러한 표현식을 공급하여 후자는 최적화 중에 표현식을 평가해야하는 함수 (내부적으로 quadraticFun)를 사용합니다. 그러나 나는 추정을 위해 그러한 표현에 대해 optim을 만들 수 없습니다.

다음 예와
fun <- function(p1 = 0.05, p2 = 0.50, p3 = 0.95, q1, q2, q3, output = "complete", densit, params) { 
    densit <- substitute(densit) 
    params <- sapply(params, as.name) 
    densiCall1 <- as.call(c(as.list(densit), as.list(q1), params)) 
    densiCall2 <- as.call(c(as.list(densit), as.list(q2), params)) 
    densiCall3 <- as.call(c(as.list(densit), as.list(q3), params)) 
    quadratEq <- substitute((densiCall1 - p1)^2 + 
          (densiCall2 - p2)^2 + 
          (densiCall3 - p3)^2) 
    quadraticFun <- function(params) { 
     eval(quadratEq) 
    }  
    initVals <- rep(1, times = length(params)) 
    res <- optim(initVals, quadraticFun) # ERROR SOMEWHERE AROUND HERE... 
    # if output is set to "complete", return the whole res object, otherwise, return just the parameters 
    if (output == "parameters") { 
     return(res$par) 
    } 
    return(res) 
} 

디버깅 오류가 구체적으로 다음과 같은 메시지 quadraticFun의 평가시, 전화 optim(initVals, quadraticFun) 중에 나타나 있음을 나타냅니다 :

> findParams(q1 = -1.644854, q2 = 0, q3 = 1.644854, densit = pnorm, params = list("mean", "sd")) 
Error in pnorm(-1.644854, mean, sd) : 
    Non-numeric argument to mathematical function 

그것은 표현 보인다 기능이 있습니다 결과는 인터프리터에 의해 문자 그대로 취해집니다. 즉, meanas은 최적화 할 함수의 인수 대신 평가할 기호로 사용됩니다.

이 문제를 해결하는 데 도움이되는 힌트를 미리 보내 주셔서 감사합니다.

답변

1

기능 quadraticFun이 매개 변수를 densiCall1 기능에 제대로 넘겨주지 않았기 때문에 작동하지 않았습니다.

코드를 약간 변경하여 평가가 필요한 호출이 하나 뿐이므로 처리하기가 더 쉽습니다. 지금 densit이 문자열입니다.이 값을 변경할 수 있다고 확신합니다. 여기에 내가 생각 해낸 기능입니다 :

findParams <- function(q = c(-1.644854, 0, 1.644854), 
     p = c(0.05, 0.50, 0.95), output = "complete", densit="pnorm", 
     params = c("mean", "sd")) { 
    l <- length(params) 
    cl <- vector("list", 2 + length(params)) 
    cl[[1]] <- as.name(densit) 
    cl[[2]] <- q 
    names(cl) <- c(NA, "q", params) 
    mode(cl) <- "call" 
    quadraticFun <- function(x) { 
     cl[3:(l+2)] <- x 
     res <- eval(cl) 
     sum((res - p)^2) 
    }  
    initVals <- rep(1, times = l) 
    res <- optim(initVals, quadraticFun) 
    if (output == "parameters") { 
     return(res$par) 
    } 
    return(res) 
} 

는 그리고 작동하는 것 같다 :

findParams() 
$par 
[1] 0.0001065349 1.0001052494 

$value 
[1] 2.682477e-09 

$counts 
function gradient 
     67  NA 

$convergence 
[1] 0 

$message 
NULL 
+0

감사 전화와 벡터화 작업의 구현의 개선을 구성하는 더 좋은 방법을 지적. 당신의 대답이 그 문제를 해결했고 통찰력이있었습니다. – gaballench