0

R で nlstools パッケージを使用しています。モデルをデータに適合させ、適切にプロットします。何が間違っているのかわかりませんが、「オブジェクト 'd' が見つかりません」というエラーが発生するため、nlstools からメソッドを呼び出すことができないようです。エラー行がコメントされたコードは次のとおりです。

Y=y_coll
X=x_ntips
d=data.frame(X,Y)

thisfit=nls(Y ~ a*X^b,data=d, start = list(a = .1, b = .1)) 

### Error in eval(expr, envir, enclos) : object 'd' not found
#a=nlsBoot (thisfit, niter = 999)
#cr= nlsConfRegions(thisfit, exp = 2, length = 200) 

#plotting   
res= data.frame(X, pred = predict(thisfit)) 
points(res[order(X),], type='l', col="grey40", lty=1) 

何が起こっているかについてのアイデアはありますか?ありがとう

4

4 に答える 4

3

OK、ここに私が見つけたものがあります: 問題は、nlsBoot への呼び出しが関数内にある場合です。次のコードは、問題を再現する必要があります (nlsBoot が変数 d を見つけられない)。

library(nlstools)

call_thisFunction <- function(){

        X=c(69, 36, 135, 66, 10, 6, 15, 18)
        Y=c(0.10008780, 0.20840336, 0.08147234, 0.12500000, 0.19444444, 0.60000000, 0.21978022, 0.29411765)
        d<- data.frame(X=X,Y=Y)
        print(d)
        thisfit<- nls(Y ~ a*X^b,data=d, start = list(a = .1, b = .1)) 
        print("done NLS")
        a= nlsBoot(thisfit, niter = 50) #FAIL - Error in eval(expr, envir, enclos) : object 'd' not found

}

call_thisFunction()

また、変数 d をグローバルにすると、次のようになります。

d<<- data.frame(X=X,Y=Y) 

または、呼び出しの前に関数の外で定義します。

(...)
d=c()
call_thisFunction()

すべてうまくいきます。誰かが理由を知っている場合は、投稿してください。ありがとう!

ここに修正があります (コメントアウトされた行は元のものであり、それらに続く行に置き換えられます):

# nlsBoot <- function(nls, niter = 999)
nlsBoot <- function (nls, niter = 999, envir = parent.frame())
{
    if (!inherits(nls, "nls")) 
        stop("Use only with 'nls' objects")

    # data2 <- eval(nls$data, sys.frame(0))
    data2 <- eval(nls$data, envir)
    fitted1 <- fitted(nls)
    resid1 <- resid(nls)
    var1 <- all.vars(formula(nls)[[2]])
    l1 <- lapply(1:niter, function(i) {
        data2[, var1] <- fitted1 + sample(scale(resid1, scale = FALSE), 
            replace = TRUE)
        nls2 <- try(update(nls, start = as.list(coef(nls)), data = data2), 
            silent = TRUE)
        if (inherits(nls2, "nls")) 
            return(list(coef = coef(nls2), rse = summary(nls2)$sigma))
    })
    if (sum(sapply(l1, is.null)) > niter/2) 
        stop(paste("Procedure aborted: the fit only converged in", 
            round(sum(sapply(l1, is.null))/niter), "% during bootstrapping"))
    tabboot <- sapply(l1[!sapply(l1, is.null)], function(z) z$coef)
    rseboot <- sapply(l1[!sapply(l1, is.null)], function(z) z$rse)
    recapboot <- t(apply(tabboot, 1, quantile, c(0.5, 0.025, 
        0.975)))
    colnames(recapboot) <- c("Median", "2.5%", "97.5%")
    estiboot <- t(apply(tabboot, 1, function(z) c(mean(z), sd(z))))
    colnames(estiboot) <- c("Estimate", "Std. error")
    serr <- sum(sapply(l1, is.null))
    if (serr > 0) 
        warning(paste("The fit did not converge", serr, "times during bootstrapping"))
    listboot <- list(coefboot = t(tabboot), rse = rseboot, bootCI = recapboot, 
        estiboot = estiboot)
    class(listboot) <- "nlsBoot"
    return(listboot)
}
于 2012-12-12T15:38:01.687 に答える
1

同じ問題を見つけたので、ここに投稿していますが、答えが明確ではないようです。nlsJack や nlsBoot などの nlstools は、元のデータ セットにアクセスする必要があります。関数に渡されるのは、元のデータへのリンクを含まず、そのラベルだけである nls オブジェクトだけだからです。そのため、データ セットをグローバル オブジェクトとして使用できるようにすると、nlsBoot (または nlsJack) がそれを見つけて分析を実行します。

于 2016-01-22T23:54:25.453 に答える
1

エラーを再現できません(適切なコード形式のコメントではなく、回答として投稿されています)。

set.seed(101)
d <- data.frame(X=rlnorm(100),Y=runif(100))
thisfit=nls(Y ~ a*X^b,data=d, start = list(a = .1, b = .1)) 
library(nlstools)
a=nlsBoot (thisfit, niter = 999)
cr= nlsConfRegions(thisfit, exp = 2, length = 200) 
## 100%
##  Confidence regions array returned 
res= data.frame(X, pred = predict(thisfit)) 

まだプロットを作成していないため、次の行は失敗します。

## points(res[order(X),], type='l', col="grey40", lty=1) 
## Error in plot.xy(xy.coords(x, y), type = type, ...) : 
##    plot.new has not been called yet

plot(cr)動作しているようです。そうですplot(res[order(X),])

于 2012-12-11T20:32:30.137 に答える