R - 非线性回归 (nls) 和多项式交互 (poly)
R - non linear regression (nls) and polynomial interactions (poly)
如果我明确定义参数(下例中的 "a" 和 "b"),我可以 运行 在 R 处进行 nls
回归。但是,我如何在 poly
函数中使用 variables/higher 递减的通用数字对 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
你可以这样做:
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)
您需要明确地将多项式项与您估计的系数(a
和 b
)相乘,就像您在第一个示例中所做的那样。你可以用矩阵乘法来做到这一点。
请注意 poly
returns 一个矩阵,其中行与您的数据对齐,列是多项式项:
> 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)))
这给出了与您的工作示例相同的答案。
如果我明确定义参数(下例中的 "a" 和 "b"),我可以 运行 在 R 处进行 nls
回归。但是,我如何在 poly
函数中使用 variables/higher 递减的通用数字对 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
你可以这样做:
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)
您需要明确地将多项式项与您估计的系数(a
和 b
)相乘,就像您在第一个示例中所做的那样。你可以用矩阵乘法来做到这一点。
请注意 poly
returns 一个矩阵,其中行与您的数据对齐,列是多项式项:
> 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)))
这给出了与您的工作示例相同的答案。