R (数値計算)

2019年7月 1日 (月)

[R]階乗を計算する

factorial関数を使う。以下、実行例。なお、4の階乗(4!)は24である。

> factorial(4)
[1] 24

ガンマ関数の値を計算するgamma関数を使っても計算できる。ガンマ関数の以下の性質を利用する。

Γ(n + 1) = n! (nは整数かつn≧1)

> gamma(4 + 1)
[1] 24

factorial関数とgamma関数はその実行速度が異なる。gamma関数のほうが断然早いので、gamma関数の使用を推奨する。

> system.time(for (i in 1:1000000) factorial(4))
ユーザ システム 経過
0.39 0.00 0.39
> system.time(for (i in 1:1000000) gamma(4 + 1))
ユーザ システム 経過
0.11 0.00 0.11

2019年6月25日 (火)

[R]スプライン関数によるデータの平滑化

smooth.spline関数を使う。Rの初期状態で使うことができる。以下、実行例。

> x <- c(1, 2, 4, 6, 8, 16)
> y <- c(0, 1, 2, 4, 3, 5)
> r <- smooth.spline(y ~ x, all.knots = TRUE)
> estx <- seq(min(x), max(x), length.out = 80)
> esty <- predict(r, estx)$y
> plot(x, y)
> lines(estx, esty, col = "red")
> print(r)
Call:
smooth.spline(x = y ~ x, all.knots = TRUE)
Smoothing Parameter spar= 0.5378882 lambda= 0.006212978 (14 iterations)
Equivalent Degrees of Freedom (Df): 2.943406
Penalized Criterion (RSS): 1.55995
GCV: 1.001812

Figure1 

[R]標準正規分布に従う確率変数(乱数)を得る

rnorm関数を使う。引数には、発生させる乱数の数を与える。

> rnorm(1)
[1] -1.35796
> rnorm(3)
[1] -0.5810260 -2.1525327 0.2157626

標準正規分布とは、平均が0、標準偏差が1の正規分布である。0付近の数値が多く得られ、正負の実数が得られる。

2019年3月13日 (水)

[R]行列の階数を得る

QR分解を行う関数qrの戻り値に階数がある(rank)。これを使用する。

> d1 <- rep(1, 9)
> ma1 <- matrix(d1, nrow = 3, byrow = TRUE)
> ma1
     [,1] [,2] [,3]
[1,]    1    1    1
[2,]    1    1    1
[3,]    1    1    1
> qr(ma1)$rank
[1] 1
> d2 <- c(1,1,1,0,1,0,0,0,1)
> ma2 <- matrix(d2, nrow = 3, byrow = TRUE)
> ma2
     [,1] [,2] [,3]
[1,]    1    1    1
[2,]    0    1    0
[3,]    0    0    1
> qr(ma2)$rank
[1] 3
> d3 <- c(1,1,1,0,0,1,0,0,0)
> ma3 <- matrix(d3, nrow = 3, byrow = TRUE)
> ma3
     [,1] [,2] [,3]
[1,]    1    1    1
[2,]    0    0    1
[3,]    0    0    0
> qr(ma3)$rank
[1] 2

2019年3月 2日 (土)

[R]計算機イプシロンを得る

計算機イプシロンとは、その計算機の計算で 1 + ε > 1 が成立する最小の正数のこと。計算機内での数値表現の制度の目安として使われる。Rでは.Machine変数に格納されている。.Machine変数のdouble.epsを参照する。これが計算機イプシロン。

> .Machine$double.eps
[1] 2.220446e-16

.Machine変数自体はリストで、その計算機の計算精度に関するいろいろな情報が格納されている。以下は、64ビット版のWindowsで64ビット版のR上で表示させた例。

> class(.Machine)
[1] "list"
> .Machine
$double.eps
[1] 2.220446e-16
$double.neg.eps
[1] 1.110223e-16
$double.xmin
[1] 2.225074e-308
$double.xmax
[1] 1.797693e+308
$double.base
[1] 2
$double.digits
[1] 53
$double.rounding
[1] 5
$double.guard
[1] 0
$double.ulp.digits
[1] -52
$double.neg.ulp.digits
[1] -53
$double.exponent
[1] 11
$double.min.exp
[1] -1022
$double.max.exp
[1] 1024
$integer.max
[1] 2147483647
$sizeof.long
[1] 4
$sizeof.longlong
[1] 8
$sizeof.longdouble
[1] 16
$sizeof.pointer
[1] 8

2019年2月28日 (木)

[R]小数を整数に変換する関数の機能の違い

Rで小数を整数に変換する関数は4つあり、それぞれ機能が異なる。

trunc
→指定の数値から小数点以下を切り捨てる
floor
→指定の数値以下で最大の値を返す
ceiling
→指定の数値以上で最小の値を返す
round
→JIS Z 8401「数値の丸め方」に基づく丸め

> d <- c(2.4, 2.5, 2.6, -2.4, -2.5, -2.6)
> trunc(d)
[1]  2  2  2 -2 -2 -2
> floor(d)
[1]  2  2  2 -3 -3 -3
> ceiling(d)
[1]  3  3  3 -2 -2 -2
> round(d)
[1]  2  2  3 -2 -2 -3

「切り捨て」はtrunc関数、「切り上げ」はceiling関数になる。round関数は四捨五入ではなく、いわゆる五捨五入であることに注意。

2018年9月 4日 (火)

[R]エラーメッセージ「.onLoad は loadNamespace()('rJava' に対する)の中で失敗しました」

パッケージxlsxを使用しようとしたときに、以下のエラーメッセージが表示されて使えないときがある。

> library(xlsx)
エラー: package or namespace load failed for ‘xlsx’:
  .onLoad は loadNamespace()('rJava' に対する)の中で失敗しました、詳細は:
  call: fun(libname, pkgname)
  error: JAVA_HOME cannot be determined from the Registry

原因はJRE(Javaの実行環境)がそのパソコンにインストールされていないため。JREをインストールすれば、使えるようになる。

Windowsの場合、インストールするJavaは、JREでもJDKでもどちらでもかまわない。32bit版でも64bit版どちらでもかまわない。Java8でもJava10どちらでもかまわない。

なお、エラーの大本は、パッケージxlsxから自動で呼び出しているパッケージrJavaがこのエラーを発生しているためである。

> library(rJava)
エラー: package or namespace load failed for ‘rJava’:
  .onLoad は loadNamespace()('rJava' に対する)の中で失敗しました、詳細は:
  call: fun(libname, pkgname)
  error: JAVA_HOME cannot be determined from the Registry

2018年8月25日 (土)

[R]現在の環境のタイムゾーンを取得する

Sys.timezone関数を使用する。

> Sys.timezone()
[1] "Asia/Tokyo"

2017年9月 7日 (木)

[R]F検定におけるF分布上の臨界値を計算する

qf関数を使う。書式は以下のとおり。

qf(1-有意水準, F値の分子の自由度, F値の分母の自由度)

以下、使用例。F値の分子の自由度が1、分母の自由度が54の場合の有意水準1%の臨界値の計算は以下のとおり。

> qf(0.99,1,54)
[1] 7.128819

2017年3月16日 (木)

[R]スプライン関数で簡単に平滑化を行う

splinefun関数を使えば良い。splinefun関数は標準で組み込まれており、特にパッケージを使わなくても使用することができる。

一度計算を行えば、その計算結果を使用して任意の地点の計算値(推定値)を簡単に求めることもでる。さらに、この計算により作成された曲線の傾きの値(1階微分の値)も簡単に得られる。

以下は、簡単な使用例。元の値を黒丸で、スプライン関数により平滑化して作成した値を赤実線で示してある。なお、splinefun関数の戻り値は関数であることに注意。

> # 平滑化を行うデータを作成
> x <- c(0, 1, 2, 3, 4, 5, 6, 8, 9)
> y <- c(0, 1, 2, 3, 2, 3, 4, 5, 5)
> # スプライン関数で平滑化の計算
> sp <- splinefun(x, y)
> # 平滑化データの作成
> xest <- seq(min(x), max(x), by = 0.1)
> yest <- sp(xest)
> # 図の作成
> plot(xest, yest, type = "l", col = "red")
> points(x, y, pch = 16, col = "black")

Image31 平滑化により得られた曲線の傾きの値を得るには、上記の例でいえば、splinefun関数の戻り値であるspにderivオプションを付けて実行すれば良い。以下は1階微分の値を得て、それを黒実線で描画した図。

> yest1 <- sp(xest, deriv = 1)
> plot(xest, yest1, type = "l")

Image32

より以前の記事一覧