0

我正在尝试通过使用函数 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

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

我很担心,因为我认为这与使用机器学习模型获得预测的方式相同。请任何人帮助我弄清楚为什么会发生这种情况。

4

1 回答 1

0

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

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

如果您传递一些数据进行标准化,例如用于训练模型的数据(这是一种很好的风格。文档psych.predict()说使用测试数据进行标准化可能会导致混淆。有关此 pdf CRAN 心理文档的详细信息,请参见第 234 页) ,它会给你简化的矩阵。

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

于 2014-12-23T18:36:39.553 回答