2

我已经使用 拟合了一个参数函数nls,现在我想打印出一个函数表达式,并将学习的参数替换回去。例如:

x <- runif(100, 0, 100)
m <- 13 * exp(-0.05 * x^2) + 0.1 + runif(100,0,0.1)
mod <- nls(m ~ a*exp(-b*x^2)+c, start=list(a=10,b=0.1,c=0.1))

我可以像这样提取公式和系数:

formula(mod)
# m ~ a * exp(-b * x^2) + c
coef(mod)
#           a           b           c 
# 13.00029360  0.04975388  0.14457936 

但我没有看到直接替换它们的方法。我似乎唯一能做的就是再次写出公式:

substitute(m ~ a * exp(-b * x^2) + c, as.list(round(coef(mod), 4)))
# m ~ 13.0003 * exp(-0.0498 * x^2) + 0.1446

我的最终目标是从磁盘上的 RDS 文件中读取拟合对象,并在org-mode文档nls中显示其功能表达式。

4

1 回答 1

4

这是你要找的吗?

do.call(substitute, args=list(formula(mod), as.list(round(coef(mod),4))))
# m ~ 13.0097 * exp(-0.0501 * x^2) + 0.1536

它之所以有效,是因为do.call首先计算两个参数,args然后才使用substitute()将系数替换为公式表达式。即,do.call()最终计算的表达式看起来像这样,根据需要:

as.call(list(substitute, formula(mod), as.list(round(coef(mod),4))))
# .Primitive("substitute")(m ~ a * exp(-b * x^2) + c, list(a = 13.0097, 
# b = 0.0501, c = 0.1536))
于 2013-04-16T17:42:43.440 回答