【问题标题】:error with nls function in r with almost the same datar中的nls函数错误,数据几乎相同
【发布时间】:2015-03-12 23:09:06
【问题描述】:

我有两个数据非常相似的表,我想拟合一个模型:

###first data
x1 <- c(0.271237802,0.253595465,0.299072793,0.355537802,  
0.335295465,0.365922793,0.476437802,0.464095465,0.482172793)  

y1 <- c(0.039937,0.044174,0.062574,0.124286,  
0.108702,0.131217,0.213418,0.216699,0.253712)

####second data
x2 <- c(0.285180641,0.289818303,0.27255962,0.373530641,  
0.356768303,0.34930962,0.463880641,0.471668303,0.46330962)

y2 <- c(0.0499,0.063764,0.05343,0.147753,  
0.14148,0.135757,0.220635,0.245013,0.236258)

####nls.model
fo1 = nls(y1~A*(x1-v)^k, start=list(A=1, v=0.15, k=1))
coef(fo1)
summary(fo1)

fo2 = nls(y2~A*(x2-v)^k, start=list(A=1, v=0.15, k=1))
coef(fo2)
summary(fo2)

####plotting data
s <- seq(from = 0, to = 1, length = 50)
plot(y1~x1, ylab = "D/D0", xlab = "LP(%)", pch = 16, xlim=c(0,0.6), ylim=c(0,0.4), col="blue")
lines(s, predict(fo1, list(x1 = s)), col = "blue")

par(new=T)

plot(y2~x2, ylab = "D/D0", xlab = "LP(%)", pch = 16, xlim=c(0,0.6), ylim=c(0,0.4), axes=F,col="red")

在第一种情况下,模型运行良好,但在第二种情况下,它失败并给出消息:

 fo2 = nls(y2~A*((x2-v)^(k)), start=list(A=1, v=0.15, k=1))
Error in numericDeriv(form[[3L]], names(ind), env) : 
  Missing value or an Infinity produced when evaluating the model 

虽然数据显示几乎是线性关系,但我想使用 nls 和建议的函数,因为线性并不总是正确的。
我知道,它可能与起始值有关,但是我无法解决这个问题。有人知道吗?

【问题讨论】:

  • 您可以尝试使用minpack.lm 包中的nlsLM。 (PS:您在定义x2 的行上缺少右括号。)
  • 好的,谢谢!那行得通。但是我不明白为什么“正常”nls 会给我一个错误。 (PS:我加了括号,谢谢)

标签: r nls


【解决方案1】:

x2-v 必须为非负数,因此请尝试此操作,只要不受约束的最小值满足 v 小于 min(x2),就可以避免错误。

nls(y2 ~ A * pmax(x2-v, 0)^k, start = list(A = 1, v = 0.15, k = 1))

如果v在最优时不小于min(x2),那么修改后的模型是否仍然可以接受的问题。

另一种可能性是将 v 限制为小于 min(x2) 。例如:

nls(y2 ~ A * pmax(x2-v, 0)^k + 1000 * (v > min(x2)), start = list(A = 1, v = 0.15, k = 1))

或使用约束优化例程。

【讨论】:

  • 就是这样!非常感谢!
猜你喜欢
  • 2013-12-05
  • 1970-01-01
  • 2018-03-04
  • 1970-01-01
  • 2013-02-08
  • 2019-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多