【问题标题】:R - non linear regression (nls) and polynomial interactions (poly)R - 非线性回归 (nls) 和多项式交互 (poly)
【发布时间】:2017-04-20 04:29:52
【问题描述】:

如果我明确定义参数(下例中的“a”和“b”),我可以在 R 处运行 nls 回归。但是,我如何在poly 函数中使用通用变量数/更高阶数对nls 进行编码?

df <- data.frame(var1 = rnorm(100), var2 = rnorm(100))

p <- as.data.frame(poly(df$var2, degree = 2))

names(p) <- paste0("poly", names(p))

df <- cbind(df, p)

nls(var1 ~ a*poly1 + b*poly2, data = df, start = list(a = 1, b = 2))

无法像lm 函数那样尝试代码:

nls(var1 ~ poly(var2, degree = 2), data = df, start = list(a = 1, b = 2)) #=> Error

【问题讨论】:

标签: r lazy-evaluation nls


【解决方案1】:

您需要明确地将多项式项和您正在估计的系数(a 和 b)相乘,就像在第一个示例中所做的那样。你可以用矩阵乘法来做到这一点。

请注意,poly 返回一个矩阵,其中行与您的数据对齐,列是多项式项:

> dim(poly(df$var2, degree = 2))
[1] 100   2

因此,与其分别使用a 和b,不如将​​它们组合成一个向量,然后将 100 x 2 矩阵与这个 2 x 1 向量相乘:

nls(var1 ~ poly(var2, degree = 2) %*% coef, data = df,
    start = list(coef = c(a = 1, b = 2)))

这给出了与您的工作示例相同的答案。

【讨论】:

    【解决方案2】:

    你可以这样做:

    df <- data.frame(var1 = rnorm(100), var2 = rnorm(100))
    
    getPoly <- function(df, degree=2) {
        p <- poly(df$var2, degree = degree)
        colnames(p) <- paste0("poly", colnames(p))
        new_df <- cbind(df, p)
        formula_str <- paste0("var1~",paste0(paste0(letters[1:degree], "*poly", 1:degree), collapse="+"))
        return(list(df=new_df, formula_str=formula_str))
    }
    
    poly_data <- getPoly(df, 3)
    start_list <- list(a=1,b=2, c=3)
    
    nls(as.formula(poly_data$formula_str), data = poly_data$df, start = start_list) 
    

    【讨论】:

      猜你喜欢
      • 2012-07-24
      • 2020-09-19
      • 2015-06-10
      • 1970-01-01
      • 2018-12-03
      • 2021-01-29
      • 2017-02-26
      • 2017-09-04
      • 2015-01-02
      相关资源
      最近更新 更多