詳細は An Introduction to R を参照.

1 Basic operating instructions / 基本的な操作

 ↓ Rコード(Rスクリプト or Rプログラム,薄い灰色で塗りつぶされた箇所)の例

1 + 1
## [1] 2

 ↑ Rコードを実行した結果

このページのRコードをどのように実行すればよいか?

  • Rを利用:Rをダウンロード
    • コンソールに直接コピーアンドペーストして「Enter」(Macの場合は「Return」)
    • 新しいスクリプトにコピーアンドペーストする場合
      • Windows: 「ファイル」→「新しいスクリプト」にペーストして,実行する箇所を選択 → 「Ctrl」+「R」
      • Mac: 白い紙のアイコンをクリックして開いたスクリプトにペーストし,実行する箇所を選択 → 「Command」+「Return」
    • 「ファイル」→「新しいスクリプト」に「写経」(コピーアンドペーストしないで一字一句書き写すこと)して実行.一番面倒だが,一番勉強になる
  • RStudioを利用:Rをダウンロードしてから RStudioをダウンロード
    • コンソールに直接コピーアンドペーストして「Enter」
    • 作成したスクリプトページにコピーアンドペーストして,実行する箇所を選択 → 「Ctrl」+「Enter」
    • GitHub から .rmd ファイルをダウンロードして,チャンクの右上にある「▶」(Run Current Chunk) を押す.一番簡単だが,一番勉強にならない

1.1 Basic arithmetic operations / 四則演算

1 + 1  # addition 
## [1] 2
2 - 3  # subtraction 
## [1] -1
2 * 3  # multiplication 
## [1] 6
2 / 3  # division 
## [1] 0.6666667

1.2 Comment out / コメントアウト

# 記号から後ろはコメントアウトされる(=実行されない). 自分用のメモを書いておくのに便利.

1 + 2 + 10
## [1] 13
1 + 2 # + 10
## [1] 3

1.3 Power, square root, log, exponent / べき乗,平方根,対数,指数

2 ^ 3  # 2 to the power of 3 
## [1] 8
2 ** 3  # same as above 
## [1] 8
sqrt(16)  # square root 
## [1] 4
log(10)  # natural logarithm 
## [1] 2.302585
exp(1)  # exponential, e = Napier's constant 
## [1] 2.718282

sqrt, log などは関数. 「関数名(引数)」の形で使う. 「引数」が関数の入力.

以下の例では関数 \(f\) (sqrt) に対して \(x = 16\) が引数(関数の入力)で,\(4\) が結果(関数の出力).

\[ f(x) = \sqrt{x}, \quad f(16) = \sqrt{16} = 4. \]

1.4 Help / ヘルプ

関数の機能や使い方を調べる.

?exp
help(exp)  # same as above

1.5 Objects / オブジェクト

円周率 \(\pi\) などの定数は既に割り当てられている.

pi  # pi (circle ratio) 
## [1] 3.141593

この pi は「オブジェクト」と呼ばれ,数値が割り当てられている.

実は,ユーザーは任意の数字を適当な「オブジェクト」として定義することができる. 数値を「オブジェクト」に割り当てることで,数値を複数の箇所で繰り返し使うことができる.

オブジェクト名 <- 数値」の形式で割り当てる. 「<-」は割り当て(または代入)を行う演算子で,「<」(小なり)と「-」(ハイフン)を組み合わせて使用.

x <- 1  # "x" is the object name
x
## [1] 1

注:小文字 x と大文字 X は区別される.

このオブジェクトを使って何らかの計算をすることができる.

x + 2
## [1] 3
x <- 10  # overwrite (override) 
x + 5
## [1] 15

オブジェクト名はアルファベットではじめる. 2文字目以降は数字やアンダーバーを使ってよい. 演算記号など(+ - * / ( ) [ ] ! ? < > = | ^ # $ % & etc.)は使用不可.

x_3digit <- 500

オブジェクトには数字だけではなく文字列を代入することもできる. ただし,文字列をダブルクオーテーション "" で囲まなければならない.

univ_name <- "Waseda"
paste(univ_name, "University")  # "paste" function concatenate strings
## [1] "Waseda University"

1.6 Vectors / ベクトル

上ではスカラーの数字を考えていたが,数ベクトル(すうベクトル)を扱うこともできる. ベクトルを作成するには c 関数を使い,ベクトルの要素を引数として指定する.

c(1, 2, 6)  # combine values into vector
## [1] 1 2 6

欠損値 (missing value) は NA で表す.

c(1, NA, 6)
## [1]  1 NA  6

連続する整数のベクトルを生成するにはコロン : を使うのが便利.

1:5
## [1] 1 2 3 4 5
100:105
## [1] 100 101 102 103 104 105

ベクトル同士を繋げることもできる.

c(1, 5:7)
## [1] 1 5 6 7
c(c(1, 2), 5:7)
## [1] 1 2 5 6 7

ベクトルの要素をすべて足し合わせる.

sum(c(1, 2, 6))  # sum of 1, 2, 6 
## [1] 9

1.6.1 Assignment to objects / オブジェクトへの代入

ベクトルもスカラーと同様にオブジェクトに代入することができる.

x <- c(1, 2, 6)  # assign vector to object "x"
x
## [1] 1 2 6
sum(x)  # sum of 1, 2, 6
## [1] 9
x + 10
## [1] 11 12 16

1.6.2 Extract a portion of the vector / ベクトルの一部を取り出す

ベクトルの特定の要素を抽出するには,min (ベクトルの要素のうち最小の値を返す関数)のような関数を使ったり,あるいは [ ] を使って何番目の要素かを直接指定する方法がある.

min(x)  # minimum value
## [1] 1
max(x)  # maximum value
## [1] 6
x[2]  # extract 2nd value
## [1] 2
x[c(2, 3)]  # extract 2nd and 3rd values
## [1] 2 6
x[2:3]  # same as above
## [1] 2 6

特定の条件を満たす要素のみを抽出することもできる. 「等しい」は == (等号が2つ),「等しくない」は != (エクスクラメーションマークと等号)を使う.

注:等号1つ = は(<- と同様に)代入を表す演算記号なので要注意.

x[x > 1]
## [1] 2 6
x > 1  # logical index 
## [1] FALSE  TRUE  TRUE
x[x == 2]  # "==" means `equal to`
## [1] 2
x[x != 2]  # "!=" means `not equal to`
## [1] 1 6

cf. 論理演算

1 > 0
## [1] TRUE
c(1, 2, 6) > 1
## [1] FALSE  TRUE  TRUE
1 == 0.5 + 0.5  # equal 
## [1] TRUE
2 != 1  # not equal 
## [1] TRUE
!(1 > 0)  # "!" = logical negation 
## [1] FALSE
1 > 0 & 2 == 1  # TRUE AND FALSE 
## [1] FALSE
1 > 0 | 2 == 1  # TRUE OR FALSE 
## [1] TRUE

特定の要素に別の値を代入して上書きすることもできる.

x
## [1] 1 2 6
x[2] <- 100
x
## [1]   1 100   6

1.6.3 Multiple vectors / 複数のベクトル

複数のベクトルに対して演算することもできる.

sum(c(1, 2, 6) - 4:6)  # sum of 1-4, 2-5, 6-6 
## [1] -6
x <- c(1, 2, 6)
x2 <- c(1, 3, 4)
x + x2
## [1]  2  5 10

ベクトルの内積(スカラー積)は %*% で計算される(\(\mathbf{x}'\)\(\mathbf{x}\) の転置).

\[ (\mathbf{x}, \mathbf{x_2}) = \mathbf{x}' \mathbf{x_2} = \left[ \matrix{1 & 2 & 6} \right] \left[ \matrix{1 \\ 3 \\ 4} \right] = 1 \times 1 + 2 \times 3 + 6 \times 4 = 1+6+24 = 31 \]

x %*% x2
##      [,1]
## [1,]   31

要素ごとの積は * で計算される.

x * x2
## [1]  1  6 24

ベクトルとスカラーの積はベクトルの各要素とスカラーの積のベクトルとして計算される.

x * 10
## [1] 10 20 60

1.6.4 String vector / 文字列のベクトル

文字列のベクトルを作成することもできる.

beatles_name <- c("John", "Paul", "George", "Ringo")

1.7 Other tips: semicolon

1行に複数のコマンドを書く場合は「;」で繋ぐ.

x; x + x2 + 1
## [1] 1 2 6
## [1]  3  6 11

2 Dataframe / データフレーム

ベクトルを束ねて行と列からなるデータフレームを作成できる. ただし,ベクトルの各要素は互いに対応していなければならない(例:1つ目のベクトルのn番目の要素と,2つ目のベクトルのn番目の要素は,同じ人や同じ企業のデータが割り当てられている).

2.1 Create data frames / データフレームを作成する

データフレームを作成するには data.frame 関数を使い,引数として「列名(変数名) = ベクトルのオブジェクト」を指定する.

beatles_name <- c("John", "Paul", "George", "Ringo") 
beatles_born <- c(1940, 1942, 1943, 1940)  # year of birth 
beatles_decease <- c(1980, NA, NA, NA)  # year of death 
beatles_height <- c(179, 180, 178, 170)  # in cm 
beatles <- data.frame(name = beatles_name, born = beatles_born, decease = beatles_decease, 
                      height = beatles_height)
beatles
##     name born decease height
## 1   John 1940    1980    179
## 2   Paul 1942      NA    180
## 3 George 1943      NA    178
## 4  Ringo 1940      NA    170

以下のように作成することもできる.

beatles2 <- data.frame(name = c("John", "Paul", "George", "Ringo"), born = c(1940, 1942, 1943, 1940),
                       decease = c(1980, NA, NA, NA), height = c(179, 180, 178, 170))
beatles2
##     name born decease height
## 1   John 1940    1980    179
## 2   Paul 1942      NA    180
## 3 George 1943      NA    178
## 4  Ringo 1940      NA    170

2.2 Extract a portion of the data frame / データフレームの一部を取り出す

データフレームの特定の要素を抽出するには, [ ] を使って何行目・何列目かを指定したり,あるいは「データフレーム名$列名」のように $ (ドル)記号を使って列名(変数名)を指定する.

beatles[1, 2]  # 1st row (John) and 2nd column (born)
## [1] 1940
beatles[1:2, 2:3]
##   born decease
## 1 1940    1980
## 2 1942      NA
beatles[1:2, c("born", "decease")]  # same as above
##   born decease
## 1 1940    1980
## 2 1942      NA
beatles[1, ]  # 1st row (John)
##   name born decease height
## 1 John 1940    1980    179
beatles[, 2]  # 2nd column (born)
## [1] 1940 1942 1943 1940
beatles[, "born"]  # same as above
## [1] 1940 1942 1943 1940
beatles$born  # column named "born" (year of birth)
## [1] 1940 1942 1943 1940

2.3 Display the structure of an object / オブジェクトの構造

str 関数で行数(サンプルサイズ),列数(変数の数),各列のデータの型(文字列,数字,etc.)を簡単に確認できる.

str(beatles)
## 'data.frame':    4 obs. of  4 variables:
##  $ name   : chr  "John" "Paul" "George" "Ringo"
##  $ born   : num  1940 1942 1943 1940
##  $ decease: num  1980 NA NA NA
##  $ height : num  179 180 178 170

注:上のオブジェクトは十分に小さいため str 関数を使うまでもないが,サイズの大きいオブジェクトを確認する際にはとても便利.

2.4 Change the value of the data frame / データフレームの値を変更する

スカラーやベクトルのオブジェクトの値を変更する場合と同様に <- で上書きできる.

beatles[3, "decease"] <- 2001
beatles
##     name born decease height
## 1   John 1940    1980    179
## 2   Paul 1942      NA    180
## 3 George 1943    2001    178
## 4  Ringo 1940      NA    170

2.5 Create new variable (column) / 新しい変数(列)を追加する

データセット$新しい変数の名前 <- 新しい変数の中身(ベクトルなど)」 のようにして追加できる.

beatles$primary_role <- c("vocal", "vocal", "guitar", "drum")
beatles
##     name born decease height primary_role
## 1   John 1940    1980    179        vocal
## 2   Paul 1942      NA    180        vocal
## 3 George 1943    2001    178       guitar
## 4  Ringo 1940      NA    170         drum

既存の変数を利用して新しい変数を作成することもできる.

たとえば,デビュー時(1962年)の年齢は「1962 - 出生年」で計算できるので,以下のようにコーディングすればよい.

beatles$age_at_debut <- 1962 - beatles$born
beatles
##     name born decease height primary_role age_at_debut
## 1   John 1940    1980    179        vocal           22
## 2   Paul 1942      NA    180        vocal           20
## 3 George 1943    2001    178       guitar           19
## 4  Ringo 1940      NA    170         drum           22

2.6 Sample data swiss / サンプルデータ

Rには幾つかのサンプルデータが既に含まれている(data() で列挙).

swiss は1888年のスイスにおける出生率と社会経済変数のデータセット. Province レベルで集計されている.

str(swiss)
## 'data.frame':    47 obs. of  6 variables:
##  $ Fertility       : num  80.2 83.1 92.5 85.8 76.9 76.1 83.8 92.4 82.4 82.9 ...
##  $ Agriculture     : num  17 45.1 39.7 36.5 43.5 35.3 70.2 67.8 53.3 45.2 ...
##  $ Examination     : int  15 6 5 12 17 9 16 14 12 16 ...
##  $ Education       : int  12 9 5 7 15 7 7 8 7 13 ...
##  $ Catholic        : num  9.96 84.84 93.4 33.77 5.16 ...
##  $ Infant.Mortality: num  22.2 22.2 20.2 20.3 20.6 26.6 23.6 24.9 21 24.4 ...

3 Plot / 描画

最も基本的な描画は plot 関数を使った散布図.

plot(x = swiss$Education, y = swiss$Fertility)

追加の引数を指定することで,グラフのタイトル,X軸・Y軸のラベル,マーカーの種類,色などを変更できる.

plot(x = swiss$Education, y = swiss$Fertility, pch = 20, col = "blue", 
     main = "Fertility vs. Education", xlab = "Education (% beyond primary school)", ylab = "Fertility")

複数のパネルを並べる場合は par(mfrow = c(行数, 列数)) を実行してから plot コマンドを実行する.

par(mfrow = c(1, 2))
plot(x = swiss$Education, y = swiss$Fertility, pch = 20)
plot(x = swiss$Education, y = swiss$Examination, pch = 20)

Tips: plot 周りで何らかのエラーが生じたら,dev.off() で一旦描画デバイスを閉じるとうまくいくことがある.

4 Loading CSV file / CSVファイルを読み込む

例としてタイタニック号の乗客データ titanic3_csv.csv を読み込む.

元データは http://biostat.mc.vanderbilt.edu/DataSets (既にリンク切れ)から取得したもので,名前などの一部変数を除外している.

参照:Titanic:タイタニック号乗客者の生存状況(年齢や性別などの13項目)の表形式データセット

  • pclass: 旅客クラス
  • survived: = 1 if survived, = 0 if not survived
  • sex: female or male
  • age: 年齢
  • sibsp: 同船する兄弟(siblings)と配偶者(spouses)の数
  • parch: 同船する親(parents)と子供(children)の数
  • embarked: 出港地(C=Cherbourg(仏・シェルブール), Q=Queenstown, S=Southampton)

4.1 read.csv

Step 1. 授業のMoodleページまたは GitHub から CSV ファイルをダウンロードして適当なフォルダに保存する. たとえばCドライブ直下の「ws_stat」(workspace for statistics) フォルダに保存する.

Step 2. setwd 関数を使って保存したフォルダを作業ディレクトリとして指定する. getwd 関数で指定された作業ディレクトリを確認できる(カッコの中には何も書かない).

Step 3. read.csv 関数でファイル名を引数として指定して読み込む.

setwd("c://ws_stat")  # set working directory
getwd()  # get working directory
## [1] "c:/ws_stat"
titanic <- read.csv("titanic3_csv.csv")

注:.rmd ファイルを開いてチャンクごとに実行する場合,チャンクの実行が終わると作業ディレクトリがリセットされる.

ファイルに日本語が含まれるとエラーが出る場合があるので,初心者のうちは日本語を含めずにファイルを作成・使用するのがおすすめ.

4.2 read.csv + file.choose

作業ディレクトリの設定がうまくできない場合は,次の行を実行してCSVファイルを読み込む.実行すると「ファイルを選択」画面が出てきて,そこから読み込むCSVファイルを選択することができる.

titanic <- read.csv(file.choose())

4.4 Data overview / データの概観

先ほど取り上げた str 関数を利用してデータフレームの構造を確認したり,head 関数を利用して最初の数行(デフォルトは6行)のみを表示させる.

str(titanic)
## 'data.frame':    1309 obs. of  8 variables:
##  $ pclass  : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ survived: int  1 1 0 0 0 1 1 0 1 0 ...
##  $ sex     : chr  "female" "male" "female" "male" ...
##  $ age     : num  29 0.92 2 30 25 48 63 39 53 71 ...
##  $ sibsp   : int  0 1 1 1 1 0 1 0 2 0 ...
##  $ parch   : int  0 2 2 2 2 0 0 0 0 0 ...
##  $ fare    : num  211 152 152 152 152 ...
##  $ embarked: chr  "S" "S" "S" "S" ...
head(titanic)
##   pclass survived    sex   age sibsp parch     fare embarked
## 1      1        1 female 29.00     0     0 211.3375        S
## 2      1        1   male  0.92     1     2 151.5500        S
## 3      1        0 female  2.00     1     2 151.5500        S
## 4      1        0   male 30.00     1     2 151.5500        S
## 5      1        0 female 25.00     1     2 151.5500        S
## 6      1        1   male 48.00     0     0  26.5500        S

View 関数を使うとデータセット全体を表示するウィンドウが表示される.

View(titanic)

4.5 Output file / ファイルを出力

Rで加工したデータセットなどを CSV などのファイル形式で出力することができる.

4.5.1 Case 1. 既に作業ディレクトリを指定している場合

先ほど setwd で指定した作業ディレクトリに出力される.

titanic_head <- head(titanic)
write.csv(titanic_head, "titanic_first_6_rows.csv")

4.5.2 Case 2. 作業ディレクトリを指定していない場合

Case 1 のコードを実行するとデフォルトで指定されている作業ディレクトリに出力される. デフォルトのディレクトリは先述のとおり getwd() で確認できる.

4.5.3 Case 3. 指定した作業ディレクトリとは別のフォルダに保存する場合

先に保存先フォルダを作成する(例:ws_stat 直下の new_dir フォルダ).

titanic_head <- head(titanic)
write.csv(titanic_head, "c://ws_stat/new_dir/titanic_first_6_rows.csv")

5 Custom functions / 自作の関数

logexp のような既に定義されている関数の他に,自作の関数を定義して使用することができる.

例:引数の二乗を返す関数

return_squared <- function (x) {
  x^2
}
return_squared(x = 5)
## [1] 25

5.1 Example: Examine whether it is a leap year or not / 閏年の判定

西暦が4で割り切れる年は原則として閏年だが,「100で割り切れて,かつ,400で割り切れない」場合は例外的に閏年ではない.

「割り切れる」とは「割り算のあまりが0」ということ.割り算のあまりは 割られる数 %% 割る数 で求められる.

2024 %% 4
## [1] 0
2024 %% 100
## [1] 24
2024 %% 400
## [1] 24

また,ある条件を満たすかどうかによって異なる処理を行うには if, elase を使う.

if 関数の引数(条件分岐の条件)には論理値(TRUE または FALSE)が与えられる.

  • TRUE の場合にのみ if{ } の中が実行される
  • FALSE の場合には else{ } の中が実行される

Tips. for 文の中で数字や文字などを出力するには print 関数が使える.

if (1 > 0) {
  print("A")
} else {
  print("B")
}
## [1] "A"

よって,以下のように関数を作成すればよい.

Tips. if 文は入れ子にすることができる.

examine_leap <- function (year) {
  if (year %% 4 == 0) {
    if (year %% 100 == 0 & year %% 400 != 0) {
      print("Not leap year")
    } else {
      print("Leap year")
    }
  } else {
    print("Not leap year")
  }
}
examine_leap(year = 2024)
## [1] "Leap year"
examine_leap(year = 2100)
## [1] "Not leap year"
examine_leap(year = 2400)
## [1] "Leap year"

6 Iterative calculations / 繰り返し計算

for 文を使うことでほとんど同じ計算を繰り返し計算することができる.

i というオブジェクトに in のあとのベクトルの要素を順次代入して計算する.つまり,

  • まず i に 1 が代入されて { } の中が実行され,
  • 次いで i に 2 が代入されて { } の中が実行され,
  • 最後 i に 3 が代入されて { } の中が実行される
for (i in 1:3) {
  print(i)
}
## [1] 1
## [1] 2
## [1] 3

for 文の中で何らかの演算をしてもよい.

\[ \sum_{i=1}^{3} i = 1 + 2 + 3 = 6 \]

累積の値を格納するオブジェクト i_cumulative を作成して,{ } の中でこのオブジェクトの値を更新する.

i_cumulative <- 0  # initialize 
for (i in 1:3) {
  i_cumulative <- i_cumulative + i
  print(i_cumulative)
}
## [1] 1
## [1] 3
## [1] 6

6.1 Combine with a custom function

自作の関数と組み合わせて使ってもよい.

まずは,閏年のときに TRUE を返す関数を定義.

is_leap <- function (year) {
  if (year %% 4 == 0 & !(year %% 100 == 0 & year %% 400 != 0)) {
    TRUE
  } else {
    FALSE
  }
}

そもそも,if 文の条件の TRUE/FALSE と返り値の TRUE/FALSE は対応しているので,if 文を使わずに以下のように書けばよい.

is_leap <- function (year) {
  year %% 4 == 0 & !(year %% 100 == 0 & year %% 400 != 0)
}

この関数を for 文の中で使う.

for (y in 2090:2110) {
  if (is_leap(year = y)) {
    print(y)
  }
}
## [1] 2092
## [1] 2096
## [1] 2104
## [1] 2108

Tips. { } の中が1行だけの場合は { } を省略できる.

for (y in 2090:2110) if (is_leap(year = y)) print(y)

(出力は省略)

7 Matrix / 行列

ベクトルを束ねて行列を作成できる.

\[ \left[ \left[ \matrix{1 \\ 2 \\ 3} \right] , \left[ \matrix{5 \\ 6 \\ 7} \right] \right] = \left[ \matrix{1 & 5 \\ 2 & 6 \\ 3 & 7} \right] \]

cbind(c(1, 2, 3), c(5, 6, 7))  # bind by columns 
##      [,1] [,2]
## [1,]    1    5
## [2,]    2    6
## [3,]    3    7
rbind(c(1, 2, 3), c(5, 6, 7))  # bind by rows 
##      [,1] [,2] [,3]
## [1,]    1    2    3
## [2,]    5    6    7

matrix 関数で作成することもできる.

mat <- matrix(c(1, 2, 3, 5, 6, 7), nrow = 3, ncol = 2)
mat
##      [,1] [,2]
## [1,]    1    5
## [2,]    2    6
## [3,]    3    7
mat2 <- matrix(c(1, 2, 3, 5, 6, 7), nrow = 2, ncol = 3, byrow = TRUE)
mat2
##      [,1] [,2] [,3]
## [1,]    1    2    3
## [2,]    5    6    7

要素の抽出.

mat[2, 2]
## [1] 6

要素の書き換え.

mat[2, 2] <- 100
mat
##      [,1] [,2]
## [1,]    1    5
## [2,]    2  100
## [3,]    3    7

7.1 Transposed matrix / 転置行列

(i, j) 要素と (j, i) 要素を入れ替える.

\[ \left[ \matrix{1 & 5 \\ 2 & 6 \\ 3 & 7} \right]' = \left[ \matrix{1 & 2 & 3 \\ 5 & 6 & 7} \right] \]

mat <- matrix(c(1, 2, 3, 5, 6, 7), nrow = 3, ncol = 2)
t(mat)
##      [,1] [,2] [,3]
## [1,]    1    2    3
## [2,]    5    6    7

7.2 Matrix product / 行列の積

行列の積は %*% で計算できる.

\[ \left[ \matrix{1 & 5 \\ 2 & 6 \\ 3 & 7} \right] \left[ \matrix{0.1 & 0.2 & 0.3 \\ 0.5 & 0.6 & 0.7} \right] \\ = \left[ \matrix{1 \times 0.1 + 5 \times 0.5 & 1 \times 0.2 + 5 \times 0.6 & 1 \times 0.3 + 5 \times 0.7 \\ 2 \times 0.1 + 6 \times 0.5 & 2 \times 0.2 + 6 \times 0.6 & 2 \times 0.3 + 6 \times 0.7 \\ 3 \times 0.1 + 7 \times 0.5 & 3 \times 0.2 + 7 \times 0.6 & 3 \times 0.3 + 7 \times 0.7 } \right] = \left[ \matrix{2.6 & 3.2 & 3.8 \\ 3.2 & 4 & 4.8 \\ 3.8 & 4.8 & 5.8 } \right] \]

mat <- matrix(c(1, 2, 3, 5, 6, 7), nrow = 3, ncol = 2)
mat
##      [,1] [,2]
## [1,]    1    5
## [2,]    2    6
## [3,]    3    7
mat2 <- matrix(c(0.1, 0.2, 0.3, 0.5, 0.6, 0.7), nrow = 2, ncol = 3, byrow = TRUE)
mat2
##      [,1] [,2] [,3]
## [1,]  0.1  0.2  0.3
## [2,]  0.5  0.6  0.7
mat %*% mat2
##      [,1] [,2] [,3]
## [1,]  2.6  3.2  3.8
## [2,]  3.2  4.0  4.8
## [3,]  3.8  4.8  5.8

7.3 Inverse matrix / 逆行列

以下を満たすような行列 \(\mathbf{A}^{-1}\)\(\mathbf{A}\) の逆行列と呼ぶ.

\[ \mathbf{A} \mathbf{A}^{-1} = \mathbf{A}^{-1} \mathbf{A} = \mathbf{E} = \left[ \matrix{1 & 0 & 0 & \cdots \\ 0 & 1 & 0 & \cdots \\ 0 & 0 & 1 & \cdots \\ \vdots & \vdots & \vdots & \ddots } \right] \]

  • スカラーであれば \(A A^{-1} = A^{-1} A = 1, A^{-1} = 1/A\) すなわち逆数.逆行列は,これの行列バージョンのようなもの.
  • \(\mathbf{E}\) は単位行列(対角成分だけが1でそれ以外のすべての要素が0)

2×2 の行列については次のように計算できる.

\[ \left[ \matrix{1 & 3 \\ 2 & 4 } \right]^{-1} = \frac{1}{1 \times 4 - 3 \times 2} \left[ \matrix{4 & -3 \\ -2 & 1} \right] = \left[ \matrix{-2 & 1.5 \\ 1 & -0.5} \right] \]

逆行列は solve で計算できる.

mat3 <- matrix(1:4, nrow = 2)
solve(mat3)
##      [,1] [,2]
## [1,]   -2  1.5
## [2,]    1 -0.5

元の行列との積を取れば単位行列になるはず.

\[ \left[ \matrix{1 & 3 \\ 2 & 4 } \right] \left[ \matrix{-2 & 1.5 \\ 1 & -0.5} \right] = \left[ \matrix{-2 & 1.5 \\ 1 & -0.5} \right] \left[ \matrix{1 & 3 \\ 2 & 4 } \right] = \left[ \matrix{1 & 0 \\ 0 & 1} \right] \]

mat3 %*% solve(mat3)  # should be identity matrix 
##      [,1] [,2]
## [1,]    1    0
## [2,]    0    1
solve(mat3) %*% mat3
##      [,1] [,2]
## [1,]    1    0
## [2,]    0    1

行列の determinant (行列式)が 0 の場合は逆行列を計算できない.

\[ \det \left[ \matrix{1 & 0 \\ 1 & 0 } \right] = 1 \times 0 + 0 \times 1 = 0 \]

solve(matrix(c(1, 1, 0, 0), nrow = 2))

(エラーが出る)

8 Take home messages

  • 分からないことがあればヘルプを見る
    • ヘルプは ?関数名 または help(関数名)
    • それでも分からなければ,Google で検索,ChatGPT に相談,YouTube で検索,etc.
  • オブジェクトへの代入は オブジェクト名 <- 中身(スカラー or ベクトル or データフレーム or 行列 etc.)
  • CSV ファイルの読み込みは read.csv(ファイル名)

.