32258


R言語にて、判別分析（LDA）を用いてグレースケールの画像データを２値化画像するコードを検討中です。  
これを実現するにあたり、MASSパッケージの`lda()`関数を使用しようと考えてるのですが、`lda()`関数使用時エラーが発生し、その原因が分かりません。このエラーの意味と対策を教えて頂きたいですm(__)m

`lda()`関数のヘルプファイル：  
<https://stat.ethz.ch/R-manual/R-devel/library/MASS/html/lda.html>

変換対象画像ファイル（グレースケール）  
[![nekosensei_greyscale.jpg](https://i.stack.imgur.com/vzb1f.jpg)](https://i.stack.imgur.com/vzb1f.jpg)

以下、実装中コードです。

[code]

    #install.packages("lda")
    #install.packages("jpeg")
    
    # expand lib on memory
    library( MASS )   # MASS package
    library( jpeg )   # jpeg画像の読み込み
    
    # set options
    options( digits=7 ) # 表示桁数
    
    # load image data (jpeg)
    jpeg_NekoSensei <- readJPEG( "nekosensei_greyscale.jpg" ) # 560*420 = 235200    pixel
    class( jpeg_NekoSensei ) # 3次元配列 um[1:420, 1:560, 1:3]
    
    ########################################
    # convert to thresholding/binary image #
    ########################################
    dfNekoSensei <- as.data.frame( jpeg_NekoSensei ) # convert to data frame
    dat_level <- seq( from=min(dfNekoSensei), to=max(dfNekoSensei), length = length(dfNekoSensei$V1) )
    
    dat_ida <- lda( dat_level ~ . , data = dfNekoSensei ) # **この箇所でエラーが発生します**
    
[/code]

エラー内容

> Error in lda.default(x, grouping, ...) : variables 1 2  
>  3 4 5 6 7 8 9 10 11 12 13 14 15 16  
>  17 18 19 20 21 22 23 24 25 26 27 28 29 30  
>  31 32 33 34 35 36 37 38 39 40 41 42 43 44  
>  45 46 47 48 49 50 51 52 53 54 55 56 57 58  
>  59 60 61 62 63 64 65 66 67 68 69 70 71 72  
>  73 74 75 76 77 78 79 80 81 82 83 84 85 86  
>  87 88 89 90 91 92 93 94 95 96 97 98 99 100  
>  101 102 103 104 105 106 107 108 109 110 111 112 113 114  
>  115 116 117 118 119 120 121 122 123 124 125 126 127 128  
>  129 130 131 132 133 134 135 136 137 138 139 140 141 142  
>  143 144 145 146 147 148 149 150 151 152 153 154 155 156  
>  157 158 159 160 161 162 163 164 165 166 167 168 169 170  
>  171 172 173 174 175 176 177 178 179 180 181 182 183 184  
>  185 186 187 188 189 190 191 192 193 194 195 196

以下、コードの続き

[code]

    print( dat_ida )
    
    
    ############################
    # set graphics parameters  #
    ############################
    # 軸に関してのデータリスト
    lstAxis <- list(                        
      xMin = 0.0, xMax = 1.0,  # x軸の最小値、最大値
      yMin = 0.0, yMax = 1.0,  # y軸の最小値、最大値
      zMin = 0.0, zMax = 1.0,  # z軸の最小値、最大値
      xlim = range( c(0.0, 1.0) ), 
      ylim = range( c(0.0, 1.0) ), 
      zlim = range( c(0.0, 1.0) ),
      mainTitle = "mainTitle", # 図のメインタイトル（図の上）
      subTitle  = "subTitle",  # 図のサブタイトル（図の下）
      xlab      = "x", # x軸の名前
      ylab      = "y", # y軸の名前
      zlab      = "z"  # z軸の名前
    )
    lstAxis$xMin <- 0
    lstAxis$xMax <- 560
    lstAxis$yMin <- 0
    lstAxis$yMax <- 420
    lstAxis$xlim = range( c(lstAxis$xMin, lstAxis$xMax) )
    lstAxis$ylim = range( c(lstAxis$yMin, lstAxis$yMax) )
    lstAxis$zlim = range( c(lstAxis$zMin, lstAxis$zMax) )
    lstAxis$xlab <- "x1"
    lstAxis$ylab <- "x2"
    lstAxis$mainTitle <- "ねこ先生（グレースケール）[Greyscale]" # 図のメインタイトル（図の上）
    
    # plot frame only
    par(new=F)
    plot.new()  # clear
    plot( c(), type='n',
          main = lstAxis$mainTitle,
          xlim=lstAxis$xlim, ylim=lstAxis$ylim,
          xlab=lstAxis$xlab, ylab=lstAxis$ylab
    )
    #grid() #グリッド線を追加
    
    ############################
    # Draw Image and figure    #
    ############################
    # draw original image
    rasterImage( 
      image = jpeg_NekoSensei, 
      xleft = lstAxis$xMin, xright = lstAxis$xMax, 
      ybottom = lstAxis$yMin, ytop = lstAxis$yMax
    )
    
    # draw converted image
    lstAxis$mainTitle <- "ねこ先生（２値化処理後）"  # 図のメインタイトル（図の上）
    plot( c(), type='n',
          main = lstAxis$mainTitle,
          xlim=lstAxis$xlim, ylim=lstAxis$ylim,
          xlab=lstAxis$xlab, ylab=lstAxis$ylab
    )
    rasterImage(
      image = jpeg_NekoSensei, # 変換後のデータ（とりあえず元データをセット） 
      xleft = lstAxis$xMin, xright = lstAxis$xMax, 
      ybottom = lstAxis$yMin, ytop = lstAxis$yMax
    )
    
[/code]


CC BY-SA 3.0
2017-01-29T16:10:32.603
32233
2017-01-31T12:51:43.000
2017-01-30T04:27:09.450
76
20266
question
r 機械学習
R言語で、判別分析（LDA）を用いた画像データの２値化法を実行する際の MASS パッケージの関数 lda() の使用法について


[cuttlefish44](https://ja.stackoverflow.com/users/15653/cuttlefish44)
様のコメントのアドバイスを元に解決することが出来ました！どうもありがとうございました！又、誤記を修正くださった方々どうもありがとうございましたm(__)m

> 以下、主な修正箇所のRコード
[code]

    ########################################
    # convert to thresholding/binary image #
    ########################################
    dfNekoSensei <- as.data.frame( expand.grid(jpeg_NekoSensei) ) # convert to data frame
    dat_levels <- c(
      rep( min(dfNekoSensei$Var1), length(dfNekoSensei$Var1)/2 ), 
      rep( max(dfNekoSensei$Var1), length(dfNekoSensei$Var1)/2 ) 
    ) # binary data set (0 or 1)
    
    dat_lda <- lda( dat_levels ~ . , data = dfNekoSensei )
    
[/code]

> 以下、修正後の実装結果  
>
> [![画像の説明をここに入力](https://i.stack.imgur.com/PB95d.png)](https://i.stack.imgur.com/PB95d.png)  
>
> [![画像の説明をここに入力](https://i.stack.imgur.com/IjueN.png)](https://i.stack.imgur.com/IjueN.png)  
>
> [![画像の説明をここに入力](https://i.stack.imgur.com/Q9xih.png)](https://i.stack.imgur.com/Q9xih.png)


CC BY-SA 3.0
2017-01-30T14:26:38.990
32258
2017-01-31T12:51:43.000
2017-04-13T12:52:39.113
-1
20266
32233
answer