NLS几乎适合

时间:2019-04-30 12:06:38

标签: r nls

我在这里有点深了……我有以下数据:

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')

看起来像这样:

plot(x = d$x, 
  y = d$y, 
  pch = 19,
  col = 'grey50',
  bty = 'n'
)

现在,我想用公式描述X和Y之间的关系。因此,我尝试了nls函数。像这样:

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)作为起始参数。但是没有爱:

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
)

我尝试了其他一些公式,但实际上我只是在黑暗中拍摄:

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

那么,关于前进的任何建议?

1 个答案:

答案 0 :(得分:0)

我不确定,但是在我看来您的数据只是杂乱无章。它使您认为自己可以做得更好,但实际上可能做不到。

使用线性化数据可以更好地可视化此噪声:

# 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])

enter image description here

请注意以上和以下各点。因此,您的第一个公式可能是正确的。