## 14.4“預測”的真正含義是什么?
當我們談論日常生活中的“預測”時,我們通常指的是在看到數據之前估計某個變量值的能力。然而,該術語通常在線性回歸的背景下用于指模型與數據的擬合;估計值()有時被稱為“預測”,獨立變量被稱為“預測”。這有一個不幸的含義,因為它意味著我們的模型還應該能夠預測未來新數據點的值。實際上,模型與用于獲取參數的數據集的匹配幾乎總是優于模型與新數據集的匹配(copas 1983)。
作為一個例子,讓我們從 NHANES 中選取 48 名兒童為樣本,并擬合一個體重回歸模型,該模型包括幾個回歸因子(年齡、身高、看電視和使用電腦的時間以及家庭收入)及其相互作用。
```r
# create dataframe with children with complete data on all variables
NHANES_child <-
NHANES %>%
drop_na(Height, Weight, TVHrsDayChild, HHIncomeMid, CompHrsDayChild, Age) %>%
dplyr::filter(Age < 18)
```
```r
# create function to sample data and compute regression on in-sample and out-of-sample data
get_sample_predictions <- function(sample_size, shuffle = FALSE) {
# generate a sample from NHANES
orig_sample <-
NHANES_child %>%
sample_n(sample_size)
# if shuffle is turned on, then randomly shuffle the weight variable
if (shuffle) {
orig_sample$Weight <- sample(orig_sample$Weight)
}
# compute the regression line for Weight, as a function of several
# other variables (with all possible interactions between variables)
heightRegressOrig <- lm(
Weight ~ Height * TVHrsDayChild * CompHrsDayChild * HHIncomeMid * Age,
data = orig_sample
)
# compute the predictions
pred_orig <- predict(heightRegressOrig)
# create a new sample from the same population
new_sample <-
NHANES_child %>%
sample_n(sample_size)
# use the model fom the original sample to predict the
# Weight values for the new sample
pred_new <- predict(heightRegressOrig, new_sample)
# return r-squared and rmse for original and new data
return(c(
cor(pred_orig, orig_sample$Weight)**2,
cor(pred_new, new_sample$Weight)**2,
sqrt(mean((pred_orig - orig_sample$Weight)**2)),
sqrt(mean((pred_new - new_sample$Weight)**2))
))
}
```
```r
# implement the function
sim_results <-
replicate(100, get_sample_predictions(sample_size = 48, shuffle = FALSE))
sim_results <-
t(sim_results) %>%
data.frame()
mean_rsquared <-
sim_results %>%
summarize(
rmse_original_data = mean(X3),
rmse_new_data = mean(X4)
)
pander(mean_rsquared)
```
<colgroup><col style="width: 29%"> <col style="width: 20%"></colgroup>
| RMSE_ 原始數據 | RMSE_ 新數據 |
| --- | --- |
| 2.97 條 | 25.72 美元 |
在這里,我們看到,雖然模型與原始數據相匹配顯示出非常好的擬合(每個人只減去幾磅),但同一個模型在預測從同一人群中抽樣的新兒童的體重值(每個人減去 25 磅以上)方面做得更差。這是因為我們指定的模型非常復雜,因為它不僅包括每個單獨的變量,而且還包括它們的所有可能組合(即它們的 _ 交互 _),從而產生一個具有 32 個參數的模型。由于這幾乎和數據點一樣多的系數(即 48 個孩子的身高),模型 _ 對數據進行了過度擬合 _,就像我們在[5.4 節](#overfitting)中最初的過度擬合示例中的復雜多項式曲線一樣。
另一種觀察過度擬合效果的方法是觀察如果我們隨機地改變權重變量的值會發生什么。隨機改變該值應該使得無法從其他變量預測權重,因為它們不應該有系統的關系。
```r
print("using shuffled y variable to simulate null effect")
```
```r
## [1] "using shuffled y variable to simulate null effect"
```
```r
sim_results <-
replicate(100, get_sample_predictions(sample_size = 48, shuffle = TRUE))
sim_results <-
t(sim_results) %>%
data.frame()
mean_rsquared <-
sim_results %>%
summarize(
rmse_original_data = mean(X3),
rmse_new_data = mean(X4)
)
pander(mean_rsquared)
```
<colgroup><col style="width: 29%"> <col style="width: 20%"></colgroup>
| rmse_original_data | rmse_new_data |
| --- | --- |
| 7.56 條 | 第 60.1 條 |
這向我們表明,即使沒有真正的關系需要建模(因為疏解應該消除了關系),復雜的模型在預測中仍然顯示非常低的錯誤,因為它適合特定數據集中的噪聲。然而,當該模型應用于一個新的數據集時,我們會發現錯誤要大得多,這是應該的。
### 14.4.1 交叉驗證
為了幫助解決過擬合問題而開發的一種方法是 _ 交叉驗證 _。這種技術通常用于機器學習領域,該領域的重點是構建能夠很好地概括為新數據的模型,即使我們沒有新的數據集來測試模型。交叉驗證背后的想法是,我們反復地適應我們的模型,每次都會遺漏數據的一個子集,然后測試模型預測每個被保留的子集中值的能力。

圖 14.9 交叉驗證程序示意圖。
讓我們看看這對于我們的重量預測示例是如何工作的。在這種情況下,我們將執行 12 倍交叉驗證,這意味著我們將把數據分成 12 個子集,然后將模型擬合 12 次,在每種情況下,去掉其中一個子集,然后測試模型準確預測所持有的因變量值的能力。-找出數據點。R 中的`caret`包使我們能夠輕松地跨數據集運行交叉驗證:
```r
# create a function to run cross-validation
# returns the r-squared for the out-of-sample prediction
compute_cv <- function(d, nfolds = 12) {
# based on https://quantdev.ssri.psu.edu/tutorials/cross-validation-tutorial
train_ctrl <- trainControl(method = "cv", number = nfolds)
model_caret <- train(
Weight ~ Height * TVHrsDayChild * CompHrsDayChild * HHIncomeMid * Age,
data = d,
trControl = train_ctrl, # folds
method = "lm"
) # specifying regression model
r2_cv <- mean(model_caret$resample$Rsquared)
rmse_cv <- mean(model_caret$resample$RMSE)
return(c(r2_cv, rmse_cv))
}
```
使用此函數,我們可以對來自 nhanes 數據集的 100 個樣本運行交叉驗證,并計算交叉驗證的 RMSE,以及原始數據和新數據集的 RMSE,正如我們上面計算的那樣。
```r
#implement the function
sim_results <-
replicate(100, get_sample_predictions_cv(sample_size = 48, shuffle = FALSE))
sim_results <-
t(sim_results) %>%
data.frame()
mean_rsquared <-
sim_results %>%
summarize(
mse_original_data = mean(X4),
mse_new_data = mean(X5),
mse_crossvalidation = mean(X6)
)
pander(mean_rsquared)
```
<colgroup><col style="width: 27%"> <col style="width: 20%"> <col style="width: 29%"></colgroup>
| MSE 原始數據 | MSE 新數據 | MSE 交叉驗證 |
| --- | --- | --- |
| 2.98 年 | 21.64 條 | 29.29 條 |
在這里,我們看到交叉驗證給了我們一個預測準確性的估計,它比我們用原始數據集看到的膨脹的準確性更接近我們用一個全新數據集看到的結果——事實上,它甚至比新數據集的平均值更悲觀。可能是因為只有部分數據被用來訓練每個模型。我們還可以確認,當因變量隨機變動時,交叉驗證能準確估計預測精度:
<colgroup><col style="width: 29%"> <col style="width: 22%"> <col style="width: 30%"></colgroup>
| rmse_original_data | rmse_new_data | RMSE 交叉驗證 |
| --- | --- | --- |
| 第 7.9 條 | 第 73.7 條 | 75.31 條 |
在這里,我們再次看到交叉驗證給了我們一個預測準確性的評估,這與我們對新數據的預期更為接近,而且更為悲觀。
正確使用交叉驗證是很困難的,建議在實際使用之前咨詢專家。然而,本節希望向您展示三件事:
* “預言”并不總是意味著你認為它意味著什么。
* 復雜的模型會嚴重地過度擬合數據,這樣即使沒有真正的預測信號,人們也能看到似乎很好的預測。
* 除非使用適當的方法,否則您應該非常懷疑地查看有關預測準確性的聲明。
- 前言
- 0.1 本書為什么存在?
- 0.2 你不是統計學家-我們為什么要聽你的?
- 0.3 為什么是 R?
- 0.4 數據的黃金時代
- 0.5 開源書籍
- 0.6 確認
- 1 引言
- 1.1 什么是統計思維?
- 1.2 統計數據能為我們做什么?
- 1.3 統計學的基本概念
- 1.4 因果關系與統計
- 1.5 閱讀建議
- 2 處理數據
- 2.1 什么是數據?
- 2.2 測量尺度
- 2.3 什么是良好的測量?
- 2.4 閱讀建議
- 3 概率
- 3.1 什么是概率?
- 3.2 我們如何確定概率?
- 3.3 概率分布
- 3.4 條件概率
- 3.5 根據數據計算條件概率
- 3.6 獨立性
- 3.7 逆轉條件概率:貝葉斯規則
- 3.8 數據學習
- 3.9 優勢比
- 3.10 概率是什么意思?
- 3.11 閱讀建議
- 4 匯總數據
- 4.1 為什么要總結數據?
- 4.2 使用表格匯總數據
- 4.3 分布的理想化表示
- 4.4 閱讀建議
- 5 將模型擬合到數據
- 5.1 什么是模型?
- 5.2 統計建模:示例
- 5.3 什么使模型“良好”?
- 5.4 模型是否太好?
- 5.5 最簡單的模型:平均值
- 5.6 模式
- 5.7 變異性:平均值與數據的擬合程度如何?
- 5.8 使用模擬了解統計數據
- 5.9 Z 分數
- 6 數據可視化
- 6.1 數據可視化如何拯救生命
- 6.2 繪圖解剖
- 6.3 使用 ggplot 在 R 中繪制
- 6.4 良好可視化原則
- 6.5 最大化數據/墨水比
- 6.6 避免圖表垃圾
- 6.7 避免數據失真
- 6.8 謊言因素
- 6.9 記住人的局限性
- 6.10 其他因素的修正
- 6.11 建議閱讀和視頻
- 7 取樣
- 7.1 我們如何取樣?
- 7.2 采樣誤差
- 7.3 平均值的標準誤差
- 7.4 中心極限定理
- 7.5 置信區間
- 7.6 閱讀建議
- 8 重新采樣和模擬
- 8.1 蒙特卡羅模擬
- 8.2 統計的隨機性
- 8.3 生成隨機數
- 8.4 使用蒙特卡羅模擬
- 8.5 使用模擬統計:引導程序
- 8.6 閱讀建議
- 9 假設檢驗
- 9.1 無效假設統計檢驗(NHST)
- 9.2 無效假設統計檢驗:一個例子
- 9.3 無效假設檢驗過程
- 9.4 現代環境下的 NHST:多重測試
- 9.5 閱讀建議
- 10 置信區間、效應大小和統計功率
- 10.1 置信區間
- 10.2 效果大小
- 10.3 統計能力
- 10.4 閱讀建議
- 11 貝葉斯統計
- 11.1 生成模型
- 11.2 貝葉斯定理與逆推理
- 11.3 進行貝葉斯估計
- 11.4 估計后驗分布
- 11.5 選擇優先權
- 11.6 貝葉斯假設檢驗
- 11.7 閱讀建議
- 12 分類關系建模
- 12.1 示例:糖果顏色
- 12.2 皮爾遜卡方檢驗
- 12.3 應急表及雙向試驗
- 12.4 標準化殘差
- 12.5 優勢比
- 12.6 貝葉斯系數
- 12.7 超出 2 x 2 表的分類分析
- 12.8 注意辛普森悖論
- 13 建模持續關系
- 13.1 一個例子:仇恨犯罪和收入不平等
- 13.2 收入不平等是否與仇恨犯罪有關?
- 13.3 協方差和相關性
- 13.4 相關性和因果關系
- 13.5 閱讀建議
- 14 一般線性模型
- 14.1 線性回歸
- 14.2 安裝更復雜的模型
- 14.3 變量之間的相互作用
- 14.4“預測”的真正含義是什么?
- 14.5 閱讀建議
- 15 比較方法
- 15.1 學生 T 考試
- 15.2 t 檢驗作為線性模型
- 15.3 平均差的貝葉斯因子
- 15.4 配對 t 檢驗
- 15.5 比較兩種以上的方法
- 16 統計建模過程:一個實例
- 16.1 統計建模過程
- 17 做重復性研究
- 17.1 我們認為科學應該如何運作
- 17.2 科學(有時)是如何工作的
- 17.3 科學中的再現性危機
- 17.4 有問題的研究實踐
- 17.5 進行重復性研究
- 17.6 進行重復性數據分析
- 17.7 結論:提高科學水平
- 17.8 閱讀建議
- References