【问题标题】:Fit model with custom function and parameters使用自定义函数和参数拟合模型
【发布时间】:2018-07-08 21:47:13
【问题描述】:

我想在 R 中使用稳健的非线性回归来拟合一些数据 (nlrob)。但是,我认为这个问题也应该适用于非鲁棒和/或线性方法。

我编写了一个自定义函数,该函数将因变量的值作为自变量加上一些额外参数的函数返回。我的问题是,对于每个“案例”,我可以有不同数量的额外参数。我该如何编码?

示例:

案例一

 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 的通用行?

【问题讨论】:

    标签: r generics parameters curve-fitting data-fitting


    【解决方案1】:

    系数可以是向量。例如,这里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")
    

    【讨论】:

    • 太棒了!!!这实际上有效:) 我会接受答案。但是,如果我想使用不是 M 的任何方法,这将不起作用。在这种情况下,我必须指定特定的下限和上限,但这不起作用。你有解决方法吗? (顺便问一下,有人知道最好的方法吗?)
    • 不是M的方法是什么意思?
    • 在 nlrob 上我们可以选择方法。默认情况下,它是一个 M 估计器。但是,据我所知,有更好的方法可用,例如最大修剪似然。所有这些其他方法的实现都假定用户应该提供边界,而不是定义起点。
    • 见添加部分。
    猜你喜欢
    • 2023-01-23
    • 2019-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多