如何在 r 中为 nls 函数指定数据范围?

How to specify data range for nls function in r?

我很抱歉可能是一个微不足道的问题,但不幸的是我还没有找到解决方案。这是我的问题...

我创建了一个函数 bm6,它有 3 个未知参数(a、l、p),我想用它来近似测量数据,这些数据在数据帧 zz 中找到。为了拟合,我在 r.

中使用了 nls 模型

nls(zz$tuReMa~bm6(zz$Time, t0=30, tau=10, a, l, p), data=zz, start=list(a=0.01, l=0.01, p=0.1))

模型收敛于整个数据范围,即从第 1 行到第 100 行,并产生搜索到的参数。 数据和拟合图: https://i.stack.imgur.com/iOn5q.png

现在我想指定我的数据范围,这样 nls 模型将只获取第 7 行和第 37 行之间的数据。你怎么做到的?我已经尝试了一些东西但没有成功。

  1. nls(zz$tuReMa[7:37]~bm6(zz$Time[7:37], t0=30, tau=10, a, l, p), data=zz, start=list(a=0.01, l=0.01, p=0.1))

    • 后者在 lm 模型中工作正常
  2. 其他数据参数data=list(zz$Time[7:37],zz$tuReMa[7:37])

  3. 带子集参数 subset = c(7:37)

也可以使用 7:37 中的值创建一个新的数据框,然后在新的数据框上应用 nls 模型,但我希望它也能顺利完成。

附加数据:

bm6 <- function(t, t0=30, tau=10, a, l, p) {
  ifelse(t<=(tau+t0), 1+a/(p-l)*(exp(-l*(t-t0))/l*(exp(l*(t-t0))-1)-exp(-p*(t-t0))/p*(exp(p*(t-t0))-1)), 
         1+a/(p-l)*(exp(-l*(t-t0))/l*(exp(l*tau)-1)-exp(-p*(t-t0))/p*(exp(p*tau)-1)))
} 

数据

structure(list(Time = c(0, 5.01, 10.01, 15.02, 20.02, 25.03, 
30.03, 35.04, 40.04, 45.05, 50.05, 55.05, 60.06, 66.07, 71.07, 
76.08, 81.08, 86.09, 91.09, 96.1, 101.1, 106.11, 111.11, 116.12, 
121.12, 126.13, 131.13, 136.14, 142.14, 147.15, 152.15, 157.16, 
162.16, 167.17, 172.17, 177.18, 182.18, 187.19, 192.19, 197.2, 
202.2, 207.21, 213.21, 218.22, 223.22, 228.23, 233.23, 238.24, 
243.24, 248.25, 253.25, 258.26, 263.26, 268.27, 273.27, 278.28, 
284.29, 289.29, 294.29, 299.3, 304.3, 309.31, 314.31, 319.32, 
324.32, 329.33, 334.34, 339.34, 344.34, 349.35, 355.36, 360.36, 
365.36, 370.37, 375.38, 380.38, 385.39, 390.39, 395.39, 400.4, 
405.41, 410.41, 415.41, 420.42, 426.43, 431.43, 436.43, 441.44, 
446.45, 451.45, 456.46, 461.46, 466.46, 471.47, 476.48, 481.48, 
486.48, 491.49, 497.5, 502.5), tu = c(24.8, 16.4, 24.1, 25.8, 
20.2, 21, 18.6, 11.8, 21.1, 66.8, 67.4, 72.5, 73.3, 71.6, 72, 
65.5, 67.8, 57.1, 61.5, 58.6, 55.9, 60.2, 54.1, 54.6, 52.7, 54.3, 
49.8, 49.4, 54.8, 49, 52.4, 50.8, 45.9, 48.4, 48.1, 48.1, 50.5, 
44.2, 42.9, 47.3, 51.7, 46.1, 46.9, 44.6, 46.1, 48, 43.2, 38.5, 
49.7, 47, 46.9, 51.8, 45, 46.7, 45.8, 39.8, 43.8, 43.3, 45.5, 
45.3, 45.9, 38.9, 44.4, 40.8, 40.5, 39.8, 43, 38, 44.7, 42.1, 
43, 39.4, 36.6, 44.9, 42.8, 37.2, 41.7, 41.8, 34.7, 44.4, 43.8, 
44.7, 44.6, 46.5, 49.7, 42, 36.3, 43.5, 43.7, 41.7, 39.3, 42.5, 
45.4, 37.6, 46, 38.5, 39.6, 37.7, 37.9, 39.9), mu = c(26.64, 
27.16, 23.43, 24.35, 24.79, 25.4, 25.27, 23.61, 25.36, 27.47, 
30.17, 29.94, 28.06, 32.19, 30.96, 35.87, 32.48, 32.41, 33.09, 
35.4, 33.68, 33.5, 32.83, 34.19, 32.25, 34.76, 33.69, 33.03, 
35.09, 37.13, 36.64, 33.51, 32.91, 33.56, 34.78, 36.06, 33.74, 
32.87, 35.57, 36.17, 35.52, 34.43, 33.85, 33.93, 36.69, 34.77, 
34.14, 33.46, 34.14, 34.5, 33.03, 33.69, 33.02, 34.23, 33.22, 
35.46, 34.28, 31.87, 32.91, 34.25, 33.75, 33.66, 31.08, 32.72, 
36.13, 35.3, 32.37, 31.25, 32.98, 34, 34.3, 33.69, 32.33, 33.01, 
36.03, 31.59, 34.09, 30.76, 31.8, 32.93, 35.32, 33.69, 31.58, 
33.99, 33.67, 33.89, 32.99, 31.17, 32.08, 33.42, 33.91, 34.36, 
31.96, 33.27, 31.9, 33.7, 33.16, 30.01, 32.04, 33.59), tuRE = c(1.15043074884029, 
0.76076872100729, 1.11795891318754, 1.19681908548708, 0.937044400265076, 
0.974155069582505, 0.862823061630219, 0.547382372432074, 0.978793903247184, 
3.0987408880053, 3.12657388999337, 3.36315440689198, 3.40026507620941, 
3.32140490390987, 3.33996023856859, 3.03843605036448, 3.14512922465209, 
2.64877402253148, 2.85288270377734, 2.71835652750166, 2.59310801855533, 
2.79257786613651, 2.50960901259112, 2.53280318091451, 2.44466534128562, 
2.51888667992048, 2.31013916500994, 2.29158383035123, 2.54208084824387, 
2.27302849569251, 2.43074884029158, 2.35652750165673, 2.12922465208747, 
2.24519549370444, 2.2312789927104, 2.2312789927104, 2.34261100066269, 
2.05036447978794, 1.99005964214712, 2.19416832339298, 2.39827700463883, 
2.13850231941683, 2.17561298873426, 2.06891981444665, 2.13850231941683, 
2.22664015904573, 2.00397614314115, 1.78595096090126, 2.30550033134526, 
2.18025182239894, 2.17561298873426, 2.40291583830351, 2.08747514910537, 
2.1663353214049, 2.1245858184228, 1.84625579854208, 2.03180914512922, 
2.00861497680583, 2.11066931742876, 2.1013916500994, 2.12922465208747, 
1.80450629555997, 2.0596421471173, 1.89264413518887, 1.87872763419483, 
1.84625579854208, 1.9946984758118, 1.76275679257787, 2.07355864811133, 
1.95294897282969, 1.9946984758118, 1.82770046388337, 1.69781312127237, 
2.08283631544069, 1.98542080848244, 1.72564612326044, 1.93439363817097, 
1.93903247183565, 1.60967528164347, 2.0596421471173, 2.03180914512922, 
2.07355864811133, 2.06891981444665, 2.15705765407555, 2.30550033134526, 
1.94831013916501, 1.68389662027833, 2.01789264413519, 2.02717031146455, 
1.93439363817097, 1.82306163021869, 1.9715043074884, 2.10603048376408, 
1.74420145791915, 2.13386348575215, 1.78595096090126, 1.83697813121272, 
1.74884029158383, 1.75811795891319, 1.85089463220676), tuMA = c(24.8, 
20.6, 21.7666666666667, 22.775, 22.2733333333333, 21.8533333333333, 
20.8866666666667, 17.5066666666667, 18.0466666666667, 34.1333333333333, 
47.3133333333333, 59.1, 67.56, 71.3533333333333, 71.9133333333333, 
69.96, 68.9, 64.5866666666667, 62.82, 60.76, 58.6933333333333, 
58.7, 57.18, 56.0266666666667, 54.7, 54.3, 52.5066666666667, 
51.2733333333333, 52.1533333333333, 51.0866666666667, 51.4, 51.3066666666667, 
49.5133333333333, 48.7866666666667, 48.3866666666667, 48.0466666666667, 
48.7933333333333, 47.46, 45.8066666666667, 45.9866666666667, 
47.6866666666667, 47.28, 47.4333333333333, 46.64, 46.2333333333333, 
46.54, 45.4933333333333, 43.0733333333333, 44.9466666666667, 
45.58, 46.12, 48.3666666666667, 47.7733333333333, 47.3133333333333, 
46.7533333333333, 44.2733333333333, 43.6, 43.2933333333333, 43.8333333333333, 
44.3866666666667, 45.1733333333333, 43.22, 43.4266666666667, 
42.36, 41.5066666666667, 40.74, 41.4466666666667, 40.2133333333333, 
41.64, 41.94, 42.4333333333333, 41.5133333333333, 39.9, 41.1466666666667, 
41.68, 40.3, 40.8066666666667, 41.1933333333333, 38.8666666666667, 
40.4533333333333, 41.7333333333333, 42.8733333333333, 43.78, 
45.1333333333333, 46.7666666666667, 45.48, 42.4133333333333, 
42.3066666666667, 42.34, 41.8933333333333, 41.18, 41.7133333333333, 
42.8, 41.16, 42.7266666666667, 41.5066666666667, 40.7066666666667, 
39.4666666666667, 38.8066666666667, 38.7933333333333), tuReMa = c(1.15043074884029, 
0.955599734923791, 1.00971946101171, 1.05649436713055, 1.03322288491275, 
1.0137397835211, 0.968897724762536, 0.812105146896399, 0.837154848685664, 
1.58338855754363, 2.19478683454827, 2.74155069582505, 3.13399602385686, 
3.309962447537, 3.3359399160592, 3.24532803180915, 3.19615639496355, 
2.99606803622708, 2.91411530815109, 2.81855533465871, 2.72268610558869, 
2.72299536116634, 2.65248508946322, 2.59898387453059, 2.53744201457919, 
2.51888667992048, 2.43569692953391, 2.37848464766954, 2.41930638391871, 
2.36982549149547, 2.3843605036448, 2.38003092555776, 2.2968411751712, 
2.26313231720786, 2.24457698254915, 2.22880494808924, 2.26344157278551, 
2.20159045725646, 2.12489507400044, 2.13324497459686, 2.2121051468964, 
2.19324055666004, 2.20035343494588, 2.1635520212061, 2.14468743096974, 
2.15891318754142, 2.11036006185112, 1.99810028716589, 2.08500110448421, 
2.1143803843605, 2.13943008614977, 2.24364921581621, 2.21612546940579, 
2.19478683454827, 2.16880936602607, 2.05376629114204, 2.02253147779987, 
2.00830572122819, 2.03335542301745, 2.05902363596201, 2.09551579412414, 
2.00490390987409, 2.01449083278109, 1.96500994035785, 1.92542522641926, 
1.88986083499006, 1.92264192622046, 1.86542964435609, 1.93161033797217, 
1.9455268389662, 1.96841175171195, 1.92573448199691, 1.85089463220676, 
1.90872542522642, 1.93346587143804, 1.86944996686547, 1.89295339076651, 
1.91089021426994, 1.80296001767175, 1.87656284515131, 1.9359399160592, 
1.98882261983654, 2.03088137839629, 2.09366026065827, 2.16942787718136, 
2.10974155069583, 1.96748398497901, 1.96253589573669, 1.96408217362492, 
1.94336204992269, 1.91027170311465, 1.93501214932626, 1.98542080848244, 
1.90934393638171, 1.98201899712834, 1.92542522641926, 1.88831455710183, 
1.83079301965982, 1.80017671747294, 1.79955820631765)), row.names = c(NA, 
-100L), class = "data.frame")

非常感谢您提供解决方案。

nls 本身有一个 subset 参数,例如使用内置 CO2 data.frame 这仅使用前 10 行:

nls(uptake ~ a + b * conc, CO2, start = list(a = 0, b = 1), subset = 1:10)

已添加

关于完全呈现问题的变化,问题是

  • zz 不应该是公式的一部分
  • 需要更好的起始值
  • c(7:37) 等同于 7:37c 是多余的。

去掉zz,用全优化的结果开始子集问题:

fm0 <- nls(tuReMa ~ bm6(Time, t0=30, tau=10, a, l, p), data=zz, 
   start=list(a=0.01, l=0.01, p=0.1)); 

fm <- nls(tuReMa~bm6(Time, t0=30, tau=10, a, l, p), data=zz, 
   start=coef(fm0), subset = 7:37)

fm

给予:

Nonlinear regression model
  model: tuReMa ~ bm6(Time, t0 = 30, tau = 10, a, l, p)
   data: zz
       a        l        p 
0.014206 0.007979 0.049172 
 residual sum-of-squares: 1.678

Number of iterations to convergence: 23 
Achieved convergence tolerance: 9.615e-06