11

単純なデータセットがあり、パワー トレンドを使用してデータに最適に適合させようとしています。サンプル データは非常に小さく、次のようになります。

structure(list(Discharge = c(250, 300, 500, 700, 900), Downstream = c(0.3, 
0.3, 0.3, 0.3, 0.3), Age = c(1.32026239202165, 1.08595138888889, 
0.638899189814815, 0.455364583333333, 0.355935185185185)), .Names = c("Discharge", 
"Downstream", "Age"), row.names = c(NA, 5L), class = "data.frame")

データは次のようになります。

> new
  Discharge Downstream       Age
1       250        0.3 1.3202624
2       300        0.3 1.0859514
3       500        0.3 0.6388992
4       700        0.3 0.4553646
5       900        0.3 0.3559352

を使用して上記のデータをプロットしようとしましたggplot2

ggplot(new)+geom_point(aes(x=Discharge,y=Age))

を使用して線形線を追加できgeom_smooth(method="lm")ますが、電力線を表示するために必要なコードがわかりません。

出力は次のとおりです。

ここに画像の説明を入力

Excel で行ったように、累乗線形回帰直線を追加するにはどうすればよいですか? エクセルの図は以下のとおりです。

ここに画像の説明を入力

4

3 に答える 3

17

mnel の答えは非線形最小二乗法では正しいですが、Excel は実際にはそれほど洗練された処理を行っていないことに注意してください。実際には、応答変数と予測変数を対数変換し、通常の (線形) 最小二乗法を実行するだけです。これを R で再現するには、次のようにします。

lm(log(Age) ~ log(Discharge), data=df)

Call:
lm(formula = log(Age) ~ log(Discharge), data = df)

Coefficients:
   (Intercept)  log(Discharge)  
         5.927          -1.024  

チェックとして、 の係数log(Discharge)は Excel の係数と同じですが、exp(5.927) ~ 375.05 です。

これをggplot2のトレンドラインとして使用する方法がわかりませんが、ベースグラフィックスで次のように使用できます。

m <- lm(log(y) ~ log(x), data=df)

newdf <- data.frame(Discharge=seq(min(df$Discharge), max(df$Discharge), len=100))
plot(Age ~ Discharge, data=df)
lines(newdf$Discharge, exp(predict(m, newdf)))

text(600, .8, substitute(b0*x^b1, list(b0=exp(coef(m)[1]), b1=coef(m)[2])))
text(600, .75, substitute(plain("R-square: ") * r2, list(r2=summary(m)$r.squared)))
于 2013-08-19T07:19:38.023 に答える
11

nlsスムーザーとして (非線形最小二乗) を使用します

例えば

ggplot(DD,aes(x = Discharge,y = Age)) +
  geom_point() + 
  stat_smooth(method = 'nls', formula = 'y~a*x^b', start = list(a = 1,b=1),se=FALSE)

ここでR2乗値と非線形モデルに関するDoug Batesのコメントに注目すると、グラフに回帰直線方程式とR2を追加するのアイデアを使用できます

回帰直線の式を追加します

# note that you have to give it sensible starting values
# and I haven't worked out why the values passed to geom_smooth work!
power_eqn = function(df, start = list(a =300,b=1)){
  m = nls(Discharge ~ a*Age^b, start = start, data = df);
  eq <- substitute(italic(y) == a  ~italic(x)^b, 
               list(a = format(coef(m)[1], digits = 2), 
                    b = format(coef(m)[2], digits = 2)))
  as.character(as.expression(eq));                 
}

ggplot(DD,aes(x = Discharge,y = Age)) +
  geom_point() + 
  stat_smooth(method = 'nls', formula = 'y~a*x^b', start = list(a = 1,b=1),se=FALSE) +  
  geom_text(x = 600, y = 1, label = power_eqn(DD), parse = TRUE)
于 2013-08-19T03:15:04.397 に答える