【问题标题】:Error in svd(x, nu = 0) : 0 extent dimensionssvd(x, nu = 0) 中的错误:0 范围维度
【发布时间】:2018-03-28 03:07:30
【问题描述】:

我正在尝试对具有 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,这是不可能的。”

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

【问题讨论】:

  • 尝试is.finite(Sample) 而不是is.na。此外,您作为 data.frame 读入,转换为矩阵并返回 data.frame,您确定 Sample 中的所有列都是数字的(或者 R 认为它们是数字的)。 lapply(Sample, scale) 可能会更好。
  • 还要注意?prcomp 已经有一个na.action= 参数,默认情况下应该是na.omit
  • @thelatemail : 感谢格式化

标签: r


【解决方案1】:

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 列而不是行。

【讨论】:

  • 无限值的情况如何?
  • 遇到了这个问题,Sample.scaled.2 &lt;- data.frame(t(na.omit(t(Sample.scaled))))中的t有什么用
  • na.omit 删除任何包含NA 的行。这里我们要删除列,而不是行,所以我们用t转置矩阵,通过na.omit,然后再次通过t得到原始方向。
【解决方案2】:

负无穷大值可以在对数变换后替换,如下所示。

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

【讨论】:

    猜你喜欢
    • 2016-06-09
    • 1970-01-01
    • 1970-01-01
    • 2021-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-22
    • 2021-10-28
    相关资源
    最近更新 更多