3

後半がこの式に適合する棒グラフがあります 。次に、棒グラフ全体をプロットし、棒グラフの最後の部分にのみ当てはまるモデルを表示します。しかし、後半だけ線グラフを表示する方法が見つかりません。私がただ何かをするならy~axexp(-b*x^2)


submitted=c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 2L, 2L, 3L, 2L, 1L, 1L, 4L, 
3L, 2L, 11L, 6L, 2L, 16L, 7L, 17L, 36L, 27L, 39L, 41L, 33L, 42L, 
66L, 92L, 138L, 189L, 249L, 665L, 224L, 309L, 247L, 641L, 777L, 
671L, 532L, 749L, 506L, 315L, 292L, 281L, 130L, 137L, 91L, 40L, 
27L, 34L, 19L, 1L)
x=seq(0:(length(submitted)-1))
y1=rs$submitted[30:(length(submitted)-1)]
x1=seq(0:(length(y1)-1))
fit1=nls(y1~a*x1*exp(-b*x1^2),start=list(a=500,b=.01),trace=TRUE)
barplot(submitted,names.arg=x, las=2, cex.axis=0.8, cex=0.8)
lines(predict(fit1))

線が表示されますが、位置が間違っています。では、線を引く場所をどのように制御できますか?

4

2 に答える 2

3

再現可能な例は役に立ちましたが、おそらく問題は、バーが期待するx座標に配置されていないことです。barplot関数の出力をキャプチャすることにより、バーのx座標を見つけることができます。

dat <- 1:5                   # fake data for barplot
fit <- dat+rnorm(5, sd=0.1)  # fake fitted values

bp <- barplot(dat)           # draw plot and capture x-coordinates
lines(bp, fit)               # add line

編集:
同じ原則を使用して、部分的な行を追加できます。コードを少し書き直して、idxモデル化するデータの部分を示すインデックスを取得します。

x <- 0:(length(submitted)-1) 
idx <- 30:(length(submitted)-1)  # the part of the data to be modeled
y1 <- submitted[idx] 
x1 <- idx-30 
fit1 <- nls(y1~a*x1*exp(-b*x1^2),start=list(a=500,b=.01),trace=TRUE) 
# capture the midpoints from the barplot
bp <- barplot(submitted,names.arg=x, las=2, cex.axis=0.8, cex=0.8) 
# subset the midpoints to the range of the fit
lines(bp[idx], predict(fit1)) 

(最初は0からnのシーケンスを与えないので、私もに変更seq(0:n)したことに注意してください。)0:n

于 2010-02-16T16:18:34.727 に答える
0

アニコから答えを取り、あなたの特定の問題にそれを作り直してください。submittedあなたが投稿したデータを使用しました。

変数を定義します。

y1 <- submitted[30:(length(submitted)-1)]
x1 <- seq(length(y1))

seq()このように関数を使うだけで十分です。それはすでにあなたのために仕事をします。barplot()次に、アニコが述べたように、フィットを実行して自分のx値をキャプチャします。これにより、x値が行列に保存されるので、as.vector()後でそれを使用してベクトルに変換し、作業を少し簡単にします。

fit1 <- nls(y1~a*x1*exp(-b*x1^2),start=list(a=500,b=.01),trace=TRUE)
bar <- barplot(submitted, las=2, cex.axis=0.8, cex=0.8)
bar2 <- as.vector(bar)

単に印刷するbar2と、正確な値が表示され、プロットのどこにフィットを配置するかを指定できます。lines()次の関数では、xベクトルがyベクトルと同じ長さであることを確認してください。たとえば、関数を使用していくつかの追加チェックを行うことができlength()ます。棒グラフの後半に配置されたフィットは次のとおりです。

lines(x = bar2[30:(length(bar2)-1)], y = predict(fit1))
于 2010-02-16T16:12:44.730 に答える