R:ggplot2のスムーズから外れ値を除去する方法は?
-
25-09-2019 - |
質問
GGPLOT2でプロットしようとしている次のデータセットがあります。これは、A1、B1、C1の3つの実験の時系列であり、各実験には3つの複製がありました。
より滑らかな(平均と分散?)を返す前に、外れ値を検出して削除する統計を追加しようとしています。私は自分の外れ値の関数を書きました(表示していません)が、これを行う機能がすでにあると思います。
ggplot2ブックのいくつかの例から、stat_sum_df( "median_hilow"、geom = "smooth")を見ましたが、hmiscのヘルプdocが外れ値を削除するかどうかを確認していませんでした。
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
編集:上の例データではなく、実際のデータから抱えている外れ値の問題の例を示して、以下に2つのチャートを追加しました。
最初のプロットは、シリーズP26S4を示しており、32日前後の実際の奇妙なことが2つの複製で起こり、2つの外れ値を示しています。
2番目のプロットはシリーズP22S5を示しており、18日目には、その日の読書で奇妙なことが起こりました。
現時点では、私はデータを眼球化しており、成長曲線が大丈夫に見えることを確認しています。 Hadleyのアドバイスを受けてFamily = "Symmetric"を設定した後、Loess Smootherが外れ値を無視するというまともな仕事をしていると確信しています。
@Peter/@Hadley、次にやりたいことは、Loessの代わりにロジスティック、Gompertz、またはRichardの成長曲線をこのデータに適合させ、指数関数段階の成長率を計算することです。最終的に私はrでgrofitパッケージを使用する予定です(http://cran.r-project.org/web/packages/grofit/index.html)、しかし今のところ、可能であればggplot2を使用して手動でプロットしたいと思います。ポインターがあれば、それは大歓迎です。
解決
試しましたか family = "symmetric"
への議論 geom_smooth
(これは順番に渡されます loess
)?これにより、黄土が外れ値に滑らかに耐性になります。
しかし、あなたのデータを見ると、なぜ線形フィットが適切ではないと思いますか?あなたは4 x値しか持っておらず、直線性からの逸脱の強力な証拠は確かにないようです。
他のヒント
まず、「外れ値」がこのような小さなデータで適切に定義されているかどうかはわかりません。
第二に、「外れ値」とはどういう意味かを決める必要があります。つまり、それは薬の1つ、複製の1つ、または時点の1つですか?
ハドリーが指摘しているように、直線性からの逸脱の証拠はほとんどありません。
最後に、よりスムーズを使用する点の一部は、十分なデータがあれば、外れ値をうまく処理することだと思います。しかし、あなたはほとんど持っていません。
ですから、なぜ外れ値を削除したいのかを正確に尋ねなければなりません。つまり、これらのデータをどうするつもりですか(素敵なプロットを作成する以外に)?
これが役立つことを願っています