R - svd() function - infinite or missing values in 'x'
Asked Answered
S

1

7

I am constantly getting this error. I am sure the matrix does not have any non-numeric entries. I also tried imputing the matrix, did not work.

Anyone know what the error might be?

fileUrl <- "https://dl.dropboxusercontent.com/u/76668273/kdd.csv";
download.file(fileUrl,destfile="./kdd.csv",method="curl");
kddtrain <- read.csv("kdd.csv");
kddnumeric <- kddtrain[,sapply(kddtrain,is.numeric)];
kddmatrix <- as.matrix(kddnumeric);
svd1 <- svd(scale(kddmatrix));
Snoopy answered 29/1, 2014 at 6:8 Comment(1)
In future, a small reproducible example (and not something that requires downloading) is appreciated.Prophet
P
15

You have columns composed of all zeroes. Using scale on a column of all zeroes returns a column composed of NaN. To solve this, remove columns where you have all zeroes (svd will not reveal anything new about them), or replace NaN columns with zero after using scale.

Reproducible example:

mat <- matrix(c(1,2,3,0,0,0,2,4,6,5,12,13),nrow = 3)
     # [,1] [,2] [,3] [,4]
# [1,]    1    0    2    5
# [2,]    2    0    4   12
# [3,]    3    0    6   13
scale(mat)
     # [,1] [,2] [,3]       [,4]
# [1,]   -1  NaN   -1 -1.1470787
# [2,]    0  NaN    0  0.4588315
# [3,]    1  NaN    1  0.6882472
# attr(,"scaled:center")
# [1]  2  0  4 10
# attr(,"scaled:scale")
# [1] 1.000000 0.000000 2.000000 4.358899
svd(mat) #fine
svd(scale(mat)) # not fine
Prophet answered 29/1, 2014 at 7:24 Comment(1)
thanks a lot, perfect answer. a simple line kddmatrix <- kddmatrix[,colSums(kddmatrix != 0) != 0] before applying svd solved it.Snoopy

© 2022 - 2024 — McMap. All rights reserved.