簡體   English   中英

R:如何從ggplot2中更順暢地刪除異常值?

[英]R: How to remove outliers from a smoother in ggplot2?

我有以下數據集,我試圖用ggplot2繪圖,它是三個實驗A1,B1和C1的時間序列,每個實驗有三個重復。

我想添加一個stat,它可以在返回更平滑(均值和方差?)之前檢測並刪除異常值。 我已經編寫了自己的異常函數(未顯示),但我希望已經有一個函數來執行此操作,我只是沒有找到它。

我從ggplot2書中的一些例子看過stat_sum_df(“median_hilow”,geom =“smooth”),但我不明白Hmisc的幫助文檔,看它是否刪除了異常值。

是否有一個函數可以在ggplot中刪除這樣的異常值,或者我在哪里修改我的代碼以添加我自己的函數?

編輯:我剛看到這個( 如何在R代碼中使用異常值測試 )並注意到Hadley建議使用一個強大的方法,如rlm。 我正在繪制細菌生長曲線,所以我不認為線性模型是最好的,但是在這種情況下對其他模型或使用或使用穩健模型的任何建議都將受到重視。

library (ggplot2)  

data = data.frame (day = c(1,3,5,7,1,3,5,7,1,3,5,7,1,3,5,7,1,3,5,7,1,3,5,7,1,3,5,7,1,3,5,7,1,3,5,7), od = 
c(
0.1,1.0,0.5,0.7
,0.13,0.33,0.54,0.76
,0.1,0.35,0.54,0.73
,1.3,1.5,1.75,1.7
,1.3,1.3,1.0,1.6
,1.7,1.6,1.75,1.7
,2.1,2.3,2.5,2.7
,2.5,2.6,2.6,2.8
,2.3,2.5,2.8,3.8), 
series_id = c(
"A1", "A1", "A1","A1",
"A1", "A1", "A1","A1",
"A1", "A1", "A1","A1",
"B1", "B1","B1", "B1",
"B1", "B1","B1", "B1",
"B1", "B1","B1", "B1",
"C1","C1", "C1", "C1",
"C1","C1", "C1", "C1",
"C1","C1", "C1", "C1"),
replicate = c(
"A1.1","A1.1","A1.1","A1.1",
"A1.2","A1.2","A1.2","A1.2",
"A1.3","A1.3","A1.3","A1.3",
"B1.1","B1.1","B1.1","B1.1",
"B1.2","B1.2","B1.2","B1.2",
"B1.3","B1.3","B1.3","B1.3",
"C1.1","C1.1","C1.1","C1.1",
"C1.2","C1.2","C1.2","C1.2",
"C1.3","C1.3","C1.3","C1.3"))

> data
   day   od series_id replicate
1    1 0.10        A1      A1.1
2    3 1.00        A1      A1.1
3    5 0.50        A1      A1.1
4    7 0.70        A1      A1.1
5    1 0.13        A1      A1.2
6    3 0.33        A1      A1.2
7    5 0.54        A1      A1.2
8    7 0.76        A1      A1.2
9    1 0.10        A1      A1.3
10   3 0.35        A1      A1.3
11   5 0.54        A1      A1.3
12   7 0.73        A1      A1.3
13   1 1.30        B1      B1.1
... etc...

這是我到目前為止所做的並且工作得很好,但不刪除異常值:

r <- ggplot(data = data, aes(x = day, y = od))
r + geom_point(aes(group = replicate, color = series_id)) + # add points
   geom_line(aes(group = replicate, color = series_id)) + # add lines
   geom_smooth(aes(group = series_id))  # add smoother, average of each replicate

編輯:我剛剛在下面添加了兩個圖表,顯示了我從實際數據而不是上面的示例數據中獲得的離群值問題的示例。

第一個圖顯示了p26s4系列,大約在第32天,在兩個重復中出現了一些非常奇怪的事情,顯示了2個異常值。

第二個圖顯示了系列p22s5,在第18天,當天閱讀時發生了一些奇怪的事情,我認為可能是機器錯誤。

目前,我正在關注數據,檢查增長曲線是否正常。 在采納哈德利的建議並設定家庭=“對稱”后,我相信黃土更順暢地做了一個忽視異常值的體面工作。

p26s4顯示在第32天左右,在兩個重復中出現了一些非常奇怪的事情,顯示出2個異常值 p22s5顯示,在第18天,當天閱讀時出現了一些奇怪的事情,我認為這可能是機器錯誤

@ Peter / @ hadley,接下來我要做的是嘗試將邏輯,gompertz或richard的增長曲線擬合到這個數據而不是黃土,並計算指數階段的增長率。 最后我打算在R中使用grofit包( http://cran.r-project.org/web/packages/grofit/index.html ),但是現在我想用ggplot2手動繪制這些包。 如果您有任何指示,那將非常感激。

你有沒有嘗試過geom_smoothfamily = "symmetric"參數(它會被傳遞給loess )? 這將使黃土光滑抵抗異常值。

但是,查看您的數據,為什么您認為線性擬合是不夠的? 你只有4個x值,而且似乎沒有強有力的證據表明偏離線性。

首先,我不確定在這些小數據上是否正確定義了“異常值”。

其次,你必須決定你所說的“異常值”是什么意思,它是葯物之一,重復之一,還是其中一個時間點?

正如哈德利指出的那樣,幾乎沒有證據表明偏離線性。

最后,我認為使用更平滑的一點是,如果有足夠的數據,它可以很好地處理異常值。 但你很少。

所以,我必須問你為什么要刪除異常值。 也就是說,你打算用這些數據做什么(除了制作好的情節)?

我希望這有幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM