當前位置: 華文世界 > 科技

多項式回歸分析-R語言

2024-08-27科技

Excel裏面就不太適合做多項式回歸了,雖然可以透過散點圖進行添加趨勢線擬合結果,但是無法判定模型參數的好壞,以及如何選擇項數。所以就最好使用程式語言來實作。昨天使用Python實作了,今天補充R語言版本。

多項式回歸是一種回歸分析方法,它透過使用多項式函數來擬合自變量(輸入)和因變量(輸出)之間的關系。在多項式回歸中,假設自變量和因變量之間的關系可以用一個多項式函數來近似表示。多項式回歸的一般形式如下:

其中,y是因變量,x是自變量,β0,β1,…,βn 是回歸系數,ϵ 是誤差項。

【多項式回歸的優點和缺點】

優點:

  1. 靈活性:可以擬合復雜的數據模式,包括非線性關系。
  2. 易於理解和實作:多項式回歸模型相對簡單,易於解釋和實作。

缺點:

  1. 過擬合風險:高階多項式可能導致模型在訓練數據上過度擬合,而在新數據上表現不佳。
  2. 計算復雜度:隨著多項式階數的增加,計算復雜度增加。

【使用R語言進行多項式回歸模擬】

首先進行數據的生成,為了使用方便,這裏就直接在軟件裏面模擬數據了↓

# 設定隨機數種子以確保可重復性set.seed(21)# 生成自變量xx <- runif(100, min = -10, max = 10)# 生成因變量y,假設y與x的關系為二次多項式y <- 2 + 3*x - 0.5*x^2 + rnorm(100, mean = 0, sd = 5)# 將數據儲存在數據框中data <- data.frame(x = x, y = y)

先簡單繪制一下圖形,看一下整體的分布情況↓

# 繪制數據分布圖plot(data$x, data$y, main = "廣告支出 vs 銷售額", xlab = "廣告支出", ylab = "銷售額", pch = 19, col = "blue")

從圖形上看,不是直線的相關關系,所以不能直接使用一元線形回歸。然後是模型的擬合,還是使用ml函數就行,只是參數需要改成多項,我們這裏不知道實際情況的情況下,先使用3次項看一下結構↓

# 擬合二次多項式回歸模型model <- lm(y ~ poly(x, 3), data = data)# 檢視模型摘要summary(model)

Call:lm(formula = y ~ poly(x, 3), data = data)Residuals: Min 1Q Median 3Q Max -13.4946 -3.2138 0.0554 3.6756 9.0921 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) -13.6000 0.4906 -27.719 <2e-16 ***poly(x, 3)1 166.6193 4.9063 33.960 <2e-16 ***poly(x, 3)2 -149.2056 4.9063 -30.411 <2e-16 ***poly(x, 3)3 6.8565 4.9063 1.397 0.165 ---Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1Residual standard error: 4.906 on 96 degrees of freedomMultiple R-squared: 0.9559, Adjusted R-squared: 0.9545 F-statistic: 693.4 on 3 and 96 DF, p-value: < 2.2e-16

【關鍵評估參數】

殘留誤差標準誤差(Residual Standard Error): 這是模型殘留誤差的均方根誤差,用於衡量模型預測值與實際觀測值之間的平均差異。值越小,表示模型擬合越好。這裏只有4.096,模型擬合效果還不錯;

Multiple R-squared: 決定系數,表示模型解釋的變異占總變異的比例。值介於0和1之間,越接近1,表示模型解釋能力越強;這裏是0.9559,已經是非常好的效果了;

Adjusted R-squared: 調整後的決定系數,考慮了模型中參數的數量。當添加不重要的變量時,R-squared可能增加,但Adjusted R-squared可能減少。這裏結果是0.9545,仍然是非常好的結果;

F-statistic: 用於檢驗模型整體顯著性的統計量。如果p值(Pr(>F))小於顯著性水平(通常為0.05),則拒絕原假設,認為模型整體顯著。這裏p值是2.2e-16,模型整體顯著;

Coefficients: 模型中每個參數的估計值、標準誤差、t值和p值。t值用於檢驗參數是否顯著不為零,p值用於判斷參數的顯著性。通常,p值小於0.05表示參數顯著。這裏截距,1,2項都非常顯著,但是3項不顯著,模型參數還有待調整。

【確定最佳多項式次數】

確定最佳多項式次數通常涉及交叉驗證或使用資訊準則(如AIC或BIC)。以下是使用交叉驗證確定最佳多項式次數的程式碼↓

# 使用交叉驗證確定最佳多項式次數library(boot)# 定義交叉驗證函數cv_error <- function(formula, data, deg, K = 10) { model <- glm(formula, data = data) return(cv.glm(data, model, K = K)$delta[1])}# 計算不同多項式次數的交叉驗證誤差cv_errors <- sapply(1:10, function(deg) { formula <- as.formula(paste("y ~ poly(x,", deg, ")", sep = "")) return(cv_error(formula, data, deg))})# 找到最小交叉驗證誤差對應的多項式次數best_deg <- which.min(cv_errors)# 打印結果print(paste("Best polynomial degree is", best_deg))

"Best polynomial degree is 2"

最後模型在1-10項之間,得出的結果是2,這也和我們模擬的次數是一樣的。為了更直觀,我們把每一次擬合的結果都存下來↓

# 建立一個數據框來儲存每個多項式次數的模型參數coefficients_table <- data.frame(Degree = integer(0), Coefficients = character(0))# 計算不同多項式次數的交叉驗證誤差和模型參數for (deg in 1:10) { formula <- as.formula(paste("y ~ poly(x,", deg, ")", sep = "")) model <- glm(formula, data = data) # 獲取模型參數 coefficients <- coef(model) coefficients <- coefficients[2:(deg + 1)] # 去除截距項 # 儲存結果 coefficients_table[deg, "Degree"] <- deg coefficients_table[deg, "Coefficients"] <- paste(round(coefficients, 2), collapse = ", ")}

結果就是2次項的時候最優,然後進行視覺化展示,把10次結果都進行擬合看一下↓

par(mfrow = c(2, 5)) # 設定圖形布局為2行5列for (deg in 1:10) { formula <- as.formula(paste("y ~ poly(x,", deg, ")", sep = "")) model <- glm(formula, data = data) x_pred <- seq(min(x), max(x), length.out = 100) y_pred <- predict(model, newdata = data.frame(x = x_pred)) plot(x, y, main = paste("Degree =", deg), xlab = "x", ylab = "y", col = "blue", pch = 19) lines(x_pred, y_pred, col = "red", lwd = 2)}

最後可以對新的數據進行預測,並繪制預測結果圖↓

# 生成x的預測值x_pred <- seq(min(x), max(x), length.out = 100)y_pred <- predict(model, newdata = data.frame(x = x_pred))# 繪制原始數據和模型預測值plot(x, y, main = "Polynomial Regression", xlab = "x", ylab = "y", col = "blue", pch = 19)lines(x_pred, y_pred, col = "red", lwd = 2)legend("topleft", legend = c("Original Data", "Polynomial Regression"), col = c("blue", "red"), pch = c(19, NA), lty = c(NA, 1))

連結是我使用PowerBI整合的歷史文章,按類別分類,可以根據需求查詢:Microsoft Power BI↓

https://app.powerbi.com/view?r=eyJrIjoiNjI2NWQ3NjktYjU0ZC00ZWZhLTgzMDgtMGI4ZTk1ZDlkODM3IiwidCI6IjI3NDQ3MWQ0LTM4ZDQtNDVlZS1hMmJkLWU1NTVhOTBkYzM4NiJ9

End