2014-12-27 9 views
1

nlrq() (quantreg 패키지)으로 비선형 quantile 회귀 모델에 적합하도록 노력했습니다. 하지만 그 기능은 시작 값에 매우 민감하다는 것을 알게되었습니다. 그래서 자기 시동 장치 SSexp()을 사용하려고했습니다. 내가 읽은 바로는 nls()을 위해 만든 자체 시동기 기능도 함께 작동합니다. 하지만 다음과 같은 오류 메시지가 점점 오전 모든 시간 :SSexp에서 nlrq를 사용하면 "getInitial (수식, mf)의 오류 : 사용되지 않은 인수 (mf)"

"Error in getInitial(formula, mf) : unused argument (mf)" 

내 입력 된 오류 코드 :

fit12 <- nlrq(visit.rate ~ SSexp(het.total, y0, b), 
           data = flower_mat,tau = 0.75) 

내가 getInitial이 어떻게 든 자기 스타터 기능을 만들 연결되어 있는지 종류의 막연한 생각을 가지고있다. 그러나 솔직히 말하면 나는 그 문제가 정확히 어디 있는지 모른다. 아무도 이것에 관해 나를 도울 수 있습니까?

추가 정보

# R version 3.1.2 -- "Pumpkin Helmet" 
# quantreg version: 5.05 
# nlrwr version : 1.1-0 

# toy dataset and code 
x <- c(0.3,0.6,0.9,1,1.5,2, 2.1, 2.5,3, 3,5,10,11,12,14,13,17,21,23,27,30, 50) 
y <- c(0,0.1,0.3,0.4,0.6,0.2,0.27,0.2,0.25,0.4,0.15,0.05,0.25,0.2,0.3,0.35,0.1,0.15,0.1,0.14,0,0) 
dat <- data.frame(x,y,stringsAsFactors=FALSE) 
plot(y~x) 
library(quantreg) 
library(nlrwr) 
fit.1 <- nlrq(y ~ SSexp(x, y0, b), 
       data = dat,tau = 0.75) 
# above mentioned error message 
with(dat, SSexp(x, 0.2, 4)) 
# this is working 
getInitial((y ~ SSexp(x, y0, b)), dat) 
# showing following error: 
# Error in getInitial((y ~ SSexp(x, y0, b)), data = dat) : unused argument (dat) 
+1

재현 예를하시기 바랍니다 ... .? –

+0

또한'R '버전과'quantreg' 버전을 게시하십시오. 그리고'SSexp (het.total, y0, b)'의 결과를 게시하면 어떤 함수가 오류를 던지고 있는지 알 수 있습니다. –

+0

답장을 보내 주셔서 감사합니다. 필요한 정보를 추가했습니다. 확인해주십시오. – Amritendu

답변

0

나는 문제가 의심 당신이 nlrwrgetInitial의 자체 버전을 가지고 dlc 인로드 할 때로드 종속성 패키지 중 하나.

시도해보십시오. 데이터 및 코드를 사용해 보았을 때 경고 메시지가 표시됩니다. "lm.fit (x, y, offset = offset, singular.ok = singular.ok, ...) : 여기에 문제를 일으키는 nlrwr에서

2
모두 getInitial()

SSexp() " 'Y'에 NA/NaN이/Inf를. 귀하의 경우에는 nlrwr을 사용하지 않을 것입니다.

게다가 검색 경로에 많은 패키지가 첨부되는데 이는 일반적으로 나쁜 습관으로 간주됩니다.

  • nlrwr::getInitial()stats::getInitial()이 두 사람과 함께 인수의 다양한 수를 수용하면서, 하나의 인수를 받아 이상. 그래서 nlrwr 버전은 R에서 여러 가지를 깨뜨리는 경향이 있습니다!

  • 은 잘못된 자체 시작 기능입니다. 또한 그래디언트를 숫자로 계산하지 않으며 pnames 속성을 제공하지 않으며 장난감 예제에서와 같이 종속 변수에 < = 0 값이 포함 된 경우 매개 변수의 초기 추정값을 계산할 수 없습니다.

차라리 SSexp() 기능이 양식을 사용 (알아서 : 인수가 다른 자기 스타트 기능의 정신에서 다른 더 있습니다) :

SSexp <- structure(function (input, A, rc) { 
    .expr2 <- exp(rc * input) 
    .value <- A * .expr2 
    .actualArgs <- as.list(match.call()[c("A", "rc")]) 
    if (all(unlist(lapply(.actualArgs, is.name)))) { 
     .grad <- array(0, c(length(.value), 2), list(NULL, c("A", "rc"))) 
     .grad[, "A"] <- .expr2 
     .grad[, "rc"] <- A * (.expr2 * input) 
     dimnames(.grad) <- list(NULL, .actualArgs) 
     attr(.value, "gradient") <- .grad 
    } 
    .value 
} 
, initial = function (mCall, data, LHS) { 
    xy <- data.frame(sortedXyData(mCall[["input"]], LHS, data)) 
    if (nrow(xy) < 3) 
     stop("Too few distinct input values to fit an exponential") 
    xy$logy <- log(xy$y) 
    ## Keep only finite cases (if there are y <= 0) 
    xyfinite <- xy[is.finite(xy$logy), ] 
    if (nrow(xyfinite) < 2) 
     stop("Too few distinct LHS values > 0 to fit an exponential") 
    res <- lsfit(xyfinite$x, xyfinite$logy)$coef 
    value <- c(exp(res[1]), res[2]) 
    setNames(value, mCall[c("A", "rc")]) 
} 
, pnames = c("A", "rc"), class = "selfStart") 

dat <- data.frame(
    x = c(0.3, 0.6, 0.9, 1, 1.5, 2, 2.1, 2.5, 3, 3, 5, 10, 11, 12, 14, 13, 17, 
      21, 23, 27, 30, 50), 
    y = c(0, 0.1, 0.3, 0.4, 0.6, 0.2, 0.27, 0.2, 0.25, 0.4, 0.15, 0.05, 0.25, 
      0.2, 0.3, 0.35, 0.1, 0.15, 0.1, 0.14, 0,0)) 
plot(y ~ x, data = dat) 
library(quantreg) 
dat.nlrq <- nlrq(y ~ SSexp(x, A, rc), data = dat, tau = 0.75) 
summary(dat.nlrq) 
lines(0:50, predict(dat.nlrq, newdata = list(x = 0:50))) 
+0

잘 했어. 나는'nlwr :: SSexp()'를 찾아 다니기조차하지 못했다. –

+0

마우스가 올려 졌을 때 나타나는 "스포일러"상자에 첨부 된 패키지에 대한 주석을 넣으려고했다는 뜻이 아니 었습니까? –

+0

@BenBolker 나는 추측하고 있지 않다. 그에 대한 코드 형식이 변경되었습니다. –