R语言无法将外部定义变量传入nls_multstart拟合函数的问题
问题原因与解决方法
报错原因
nls_multstart函数在解析拟合公式时,会将所有不在传入的data数据框中的变量,全部识别为需要拟合的未知参数。
你在外部定义的t0和conc两个固定参数,既没有包含在data_to_fit里,也没有直接写在公式中,因此函数会将这两个变量也判定为待拟合参数,加上原本的4个拟合参数总共有6个,但你提供的start_lower、start_upper都只有4组边界值,自然就会触发「参数数量与起始边界数量不匹配」的报错:
'Error in nls.multstart::nls_multstart(y ~ fit_drx_mono(assoc_time, t0, : There must be as many parameter starting bounds as there are parameters'
而你直接把两个值写在公式内部时,函数会识别为固定数值,不会当成待拟合参数,所以能正常运行。
解决方法
- 方法1:将固定参数加入拟合数据集
给data_to_fit新增对应固定值的列,函数会直接从数据集读取这两个值,不会判定为拟合参数:conc <- 5e-9 t0 <- 127 # 新增固定值列,所有行取值一致即可 data_to_fit$conc <- conc data_to_fit$t0 <- t0 nls.multstart::nls_multstart(y ~ fit_mono(assoc_time, t0, conc, kon, koff, ampon, ampoff), data = data_to_fit, iter = 100, start_lower = c(kon = 1e4, koff = 0.00001, ampon = 0.05, ampoff = 0), start_upper = c(kon = 1e7, koff = 0.5, ampon = 0.6, ampoff = 0.5), lower = c(kon = 0, koff = 0, ampon = 0, ampoff = 0)) - 方法2:将固定参数值嵌入公式字符串
通过字符串格式化直接把固定值写入公式,和你直接在内部写值的效果完全一致:conc <- 5e-9 t0 <- 127 # 构造嵌入固定值的拟合公式 fit_formula <- as.formula( sprintf("y ~ fit_mono(assoc_time, %.f, %.e, kon, koff, ampon, ampoff)", t0, conc) ) nls.multstart::nls_multstart(fit_formula, data = data_to_fit, iter = 100, start_lower = c(kon = 1e4, koff = 0.00001, ampon = 0.05, ampoff = 0), start_upper = c(kon = 1e7, koff = 0.5, ampon = 0.6, ampoff = 0.5), lower = c(kon = 0, koff = 0, ampon = 0, ampoff = 0)) - 方法3:使用
rlang包构建带环境的公式(适合参数动态变化的场景)
把固定参数绑定到公式的环境中,函数会从绑定的环境读取固定值,不会识别为拟合参数:library(rlang) conc <- 5e-9 t0 <- 127 # 构建绑定当前环境变量的公式 fit_formula <- new_formula( lhs = expr(y), rhs = expr(fit_mono(assoc_time, !!t0, !!conc, kon, koff, ampon, ampoff)) ) # 后续调用逻辑和上面一致
内容的提问来源于stack exchange,提问作者Tomáš Kroupa
相关产品推荐
相关产品推荐

