非线性最小二乘法的问题nls非二元算子的非数字参数

时间:2013-01-24 15:37:03

标签: r nls

我刚刚开始使用R,并希望得到一个非线性最小二乘拟合nls(...)到公式y = A(1-exp(-bL))+ R. 我通过

定义我的函数g
> g<-function(x,y,A,b,R) {
    y~A(1-exp(-bx))+R
    }

并希望通过

执行nls
>nls((y~g(x,y,A,b,R)),data=Data, start=list(A=-2,b=0,R=-5))

最后我收到以下错误消息。

>Error in lhs - rhs : non-numeric argument to binary operator

我想这只是另一个初学者的一个愚蠢的基本错误,但如果有人能帮助我,我会非常高兴。

接下来的问题是,我是否可以在我的图表中实现拟合曲线

>plot(x,y,main="VI.20.29")

感谢大家花时间阅读并希望回答我的问题!

详细信息: 我有一个表格,其中包含x值(Light.intensity)和y值(例如VI.20.29)

> photo.data<-read.csv("C:/X/Y/Z.csv", header=T)
    > names(photo.data)
     [1] "Light.intensity" "SR.8.6"          "SR.8.7"         
     [4] "SR.8.18"         "SR.8.20"         "VI.20.1"        
     [7] "VI.20.5"         "VI.20.20"        "VI.20.29"       
    [10] "DP.19.1"         "DP.19.15"        "DP.19.33"       
    [13] "DP.19.99"       
    > x<-photo.data$Light.intensity
    > x
    [1]    0   50  100  200  400  700 1000 1500 2000
    > y<-photo.data$VI.20.29
    > y
    [1] -2.76 -2.26 -1.72 -1.09  0.18  0.66  1.47  1.48  1.63
    > plot(x,y,main="VI.20.29")
    > Data<-data.frame(x,y)
    > Data
         x     y
    1    0 -2.76
    2   50 -2.26
    3  100 -1.72
    4  200 -1.09
    5  400  0.18
    6  700  0.66
    7 1000  1.47
    8 1500  1.48
    9 2000  1.63
    > g<-function(x,y,A,b,R) {
    +   y~A(1-exp(-bx))+R
    +   }
    > nls((y~g(x,y,A,b,R)),data=Data, start=list(A=-2,b=0,R=-5))
    Error in lhs - rhs : non-numeric argument to binary operator

3 个答案:

答案 0 :(得分:1)

问题是你在一个函数中调用一个函数。当函数y~g(...)本身调用g(...) 时,您会说y~(other variables)。它在某种程度上是“重复计算”。

只是做:

nls(y~A*(1-exp(-b*x))+R, data=Data, start=list(A=-2,b=0,R=-5))

答案 1 :(得分:1)

您对参数的初步猜测是偏离的。我将您的数据保存在'data.csv'中 对于这个例子,收敛然后做图...为了得到这个,我 调整参数以获得接近,然后nls适合...

df <- read.csv('data.csv')
x <- df$x
y <- df$y
plot(x,y)

fit <- nls(y~A*(1-exp(-b*x))+R, data=df, start=list(A=3,b=0.005,R=-2))
s <- summary(fit)

A <- s[["parameters"]][1]
b <- s[["parameters"]][2]
R <- s[["parameters"]][3]

f <- function(z){
  v <- A*(1-exp(-b*z))+R
  v
}

x.t <- 0:max(x)
y.c <- sapply(x.t, f)
lines(x.t, y.c, col='red')
print(s)

答案 2 :(得分:0)

计算机按照你的说法行事:

y~A(1-exp(-bx))+R

此处R将A(...)解释为函数,将bx解释为变量。

您想要y~A*(1-exp(-b*x))+R