我对使用插入符号包的PCA以及我收到的错误消息有疑问,“无法将常量/零列重新调整为单位差异”。
考虑两组相似的代码。第一个工作正常:
a = c(0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, -1, -1, NA)
b = c(1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, -1, -1, NA)
c = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0)
df = data.frame(a, b, c)
trans = preProcess(df, method = c("center", "scale", "pca"))
每列的方差可以看作:
apply(df, 2, var, na.rm=TRUE)
请注意,列“c”的方差为0.11
假设我将“c”列中的 倒数第二个 整数更改为1而不是0,然后运行相同的代码:
a = c(0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, -1, -1, NA)
b = c(1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, -1, -1, NA)
c = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0)
df = data.frame(a, b, c)
trans = preProcess(df, method = c("center", "scale", "pca"))
我收到错误消息:
Error in prcomp.default(x, scale = TRUE, retx = FALSE) :
cannot rescale a constant/zero column to unit variance
如果查看列c的方差,则为0.059:
apply(df, 2, var, na.rm=TRUE)
任何人都可以帮助我理解这两组代码之间的区别,以及为什么第二组代码在第一组没有时会出错?
谢谢
答案 0 :(得分:3)
PCA仅使用完整的观察结果。在上面的df
的第二个定义中,由于缺失,PCA分析将丢弃最后一行。列c
在其余行中保持不变。
注意:我的答案一般是围绕PCA,而不是特定于插入符号包。