使用psych :: principal()的维度缩减不适用于较小的数据

时间:2014-12-17 21:15:22

标签: r pca psych

我试图通过使用函数psych :: Principal()来使用训练数据来获取PCA组件。

> train <- read.csv("mytraindata.csv", header = TRUE)
> train[is.na(train)] <- 0
> train <- sapply(train, as.numeric)
> fit <- principal(train, nfactors = 6, rotate = "promax", missing = TRUE)

现在,我正在尝试减少测试数据的维度。所以,我首先加载我的数据如下:

> test <- read.csv("mytestdata.csv", header = TRUE)
> test[is.na(test)] <- 0
> test <- sapply(test, as.numeric)

当我在前四行应用它时,我得到一些有效的输出如下:

> sm <- test[1:4,]
> predict(fit, sm)
       PC1        PC2        PC3        PC4        PC5       PC6
[1,]  2.208531 -0.5038822 -2.6390489  0.4115814  1.7402972  3.213355
[2,] -4.678453 -0.4528760  0.7745650 -1.2372164 -0.3016823 -2.706421
[3,] -1.864383 -2.6386053  0.6979575 -1.3102945 -1.2105619 -2.833270
[4,]  4.334304  3.5953635  1.1665265  2.1359295 -0.2280531  2.326335

但是,当我在3行上应用相同的时间时,它会给出NaN,如下所示:

> sm <- test[1:3,]
> predict(fit, sm)
     PC1 PC2 PC3 PC4 PC5 PC6
[1,] NaN NaN NaN NaN NaN NaN
[2,] NaN NaN NaN NaN NaN NaN
[3,] NaN NaN NaN NaN NaN NaN

如果我使用训练数据而不是测试数据,我也会得到类似的输出。

我担心,因为我认为这可以像机器学习模型一样用于预测。任何人都可以帮我弄清楚为什么会发生这种情况。

1 个答案:

答案 0 :(得分:0)

我找到了解决这个问题的方法。

实际上,psych.predict()采用第三个可选参数,即标准化数据。似乎需要一些数据来标准化预测。如果未提供第三个参数,则使用第二个参数作为标准化的数据。因为,第二个参数只有更少的实例,它无法标准化数据并抛出NaN。

如果您传递一些数据用于标准化,例如用于训练模型的数据(这是一种好的风格。psych.predict()的文档说使用测试数据进行标准化可能会导致混淆。请参阅第234页这个pdf CRAN psych documentation)的详细信息,它将为您提供简化的矩阵。

predict(fit, sm, train) #third argument i.e. standardization data should be passed