6

ggplot2でプロットしようとしている次のデータセットがあります。これは、3つの実験A1、B1、およびC1の時系列であり、各実験には3つの複製があります。

よりスムーズな値(平均と分散?)を返す前に、外れ値を検出して削除する統計を追加しようとしています。私は独自の外れ値関数(図には示されていません)を作成しましたが、これを実行する関数がすでに存在することを期待しています。

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

編集:上記の例のデータではなく、実際のデータから発生している外れ値の問題の例を示す2つのグラフを以下に追加しました。

最初のプロットはシリーズp26s4を示しており、32日目頃、2つの複製で本当に奇妙なことが起こり、2つの外れ値が示されています。

2番目のプロットはシリーズp22s5を示しており、18日目には、その日の読み取りで何か奇妙なことが起こりました。おそらくマシンエラーだと思います。

現時点では、成長曲線に問題がないことを確認するために、データに注目しています。Hadleyのアドバイスを受け、family = "symmetric"に設定した後、私は、レススムーザーが外れ値を無視するというまともな仕事をしていると確信しています。

p26s4は、32日目頃に、2つの複製で本当に奇妙なことが起こったことを示し、2つの外れ値を示しています p22s5は、18日目に、その日の読み取りで何か奇妙なことが起こったことを示しています。おそらくマシンエラーだと思います

@ Peter / @ hadley、次にやりたいことは、黄土ではなく、ロジスティック、ゴンペルツ、またはリチャードの成長曲線をこのデータに適合させ、指数関数的段階での成長率を計算することです。最終的にはRでgrofitパッケージ(http://cran.r-project.org/web/packages/grofit/index.html)を使用する予定ですが、今のところ、可能であればggplot2を使用してこれらを手動でプロットしたいと思います。あなたが何かポインタを持っているなら、それは大いにありがたいです。

4

2 に答える 2

15

あなたはへのfamily = "symmetric"議論を試みましたかgeom_smooth(それは順番にに渡されloessます)?これにより、レスは外れ値に対して滑らかになります。

構文は次のようになります。

geom_smooth(method = loess, method.args = list(family = "symmetric"))

しかし、データを見ると、なぜ線形フィットが適切でないと思いますか?x値は4つしかなく、線形性からの逸脱を示す強力な証拠は確かにないようです。

于 2010-04-10T12:17:55.630 に答える
2

まず、このような小さなデータで「外れ値」が適切に定義されているかどうかはわかりません。

次に、「外れ値」の意味を決定する必要があります。つまり、それは薬物の1つ、複製の1つ、または時点の1つですか。

ハドリーが指摘しているように、線形性からの逸脱の証拠はほとんどありません。

最後に、スムーザーを使用するポイントの一部は、十分なデータがあれば、外れ値をうまく処理できることだと思います。しかし、あなたにはほとんどありません。

したがって、外れ値を削除する理由を正確に尋ねる必要があります。つまり、これらのデータをどのように処理しますか(適切なプロットを作成する以外に)?

これがお役に立てば幸いです

于 2010-04-10T18:31:11.207 に答える