2014-12-27 1 views
1

Я пытался подгонять модель нелинейной квантильной регрессии с nlrq() (от quantreg). Но я обнаружил, что функция очень чувствительна к стартовым значениям. Поэтому я попытался использовать самозапуск SSexp(). То, что я прочитал, выполняет функции автозапуска для nls(). Но все время я получаю следующее сообщение об ошибке:с использованием nlrq с SSexp генерирует эту ошибку: «Ошибка в getInitial (formula, 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

Я подозреваю, что проблема в том, что один из зависимых пакетов, загруженных при загрузке nlrwr является dlc, которая имеет свою собственную версию getInitial.

Попробуйте stats::getInitial(etc) - tho 'Я предупреждаю вас, что, когда я попробовал это с вашими данными и кодом, я получаю «Ошибка в lm.fit (x, y, offset = offset, singular.ok = singular.ok, ...): NA/NaN/Inf в 'у'»

2

Оба getInitial() и SSexp() от nlrwr вызывают проблемы здесь. Итак, я бы не использовал nlrwr в вашем случае.

Плюс, он прикрепляет множество пакетов к пути поиска, который обычно считается плохой практикой.

  • nlrwr::getInitial() принимает только один аргумент, в то время как stats::getInitial() принимает переменное число аргументов, с двумя, по крайней мере. Таким образом, версия nlrwr очень подвержена разрыву нескольких вещей в R!

  • nlrwr::SSexp() является плохой функцией самозапуска. Он не вычисляет градиент численно, он не дает атрибута 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 Я не предполагаю; изменил форматирование кода для него. –

 Смежные вопросы

  • Нет связанных вопросов^_^