在r中进行非线性最小二乘拟合

在r中进行非线性最小二乘拟合,r,nls,gamma-distribution,R,Nls,Gamma Distribution,我有两个向量: y <- c(0.044924, 0.00564, 0.003848, 0.002385, 0.001448, 0.001138, 0.001025, 0.000983, 0.00079, 0.000765, 0.000721, 0.00061, 0.000606, 0.000699, 0.000883, 0.001069, 0.001226, 0.001433, 0.00162, 0.001685, 0.001604, 0.001674, 0.001706, 0.0

我有两个向量:

y <- c(0.044924, 0.00564, 0.003848, 0.002385, 0.001448, 0.001138, 
0.001025, 0.000983, 0.00079, 0.000765, 0.000721, 0.00061, 0.000606, 
0.000699, 0.000883, 0.001069, 0.001226, 0.001433, 0.00162, 0.001685, 
0.001604, 0.001674, 0.001706, 0.001683, 0.001505, 0.001497, 0.001416, 
0.001449, 0.001494, 0.001544, 0.00142, 0.001458, 0.001544, 0.001279, 
0.00159, 0.001756, 0.001749, 0.001909, 0.001885, 0.002063, 0.002265, 
0.002137, 0.002391, 0.002619, 0.002733, 0.002957, 0.003244, 0.003407, 
0.003563, 0.003889, 0.004312, 0.004459, 0.004946, 0.005248, 0.005302, 
0.00574, 0.006141, 0.006977, 0.007386, 0.007843, 0.008473, 0.008949, 
0.010164, 0.010625, 0.011279, 0.01191, 0.012762, 0.014539, 0.01477)

x <- 0:68
我输入的参数是我知道的接近预期值的参数。有人知道我做错了什么吗

我已经尝试了参数
a
b
k
的各种初始值,但我总是得到某种错误。

使用
optim()
。您必须创建一个函数,该函数以a、b和k作为输入(收集为向量),并返回平方误差作为结果:

func <-function(pars) {
  a <- pars["a"]
  b <- pars["b"]
  k <- pars["k"]
  fitted <- (a*b*exp(b*x)*k)/((k*b)+(a*(exp(b*x)-1)))
  sum((y-fitted)^2)  
  } 

func当我将起始曲线与点进行比较时,例如使用
plot(x,y);行((a*b*exp(b*x)*k)/(k*b)+(a*(exp(b*x)-1)),col=“red”)
,看起来并没有那么相似-尤其是0附近的凹凸未被表示。为什么您相信数据可以通过该曲线拟合,并且参数值很接近?我支持@DavidRobinson。你所用的方程似乎无法拟合一条向上翻转的抛物线。我使用了你的方程和一系列的起始值,唯一的曲线在x小于10和x大于60的情况下是奇怪的,带有锐角。非常感谢@DavidRobinson和Jean V.Adams。我同意你们两个。在这种情况下,y=死亡率,x=年龄,模型使用的是混合分布(脆弱模型)<代码>(a*b*exp(b*x)*k)/(k*b)+(a*(exp(b*x)-1))
它的伽马分布以Gompertz为基线危险。我怎么才能找到合适的呢?我需要你的帮助。非常感谢你
func <-function(pars) {
  a <- pars["a"]
  b <- pars["b"]
  k <- pars["k"]
  fitted <- (a*b*exp(b*x)*k)/((k*b)+(a*(exp(b*x)-1)))
  sum((y-fitted)^2)  
  } 
result <- optim(c(a=0.00012, b=0.08436, k=0.21108), func)
plot(x, y)
a <- result$par["a"]
b <- result$par["b"]
k <- result$par["k"]
lines((a*b*exp(b*x)*k)/((k*b)+(a*(exp(b*x)-1))), col = "blue")