2017-09-09 33 views
0

Rのバープロットに回帰直線を重ねたいと思っています。Rosindellらの添付画像と同様です。しかし、私が自分のデータでこれをしようとすると、線はバープロットの全長を伸ばしません。Rの棒グラフに回帰直線を重ねるにはどうすればよいですか?

、再現例えば、私は、ダミーのコードを作った:

x = 20:1 
y = 1:20 

barplot(x, y, space = 0) 
lines(x, y, col = 'red') 

私はbarplotビンの全体のストレッチを横断するラインを取得するにはどうすればよいですか?

PS:ラインは非線形である必要はありません。バープロットに直線を重ねるだけです。

ありがとうございます。

Rindell et al. 2011 My sample plot

答えて

1

より一般的な解決策は、barplot()によって生成されるx値に依存することができます。この方法では、(xとyの値ではなく)カウントだけを持つシナリオに対処できます。私はこのような変数を参照しています。ここでは、 "x"がカテゴリになっています(正確にはx軸の値はyの名前に対応しています)。

p.x <- c(8,12,14,9,5,3,2) 
x <- sample(c("A","B","C","D","E","F","G"), 
      prob = p.x/sum(p.x), 
      replace = TRUE, 
      size = 200) 
y <- table(x) 
y 
# A B C D E F G 
# 27 52 46 36 21 11 7 

あなたがbarplot()を使用する場合は、あなたがあなたのラインを導くために、変数のバーのx位置(この場合はplot.dim)を収集し、使用することができます

plot.dim <- barplot(y) 
lines(plot.dim, y, col = "red", lwd = 2) 

結果 enter image description here

今、あなたのデータに戻ってください。 xとyの両方を持っていても、barplotにはy変数だけが表示され、xはyのラベルに使われます。

x <- 20:1 
y <- as.integer(22 - 1 * sample(seq(0.7, 1.3, length.out = length(x))) * x) 

names(y) <- x 
y <- y[order(as.numeric(names(y)))] 

y値をもう一度プロットしてみましょう。 xpos変数のバープロット位置を収集します。

xpos <- barplot(y, las = 2) 

最初のバー(X = 1)同様に1に位置していないことに注意してくださいは、最後のバーは23.5(としない20)に位置しています。

xpos[1] 
# x=1 is indeed at 0.7 
xpos[length(xpos)] 
# x=20 is indeed at 23.5 

回帰(たとえば、lm()を使用)を実行しますか?最初と最後のx(yラベル)の予測y値を計算します。

lm.fit <- lm(y~as.numeric(names(y))) 
y.init <- lm.fit$coefficients[2] * as.numeric(names(y))[1] + lm.fit$coefficients[1] 
y.end <- lm.fit$coefficients[2] * as.numeric(names(y))[(length(y))] + lm.fit$coefficients[1] 

あなたは今segments()を使用して線を介してポーズが、xposに保存されている内容に応じて、あなたのxの値を設定することを忘れないでくださいすることができます。

segments(xpos[1], y.init, xpos[length(xpos)], y.end, lwd = 2, col = "red") 

enter image description here

+0

この博士ファンティーニいただきありがとうございます。私は自分のデータでこれを試してみました。しかし、直線を直線にする方法がある(すなわち、ビンの中心のまわりで跳ね返っていない)。私はデータ内の棒グラフを横断する線形回帰直線を作りたい。線がまっすぐであれば良いでしょう。 –

+0

あなたの質問に答えるために私の答えが更新されました。確かにあなたは回帰を過度にすることができます。 barplot()関数が返すx値を必ず使用してください。 –

1

チェックアウトヘルプページ?barplot:第二引数はありませんy座標width - optional vector of bar widths、です。次のコードはあなたが望むものを行いますが、一般的な目的のソリューションだとは思いません。

barplot(y[x], space = 0) 
lines(x, y, col = 'red') 

enter image description here

編集:
A、おそらくより良い方法がbarplotの戻り値を用いることであろう。

bp <- barplot(y[x], space = 0) 
lines(c(bp), y[x], col = 'red') 
関連する問題