使用自定义函数和参数拟合模型
Fit model with custom function and parameters
我想在 R 中使用稳健的非线性回归来拟合一些数据 (nlrob)。但是,我认为这个问题对于非稳健 and/or 线性方法也应该有效。
我写了一个自定义函数,return 因变量的值作为自变量加上一些额外参数的函数。我的问题是,对于每个 "case",我可以有不同数量的额外参数。我该如何编码?
示例:
案例 1
nlrob(y ~ f(x, p,p1),data = data1, start = c(p1 = 0 ))
案例 2
nlrob(y ~ f(x,p, p1,p2,p3),data = data2, start = c(p1 = 0,p2 = 0,p3 = 0 ))
我应该如何编写函数 f 以便它可以接收和解析 x、p 和 p* 的任意值?如何编写 nlrob 行以使其工作?换句话说,如何为任意数量的参数编写对 nlrob 和函数 f 的调用的通用行?
系数可以是向量。例如,此处 f
的 p
参数可以是长度 1 或 2:
f <- function(x, p) if (length(p) == 1) p * x else p[1] * x + p[2]
nlrob(demand ~ f(Time, p), BOD, start = list(p = 1))
nlrob(demand ~ f(Time, p), BOD, start = list(p = 1:2))
已添加:
要与 method = "tau"
一起使用,例如,定义 upper
和 lower
而不是 start
:
# lower <- 0; upper <- 10
lower <- c(0, 0); upper <- c(10, 10)
nms <- paste0("p", seq_along(upper))
names(lower) <- names(upper) <- nms
f <- function(x, ...) {
with(list(...), if (...length() == 1) p1 * x else p1 * x + p2)
}
fo <- sprintf("demand ~ f(Time, %s)", toString(paste(nms, "=", nms)))
nlrob(fo, data = BOD, lower = lower, upper = upper, method = "tau")
我想在 R 中使用稳健的非线性回归来拟合一些数据 (nlrob)。但是,我认为这个问题对于非稳健 and/or 线性方法也应该有效。
我写了一个自定义函数,return 因变量的值作为自变量加上一些额外参数的函数。我的问题是,对于每个 "case",我可以有不同数量的额外参数。我该如何编码?
示例:
案例 1
nlrob(y ~ f(x, p,p1),data = data1, start = c(p1 = 0 ))
案例 2
nlrob(y ~ f(x,p, p1,p2,p3),data = data2, start = c(p1 = 0,p2 = 0,p3 = 0 ))
我应该如何编写函数 f 以便它可以接收和解析 x、p 和 p* 的任意值?如何编写 nlrob 行以使其工作?换句话说,如何为任意数量的参数编写对 nlrob 和函数 f 的调用的通用行?
系数可以是向量。例如,此处 f
的 p
参数可以是长度 1 或 2:
f <- function(x, p) if (length(p) == 1) p * x else p[1] * x + p[2]
nlrob(demand ~ f(Time, p), BOD, start = list(p = 1))
nlrob(demand ~ f(Time, p), BOD, start = list(p = 1:2))
已添加:
要与 method = "tau"
一起使用,例如,定义 upper
和 lower
而不是 start
:
# lower <- 0; upper <- 10
lower <- c(0, 0); upper <- c(10, 10)
nms <- paste0("p", seq_along(upper))
names(lower) <- names(upper) <- nms
f <- function(x, ...) {
with(list(...), if (...length() == 1) p1 * x else p1 * x + p2)
}
fo <- sprintf("demand ~ f(Time, %s)", toString(paste(nms, "=", nms)))
nlrob(fo, data = BOD, lower = lower, upper = upper, method = "tau")