2017-04-20 145 views
1

如果我明確定義參數(下例中的「a」和「b」),我可以在R處運行nls迴歸。然而,我怎樣才能在poly函數中用nls代入一般變量/更高的增量?R - 非線性迴歸(nls)和多項式相互作用(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 
+0

這基本上是在https://stackoverflow.com/questions/3643606/r-polynomial-shortcut-notation-in-nls-formula中提出的問題(它沒有直接的答案) – Frank

回答

1

你需要明確乘多項式條款和你估計的係數(ab),就像你在第一個例子中所做的那樣。你可以用矩陣乘法來做到這一點。

注意poly返回一個矩陣,其中的行線向上與您的數據和列是多項式的項:

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

因此,而不是ab工作分開,將它們組合成一個向量並用這個2×1向量乘以100×2矩陣:

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

這給出了與你的工作示例相同的答案。

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)