![](http://static.javashuo.com/static/loading.gif)
![](http://static.javashuo.com/static/loading.gif)
下文中所使用的示例數據和R代碼的百度盤連接(提取碼,egpa):git
https://pan.baidu.com/s/1GwW8EYgFE7EPrW6o9u5ScAgithub
若百度盤失效,也可在GitHub的備份中獲取:web
https://github.com/lyao222lll/sheng-xin-xiao-bai-yu微信
經過ggplot2函數stat_smooth()、geom_smooth()統計變量關係並擬合迴歸機器學習
ggplot2內置了迴歸統計函數,想必同窗們也都很熟悉,就是stat_smooth()以及geom_smooth()。兩個函數的使用方法大體一致,可基於給定的雙變量關係擬合指定的迴歸,默認方法包含局部加權迴歸(loess)、通常線性模型(lm)、廣義線性模型(glm)、廣義加性模型(gam)以及一些非線性迴歸(nls,如指數迴歸)等,並同時將雙變量關係的迴歸線繪製在二維圖中表示出來。此外,結合一些拓展包也能夠實現更多非線性迴歸的做圖。編輯器
接下來展現幾個簡單示例,瞭解不一樣模式迴歸曲線經過ggplot2函數的繪製方法。函數
示例1.1-局部加權迴歸(loess)的平滑擬合學習
MASS包的內置數據集Boston,記錄了波士頓郊區的房屋價值與當地社會環境、人口組成等信息。這裏但願關注當地低收入人口比例和其所居住地房屋價格是否有關,不妨首先擬合一個雙變量關係的平滑曲線進行探索。url
平滑回歸方法中,局部加權迴歸(LOESS)是最經常使用的平滑器。在函數stat_smooth()或geom_smooth()中經過method = 'loess'指定局部加權迴歸的平滑擬合,並經過span參數控制曲線平滑度。spa
#MASS 包的示例數據集,波士頓郊區的房屋價值,詳情 ?Boston
library(MASS)
data(Boston)
#ggplot2 繪製低收入人口比例和居住地房屋價格的關係
library(ggplot2)
p <- ggplot(data = Boston, aes(x = medv, y = lstat)) +
geom_point() +
theme_bw()
p
##擬合局部加權迴歸(loess),並展現 95% 置信區間
#stat_smooth() 參數 span 可控制曲線平滑度,值越大擬合曲線越平滑,詳情 ?stat_smooth
#注意平滑參數值應當謹慎設置,它強烈影響曲線意義的解讀
p1 <- p + stat_smooth(method = 'loess', span = 0.5, se = TRUE, level = 0.95)
p1
#相似地,geom_smooth() 參數中,span 控制曲線平滑度
p2 <- p + geom_smooth(method = 'loess', span = 0.75, se = TRUE)
p2
平滑曲線展示了居住地房屋價格越高,當地低收入人口比例越低。可能與低收入人羣難以負擔得起較高居住地的成本,而更多選擇廉價的房屋租賃或長期居住有關。
示例1.2-通常加性模型的平滑擬合
實現非參數平滑回歸的另外一方法是使用加性模型。在函數stat_smooth()或geom_smooth()中經過method = 'gam'指定加性模型的平滑擬合,並經過在formula參數中選擇平滑器參數實現。默認狀況下,該函數假定響應變量服從正態分佈,並執行通常加性模型的形式。
##gam 默認狀況下執行通常加性模型的平滑回歸,並展現 95% 置信區間
#stat_smooth() 和 geom_smooth() 的用法大體類似
#經過 formula = y~s(x) 指定函數關係,s() 中的參數 k 可調整平滑度,詳情 ?s()
#注意平滑參數值應當謹慎設置,它強烈影響曲線意義的解讀
p + stat_smooth(method = 'gam', formula = y~s(x, k = 10), se = TRUE, level = 0.95)
p + geom_smooth(method = 'gam', formula = y~s(x, k = 5), se = TRUE)
和loess平滑顯示了一致的趨勢,平滑曲線展示了居住地房屋價格越高,當地低收入人口比例越低。
示例1.3-通常線性模型(lm)之簡單線性迴歸
上圖的非參數平滑曲線顯示了低收入人口的居住比例隨當地房屋價格的升高而下降,不妨使用參數迴歸代替描述這個趨勢,例如最常使用的簡單線性迴歸。函數stat_smooth()或geom_smooth()中,經過method = 'lm'指定線性迴歸擬合變量關係,默認繪製Y=β1X+β0形式的簡單線性迴歸形式。
##通常線性模型(lm),並展現 95% 置信區間
#stat_smooth() 擬合簡單線性迴歸,詳情 ?stat_smooth
p1 <- p1 + stat_smooth(method = 'lm', se = TRUE, level = 0.95, color = 'red')
p1
#geom_smooth() 擬合簡單線性迴歸,詳情 ?geom_smooth
p2 <- p2 + geom_smooth(method = 'lm', se = TRUE, color = 'red')
p2
該圖顯示了波士頓郊區低收入人口的居住比例隨當地房屋價格的升高而呈現明顯的線性下降趨勢。藍線,上文的非參數loess平滑擬合;紅線,普通線性迴歸擬合。
示例1.4-通常線性模型(lm)之帶屢次項的線性迴歸
不過上述非參數平滑曲線圖的走勢代表,彷佛還能夠用一個彎曲的曲線來提升擬合精度,即擬合含屢次項的線性迴歸。所以繼續考慮添加二次項關係,即Y=β1X+β2X2+β0。相似地,在函數stat_smooth()或geom_smooth()中經過method = 'lm'指定線性迴歸,並經過formula指定變量間屢次項關係。
#添加低收入人口比例和居住地房屋價格的二次線性迴歸,並展現 95% 置信區間
#geom_smooth() 默認 formula=y~x 對應一次關係,可更改 formula = y~poly(x, n) 擬合 n 次關係,詳情 ?stat_smooth
p1 + stat_smooth(method = 'lm', formula = y~poly(x, 2), se = TRUE, level = 0.95, color = 'green3')
#一樣地,geom_smooth() 默認 formula=y~x 對應一次關係,可更改 formula = y~poly(x, n) 擬合 n 次關係,詳情 ?geom_smooth
p2 + geom_smooth(method = 'lm', formula = y~poly(x, 2), se = TRUE, color = 'green3')
能夠看到,考慮了低收入人口比例和居住地房屋價格的二次線性關係後,擬合精度更優,更能描述出兩者實際的趨勢。藍線,上文的非參數loess平滑擬合;紅線,上文普通線性迴歸擬合;綠線,二次線性迴歸擬合。
示例1.5-廣義加性模型(gam)之泊松加性模型
網盤示例數據「fish_data.txt」,來自前文泊松響應的廣義加性模型的示例,記錄了河流中某魚類個體數量與水體環境的關係。前文已經經過非參數的泊松加性模型探索了影響魚類物種丰度的環境因素,並描述了響應曲線的特徵,在這裏將繼續經過ggplot2繪製泊松加性模型的平滑擬合曲線。
如上文所述,在函數stat_smooth()或geom_smooth()中經過method = 'gam'指定加性模型的平滑擬合。因爲函數默認響應變量服從正態分佈並執行通常加性模型的形式,所以在這裏須要額外在參數method.args中指定響應變量的泊松分佈,以執行泊松加性模型。此外,還需在formula參數中設定平滑器參數。
#讀取示例的魚類物種丰度和水體環境數據
dat <- read.delim('fish_data.txt', sep = '\t', row.names = 1)
#ggplot2 繪製魚類物種丰度與水域流域面積的關係
library(ggplot2)
p <- ggplot(data = dat, aes(x = acre, y = fish)) +
geom_point() +
theme_bw()
p
##計數型變量,嘗試使用泊松加性模型擬合平滑曲線探索變量關係,並展現 95% 置信區間
#stat_smooth() 和 geom_smooth() 的用法大體類似
#經過 method.args 指定響應變量的類型,這裏使用泊松加性模型
#經過 formula = y~s(x) 指定函數關係,平滑器 s() 中的參數 k 可調整平滑度,詳情 ?s()
#注意平滑參數值應當謹慎設置,它強烈影響曲線意義的解讀
p1 <- p + stat_smooth(method = 'gam', formula = y~s(x, k = 5), method.args = list(family = 'poisson'), se = TRUE, level = 0.95)
p1
p2 <- p + geom_smooth(method = 'gam', formula = y~s(x, k = 3), method.args = list(family = 'poisson'), se = TRUE)
p2
整體來講,隨水域流域面積(acre)的增長,魚類物種數量將提高。
示例1.6-廣義線性模型(glm)之泊松迴歸
如上非參數的泊松加性模型顯示了魚類物種數量隨水域流域面積的增長而提高,這種提高效應彷佛能夠經過線性關係來描述。所以,接下來不妨使用參數化的廣義線性模型描述這個趨勢,即泊松迴歸。
不管使用函數stat_smooth()或geom_smooth(),均經過method = 'glm'指定使用廣義線性迴歸擬合變量關係,並需額外在參數method.args中指定響應變量的泊松分佈。
##計數型變量,嘗試使用廣義線性模型的泊松迴歸描述變量關係,並展現 95% 置信區間
#stat_smooth() 和 geom_smooth() 中,經過 method.args 指定響應變量的類型,這裏使用泊松迴歸
p1 + stat_smooth(method = 'glm', method.args = list(family = 'poisson'), se = TRUE, level = 0.95, color = 'red')
p2 + geom_smooth(method = 'glm', method.args = list(family = 'poisson'), se = TRUE, color = 'red')
泊松迴歸有效體現出了魚類物種數量隨水域流域面積的增長而提高的線性響應趨勢。藍線,上文非參數泊松加性模型的平滑擬合;紅線,泊松迴歸的線性擬合。
示例1.7-廣義線性模型(glm)之logistic迴歸型
考慮到廣義線性模型的種類很是多,這裏再展現一例廣義線性模型的其它常見類型,logistic迴歸在ggplot2中的繪製方法,加深對ggplot2直接繪製廣義線性模型擬合曲線方法的理解。
網盤示例數據「breast.csv」,來自前文廣義線性模型之logistic迴歸的示例,記錄了乳腺癌惡性腫瘤相關的細胞特徵得分。前文已經經過logistic迴歸肯定了多種細胞特徵得分與腫瘤惡性狀態(良性或惡性,屬於二分響應變量)的關聯,並評估了經過這些細胞特徵得分區分腫瘤良性或惡性的準確度。在這裏將繼續經過ggplot2繪製logistic迴歸的擬合曲線。
相似地,在函數stat_smooth()或geom_smooth()中經過method = 'glm'指定使用廣義線性迴歸擬合變量關係,並額外在參數method.args中指定響應變量的二項分佈。
#威斯康星州乳腺癌數據集
breast <- read.csv('breast.csv')
#使用 0-1 的二分數值從新定義腫瘤的兩種狀態(0,良性;1,惡性)
breast[which(breast$class == 2),'response'] <- 0
breast[which(breast$class == 4),'response'] <- 1
#例如以腫瘤厚度得分與腫瘤良性或惡性狀態的關係爲例
library(ggplot2)
p <- ggplot(data = breast, aes(x = clumpThickness, y = response)) +
geom_jitter(height = 0.05, width = 0, alpha = 0.5) + #做圖時對點添加了少許上下抖動效果僅爲減小點的重疊
theme_bw()
p
##二分響應變量,使用廣義線性模型的二項 logistic 迴歸描述變量關係,並展現 95% 置信區間
p + stat_smooth(method = 'glm', method.args = list(family = 'binomial'), se = TRUE, level = 0.95, color = 'red')
p + geom_smooth(method = 'glm', method.args = list(family = 'binomial'), se = TRUE, color = 'red')
二項響應的logistic迴歸經常使用於描述響應變量被分配爲兩個類別(0或1)的機率。在這個實例中,0表明腫瘤良性,1表明腫瘤惡性。圖中紅色曲線爲logistic迴歸得到的機率擬合曲線,形象呈現了腫瘤爲惡性的機率隨腫瘤厚度得分增長的非線性響應。
示例1.8-非線性參數迴歸示例之指數迴歸
再展現一例常見的參數非線性迴歸方法,指數迴歸在ggplot2中的繪製。
仍以上文提到的波士頓郊區的房屋價值數據集爲例,經過局部加權迴歸(LOESS)的平滑曲線觀察居住地房屋價格和人均城鎮犯罪率的關係時,發現兩者彷佛存在指數關聯。隨人均城鎮犯罪率的升高,房屋價格開始呈現劇烈的降低,隨後達到平緩。所以,考慮在圖中擬合指數迴歸曲線。
經過在stat_smooth()或geom_smooth()中指定method = 'nls'便可擬合參數非線性迴歸,formula中設置非線性迴歸式,method.args中設定一些必要的補充信息。
#MASS 包的示例數據集,波士頓郊區的房屋價值,詳情 ?Boston
library(MASS)
data(Boston)
#ggplot2 繪製居住地房屋價格和人均城鎮犯罪率的關係
library(ggplot2)
p <- ggplot(data = Boston, aes(x = crim, y = medv)) +
geom_point() +
theme_bw() +
stat_smooth(method = 'loess', span = 0.5, se = TRUE, level = 0.95)
p
##參數非線性迴歸(nls)的擬合,以指數迴歸爲例
#stat_smooth() 和 geom_smooth() 的用法大體類似
#參數中 a 和 b 的初始值手動指定,可參考 https://mp.weixin.qq.com/s/fxkMlEBs8UEwuGlUi50uLA
p + stat_smooth(method = 'nls', formula = y ~ a*x^b, method.args = list(start = list(a = 2, b = 1.5)), se = FALSE, color = 'red')
p + geom_smooth(method = 'nls', formula = y ~ a*x^b, method.args = list(start = list(a = 2, b = 1.5)), se = FALSE, color = 'red')
這個指數迴歸大體描述出了隨人均城鎮犯罪率的升高,房屋價格首先呈現劇烈的降低,並在隨後達到平緩的趨勢。藍線,上文的非參數loess平滑擬合;紅線,指數迴歸擬合曲線。
經過ggplot2函數stat_function()指定迴歸函數繪製擬合線
不少迴歸方法,特別對於大多數非線性迴歸而言,ggplot2及其拓展包中缺乏做圖方案,難以經過stat_smooth()、geom_smooth()直接做圖。這時候,能夠考慮使用stat_function()根據指定函數繪製擬合線。
若是已經提早計算出了迴歸式的各參數,則能夠直接將已知的迴歸式指定給ggplot2函數stat_function()。stat_function()可以在做圖時將自變量代入至已知的迴歸式中擬合響應變量的預測值,並使用平滑線鏈接響應變量的預測值得到迴歸線。理論上,stat_function()能夠實現對任意給定迴歸式的擬合線繪製。
示例2.1-一個帶屢次項的線性迴歸示例
例如在上文「示例1.4-通常線性模型(lm)之帶屢次項的線性迴歸」中,已經描述了低收入人口比例和居住地房屋價格的二次線性關係。如要經過stat_function()繪製擬合曲線,則操做過程以下。
#MASS 包的示例數據集,波士頓郊區的房屋價值,詳情 ?Boston
library(MASS)
data(Boston)
#ggplot2 繪製低收入人口比例和居住地房屋價格的關係
library(ggplot2)
p <- ggplot(data = Boston, aes(x = medv, y = lstat)) +
geom_point() +
theme_bw()
p
##經過 lm() 計算低收入人口比例和居住地房屋價格的二次線性關係
fit <- lm(lstat~medv+I(medv^2), data = Boston)
summary(fit)
#根據 lm() 得到的對迴歸係數(斜率)和截距的參數估計值
#可知二次迴歸式書寫爲 Y = -1.715X + 0.021X^2 + 39.048
#而後將這個迴歸式書寫到 stat_function() 中
p + stat_function(fun = function(x) -1.715*x+0.021*x^2+39.048, color = 'red', size = 1.2)
#或者直接在 lm() 結果中提取回歸係數(斜率)和截距
#而後將提取出的值代入至 stat_function() 中
b0 <- coefficients(fit)[1] #截距
b1 <- coefficients(fit)[2] #一次項的迴歸係數
b2 <- coefficients(fit)[3] #二次項的迴歸係數
p + stat_function(fun = function(x) b1*x+b2*x^2+b0, color = 'red', size = 1.2)
![](http://static.javashuo.com/static/loading.gif)
如此方法,可將已知的低收入人口比例和居住地房屋價格的二次線性關係添加在圖中。
示例2.2-一個指數迴歸的非線性參數迴歸示例
相似地,再以上文「示例1.8-非線性參數迴歸示例之指數迴歸」的結果爲例,展現一個非線性參數迴歸經過stat_function()繪製擬合曲線的過程。
#ggplot2 繪製居住地房屋價格和人均城鎮犯罪率的關係
library(ggplot2)
p <- ggplot(data = Boston, aes(x = crim, y = medv)) +
geom_point() +
theme_bw()
p
##參數非線性迴歸(nls)的擬合,以指數迴歸爲例
#參數中 a 和 b 的初始值手動指定,可參考 https://mp.weixin.qq.com/s/fxkMlEBs8UEwuGlUi50uLA
mod <- nls(medv ~ a*crim^b, data = Boston, start = list(a = 2, b = 1.5))
summary(mod)
#根據 nls() 得到的對 a 和 b 參數估計值
#可知指數迴歸式書寫爲 Y = 20.743X^-0.086
#而後將這個迴歸式書寫到 stat_function() 中
p + stat_function(fun = function(x) 20.743*x^-0.086, color = 'red', size = 1.2)
#或者直接在 nls() 結果中提取 a 和 b 的值
#而後將提取出的值代入至 stat_function() 中
a <- coefficients(mod)[1] #a 的值
b <- coefficients(mod)[2] #b 的值
p + stat_function(fun = function(x) a*x^b, color = 'red', size = 1.2)
如此方法,可將已知的房屋價格隨人均城鎮犯罪率的升高而下降的大體的指數響應趨勢添加在圖中。
根據已知迴歸模型預測指望值,並在圖中繪製後鏈接成線
除了經過在stat_function()中手動輸入迴歸關係式外,也能夠經過已經在R函數中構建好的迴歸模型以predict()預測響應變量值,並在圖中繪製後以線段或曲線的形式鏈接起來獲得迴歸線。這種方法更多應用於迴歸式複雜難以書寫的狀況,或者應用在其它非參數迴歸、機器學習方法等難以理解的形式中。
示例3.1-一個非參數的平滑回歸示例
例如上文「示例1.1-局部加權迴歸(loess)的平滑擬合」的平滑回歸曲線,是非參數形式的,難以經過具體數學公式來描述。除了直接經過stat_smooth()或geom_smooth()實現外,但若在stat_function()中輸入公式則確定行不通。雖然咱們也不必展現其它冗餘的方法了,但此處僅僅是想舉例告知其它的可選替代形式,所以請容許我繼續。
#MASS 包的示例數據集,波士頓郊區的房屋價值,詳情 ?Boston
library(MASS)
data(Boston)
#ggplot2 繪製低收入人口比例和居住地房屋價格的關係
library(ggplot2)
p <- ggplot(data = Boston, aes(x = medv, y = lstat)) +
geom_point() +
theme_bw()
p
##經過 R 函數 loess() 構建局部加權迴歸(LOESS)模型
#參數 span 可控制曲線平滑度,值越大擬合曲線越平滑,詳情 ?loess
#注意平滑參數值應當謹慎設置,它強烈影響曲線意義的解讀
fit <- loess(lstat~medv, data = Boston, span = 0.75)
summary(fit)
#經過 predict() 根據已構建好的迴歸模型預測響應變量的指望值
#即根據居住地房屋價格得到低收入人口比例的預測值
lstat_pred <- predict(fit, Boston, type = 'response')
head(lstat_pred)
#將低收入人口比例的預測值添加在已有的關係圖中,並用折線圖鏈接成「擬合線」
Boston$lstat_pred <- lstat_pred
p + geom_line(data = Boston, aes(x = medv, y = lstat_pred), color = 'red')
##和 ggplot2 的默認方法 stat_smooth() 的比較
p + stat_smooth(method = 'loess', span = 0.75, se = TRUE, level = 0.95)
局部加權迴歸(LOESS)平滑曲線展示了居住地房屋價格越高,當地低收入人口比例越低的趨勢。紅線,首先構建LOESS模型,並經過已知迴歸模型預測lstat的值後,繪製在圖中鏈接成線;藍線,ggplot2默認的stat_smooth()方法所得LOESS曲線;兩者是一致的。
示例3.2-一個logistic迴歸的廣義線性模型示例
與通常線性模型相比,廣義線性模型涉及到鏈接函數的轉換,使其相對複雜不易理解。所以,某些廣義線性模型的函數式可能書寫麻煩,不易於經過stat_function()描繪出來。除了直接經過stat_smooth()或geom_smooth()實現做圖外,也能夠用這種替代形式表現出。以上文「示例1.7-廣義線性模型(glm)之logistic迴歸」的數據爲例,給個參考過程。
#威斯康星州乳腺癌數據集
breast <- read.csv('breast.csv')
#使用 0-1 的二分數值從新定義腫瘤的兩種狀態(0,良性;1,惡性)
breast[which(breast$class == 2),'response'] <- 0
breast[which(breast$class == 4),'response'] <- 1
#例如以腫瘤厚度得分與腫瘤良性或惡性狀態的關係爲例
library(ggplot2)
p <- ggplot(data = breast, aes(x = clumpThickness, y = response)) +
geom_jitter(height = 0.05, width = 0, alpha = 0.5) + #做圖時對點添加了少許上下抖動效果僅爲減小點的重疊
theme_bw()
p
##二分響應變量,使用廣義線性模型的二項 logistic 迴歸描述變量關係
fit <- glm(response~clumpThickness, data = breast, family = binomial())
summary.glm(fit)
#經過 predict() 根據已構建好的迴歸模型預測響應變量的指望值
#即根據腫瘤厚度得分預測腫瘤爲惡性的機率
response_pred <- predict(fit, breast, type = 'response')
head(response_pred)
#將預測的腫瘤爲惡性的機率添加在已有的關係圖中,並用折線圖鏈接成「擬合線」
breast$response_pred <- response_pred
p + geom_line(data = breast, aes(x = clumpThickness, y = response_pred), color = 'red')
##和 ggplot2 的默認方法 stat_smooth() 的比較
p + stat_smooth(method = 'glm', method.args = list(family = 'binomial'), se = TRUE, level = 0.95)
在這個實例中,0表明腫瘤良性,1表明腫瘤惡性。logistic迴歸得到的機率擬合曲線,形象呈現了腫瘤爲惡性的機率隨腫瘤厚度得分增長的非線性響應。 紅線,首先構建logistic模型,並經過已知迴歸模型預測腫瘤爲惡性的機率後,繪製在圖中鏈接成線;藍線,ggplot2默認的stat_smooth()方法所得logistic曲線;兩者是一致的。
其它拓展做圖
上文主要在幾種不一樣類型的擬合曲線的繪製過程上做了演示,包含局部加權迴歸(loess)、通常線性模型(lm)、廣義線性模型(glm)、廣義加性模型(gam)以及一些非線性迴歸(nls,如指數迴歸)等,幫助瞭解不一樣模式迴歸曲線怎樣經過ggplot2函數的實現方法。
而對於ggplot2主題的調整,怎樣讓圖形更美觀,就沒做啥說起,你們本身看着來吧。最後再展現幾種實用的拓展用法。
示例4.1-一圖展現多組的迴歸
有時涉及了多分組的狀況,自變量的水平一致但各組響應變量的值不一樣。爲了方便多組之間可以直觀的比較,指望在同一張圖中展現多組的迴歸曲線,並經過斜率的變化描述趨勢的升高或下降幅度,這也是平時很是常見的情形。
網盤示例數據「plant.txt」,測量了生長於兩個不一樣溫度(低、高)環境中的某種植物的高度,以及土壤中的氮濃度,指望瞭解土壤氮濃度及溫度對植物生長的影響。考慮到線性關係最爲直觀且易於理解,這裏但願經過創建簡單線性迴歸,探討植物生長高度與其所處環境中土壤氮濃度及溫度的關係。
#植物生長與環境條件的數據集
dat <- read.delim('plant.txt', sep = '\t')
#橫座標土壤氮濃度,縱座標植物生長高度
#按高溫和低維條件分別標記分組後,擬合線性迴歸
library(ggplot2)
p <- ggplot(data = dat, aes(x = N, y = plant)) +
geom_point(aes(color = temperature)) +
scale_color_manual(values = c('red', 'blue'), limits = c('High', 'Low')) +
geom_smooth(aes(color = temperature), method = 'lm', se = TRUE, show.legend = FALSE) +
theme_bw() +
theme(legend.key = element_blank()) +
labs(x = 'N', y = 'plant height')
p
根據做圖結果得知,土壤氮含量高時更有利於該植物生長,而且該植物爲喜溫植物,在溫度容許的範圍內,溫暖更刺激其生長。
示例4.2-在圖中添加文字描述
例如,將上述兩組的線性迴歸的公式、R2和p值額外添加在圖中,以告知讀者回歸的精度和顯著性水平。此時,您須要額外經過迴歸函數獲取參數估計,並將它們提取出來後,組合成迴歸公式添加到圖中的合適位置。
#經過 lm() 得到線性迴歸的參數估計
fit_height <- lm(plant~N, data = subset(dat, temperature == 'High'))
summary(fit_height)
fit_low <- lm(plant~N, data = subset(dat, temperature == 'Low'))
summary(fit_low)
#提取兩個迴歸的迴歸係數(斜率)、截距、R二、p 值等
b0_height <- coefficients(fit_height)[1] #截距
b1_height <- coefficients(fit_height)[2] #斜率
R2_height <- summary(fit_height)$adj.r.squared #推薦使用校訂後的 R2
p_height <- summary(fit_height)$coefficients[2,4] #p 值
b0_low <- coefficients(fit_low)[1] #截距
b1_lowt <- coefficients(fit_low)[2] #斜率
R2_low <- summary(fit_low)$adj.r.squared #推薦使用校訂後的 R2
p_low <- summary(fit_low)$coefficients[2,4] #p 值
#將提取出的結果組合成新的數據集,以便添加在原圖中
label_height <- data.frame(
formula_height = sprintf('italic(Y) == %.3f*italic(X) + %.3f', b1_height, b0_height),
R2_height = sprintf('italic(R^2) == %.3f', R2_height),
p_height = ifelse(p_height < 0.001, sprintf('italic(P) < 0.001'), ifelse(p_height < 0.01, sprintf('italic(P) < 0.01'), ifelse(p_height < 0.05, sprintf('italic(P) < 0.05'), sprintf('italic(P) >= 0.05')))),
formula_low = sprintf('italic(Y) == %.3f*italic(X) + %.3f', b1_lowt, b0_low),
R2_low = sprintf('italic(R^2) == %.3f', R2_low),
p_low = ifelse(p_low < 0.001, sprintf('italic(P) < 0.001'), ifelse(p_low < 0.01, sprintf('italic(P) < 0.01'), ifelse(p_low < 0.05, sprintf('italic(P) < 0.05'), sprintf('italic(P) >= 0.05')))))
#添加文字時手動調整下位置
p +
geom_text(x = 1, y = 42, aes(label = formula_height), data = label_height, parse = TRUE, size = 2.5, hjust = 0, color = 'red', show.legend = FALSE) +
geom_text(x = 1, y = 38, aes(label = R2_height), data = label_height, parse = TRUE, size = 2.5, hjust = 0, color = 'red', show.legend = FALSE) +
geom_text(x = 1, y = 34, aes(label = p_height), data = label_height, parse = TRUE, size = 2.5, hjust = 0, color = 'red', show.legend = FALSE) +
geom_text(x = 1, y = 28, aes(label = formula_low), data = label_height, parse = TRUE, size = 2.5, hjust = 0, color = 'blue', show.legend = FALSE) +
geom_text(x = 1, y = 24, aes(label = R2_low), data = label_height, parse = TRUE, size = 2.5, hjust = 0, color = 'blue', show.legend = FALSE) +
geom_text(x = 1, y = 20, aes(label = p_low), data = label_height, parse = TRUE, size = 2.5, hjust = 0, color = 'blue', show.legend = FALSE)
此時將兩組線性迴歸的公式、R2和p值額外添加在圖中,形象地告知了迴歸統計的可靠性等信息。
示例4.3-分面迴歸圖
經常使用於多個自變量,或者多個響應變量的狀況下,雙變量回歸分析的展現。
例如,這裏嘗試經過多個簡單線性迴歸,分別描述網盤示例數據「fish_data.txt」中全部6種環境因素對魚類物種丰度的影響。
#讀取魚類物種丰度和水體環境數據
dat <- read.delim('fish_data.txt', sep = '\t', row.names = 1)
#繪製二維散點圖觀測各環境變量與魚類物種丰度的關係
#並同時添加簡單線性迴歸擬合線
library(ggplot2)
dat_plot <- reshape2::melt(dat, id = 'fish')
p <- ggplot(dat_plot, aes(value, fish)) +
geom_point() +
facet_wrap(~variable, ncol = 3, scale = 'free') +
geom_smooth(method = 'lm') +
labs(x = '', y = 'fish')
p
#如下在散點圖中添加各環境變量與魚類物種丰度的一元迴歸的 R2 和 p 值做爲標識
#注:該 R2 和 p 值僅爲多個一元迴歸的 R2 和 p 值,不要將其視爲一個多元迴歸
#擬合各環境變量與魚類物種丰度的一元迴歸,並提取各自 R2 和 p 值
env <- c('acre', 'do2', 'depth', 'no3', 'so4', 'temp')
R2_adj <- c()
p_value <- c()
for (i in env) {
fit_stat <- summary(lm(dat[['fish']]~dat[[i]])) #一元線性迴歸
R2_adj <- c(R2_adj, fit_stat$adj.r.squared) #提取校訂後 R2
p_value <- c(p_value, fit_stat$coefficients[2,4]) #提取顯著性 p 值
}
env_stat <- data.frame(row.names = env, R2_adj, p_value)
env_stat #數據框中存儲了各環境變量與魚類物種丰度的一元迴歸的 R2 和 p 值
#自動定義文字在圖中的展現座標位置
env_stat$fish <- (max(dat$fish)-min(dat$fish))*0.85 + min(dat$fish)
for (i in env) env_stat[i,'value'] <- (max(dat[[i]])-min(dat[[i]]))*0.7 + min(dat[[i]])
#生成文字標籤數據集
env_stat$variable <- rownames(env_stat)
env_stat$R2_adj <- paste(sprintf('italic(R^2) == %.3f', env_stat$R2_adj))
env_stat$p_value <- paste(sprintf('italic(P) == %.3f', env_stat$p_value))
#和先前的數據框合併,便於做圖
env_stat <- env_stat[c('fish', 'variable', 'value', 'R2_adj', 'p_value')]
dat_plot$R2_adj <- NA
dat_plot$p_value <- NA
dat_plot <- rbind(dat_plot, env_stat)
p +
geom_text(data = dat_plot, aes(label = R2_adj), parse = TRUE, size = 3, hjust = 0) +
geom_text(data = dat_plot, aes(label = p_value), parse = TRUE, size = 3, hjust = 0, vjust = 3)
相似的方法在前文多元線性迴歸中也有提到,但注意的是,在這種情形下都是考慮的各環境對物種丰度的獨立效應,即多個一元線性迴歸的組合圖展現,沒法視爲多元迴歸的替代可視化方法。
![](http://static.javashuo.com/static/loading.gif)
![](http://static.javashuo.com/static/loading.gif)
關於多元迴歸中需考慮的問題:
通常線性模型(LM):
類別型響應變量:logistic迴歸
比例型響應變量:beta迴歸
常見的非線性模型:
迴歸樹:
生存分析:
基於類似或相異矩陣的迴歸或降維思想的迴歸:
基於距離的冗餘分析(db-RDA),或稱典範主座標分析(CAP)
本文分享自微信公衆號 - 小明的數據分析筆記本(gh_0c8895f349d3)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。