-1

特定の共分散行列で PCA を実行する R 関数を作成しています。ここで、固有関数を使用して固有値と固有ベクトルを取得しようとすると、コンパイラはオブジェクトが見つからないと言います。問題を解決する方法はありますか?私のコードは以下のとおりです:

lab3<-function(cov,scale){ 
  if (scale==F)
  cov<-cov2cor(cov)

  dimension<-nrow(cov)
  eig<-eigen(cov)$values
  total<-sum(eig)
  stdev<-sqrt(eig)
  rotation<-eigen(cov)$vectors
  indp<-c(1:dimension)
  cump<-c(1:dimension)
  for (i in 1:dimension)
  {indp[i]=eig[i]/total
   cump[i]=sum(eigenvalue[1:i])/total
  }

  output=list(stdev,rotation,indp,cump)

}

ありがとう。

入力は、コードを実行するためだけd<-matrix(c(1,-2,0,-2,5,0,0,0,2),3) に行うことができlab3(d,T)ます..混乱を招いてしまい、本当に申し訳ありません。そんなつもりはなかったし、知らなかっただけです。御時間ありがとうございます。

4

1 に答える 1

4

当面の問題は、

cump[i]=sum(eigenvalue[1:i])/total

eigenvalue存在しないものを参照します。eig代わりにここで使用するつもりだったと思います:

cump[i]=sum(eig[1:i])/total

コメントから、エラーは次のようです。

as.vector(x, mode) : cannot coerce type 'closure' to vector of type 'any'

を指定せずに関数を呼び出すため、これが疑わしい結果になりますscale。その後、R は関数 (クロージャー) を見つけますが、ステートメントscaleに必要な型に強制することはできません。if()これを解決する簡単な方法は、次のいずれかを実行することです。

lab3 <- function(cov, scale = FALSE) {
....

また

lab3 <- function(cov) {
  if(missing(scale))
    scale <- FALSE
....

最初の形式が優先されます。

他にも問題があります。

  1. きっとあなたは欲しい

    if(scale)
      cov <- cov2cor(cov)
    

    ? つまり、すべての変数をゼロ平均単位分散にスケーリングする場合にのみ、相関行列が必要です。

  2. 次の 2 行を使用すると、forループをより効率的に実行できます。

    indp <- eig / total
    cump <- cumsum(indp)
    

    ループはまったく必要ありません。最初forにセットアップする必要もありませindpcump

  3. eigen()あなたは2回電話します。一度呼び出して、返されたオブジェクト全体を保存することをお勧めします。必要なビットのサブセット。

これらの問題をすべて解決すると、次の機能が得られます。

lab3 <- function(cov, scale=FALSE){ 
  if (scale)
    cov <- cov2cor(cov)

  ed <- eigen(cov)
  eig <- ed$values
  total <- sum(eig)
  stdev <- sqrt(eig)
  rotation <-ed$vectors
  indp <- eig / total
  cump <- cumsum(eig)

  list(stdev, rotation, indp, cump)
}

どちらが機能しますか:

> lab3(cov(iris[, 1:4]))
[[1]]
[1] 2.0562689 0.4926162 0.2796596 0.1543862

[[2]]
            [,1]        [,2]        [,3]       [,4]
[1,]  0.36138659 -0.65658877 -0.58202985  0.3154872
[2,] -0.08452251 -0.73016143  0.59791083 -0.3197231
[3,]  0.85667061  0.17337266  0.07623608 -0.4798390
[4,]  0.35828920  0.07548102  0.54583143  0.7536574

[[3]]
[1] 0.924618723 0.053066483 0.017102610 0.005212184

[[4]]
[1] 4.228242 4.470912 4.549122 4.572957

最後に、数値安定性の理由から、固有値分解よりも特異値分解による PCA の方が優れていると考えられることに注意してください。そして、これらすべてをベース R で、princompまたはできれば経由で行うことができます。prcomp

于 2013-03-27T16:21:13.463 に答える