« 2014年1月 | トップページ | 2014年3月 »

2014年2月13日 (木)

[R]簡単に非線形最小2乗法を行う

関数nlsを使うと、簡単に非線形最小2乗法を使うことができる。以下に使用例を示す。

> x <- c(1, 2, 3, 5, 7, 9)  # 横軸の値
> y <- c(1, 4, 10, 30, 40, 80)  # 縦軸の値
> # 関数nlsで非線形最小2乗法を実施
> r <- nls(y ~ a * exp(b * x), start = c(a = 1, b = 1))
> # 得られた最小2乗解による計算値を計算する横軸座標
> xest <- 1:10
> # 関数predictを使うためにはデータフレームかが必要
> data <- data.frame(x = xest)
> # xestで指定をしたところの最小2乗解を得る
> yest <- predict(r, data)
> plot(x, y)  # 観測値を図にプロット
> lines(xest, yest)  # 最小2乗解を折れ線で描画
> print(r)  # 計算結果を表示
Nonlinear regression model
  model: y ~ a * exp(b * x)
   data: parent.frame()
       a        b
4.264107 0.326173
residual sum-of-squares: 114.38

Number of iterations to convergence: 12
Achieved convergence tolerance: 3.610584e-06

当然のことながら、適切な初期値を与えないと解は求まらないので注意。

2014年2月11日 (火)

[R]文字列で名前を与えた関数を実行する

数値計算のための汎用サブルーチン(関数)において、値を返す関数名を文字列として与えたいときがある。プログラミング言語では通常は使えない機能で、Fortran 77やFortran 95では、externalを使用することで行うことはできる。

関数callと関数evalを組み合わせて使用することで、文字列で名前を与えた関数を行い、計算も行うことができるようになる。

> sin(pi / 4)  # 普通に関数を実行
[1] 0.7071068
> s <- "sin"  # 文字列で名前を与えて行いたい関数名を指定
> eval(call(s, pi / 4))  # 関数の実行
[1] 0.7071068
> f <- function(x) { return(x ^ 2) }  # 自作関数の定義
> s <- "f"
> eval(call(s, 3))  # 自作関数名を文字列で与えて関数の実行
[1] 9
> atan2(pi, 4)  # 引数が2つ必要な数学関数で実験
[1] 0.6657738
> s <- "atan2"
> n1 <- pi  # 値も変数で与えることにする
> n2 <- 4  # 同上
> eval(call(s, n1, n2))
[1] 0.6657738

[R]微分する

関数expressionと関数Dを使うと、複雑な式でも解析的に導関数を求める(関数の微分を行いその式を得る)ことができる。

> f <- expression(x ^ 2)  # 関数の定義
> D(f, "x")  # xで微分
2 * x
> f <- expression(x ^ 2 * 2 * log(x))  # 少し複雑な関数(式)の定義
> D(f, "x")  # xで微分
2 * x * 2 * log(x) + x^2 * 2 * (1/x)

« 2014年1月 | トップページ | 2014年3月 »

無料ブログはココログ

■■

■■■