2

nlrq()我一直在尝试用(来自quantreg包)拟合非线性分位数回归模型。但是我发现该函数对起始值非常敏感。所以我尝试使用自启动器SSexp()。我读到的自启动功能nls()也适用于它。但我一直收到以下错误消息:

"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)
4

2 回答 2

4

两者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)))
于 2014-12-28T10:58:49.773 回答
0

我怀疑问题是加载时加载的依赖包之一nlrwrdlc,它有自己的getInitial.

试试 stats::getInitial(etc) ——尽管如此,我会警告你,当我用你的数据和代码尝试它时,我得到“lm.fit 中的错误(x,y,offset = offset,singular.ok =singular.ok,...): 'y'中的NA/NaN/Inf"

于 2014-12-27T14:57:55.197 回答