首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NLS几乎符合

NLS几乎符合
EN

Stack Overflow用户
提问于 2019-04-30 20:06:38
回答 1查看 40关注 0票数 0

我在这里有点力不从心...我有这样的数据:

代码语言:javascript
复制
d <- data.frame(matrix(data = c(1,1.5,6,2,11,2.5,16,3,26,4,46,5,66,6,86,7,126,8,176,9,276,10,426,11,626,12,876,13,1176,14,1551,15,2026,16,2676,17,3451,18,4351,19,5451,20,6801,21,8501,22,10701,23),
    byrow = TRUE,
    ncol = 2
 )
)

names(d) <- c('x','y')

看起来像这样:

代码语言:javascript
复制
plot(x = d$x, 
  y = d$y, 
  pch = 19,
  col = 'grey50',
  bty = 'n'
)

现在我想用一个公式来描述X和Y之间的关系。因此,我尝试使用nls函数。如下所示:

代码语言:javascript
复制
fit <- nls(y ~ a * x ^ b, 
  start = list(a = 1, 
    b = 1), 
  data = d
)
lines(d$x, 
  predict(fit), 
  col = 'red', 
  lty = 2
)

正如您所看到的,这条线几乎是匹配的!这就是我被卡住的地方。有种感觉告诉我,这是一个完美的组合。但我不知道接下来该怎么做。可选的起始值似乎不会改变任何事情。我得到了使用lm(log(y) ~ log(x), data = d)作为启动参数的建议。但没有爱:

代码语言:javascript
复制
fit <- nls(y ~ a * x ^ b, 
  start = list(a = exp(0.3120), 
    b = 0.3883), 
  data = d
)
lines(d$x, 
  predict(fit), 
  col = 'blue', 
  lty = 2
)

我已经尝试了其他一些公式,但在这里我真的只是在摸索:

代码语言:javascript
复制
nls(y ~ a * x / (b + x), data = d)
nls(y ~ a + ((x * b) / (x + c)), start = c(a = 1, b = 10, c = 1), data = d

那么,对于如何前进,有什么建议吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-30 20:40:57

我不能完全确定,但在我看来,您的数据只是有噪声。这会让你认为你可以做得更好,但实际上可能不是。

这种噪声可以用线性化的数据更好地可视化:

代码语言:javascript
复制
# Linearize by eye
new_x = d$x^0.18

# Plot of data linearized
plot(x = new_x, 
  y = d$y, 
  pch = 19,
  col = 'grey50',
  bty = 'n'
)

# Linear regression
lin_reg = lm(d$y ~ new_x)

# Fitted 
abline(a=lin_reg$coef[1], b=lin_reg$coef[2])

注意上面和下面的点是不同的。所以你的第一个公式可能是正确的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55920621

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档