R語言可視化 ggplot2—統計變換+位置調整+整合

統計變換

統計變換可將輸入的數據集看做輸入,將返回的數據集作爲輸出,因此統計變換可以向原數據集中插入新的變量。例如,常被用來繪製直方圖的stat_bin統計變換會生成如下變量:

  • count,每個組裏觀測值的數目;
  • density,每個組裏觀測值的密度(佔整體的百分數/組寬);
  • x,組的中心位置。

這些生成變量可以被直接調用。
例如,直方圖默認將條形的高度賦值爲觀測值的頻數(count),如果你更喜歡傳統的直方圖,你可以用密度(density)來代替。下
面的例子給出了鑽石數據集中的克拉(carat)的密度直方圖。

ggplot(diamonds, aes(carat)) + 
geom_histogram(aes(y = ..density..), binwidth = 0.1)
#或
qplot(carat, ..density.., data = diamonds, geom = "histogram", binwidth = 0.1)

在這裏插入圖片描述

位置調整

應用於條形圖的三種位置調整

從上到下次是:堆疊(stacking),填充(filling)和並列(dodging)

dplot <- ggplot(diamonds, aes(clarity, fill = cut))
dplot + geom_bar(position = "stack")
dplot + geom_bar(position = "fill")
dplot + geom_bar(position = "dodge")

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

整合

集合集合對象和統計變換

頻率多邊形(frequency polygon)(上);
散點圖,點的大小和高度都映射給了頻率(下)

d <- ggplot(diamonds, aes(carat)) + xlim(0, 3)
d + stat_bin(aes(ymax = ..count..), binwidth = 0.1, geom = "area")

d + stat_bin(aes(size = ..density..), binwidth = 0.1, geom = "point", position = "identity")

在這裏插入圖片描述
在這裏插入圖片描述

改變圖形屬性和數據集

例:nlme包的Oxboys數據集

首先我們讀入nlme包,然後擬合一個截距和斜率都包含隨機效應的混合模型。(通過對個體模型的探索得知這個模型是合理的。)我們仍然要先建一個圖形對象作爲模板,這一步和之前做法一致,然後我們利用從模型中導出的數據對模型進行渲染。

require(nlme, quiet = TRUE, warn.conflicts = FALSE)
model <- lme(height ~ age, data = Oxboys, random = ~1 + age | Subject)
oplot <- ggplot(Oxboys, aes(age, height, group = Subject)) + geom_line()

隨後,我們對預測的生長軌跡和實際的生長軌跡進行對比。我們先建立一個包含所有年齡(age)和個體(subjects)組合的網格數據框。對於這個簡單的線性模型這麼做雖然顯得有點小題大做,但是仍作爲例子放到這裏,爲以後處理更加複雜的模型提供參考。接下來我們把模型的預測值添加到剛剛生成的數據集中,變量名叫height。

age_grid <- seq(-1, 1, length = 10)
subjects <- unique(Oxboys$Subject)

preds <- expand.grid(age = age_grid, Subject = subjects)
preds$height <- predict(model, preds)

得到預測值後,我們把它和原始數據繪製到同一張圖上。因爲在新數據集preds裏,我們使用了與原始數據0xboys相同的變量名,並且我們想使用相同的分組圖形屬性,所以我們不用修改任何圖形屬性,只需要修改默認的數據集即可。我們還設定了顏色和大小兩個圖形屬性參數以便於圖形的比較。

oplot + geom_line(data = preds, colour = "#3366FF", size = 0.4)

在這裏插入圖片描述
從圖形上看,這個模型似乎很好地擬合了該數據更深層次的結構,但是仍然很難分辨細節。另一種比較模型擬合好壞的方法是觀察殘差,所以我們也演示一下這種方法。首先我們把擬合值(fitted)和殘差(resid)都添加到原數據裏去,然後更新數據集(用%+%),將默認的y圖形屬性改成resid,最後對整個數據添加一條光滑曲線。

Oxboys$fitted <- predict(model)
Oxboys$resid <- with(Oxboys, fitted - height)

oplot %+% Oxboys + aes(y = resid) + geom_smooth(aes(group = 1))

在這裏插入圖片描述
從圖形可以看到殘差並不是隨機分佈的,因此所建立的模型有缺陷。我們向模型中添加一個二次項,再次計算擬合值和殘差並重新繪製殘差圖。這次沒有明顯的證據表明模型擬合得不好。

model2 <- update(model, height ~ age + I(age^2))
Oxboys$fitted2 <- predict(model2)
Oxboys$resid2 <- with(Oxboys, fitted2 - height)

oplot %+% Oxboys + aes(y = resid2) + geom_smooth(aes(group = 1)) 

在這裏插入圖片描述

值得注意的是,我們對圖形對象的修改是非常容易的。我們更新了數據並且重新作了兩次圖卻沒有再次運行過oplot,這正是ggplot2圖層功能所秉承的理念:使得反覆擬合和評估模型變得輕鬆而自然。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章