2015-05-01 50 views
1

我试图使用minpack.lm中的nls.lm函数来适应非线性模型对心理物理实验的某些数据。R中的nls.lm模型拟合“错误:未使用的参数”

我已经搜索过了,找不到很多关于软件包的信息,所以基本上已经复制了nls.lm帮助页面上给出的示例格式。不幸的是我的脚本仍然失败运行和R抛出了这个错误:

Error in fn(par, ...) : 
unused argument (observed = c(0.1429, 0.2857, 0.375, 0.3846, 0.4667, 0.6154)) 

看来,脚本认为我要拟合模型的数据是无关紧要的,这肯定是不对的。

我期待它适合模型,并为备用参数(w)产生0.5403的值。

任何帮助,非常感谢。 我正在从Matlab转移到R,所以如果我的代码看起来sl ap的道歉。

这是脚本。

install.packages("pracma") 
    require(pracma) 
    install.packages("minpack.lm") 
    require(minpack.lm) 

    # Residual function, uses parameter w (e.g. .23) to predict accuracy error at a given ratio [e.g. 2:1] 
    residFun=function(w,n) .5 * erfc(abs(n[,1]-n[,2])/ ((sqrt(2)*w) * sqrt((n[,1]^2) + (n[,2]^2)))) 

    # example for residFun 
    # calculates an error rate of 2.59% 
    a=matrix(c(2,1),1,byrow=TRUE) 
    residFun(.23,a) 

    # Initial guess for parameter to be fitted (w) 
    parStart=list(w=0.2) 

    # Recorded accuracies in matrix, 1- gives errors to input into residFun 
    # i.e. the y-values I want to fit the model 
    Acc=1-(matrix(c(0.8571,0.7143,0.6250,0.6154,0.5333,0.3846),ncol=6)) 

    # Ratios (converted to proportions) used in testing 
    # i.e. the points along the x-axis to fit the above data to 
    Ratios=matrix(c(0.3,0.7,0.4,0.6,0.42,0.58,0.45,0.55,0.47,0.53,0.49,0.51),nrow=6,byrow=TRUE) 

    # non-linear model fitting, attempting to calculate the value of w using the Levenberg-Marquardt nonlinear least-squares algorithm 
    output=nls.lm(par=parStart,fn=residFun,observed=Acc,n=Ratios) 

    # Error message shown after running 
    # Error in fn(par, ...) : 
    # unused argument (observed = c(0.1429, 0.2857, 0.375, 0.3846, 0.4667, 0.6154)) 

回答

2

该错误意味着你传递了一个函数,它没有期望的参数。 ?nls.lm没有参数observed,所以它被传递给传递给fn的函数,在你的情况下,residFun。但是,residFun也不期望这个论点,因此错误。你需要重新定义这个函数是这样的:

# Residual function, uses parameter w (e.g. .23) to predict accuracy error at a given ratio [e.g. 2:1] 
residFun=function(par,observed, n) { 
    w <- par$w 
    r <- observed - (.5 * erfc(abs(n[,1]-n[,2])/ ((sqrt(2)*w) * sqrt((n[,1]^2) + (n[,2]^2))))) 
    return(r) 
} 

它提供了以下结果:

> output = nls.lm(par=parStart,fn=residFun,observed=Acc,n=Ratios) 
> output 
Nonlinear regression via the Levenberg-Marquardt algorithm 
parameter estimates: 0.540285874836135 
residual sum-of-squares: 0.02166 
reason terminated: Relative error in the sum of squares is at most `ftol'. 

为什么会发生:

看来你被这个例子中,他documentation启发:

## residual function 
residFun <- function(p, observed, xx) observed - getPred(p,xx) 
## starting values for parameters 
parStart <- list(a=3,b=-.001, c=1) 
## perform fit 
nls.out <- nls.lm(par=parStart, fn = residFun, observed = simDNoisy, 
xx = x, control = nls.lm.control(nprint=1)) 

请注意,observed这里是一个参数residFun

+0

啊!谢谢!我知道这将是明显的事情。 所以这应该工作(至少直到下一个错误)? ((n [,1] -n [,2])/((sqrt(2)* w)* sqrt((n [ ,1]^2)+(n [,2]^2))))' –

+1

不,它不起作用,因为'observed'不是你的函数的参数,而是它的输出。我更新了一个函数 – scoa

+0

我的答案谢谢,非常感谢。 –

相关问题