トップページ | 2014年2月 »

2014年1月29日 (水)

1回の繰り返し計算(ループ)で分散を求める

以下の例のようにすればよい。ただし、求まるのは分散(偏差の平方和をnで割った値)であって不偏分散(偏差の平方和をn-1で割った値)ではないことに注意。

x <- c(1, 2, 3, 4, 5, 6, 7, 8, 9)
n <- length(x)  # 標本数
sum <- sum2 <- 0.
for (i in 1:n) {
    sum <- sum + x[i]
    sum2 <- sum2 + x[i] ^ 2
}
(ave <- sum / n)  # 平均
(vari <- sum2 / n - ave * ave)  # 分散

参考までに、Rに標準で搭載されている分散を求める関数varは不偏分散を求めるものである。

2014年1月25日 (土)

[R]SpatialLinesDataFrameオブジェクトから座標データを簡単に抜き出す

ggplot2パッケージに含まれる関数fortifyを使うと、SpatialLinesDataFrameオブジェクトから座標データを簡単なデータフレーム形式に変換してくれる。以下に、線が20含まれるシェープファイルmap.shpを使用した例を示す。

> library(maptools)
> library(ggplot2)
> shp <- readShapeLines("map.shp")
> shp
(大量にデータが表示される)
> length(shp)  # 線の数
[1] 20
> df <- fortify(shp)  # データフレーム形式に変換
> is.data.frame(df)
[1] TRUE
> head(df, 3)
         long         lat order piece group id
1 ・・・
2 ・・・
3 ・・・
> tail(df, 3)
             long         lat order piece  group   id
○○ ・・・
○○ ・・・
○○ ・・・

含まれる線の識別は列idを見ればよい。上記の例でいうと、列idは1から始まり線が変わることにidが1ずつ増えて最終行のidは20になる。

2014年1月24日 (金)

SpatialLinesDataFrameオブジェクトから座標データを抜き出す。

S4クラスである。下記は線の数が20含まれるmap.shpというシェープファイルを読み込んだときの例。「・・・」は表示を省略していることを示す。

> library(maptools)
> shp <- readShapeLines("map.shp")
> mode(shp)  # クラスを確認
[1] "S4"
> length(shp)  # シェープファイルに含まれる線の数
[1] 20
> shp@lines[[1]]@Lines[[1]]@coords  # 1番目の線の座標
            [,1]        [,2]
[1,] ・・・
[2,] ・・・
[3,] ・・・
> shp@lines[[2]]@Lines[[1]]@coords  # 2番目の線の座標
             [,1]        [,2]
[1,] ・・・
[2,] ・・・
[3,] ・・・
[4,] ・・・
> shp@lines[[20]]@Lines[[1]]@coords  # 最後(20番目)の線の座標
            [,1]        [,2]
[1,] ・・・
[2,] ・・・
> shp@lines[[21]]@Lines[[1]]@coords  # 最後の次は当然無い
以下にエラー shp@lines[[21]] :  添え字が許される範囲外です
> is.matrix(shp@lines[[20]]@Lines[[1]]@coords)  # 座標データの形式を確認
[1] TRUE

座標データは、1桁目(上の[,1])にx座標(横軸方向)が、2桁目(上の[,2])にy座標(縦軸方向)が格納されている。

なお、spsurveyパッケージの関数read.shapeを使用して作成したオブジェクトでも扱いは全く同じ。

エラーメッセージ「Not polygon shapes」

maptoolsパッケージの関数readShapePolyを使用してシェープファイルを読み込むとき、うまくいかないことがある。以下はmap.shpというファイルを読み込むときの例。

> library(maptools)
要求されたパッケージ sp をロード中です
Checking rgeos availability: TRUE
> shp <- readShapePoly("map.shp")
以下にエラー .asSpatialPolygonsShapes(Map$Shapes, IDs, proj4string = proj4string,  :
  Not polygon shapes

シェープファイルにポリゴンのデータが含まれていないからと思われる。よって、この関数では扱えない。関数readShapeLinesを使えばよい。

> shp <- readShapeLines("map.shp")

2014年1月23日 (木)

[R]シェープファイルを扱う

maptoolsパッケージかspsurveyパッケージを利用すると、シェープファイルを扱うことができる。

> library(maptools)
Checking rgeos availability: TRUE
> library(spsurvey)
要求されたパッケージ sp をロード中です
Version 2.5 of the spsurvey package was loaded successfully.

片方だけでも当然使えるが、それぞれ機能が違う。

[R]分散を求める

var関数を使う。なお、var関数が計算するのは不偏分散(偏差の平方和をn-1で割った値、nは標本数)であり、高校数学で習う標本分散(偏差の平方和をnで割った値)ではないことに注意。

> x <- c(1, 2, 3, 4, 5, 6, 7, 8, 9)
> mean(x)  # 平均
[1] 5
> var(x)  # 不偏分散
[1] 7.5
> (length(x) - 1) / length(x) * var(x)  # 標本分散
[1] 6.666666667
> # 逐次計算で不偏分散と標本分散を計算してみる
> dss <- sum((x - mean(x)) ^ 2)  # 偏差の平方和
> dss / (length(x) - 1)  # 不偏分散
[1] 7.5
> dss / length(x)  # 標本分散
[1] 6.666666667

[R]平均を求める

mean関数を使う。

> x <- c(1, 2, 3, 4, 5, 6, 7)
> mean(x)
[1] 4

2014年1月20日 (月)

[R]read.table関数でテキストファイルを読み込むときに数字を文字として読み込む

例えば以下のようなテキストファイル data.dat を、

001 002
003 004

read.table関数でオプションを何も付けずに読み込むと、数値として読み込まれてしまう。

> df <- read.table("data.dat")
> df
  V1 V2
1  1  2
2  3  4

「001」や「002」を文字として読み込ませたいときは、colClassesオプションを使って文字型であることを明示すると、文字として読み込むことができる。

> df <- read.table("data.dat", colClasses = "character")
> df
   V1  V2
1 001 002
2 003 004

2014年1月17日 (金)

[ggplot2]複数のデータを重ねて図に描画する

演算子「+」を使用して描画オブジェクトを足し合わせればよい。

> library(ggplot2)
> x <- c(1, 2, 3)
> y1 <- c(2, 3, 5)
> y2 <- c(1, 5, 10)
> dtf1 <- data.frame(x = x, y = y1)
> dtf2 <- data.frame(x = x, y = y2)
> g <- ggplot(NULL)
> g <- g + geom_point(data = dtf1, aes(x, y))
> g <- g + geom_point(data = dtf2, aes(x, y))
> print(g)

Image2
注意点として、描画処理の最初に「g <- ggplot(NULL)」としてggplot2のオブジェクトを作成しておくことが必要であるので注意。

また、geom_point関数内で「data =」を省くとうまく動作しないのでこちらも注意。

Rグラフィックスクックブック ―ggplot2によるグラフ作成のレシピ集 ggplot2: Elegant Graphics for Data Analysis (Use R!)

はじめてのR: ごく初歩の操作から統計解析の導入まで RStudioではじめるRプログラミング入門 Rによるデータサイエンス データ解析の基礎から最新手法まで Rによる機械学習 (Programmer's SELECTION) Rによるやさしい統計学 R言語徹底解説 Rによるやさしいテキストマイニング R言語上級ハンドブック

2014年1月16日 (木)

[ggplot2]コマンドラインではグラフが描画されるのにスクリプトファイルでは描画されない

オブジェクトを作成して、それを(明示的に)描画する必要がある。例えば、コマンドラインでの入力では、以下のようにすればグラフは表示される。

> library(ggplot2)
> x <- c(1, 2, 3)
> y <- c(2, 3, 5)
> df <- data.frame(x, y)
> ggplot(df, aes(x, y)) + geom_point()

コマンドラインでは上記の最終行のようにggplotコマンドを使用すれば描画されるが、スクリプト内ではggplotのオブジェクトを作成して、それをprint関数で明示しなければ描画されない。つまり、以下のようにスクリプトファイルを書けばよい。

library(ggplot2)
x <- c(1, 2, 3)
y <- c(2, 3, 5)
df <- data.frame(x, y)
g <- ggplot(df, aes(x, y)) + geom_point()
print(g)

これを以下のように実行すればよい。

> source("test.R")

2014年1月15日 (水)

ggplot2パッケージを使う

libraryコマンドを使う。

> library(ggplot2)

2014年1月14日 (火)

[ggplot2]ggplot2パッケージのインストール

ggplot2パッケージは、Rのインストール直後の状態ではインストールされていない。使用するにはパッケージをインストールする。

install.packagesコマンドを使用する。ミラーサイトを選ぶ。1分もかからずインストールは完了する。

> install.packages("ggplot2")
--- このセッションで使うために、CRAN のミラーサイトを選んでください ---
(以下、略)

2014年1月12日 (日)

[R]ベクトルの要素から特定の条件を満たす値の要素数を得る

which関数を使う。which関数は引数に指定をした条件に合う要素の要素番号をベクトルで返す。

> n <- c(10, 20, 30, 40, 50)
> which(n >= 30)  # 値が30以上の要素の要素番号を得る
[1] 3 4 5
> length(which(n >= 30))  # 30以上は3つあるはず
[1] 3
> length(which(n >= 60))  # 60以上は1つもない
[1] 0

2014年1月11日 (土)

[R]ベクトルから指定の要素の値を取得する

ベクトルの要素番号の指定に、抜き出したい要素のインデックスをベクトルで指定する。

> n <- c(10, 20, 30, 40, 50)
> n
[1] 10 20 30 40 50
> n[c(1, 2, 4)]  # 1,2,4番目の要素を抜き出し
[1] 10 20 40
> n[-c(1, 2, 4)]  # 1,2,4番目以外の要素を抜き出し
[1] 30 50

上の例のとおり、ベクトルをマイナスで指定すると、それ以外、という指定になる。

トップページ | 2014年2月 »

無料ブログはココログ

■■

■■■