復習を兼ねてデータの準備

NICERから、IDと「トピック」とCriterionスコア及び8つの言語指標を出力する

myNICERindex <- function(){
  
  # 各指標のベクトルを作っておいて、できたものをデータフレームにまとめる
  
  # ベクトルの初期化
  typeV  <- c()
  tokenV <- c()
  ttrV   <- c()
  giV    <- c()
  awlV   <- c()
  aslV   <- c()
  nosV   <- c()
  
  mattrV <- c()                                   # MATTR追加 以下同じ
  scoreV <- c()
  idV    <- c()
  topicV <- c()
  
  files <- list.files()
  
  for (i in files) {
    lines.tmp <- scan(i, what="char", sep="\n")
    body.tmp <- grep("^\\*\\w+:\t", lines.tmp, value=T)
    data.tmp <- gsub("^\\*\\w+:\t", "", body.tmp)
    data.tmp <- data.tmp[data.tmp != ""]
    tmp4 <- gsub("[[:punct:]]", " ", data.tmp) 
    tmp5 <- gsub("  +", " ", tmp4)
    tmp6 <- tolower(tmp5)
    tmp7 <- strsplit(tmp6, " ")
    tmp8 <- unlist(tmp7)
    token <- sort(tmp8)
    type <- unique(token)
    
    ttr <- length(type)/length(token)
    gi  <- length(type)/sqrt(length(token))
    tmp <- paste(token, collapse = "")
    awl <- nchar(tmp)/length(token)
    asl <- length(token)/length(data.tmp)
    nos <- length(body.tmp)                                # Number of Sentences
    
    #MATTR 追加
    numwords <- length(token)
    token <- c(token,token)
    ttrsum <- 0                                            # ttrsum の初期化
    mattr <- 0                                             # mattr の初期化
    for(i in 1:numwords){
      mado <- token[i:(99+i)]
      wttr <- length(unique(sort(mado)))/100 
      ttrsum <- ttrsum + wttr
    }
    mattr <-    ttrsum/numwords                         # mattrに代入
    mattrV   <- c(mattrV, mattr)                      # ベクトルデータとして保存
    
    #スコア 追加
    criterion.tmp <- grep("@Criterion", lines.tmp, value = T) # @Criterionの行を検索
    score <- gsub("@Criterion:\t", "", criterion.tmp)         # スコアのみに
    scoreV   <- c(scoreV , score)                             # ベクトルデータとして保存
    
    #ID 追加
    id.tmp <- grep("@Participants:", lines.tmp, value = T) # @Participantsの行を検索
    id <- gsub("@Participants:\t", "", id.tmp)         # IDのみに
    idV   <- c(idV , id)                             # ベクトルデータとして保存
 
    #Topic 追加
    topic.tmp <- grep("@Topic:", lines.tmp, value = T) # @Participantsの行を検索
    topic <- gsub("@Topic:\t", "", topic.tmp)         # IDのみに
    topicV   <- c(topicV , topic)                             # ベクトルデータとして保存
  
    
    # 各数値をベクトルに入れる
    typeV <- c(typeV, length(type))
    tokenV <- c(tokenV, length(token))
    ttrV   <- c(ttrV, ttr)
    giV    <- c(giV, gi)
    awlV   <- c(awlV, awl)
    aslV   <- c(aslV, asl)
    nosV   <- c(nosV, nos)
  

  }
  
 # 最後に全部をデータフレームにまとめる
 data.frame(idV, topicV, scoreV, typeV, tokenV, ttrV, giV, mattrV, awlV, aslV, nosV)

}

実行

母語話者データ

setwd("NICER1_3_2/NICER_NS")

ns_indexes.df <- myNICERindex()
head(ns_indexes.df )

「見出し」を付け替える:names() <- c()

names(ns_indexes.df ) <- c("ID", "Topic", "Score", "Type", "Token", "TTR", "GI", "MATTR", "AWL","ASL", "NoS")

head(ns_indexes.df )

学習者データ

setwd("NICER1_3_2/NICER_NNS")                    # ディレクトリーを変える NNS

jp_indexes.df <- myNICERindex()
names(jp_indexes.df ) <- c("ID", "Topic", "Score", "Type", "Token", "TTR", "GI", "MATTR", "AWL","ASL", "NoS")
head(jp_indexes.df )

学習者データと母語話者データの統合

学習者データのデータフレームと母語話者データのデータフレームの作成

  • jp_indexes.df と ns_indexes.df

nsとjpというカテゴリーをそれぞれのデータフレームに追加する

  • 統合した後、カテゴリーでデータを分けることができるように

  • 新しいカラムを追加:使ってない見出しを設定し、そこに入れたいものを代入

    • ns と jp は、言語の違いということで、L1とL2、Langという見出しにして、ns は 1 、jp は 2 を入れる。
jp_indexes.df$Lang <- 2

head(jp_indexes.df)
ns_indexes.df$Lang <- 1

head(ns_indexes.df)

二つのデータフレームを統合する:「縦に(row)」つなげる: rbind(データフレーム1, データフレーム2)

  • all_indexes.df
all_indexes.df <- rbind(jp_indexes.df, ns_indexes.df)

head(all_indexes.df)
tail(all_indexes.df)

データをテキストファイルに保存しておく

write.table(all_indexes.df, "all_indexes.df.txt")
all_indexes.df <- read.table("all_indexes.df.txt")

判別分析

head(all_indexes.df)
str(all_indexes.df)
## 'data.frame':    452 obs. of  12 variables:
##  $ ID   : chr  "JPN501" "JPN502" "JPN503" "JPN504" ...
##  $ Topic: chr  "sports" "education" "education" "sports" ...
##  $ Score: chr  "4" "4" "3" "4" ...
##  $ Type : int  134 160 121 139 175 124 151 98 104 99 ...
##  $ Token: int  638 712 402 520 840 522 724 396 526 366 ...
##  $ TTR  : num  0.42 0.449 0.602 0.535 0.417 ...
##  $ GI   : num  7.5 8.48 8.53 8.62 8.54 ...
##  $ MATTR: num  0.426 0.455 0.606 0.539 0.423 ...
##  $ AWL  : num  4.3 4.23 4.75 4.77 4 ...
##  $ ASL  : num  10.63 12.28 15.46 9.63 16.8 ...
##  $ NoS  : int  30 29 13 27 25 20 26 20 19 14 ...
##  $ Lang : num  2 2 2 2 2 2 2 2 2 2 ...

判別カテゴリーをファクター型に

all_indexes.df$Lang <- as.factor(all_indexes.df$Lang)
str(all_indexes.df)
## 'data.frame':    452 obs. of  12 variables:
##  $ ID   : chr  "JPN501" "JPN502" "JPN503" "JPN504" ...
##  $ Topic: chr  "sports" "education" "education" "sports" ...
##  $ Score: chr  "4" "4" "3" "4" ...
##  $ Type : int  134 160 121 139 175 124 151 98 104 99 ...
##  $ Token: int  638 712 402 520 840 522 724 396 526 366 ...
##  $ TTR  : num  0.42 0.449 0.602 0.535 0.417 ...
##  $ GI   : num  7.5 8.48 8.53 8.62 8.54 ...
##  $ MATTR: num  0.426 0.455 0.606 0.539 0.423 ...
##  $ AWL  : num  4.3 4.23 4.75 4.77 4 ...
##  $ ASL  : num  10.63 12.28 15.46 9.63 16.8 ...
##  $ NoS  : int  30 29 13 27 25 20 26 20 19 14 ...
##  $ Lang : Factor w/ 2 levels "1","2": 2 2 2 2 2 2 2 2 2 2 ...

MASS::lda

library(MASS)

DA.result <- lda(Lang ~ Type + Token + MATTR + AWL + ASL + NoS, data=all_indexes.df, CV=T)
DA.result$class
##   [1] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
##  [38] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
##  [75] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [112] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [149] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [186] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [223] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [260] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [297] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [334] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [371] 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1
## [408] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1
## [445] 1 1 1 1 1 1 1 1
## Levels: 1 2
anyNA(all_indexes.df)
## [1] FALSE

欠損値がある場合は確認

subset(all_indexes.df, is.na(Token))

DA.model すべての変数を入れた判別モデル

DA.model <- lda(Lang ~ Type + Token + MATTR + AWL + ASL + NoS, data=all_indexes.df)

DA.model
## Call:
## lda(Lang ~ Type + Token + MATTR + AWL + ASL + NoS, data = all_indexes.df)
## 
## Prior probabilities of groups:
##         1         2 
## 0.1570796 0.8429204 
## 
## Group means:
##       Type     Token     MATTR      AWL      ASL      NoS
## 1 387.2676 1973.0986 0.4103297 4.751333 22.59186 45.66197
## 2 126.2073  558.2415 0.4712071 4.361718 12.87662 22.06824
## 
## Coefficients of linear discriminants:
##                LD1
## Type  -0.030430371
## Token  0.001101204
## MATTR  2.009154987
## AWL   -0.449549288
## ASL   -0.019658983
## NoS    0.028913641

判別精度

hyou <- table(all_indexes.df$Lang, predict(DA.model)$class)
hyou
##    
##       1   2
##   1  67   4
##   2   0 381

判別率:全体の数のうち、正しく判別できたものの割合

  • DA.modelの場合、99%は正しく判別できている
正しく判別できたもの: 67 + 381         = 448
全体の数      : 67 + 4 + 0 + 381 = 452
correct <- (hyou[1,1]+hyou[2,2])/sum(hyou)
correct
## [1] 0.9911504
plot(DA.model)

DA.model2 二つの変数で: MATTRとAWL

DA.model2 <- lda(Lang ~  MATTR + AWL , data=all_indexes.df)
DA.model2
## Call:
## lda(Lang ~ MATTR + AWL, data = all_indexes.df)
## 
## Prior probabilities of groups:
##         1         2 
## 0.1570796 0.8429204 
## 
## Group means:
##       MATTR      AWL
## 1 0.4103297 4.751333
## 2 0.4712071 4.361718
## 
## Coefficients of linear discriminants:
##             LD1
## MATTR 12.394623
## AWL   -2.588162
hyou <- table(all_indexes.df$Lang, predict(DA.model2)$class)
hyou
##    
##       1   2
##   1  33  38
##   2  24 357
correct <- (hyou[1,1]+hyou[2,2])/sum(hyou)
correct
## [1] 0.8628319

DA.model3 TypeとToken

DA.model3 <- lda(Lang ~  Type + Token , data=all_indexes.df)

DA.model3
## Call:
## lda(Lang ~ Type + Token, data = all_indexes.df)
## 
## Prior probabilities of groups:
##         1         2 
## 0.1570796 0.8429204 
## 
## Group means:
##       Type     Token
## 1 387.2676 1973.0986
## 2 126.2073  558.2415
## 
## Coefficients of linear discriminants:
##                LD1
## Type  -0.030407690
## Token  0.001464086
hyou <- table(all_indexes.df$Lang, predict(DA.model3)$class)
hyou
##    
##       1   2
##   1  67   4
##   2   0 381
correct <- (hyou[1,1]+hyou[2,2])/sum(hyou)
correct
## [1] 0.9911504

DA.model4 Tokenぬきで、TypeとNoS

DA.model4 <- lda(Lang ~  Type + NoS , data=all_indexes.df)

DA.model4
## Call:
## lda(Lang ~ Type + NoS, data = all_indexes.df)
## 
## Prior probabilities of groups:
##         1         2 
## 0.1570796 0.8429204 
## 
## Group means:
##       Type      NoS
## 1 387.2676 45.66197
## 2 126.2073 22.06824
## 
## Coefficients of linear discriminants:
##              LD1
## Type -0.02731629
## NoS   0.04378828
hyou <- table(all_indexes.df$Lang, predict(DA.model4)$class)
hyou
##    
##       1   2
##   1  66   5
##   2   0 381
correct <- (hyou[1,1]+hyou[2,2])/sum(hyou)
correct
## [1] 0.9889381

グラフ

散布図と判別境界線の描写 DA.model2: MATTR, AWL

teisu <- apply(DA.model2$means %*% DA.model2$scaling, 2, mean) # 定数項の計算

plot(all_indexes.df$MATTR, all_indexes.df$AWL, col=c("blue", "red")[all_indexes.df$Lang], cex=1)

xmin <- min(all_indexes.df$MATTR)  # x軸のMATTRの最小値
xmax <- max(all_indexes.df$MATTR)  # x軸のMATTRの最大値

ymin <- teisu/DA.model2$scaling[2]  - (DA.model2$scaling[1]*xmin)/DA.model2$scaling[2] # xminの時のyの値の計算
ymax <- teisu/DA.model2$scaling[2]  - (DA.model2$scaling[1]*xmax)/DA.model2$scaling[2] # xmaxの時のyの値の計算

lines(c(xmin,xmax),c(ymin,ymax), type="l", col="green", lwd=2) # 最小値の(x, y)座標と最大値の(x, y)座標を結ぶ直線

散布図と判別境界線の描写 DA.model3: Type, Token

teisu <- apply(DA.model3$means %*% DA.model3$scaling, 2, mean) # 定数項の計算

plot(all_indexes.df$Type, all_indexes.df$Token, col=c("blue", "red")[all_indexes.df$Lang], cex=1)

xmin <- min(all_indexes.df$Type)  # x軸の最小値
xmax <- max(all_indexes.df$Type)  # x軸の最大値

ymin <- teisu/DA.model3$scaling[2]  - (DA.model3$scaling[1]*xmin)/DA.model3$scaling[2] # xminの時のyの値の計算
ymax <- teisu/DA.model3$scaling[2]  - (DA.model3$scaling[1]*xmax)/DA.model3$scaling[2] # xmaxの時のyの値の計算

lines(c(xmin,xmax),c(ymin,ymax), type="l", col="green", lwd=2) # 最小値の(x, y)座標と最大値の(x, y)座標を結ぶ直線

散布図と判別境界線の描写 DA.model4: Type, NoS

teisu <- apply(DA.model4$means %*% DA.model4$scaling, 2, mean) # 定数項の計算

plot(all_indexes.df$Type, all_indexes.df$NoS, col=c("blue", "red")[all_indexes.df$Lang], cex=1)

xmin <- min(all_indexes.df$Type)  # x軸の最小値
xmax <- max(all_indexes.df$Type)  # x軸の最大値

ymin <- teisu/DA.model4$scaling[2]  - (DA.model4$scaling[1]*xmin)/DA.model4$scaling[2] # xminの時のyの値の計算
ymax <- teisu/DA.model4$scaling[2]  - (DA.model4$scaling[1]*xmax)/DA.model4$scaling[2] # xmaxの時のyの値の計算

lines(c(xmin,xmax),c(ymin,ymax), type="l", col="green", lwd=2) # 最小値の(x, y)座標と最大値の(x, y)座標を結ぶ直線

model5: AWL, ASL

DA.model0 <- lda(Lang ~  AWL + ASL , data=all_indexes.df)

teisu <- apply(DA.model0$means %*% DA.model0$scaling, 2, mean) # 定数項の計算

plot(all_indexes.df$AWL, all_indexes.df$ASL, col=c("blue", "red")[all_indexes.df$Lang], cex=1)

xmin <- min(all_indexes.df$AWL)  # x軸の最小値
xmax <- max(all_indexes.df$AWL)  # x軸の最大値

ymin <- teisu/DA.model0$scaling[2]  - (DA.model0$scaling[1]*xmin)/DA.model0$scaling[2] # xminの時のyの値の計算
ymax <- teisu/DA.model0$scaling[2]  - (DA.model0$scaling[1]*xmax)/DA.model0$scaling[2] # xmaxの時のyの値の計算

lines(c(xmin,xmax),c(ymin,ymax), type="l", col="green", lwd=2) # 最小値の(x, y)座標と最大値の(x, y)座標を結ぶ直線

重要な説明変数の選択

source("http://aoki2.si.gunma-u.ac.jp/R/src/sdis.R", encoding="euc-jp")
str(all_indexes.df)
## 'data.frame':    452 obs. of  12 variables:
##  $ ID   : chr  "JPN501" "JPN502" "JPN503" "JPN504" ...
##  $ Topic: chr  "sports" "education" "education" "sports" ...
##  $ Score: chr  "4" "4" "3" "4" ...
##  $ Type : int  134 160 121 139 175 124 151 98 104 99 ...
##  $ Token: int  638 712 402 520 840 522 724 396 526 366 ...
##  $ TTR  : num  0.42 0.449 0.602 0.535 0.417 ...
##  $ GI   : num  7.5 8.48 8.53 8.62 8.54 ...
##  $ MATTR: num  0.426 0.455 0.606 0.539 0.423 ...
##  $ AWL  : num  4.3 4.23 4.75 4.77 4 ...
##  $ ASL  : num  10.63 12.28 15.46 9.63 16.8 ...
##  $ NoS  : int  30 29 13 27 25 20 26 20 19 14 ...
##  $ Lang : Factor w/ 2 levels "1","2": 2 2 2 2 2 2 2 2 2 2 ...
sdis.result <- sdis(all_indexes.df[4:11], all_indexes.df[12])
## 有効ケース数: 452
## 群を表す変数: Lang
## 
## ***** 平均値 *****
##                  1           2        全体
## Type   387.2676056 126.2073491 167.2146018
## Token 1973.0985915 558.2414698 780.4867257
## TTR      0.4043734   0.4660248   0.4563406
## GI      12.3755946   7.5715687   8.3261834
## MATTR    0.4103297   0.4712071   0.4616445
## AWL      4.7513327   4.3617179   4.4229184
## ASL     22.5918585  12.8766212  14.4026873
## NoS     45.6619718  22.0682415  25.7743363
## 
## ***** プールされた群内相関係数行列 *****
## 
##              Type      Token        TTR        GI      MATTR         AWL
## Type   1.00000000  0.9038982 -0.2653464 0.7685720 -0.2623123 -0.04618413
## Token  0.90389816  1.0000000 -0.5369960 0.4498941 -0.5353729 -0.14042196
## TTR   -0.26534644 -0.5369960  1.0000000 0.2762727  0.9990017  0.26567511
## GI     0.76857203  0.4498941  0.2762727 1.0000000  0.2815950  0.13298483
## MATTR -0.26231234 -0.5353729  0.9990017 0.2815950  1.0000000  0.27001137
## AWL   -0.04618413 -0.1404220  0.2656751 0.1329848  0.2700114  1.00000000
## ASL    0.25575020  0.2515538 -0.1885313 0.1729259 -0.1853512  0.20856585
## NoS    0.66663032  0.7400935 -0.4415735 0.3457875 -0.4403156 -0.25905336
##              ASL        NoS
## Type   0.2557502  0.6666303
## Token  0.2515538  0.7400935
## TTR   -0.1885313 -0.4415735
## GI     0.1729259  0.3457875
## MATTR -0.1853512 -0.4403156
## AWL    0.2085658 -0.2590534
## ASL    1.0000000 -0.3541723
## NoS   -0.3541723  1.0000000
## 
## 変数編入基準    Pin:  0.05
## 変数除去基準    Pout: 0.05
## 編入候補変数: Type              P : <0.001  ***** 編入されました
## 
## ***** ステップ 1 *****   編入変数: Type
## 
## ***** 分類関数 *****
## 
##              1        2  偏F値    P値
## Type   -0.3775 -0.12302 1987.9 <0.001
## 定数項 73.0960  7.76320              
## ウィルクスのΛ: 0.18458
## 等価なF値:   1987.9
## 自由度:     (1, 450.00)
## P値:      <0.001
## 
## 除去候補変数: Type              P : <0.001  ***** 除去されませんでした
## 編入候補変数: NoS               P : <0.001  ***** 編入されました
## 
## ***** ステップ 2 *****   編入変数: NoS
## 
## ***** 分類関数 *****
## 
##               1        2    偏F値    P値
## Type   -0.43779 -0.10464 1086.333 <0.001
## NoS     0.40925 -0.12480   43.759 <0.001
## 定数項 75.42732  7.98000                
## ウィルクスのΛ: 0.16819
## 等価なF値:   1110.3
## 自由度:     (2, 449.00)
## P値:      <0.001
## 
## 除去候補変数: NoS               P : <0.001  ***** 除去されませんでした
## 編入候補変数: AWL               P : 0.00684  ***** 編入されました
## 
## ***** ステップ 3 *****   編入変数: AWL
## 
## ***** 分類関数 *****
## 
##                1          2    偏F値     P値
## Type    -0.28127   0.042803 790.7280 < 0.001
## NoS     -0.86859  -1.328545  27.9443 < 0.001
## AWL    -92.71076 -87.335003   7.3827 0.00684
## 定数項 294.54496 202.423625                 
## ウィルクスのΛ: 0.16547
## 等価なF値:   753.17
## 自由度:     (3, 448.00)
## P値:      <0.001
## 
## 除去候補変数: AWL               P : 0.00684  ***** 除去されませんでした
## 編入候補変数: GI                P : 0.196  ***** 編入されませんでした
## 
## ===================== 結果 =====================
## 
## ***** 分類関数 *****
## 
##                1          2    偏F値     P値
## Type    -0.28127   0.042803 790.7280 < 0.001
## NoS     -0.86859  -1.328545  27.9443 < 0.001
## AWL    -92.71076 -87.335003   7.3827 0.00684
## 定数項 294.54496 202.423625                 
## 
## ***** 判別関数 *****
## 
## 1 と 2 の判別
## マハラノビスの汎距離: 6.15818
## 理論的誤判別率:    0.00104
## 
##         判別係数 標準化判別係数
## Type     0.16204       17.04605
## NoS     -0.22998       -3.02903
## AWL      2.68788        0.97799
## 定数項 -46.06067               
## 
## ***** 判別結果集計表 ****
## 
##         判別された群
## 実際の群   1   2
##        1  69   2
##        2   0 381

三つのモデル:Type, NoS, AWL

DA.model5 <- lda(Lang ~  Type + NoS + AWL, data=all_indexes.df)

DA.model5
## Call:
## lda(Lang ~ Type + NoS + AWL, data = all_indexes.df)
## 
## Prior probabilities of groups:
##         1         2 
## 0.1570796 0.8429204 
## 
## Group means:
##       Type      NoS      AWL
## 1 387.2676 45.66197 4.751333
## 2 126.2073 22.06824 4.361718
## 
## Coefficients of linear discriminants:
##              LD1
## Type -0.02631280
## NoS   0.03734493
## AWL  -0.43647342

判別表

hyou <- table(all_indexes.df$Lang, predict(DA.model5)$class)
hyou
##    
##       1   2
##   1  67   4
##   2   0 381

判別率

correct <- (hyou[1,1]+hyou[2,2])/sum(hyou)
correct
## [1] 0.9911504

上位二つのモデル:Type, NoS, DA.model6

  • 標準化判別係数が大きいもの
DA.model6 <- lda(Lang ~  Type + NoS, data=all_indexes.df)

DA.model6
## Call:
## lda(Lang ~ Type + NoS, data = all_indexes.df)
## 
## Prior probabilities of groups:
##         1         2 
## 0.1570796 0.8429204 
## 
## Group means:
##       Type      NoS
## 1 387.2676 45.66197
## 2 126.2073 22.06824
## 
## Coefficients of linear discriminants:
##              LD1
## Type -0.02731629
## NoS   0.04378828

判別表

hyou <- table(all_indexes.df$Lang, predict(DA.model6)$class)
hyou
##    
##       1   2
##   1  66   5
##   2   0 381

判別率

correct <- (hyou[1,1]+hyou[2,2])/sum(hyou)
correct
## [1] 0.9889381

グラフ

DA.model6 <- lda(Lang ~  Type + NoS , data=all_indexes.df)

teisu <- apply(DA.model6$means %*% DA.model6$scaling, 2, mean) # 定数項の計算

plot(all_indexes.df$Type, all_indexes.df$NoS, col=c("blue", "red")[all_indexes.df$Lang], cex=1)

xmin <- min(all_indexes.df$Type)  # x軸の最小値
xmax <- max(all_indexes.df$Type)  # x軸の最大値

ymin <- teisu/DA.model6$scaling[2]  - (DA.model6$scaling[1]*xmin)/DA.model6$scaling[2] # xminの時のyの値の計算
ymax <- teisu/DA.model6$scaling[2]  - (DA.model6$scaling[1]*xmax)/DA.model6$scaling[2] # xmaxの時のyの値の計算

lines(c(xmin,xmax),c(ymin,ymax), type="l", col="green", lwd=2) # 最小値の(x, y)座標と最大値の(x, y)座標を結ぶ直線

別の二つの組み合わせ:NoS, AWL, DA.model7

モデル

DA.model7 <- lda(Lang ~  NoS + AWL, data=all_indexes.df)
DA.model7
## Call:
## lda(Lang ~ NoS + AWL, data = all_indexes.df)
## 
## Prior probabilities of groups:
##         1         2 
## 0.1570796 0.8429204 
## 
## Group means:
##        NoS      AWL
## 1 45.66197 4.751333
## 2 22.06824 4.361718
## 
## Coefficients of linear discriminants:
##             LD1
## NoS -0.09529848
## AWL -1.89276930

判別表

hyou <- table(all_indexes.df$Lang, predict(DA.model7)$class)
hyou
##    
##       1   2
##   1  50  21
##   2   6 375

判別率

correct <- (hyou[1,1]+hyou[2,2])/sum(hyou)
correct
## [1] 0.9402655

グラフ

DA.model7 <- lda(Lang ~  NoS + AWL , data=all_indexes.df)

teisu <- apply(DA.model7$means %*% DA.model7$scaling, 2, mean) # 定数項の計算

plot(all_indexes.df$NoS, all_indexes.df$AWL, col=c("blue", "red")[all_indexes.df$Lang], cex=1)

xmin <- min(all_indexes.df$NoS)  # x軸の最小値
xmax <- max(all_indexes.df$NoS)  # x軸の最大値

ymin <- teisu/DA.model7$scaling[2]  - (DA.model7$scaling[1]*xmin)/DA.model7$scaling[2] # xminの時のyの値の計算
ymax <- teisu/DA.model7$scaling[2]  - (DA.model7$scaling[1]*xmax)/DA.model7$scaling[2] # xmaxの時のyの値の計算

lines(c(xmin,xmax),c(ymin,ymax), type="l", col="green", lwd=2) # 最小値の(x, y)座標と最大値の(x, y)座標を結ぶ直線

DA.model8: Type, AWL

モデル

DA.model8 <- lda(Lang ~  Type + AWL, data=all_indexes.df)
DA.model8
## Call:
## lda(Lang ~ Type + AWL, data = all_indexes.df)
## 
## Prior probabilities of groups:
##         1         2 
## 0.1570796 0.8429204 
## 
## Group means:
##       Type      AWL
## 1 387.2676 4.751333
## 2 126.2073 4.361718
## 
## Coefficients of linear discriminants:
##              LD1
## Type -0.02167441
## AWL  -0.71678938

判別表

hyou <- table(all_indexes.df$Lang, predict(DA.model8)$class)
hyou
##    
##       1   2
##   1  67   4
##   2   0 381

判別率

correct <- (hyou[1,1]+hyou[2,2])/sum(hyou)
correct
## [1] 0.9911504

グラフ

DA.model8 <- lda(Lang ~  Type + AWL , data=all_indexes.df)

teisu <- apply(DA.model8$means %*% DA.model8$scaling, 2, mean) # 定数項の計算

plot(all_indexes.df$Type, all_indexes.df$AWL, col=c("blue", "red")[all_indexes.df$Lang], cex=1)

xmin <- min(all_indexes.df$Type)  # x軸の最小値
xmax <- max(all_indexes.df$Type)  # x軸の最大値

ymin <- teisu/DA.model8$scaling[2]  - (DA.model8$scaling[1]*xmin)/DA.model8$scaling[2] # xminの時のyの値の計算
ymax <- teisu/DA.model8$scaling[2]  - (DA.model8$scaling[1]*xmax)/DA.model8$scaling[2] # xmaxの時のyの値の計算

lines(c(xmin,xmax),c(ymin,ymax), type="l", col="green", lwd=2) # 最小値の(x, y)座標と最大値の(x, y)座標を結ぶ直線