対数関係にあるように見えるデータポイント(xとy)がいくつかあります。
> mydata
x y
1 0 123
2 2 116
3 4 113
4 15 100
5 48 87
6 75 84
7 122 77
> qplot(x, y, data=mydata, geom="line")
ここで、グラフに適合し、他のデータポイントを推測できる基礎となる関数を見つけたいと思います(つまり、3
または82
)。 lm
とnls
について読みましたが、実際にはどこにも行きません。
最初に、私はそれがプロットに最も似ていると思った関数を作成しました:
f <- function(x, a, b) {
a * exp(b *-x)
}
x <- seq(0:100)
y <- f(seq(0:100), 1,1)
qplot(x,y, geom="line")
その後、nls
を使用してフィッティングモデルを生成しようとしました。
> fit <- nls(y ~ f(x, a, b), data=mydata, start=list(a=1, b=1))
Error in numericDeriv(form[[3]], names(ind), env) :
Missing value or an Infinity produced when evaluating the model
誰かがここから何をすべきかについて正しい方向に私を向けることができますか?
フォローアップ
コメントを読んでもう少しグーグルした後、a
、b
、c
の開始パラメーターを調整すると、突然モデルが収束しました。
fit <- nls(y~f(x,a,b,c), data=data.frame(mydata), start=list(a=1, b=30, c=-0.3))
x <- seq(0,120)
fitted.data <- data.frame(x=x, y=predict(fit, list(x=x))
ggplot(mydata, aes(x, y)) + geom_point(color="red", alpha=.5) + geom_line(alpha=.5) + geom_line(data=fitted.data)
たぶん、モデルに3次仕様を使用し、lm
を介して推定すると、適切に適合します。
# Importing your data
dataset <- read.table(text='
x y
1 0 123
2 2 116
3 4 113
4 15 100
5 48 87
6 75 84
7 122 77', header=T)
# I think one possible specification would be a cubic linear model
y.hat <- predict(lm(y~x+I(x^2)+I(x^3), data=dataset)) # estimating the model and obtaining the fitted values from the model
qplot(x, y, data=dataset, geom="line") # your plot black lines
last_plot() + geom_line(aes(x=x, y=y.hat), col=2) # the fitted values red lines
# It fits good.
応答変数のログを取得し、lm
を使用して線形モデルを近似してみてください。
fit <- lm(log(y) ~ x, data=mydata)
調整済み決定係数は0.8486であり、額面どおり悪くはありません。たとえば、プロットを使用して近似を確認できます。
plot(fit, which=2)
しかし、おそらく、それは結局のところそれほど適切ではありません:
last_plot() + geom_line(aes(x=x, y=exp(fit$fitted.values)))
このドキュメントをチェックしてください: http://cran.r-project.org/doc/contrib/Ricci-distributions-en.pdf
簡単に言うと、最初にデータに適合するモデル(指数関数など)を決定してから、そのパラメーターを推定する必要があります。
広く使用されているディストリビューションは次のとおりです。 http://www.itl.nist.gov/div898/handbook/eda/section3/eda366.htm