R - 非线性回归(nls)和多项式相互作用(poly)

时间:2017-04-20 04:29:53

标签: r lazy-evaluation nls

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

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

2 个答案:

答案 0 :(得分:1)

你可以这样做:

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) 

答案 1 :(得分:1)

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

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

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

因此,不是单独使用ab,而是将它们组合成一个向量,并将100 x 2矩阵与这个2 x 1向量相乘:

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

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