8

5000列30行のデータフレームでPCAを実行しようとしています

Sample <- read.table(file.choose(), header=F,sep="\t")
Sample.scaled <- data.frame(apply(Sample,2,scale))
pca.Sample <- prcomp(Sample.scaled,retx=TRUE)`

エラーが発生しました

Error in svd(x, nu = 0) : infinite or missing values in 'x'

sum(is.na(Sample))
[1] 0

sum(is.na(Sample.scaled))
[1] 90

以下を使用して、すべてのna値を無視しようとしました

pca.Sample <- prcomp(na.omit(Sample.scaled),retx=TRUE)

次のエラーが発生します

Error in svd(x, nu = 0) : 0 extent dimensions

na.actionには数式を指定する必要があるという報告があったため、以下を試してみました

pca.Sample <- prcomp(~.,center=TRUE,scale=TRUE,Sample, na.action=na.omit)

次のエラーが発生します

Error in prcomp.default(x, ...) :
  cannot rescale a constant/zero column to unit variance

問題は、「データ列の1つが定数です。定数の分散が0であり、スケーリングが0で除算されるためです。これは不可能です」と考えてください。

しかし、これに取り組む方法がわかりません。どんな助けでも大歓迎です...。

4

2 に答える 2

8

sum(is.na(Sample.scaled))として出てくるという事実から判断すると90、いつsum(is.na(Sample))だった0か、3つの定数列があるように見えます。

これはランダムに生成された(再現可能な)例で、同じエラーメッセージが表示されます。

Sample <- matrix(rnorm(30 * 5000), 30)
Sample[, c(128, 256, 512)] <- 1

Sample <- data.frame(Sample)
Sample.scaled <- data.frame(apply(Sample, 2, scale))

> sum(is.na(Sample))
[1] 0

> sum(is.na(Sample.scaled))
[1] 90

# constant columns are "scaled" to NA.
> pca.Sample <- prcomp(Sample.scaled,retx=TRUE)
Error in svd(x, nu = 0) : infinite or missing values in 'x'

# 3 entire columns are entirely NA, so na.omit omits every row
> pca.Sample <- prcomp(na.omit(Sample.scaled),retx=TRUE)
Error in svd(x, nu = 0) : 0 extent dimensions

# can't scale the 3 constant columns
> pca.Sample <- prcomp(~.,center=TRUE,scale=TRUE,Sample, na.action=na.omit)
Error in prcomp.default(x, ...) : 
  cannot rescale a constant/zero column to unit variance

次のようなことを試すことができます:

Sample.scaled.2 <- data.frame(t(na.omit(t(Sample.scaled))))
pca.Sample.2 <- prcomp(Sample.scaled.2, retx=TRUE)

つまりna.omit、転置で使用して、NA行ではなく列を削除します。

于 2012-11-13T00:35:02.430 に答える
1

負の無限大の値は、以下のように対数変換後に置き換えることができます。

log_features <- log(data_matrix[,1:8])
log_features[is.infinite(log_features)] <- -99999
于 2016-01-10T19:31:44.083 に答える