濤哥文集(39):R-squared沒用了嗎?

2015年10月16日星期四,一個令人難以置信的學生在Reddit上發帖說,我的統計學教授剛剛大肆宣揚R-squared值基本上是無用的,這有什麼道理嗎?與Reddit上其他關於統計的帖子相比,這引起了相當多的關注。

原來這個學生的統計學教授是卡內基梅隆大學的Cosma Shalizi。Shalizi免費開放了他的課堂講課材料,所以我們可以看到他到底在 “宣揚 ”什麼。這一切都從他的第10講筆記的第3。2節開始。

如果你忘記或不知道,R-squared是一個經常伴隨著迴歸輸出的統計數字。它的數值從0到1不等,通常被解釋為總結迴歸模型所能解釋的反應中的變化百分比。因此,R-squared為0。65可能意味著該模型解釋了我們因變數變化的65%。鑑於這種邏輯,我們希望我們的迴歸模型有一個高的R-squared。然而,Shalizi用令人信服的論據對這一邏輯提出異議。

在 R 中,我們通常透過呼叫模型物件上的彙總函式來獲得 R-squared。這是一個使用模擬資料的快速示例:

x <- 1:20 # independent variableset。seed(1) # for reproducibilityy <- 2 + 0。5*x + rnorm(20,0,3) # dependent variable; function of x with random errormod <- lm(y~x) # simple linear regressionsummary(mod)$r。squared # request just the r-squared value#[1] 0。6026682

表示 R-squared的一種方法是將擬合值偏差平方和除以原始值偏差平方和:

濤哥文集(39):R-squared沒用了嗎?

我們可以使用我們的模型物件直接計算它,如下所示:

f <- mod$fitted。values # extract fitted (or predicted) values from modelmss <- sum((f - mean(f))^2) # sum of squared fitted-value deviationstss <- sum((y - mean(y))^2) # sum of squared original-value deviationsmss/tss # r-squared#[1] 0。6026682

現在讓我們看一下 Shalizi 關於 R-squared 的一些陳述,並用 R 中的模擬來演示它們。

1.R-squared不衡量擬合優度。

當模型完全正確時,它可以是低到任何程度。透過使 σ2變大,我們將 R2推向 0,即使簡單線性迴歸模型的每個假設在每個特定情況下都是正確的。

σ2是什麼?當我們執行線性迴歸時,我們假設我們的模型幾乎可以預測我們的因變數。假設“幾乎”和“精確”之間的差異是從均值為 0 和方差為 σ2的正態分佈中抽取的。

Shalizi的說法很容易證明。我們在這裡的方法是建立一個函式,(1)生成符合簡單線性迴歸假設的資料(獨立觀測,具有恆定方差的正態分佈誤差),(2)對資料擬合一個簡單的線性模型,(3)報告R-squared。注意,為了簡單起見,唯一的引數是sigma。然後我們將這個函式 “應用 ”於一系列增加的σ值,並繪製結果。

r2。0 <- function(sig){ x <- seq(1,10,length。out = 100) # our predictor y <- 2 + 1。2*x + rnorm(100,0,sd = sig) # our response; a function of x plus some random noise summary(lm(y ~ x))$r。squared # print the R-squared value}sigmas <- seq(0。5,20,length。out = 20)rout <- sapply(sigmas, r2。0) # apply our function to a series of sigma valuesplot(rout ~ sigmas, type=“b”)

濤哥文集(39):R-squared沒用了嗎?

果然,R平方隨著sigma的增加而急劇下降,儘管該模型在各方面都是完全正確的。

2.當模型完全錯誤時,R-squared可以任意接近1。

再次強調的是,R-squared不能衡量擬合優度。在這裡,我們使用 Shalizi 講座 10 筆記中不同部分的程式碼來生成非線性資料。

set。seed(1)x <- rexp(50,rate=0。005) # our predictor is data from an exponential distributiony <- (x-1)^2 * runif(50, min=0。8, max=1。2) # non-linear data generationplot(x,y) # clearly non-linear

濤哥文集(39):R-squared沒用了嗎?

現在檢查 R-squared:

summary(lm(y ~ x))$r。squared#[1] 0。8485146

它非常高,約為 0。85,但模型完全錯誤。在這種情況下,使用 R 平方來證明我們模型的“優點”是錯誤的。希望人們首先繪製資料並認識到在這種情況下簡單的線性迴歸是不合適的。

3.R-squared 沒有說明預測誤差,即使 σ2 完全相同,並且係數沒有變化。

只需更改 X 的範圍,R-squared就可以在 0 和 1 之間的任何位置。我們最好使用均方誤差 (MSE) 作為預測誤差的度量。

MSE基本上是擬合的y值減去觀察到的y值的平方,然後求和,再除以觀察數。

讓我們來證明這一說法,首先生成符合所有簡單線性迴歸假設的資料,然後將y對x進行迴歸,以評估R平方和MSE。

x <- seq(1,10,length。out = 100)set。seed(1)y <- 2 + 1。2*x + rnorm(100,0,sd = 0。9)mod1 <- lm(y ~ x)summary(mod1)$r。squared#[1] 0。9383379sum((fitted(mod1) - y)^2)/100 # Mean squared error#[1] 0。6468052

現在重複上面的程式碼,但這次是用不同的x範圍,其他都保持不變。

x <- seq(1,2,length。out = 100) # new range of xset。seed(1)y <- 2 + 1。2*x + rnorm(100,0,sd = 0。9)mod1 <- lm(y ~ x)summary(mod1)$r。squared#[1] 0。1502448sum((fitted(mod1) - y)^2)/100 # Mean squared error#[1] 0。6468052

R-squared從0。94下降到0。15,但MSE保持不變。換句話說,兩個資料集的預測能力是一樣的,但R-squared會讓你相信第一個例子在某種程度上有一個更有預測能力的模型。

4. R-squared不能在未轉換Y的模型和轉換Y的模型之間進行比較,也不能在Y的不同轉換之間進行比較。

當模型的假設得到更好的滿足時,R-squared很容易下降。

讓我們透過生成將受益於轉換的資料來研究這個問題。注意下面的R程式碼與我們之前的努力非常相似,但現在我們對Y變數進行指數化處理。

x <- seq(1,2,length。out = 100)set。seed(1)y <- exp(-2 - 0。09*x + rnorm(100,0,sd = 2。5))summary(lm(y ~ x))$r。squared#[1] 0。003281718plot(lm(y ~ x), which=3)

濤哥文集(39):R-squared沒用了嗎?

R-squared非常低,我們的殘差與擬合圖顯示出異常值和非恆定方差。一個常見的解決方法是將資料進行對數轉換。讓我們試試這個方法,看看會發生什麼。

plot(lm(log(y)~x),which = 3)

濤哥文集(39):R-squared沒用了嗎?

診斷圖看起來好多了。我們對恆定方差的假設似乎得到了滿足。但看一下R-squared。

summary(lm(log(y)~x))$r。squared #[1] 0。0006921086

它甚至更低! 這是一個極端的例子,並不總是這樣發生。事實上,對數轉換通常會產生R-squared的增加。但正如剛才所展示的,更好地滿足的假設並不總是導致更高的R-squared。因此,R-squared不能在模型之間進行比較。

5.

說R-squared是迴歸所解釋的 “方差的一部分 ”是很常見的。然而如果我們把X迴歸到Y上,我們會得到完全相同的R-squared。這本身就足以說明,

高的R-squared並不能說明一個變數對另一個變數的解釋。

這是最容易證明的說法。

x <- seq(1,10,length。out = 100)y <- 2 + 1。2*x + rnorm(100,0,sd = 2)summary(lm(y ~ x))$r。squared#[1] 0。7065779summary(lm(x ~ y))$r。squared#[1] 0。7065779

是X解釋了Y,還是Y解釋了X?我們說 “解釋 ”是為了繞過 “原因 ”這個詞嗎?在這樣一個有兩個變數的簡單情況下,R-squared只是x和y之間相關性的平方。

all。equal(cor(x,y)^2, summary(lm(x ~ y))$r。squared, summary(lm(y ~ x))$r。squared)#[1] TRUE

在這種情況下,為什麼不直接使用相關關係而不是R-squared?但是,相關關係又總結了線性關係,這可能不適合於資料。這是另一個強烈建議你繪製資料的例子。

讓我們回顧一下:

R-squared不衡量擬合優度。

R-squared 不測量預測誤差。

R-squared 不允許您使用轉換後的響應來比較模型。

R-squared不衡量一個變數如何解釋另一個變數。

而這正是我們在本文中介紹的內容。Shalizi在他的講義中給出了更多的理由。應該注意的是,Adjusted R-squared 沒有解決任何這些問題。

那麼,是否有任何理由使用R-squared?Shalizi說沒有。(“我從未發現它有任何幫助的情況。”) 毫無疑問,一些統計學家和Redditors可能不同意。無論你的觀點如何,如果你選擇使用R平方來為你的資料分析提供資訊,最好仔細檢查一下它是否告訴你你認為它所要告訴你的東西。