svd(x,nu = 0)中的错误:0范围尺寸

时间:2012-11-12 22:43:45

标签: r

我正在尝试在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

认为问题可能是因为“我的一个数据列是常量。常量的方差是0,然后缩放将除以0,这是不可能的。”

但不确定如何解决这个问题。任何帮助非常感谢....

2 个答案:

答案 0 :(得分:5)

sum(is.na(Sample.scaled)) 90 sum(is.na(Sample)) 0 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为{{1}}时,看起来您已经有三个不变的列。

这是一个随机生成的(可重现的)示例,它给出了相同的错误消息:

{{1}}

您可以尝试以下方式:

{{1}}

即。在转置上使用{{1}}来删除{{1}}列而不是行。

答案 1 :(得分:2)

在以下日志转换后可以替换负无穷大值。

log_features <- log(data_matrix[,1:8])
log_features[is.infinite(log_features)] <- -99999