函数和列表中R中的nls函数
我正在使用一个用R语言编写的软件包来将实验数据与特定模型相匹配 我想编写自己的模型并使用相同的包(作者声称这是可能的) 因此,我正在挖掘源文件,以找到它们定义模型函数的位置。我卡住了 通过使用函数和列表中R中的nls函数,r,list,function,environment,nls,R,List,Function,Environment,Nls,我正在使用一个用R语言编写的软件包来将实验数据与特定模型相匹配 我想编写自己的模型并使用相同的包(作者声称这是可能的) 因此,我正在挖掘源文件,以找到它们定义模型函数的位置。我卡住了 通过使用nls的方式。我理解了nls如何在下面的案例中工作 x <- -(1:100)/10 y <- 100 + 10 * exp(x / 2) + rnorm(x)/2 nlmod <- nls(y ~ Const + A * exp(B * x),start=list(Const=5,A=
nls
的方式。我理解了nls
如何在下面的案例中工作
x <- -(1:100)/10
y <- 100 + 10 * exp(x / 2) + rnorm(x)/2
nlmod <- nls(y ~ Const + A * exp(B * x),start=list(Const=5,A=5,B=7))
当我跑的时候
> ~rescomp(theta = t, d = d, currModel = currModel)
要查看上面示例中的公式(Const+a*exp(B*x))。我明白了
~rescomp(theta = t, d = d, currModel = currModel)
environment: 0x000000000a7f7530
我想学习如何查看结果公式以及如何nls
数据设置为列表\环境时工作。有什么建议吗
以下是rescomp
function (theta = vector(), d = vector(), currModel = currModel,
currTheta = vector())
{
if (length(currTheta) == 0)
currTheta <- getThetaCl(theta, currModel)
groups <- currModel@groups
m <- currModel@modellist
resid <- clpindepX <- list()
nexp <- length(m)
for (i in 1:nexp) {
clpindepX[[i]] <- if (!m[[i]]@clpdep || m[[i]]@getX)
getClpindepX(model = m[[i]], theta = currTheta[[i]],
multimodel = currModel, returnX = FALSE, rawtheta = theta,
dind = 0)
else matrix()
}
for (i in 1:length(groups)) {
resid[[i]] <- residPart(model = m[[1]], group = groups[[i]],
multimodel = currModel, thetalist = currTheta, clpindepX = clpindepX,
finished = currModel@finished, returnX = FALSE, rawtheta = theta)
if (currModel@finished) {
currModel <- fillResult(group = groups[[i]], multimodel = currModel,
thetalist = currTheta, clpindepX = clpindepX,
rlist = resid[[i]], rawtheta = theta)
}
}
if (currModel@finished) {
currModel@fit@nlsres$onls$nclp <- currModel@nclp
if (currModel@optlist[[1]]@sumnls) {
if (class(currModel@fit@nlsres$onls) == "nls")
class(currModel@fit@nlsres$onls) <- "timp.nls"
else if (class(currModel@fit@nlsres$onls) == "nls.lm")
class(currModel@fit@nlsres$onls) <- "timp.nls.lm"
else class(currModel@fit@nlsres$onls) <- "timp.optim"
currModel@fit@nlsres$sumonls <- summary(currModel@fit@nlsres$onls,
currModel = currModel, currTheta = currTheta)
}
if (currModel@stderrclp) {
for (i in 1:length(groups)) {
currModel <- getStdErrClp(group = groups[[i]],
multimodel = currModel, thetalist = currTheta,
clpindepX = clpindepX, rlist = resid[[i]],
rawtheta = theta)
}
if (currModel@stderrclp) {
for (i in 1:length(groups)) {
currModel <- getStdErrClp(group = groups[[i]],
multimodel = currModel, thetalist = currTheta,
clpindepX = clpindepX, rlist = resid[[i]],
rawtheta = theta)
}
}
}
if (currModel@finished && currModel@trilinear) {
trires <- triResolve(currModel, currTheta)
currModel <- trires$currModel
currTheta <- trires$currTheta
}
if (currModel@finished && m[[1]]@mod_type == "kin") {
if (m[[1]]@fullk) {
for (i in 1:nexp) {
nocolsums <- length(m[[1]]@lightregimespec) >
0
eig <- fullKF(currTheta[[i]]@kinpar, currTheta[[i]]@kinscal,
m[[1]]@kmat, currTheta[[i]]@jvec, m[[1]]@fixedkmat,
m[[1]]@kinscalspecial, m[[1]]@kinscalspecialspec,
nocolsums)
currTheta[[i]]@eigenvaluesK <- eig$values
}
}
}
if (currModel@finished) {
return(list(currModel = currModel, currTheta = currTheta))
}
if (currModel@algorithm == "optim")
retval <- sum(unlist(resid))
else retval <- unlist(resid)
retval
}
函数(θ=向量(),d=向量(),currModel=currModel,
currteta=vector())
{
if(长度(电流)==0)
currTheta没有公式。
nls
反复向函数传递调用,该函数正在提取“currModel”和参数(可能是θ和d),这些参数将根据从rescomp
函数返回的标量最小化。您抱怨键入“rescomp”的结果“太长,无法在此处写入”这仅仅表明a)你不明白你应该编辑你的问题,而不是在评论中写出来,b)你对正在发生的事情的期望太小
以函数形式编写第一个nls问题为例:
myfunc <- function(Const,A,B,y=y,x=x) { abs(y - ( Const + A * exp(B * x)))}
myfunc putrm(list=ls())在你的示例代码中不是一个好主意。试着只键入rescomp
Senor O,我忘了删除那一行。@Ben Bolker,我已经查看了rescomp
以找到公式,但找不到它。rescomp
将函数的内容转换为函数。rescomp太长,无法在这里写入nls
只是计算rescomp
使用不同的起始变量以最小化错误。感谢您的回答,这真的很有帮助。我还添加了上面的rescomp
函数。如果您想查看驱动模型构造的公式,我建议您不能在rescomp
中找到它,而是通过剖析currModel
来找到它>-对象。我的第一个建议是尝试调用currModel$call
…如果不成功,则报告names(currModel)
和class(currModel)
的结果。
myfunc <- function(Const,A,B,y=y,x=x) { abs(y - ( Const + A * exp(B * x)))}
nlmod <- nls( ~myfunc(Const,A,B,y=y,x=x) ,start=list(Const=5,A=5,B=7))
nlmod # same results