????????在研究離散變量之間的影響時,我們往往只能獲取類似中位數,平均數點來額外數據特點;但如果數據本身具有時間特性的話,我們可以嘗試運用函數型分析,將靜態的離散點轉為動態過程來分析,即若本來是分析離散點對另一個變量的影響,那么轉換后就變為研究一條曲線的變化趨勢是否對應了另一個變量的變化特點。
????????比如氣溫數據分析冰淇淋銷量時,只看離散點只能知道氣溫越高,銷量越好,但若看趨勢,很可能捕捉到在下午氣溫會比其他時候更高,賣出更多冰淇淋的特點。以下是一個例子:
library(fda)# 生成模擬數據 -------------------------------------------------
set.seed(123)
n <- 100 # 樣本量
time_points <- seq(0, 1, length.out=50) # 觀測時間點# 生成隨機溫度曲線(函數型X)
true_curve <- sin(2 * pi * time_points) * exp(-time_points)
X_curves <- t(replicate(n, true_curve + rnorm(length(time_points), sd=0.5)))# 生成產量Y(與曲線變化率相關)
# Y <- 5 * apply(X_curves, 1, function(x) sum(diff(x))) + rnorm(n, sd=2)
Y <- 5 * apply(X_curves, 1, function(x) sum(abs(diff(x)))) + rnorm(n, sd=2)
# 創建函數型數據對象
basis <- create.bspline.basis(c(0,1), nbasis=15)
X_fd <- smooth.basis(time_points, t(X_curves), basis)$fd# 函數型線性回歸
fit <- fRegress(Y ~ X_fd) # 注意這里變量名是X_fd# 預測新數據
new_curve <- true_curve + 0.3 * sin(4 * pi * time_points)
new_fd <- smooth.basis(time_points, new_curve, basis)$fdbeta_fd <- fit$betaestlist[[2]]$fd # 第1個是截距,第2個是X_fd的系數# 計算預測值:Y = 截距 + 積分(X(t) * beta(t) dt)
intercept <- fit$betaestlist[[1]]$fd$coefs # 截距項
pred_integral <- inprod(new_fd, beta_fd) # 函數內積
prediction <- intercept + pred_integralprint(paste("預測產量:", prediction))# 輸出結果
plot(new_fd, main="新溫度曲線")
print(paste("預測產量:", round(prediction, 2)))
輸出:
[1] "預測產量: 153.38"
圖像顯示溫度按照正弦曲線的趨勢波動,但在實際應用中,在畫圖時一般不推薦用標準化的時間軸,會忽略真實的現實信息,像這里便無法判斷時間段指的是一個小時還是12個小時。