对 MCA 对象 FactoMineR 进行预测时出错
Errors making predictions on MCA object FactoMineR
我正在尝试使用 FactoMineR 包中的 MCA 从 R 中的 MCA 分析中获取新坐标。
其中 df 是数据帧,
res = MCA(df)
predict.MCA(res, df)
产生错误:
Error in predict.MCA(res, df) :
The following categories are not in the active dataset: 0.01.12.13.11.22.21.30.01.12.13.11.22.23.21.32.33.30.01.12.13.11.22.23.21.30.01.12.13.11.22.23.21.32.33.30.01.12.13.11.22.23.21.32.33.30.015.1610.111.215.2610.211.315.3610.3
我不确定类别有何不同,因为它在 MCA 和预测中是完全相同的数据帧 (df)。 (我这样做只是为了调试,因为我最初在尝试转换我的测试集时遇到了这个错误。)
我尝试对输入数据帧的每一列使用 droplevels,但我得到了同样的错误。
感谢任何帮助。
如果没有您提供的可重现示例,很难诊断此问题,但是有几个地方可以着手。
如果您查看 predict.mca() 函数中错误的来源,它来自这些行(经过编辑以更清晰易读):
olddata <- object$call$X[,
rownames(object$var$eta),
drop=FALSE]
newdata <- newdata[,
colnames(olddata),
drop = FALSE]
pb <- NULL
for (i in 1:ncol(newdata)) {
if (sum(!levels(newdata[ ,i]) %in% levels(olddata[ ,i])) > 0) {
pb <- c(pb, levels(newdata[, i])[which(!levels(newdata[, i]) %in% levels(olddata[ ,i]))])
}
}
if (!is.null(pb)) {
stop("The following categories are not in the active dataset: ",pb)
}
幸运的是,这个错误通过 FactoMiner 自己的一个例子重现了,这有点有趣,所以使用爱好数据集:
library(FactoMineR)
hobbies <- read.table("http://factominer.free.fr/course/doc/data_MCA_Hobbies.csv",
header = TRUE,
sep = ";")
hobbies[, "TV"] <- as.factor(hobbies[, "TV"])
res.mca <- MCA(hobbies,
quali.sup = 19:22,
quanti.sup = 23)
pred.obj <- predict.MCA(object = res.mca,
newdata = hobbies)
return错误:
Error in predict.MCA(object = res.mca, newdata = hobbies) :
The following categories are not in the active dataset: nynynynynynynynynynynynynynynynyny
这是怎么回事?如果你稍微破解 FactoMiner 的代码,return 他们的 'olddata' 和 'newdata' 对象,你会看到他们的 'olddata' 对象中的因素已经从 "n" 和 "y"(在爱好数据集中)到 "columnname_n/y"。
这只涉及插入:
return(list(olddata, newdata)
在 'predict.mca()' 中创建这些分配后的下一行,然后:
X <- predict.MCA(object = res.mca,
newdata = hobbies)
然后:
levels(X[[1]][, 1L])
[1] "Reading_n" "Reading_y"
levels(X[[2]][, 1L])
[1] "n" "y"
所以 FactoMiner 正在寻找新数据中的因素,以匹配旧数据中的因素。不是 FactoMiner 用户,我不完全清楚他们为什么要以这种方式编码他们的数据框。这可能是有原因的,但在我看来,这实际上会影响提供给该函数的任何数据。如果你愿意,你可以破解它 a) 只转换你的新数据以遵循这种格式,或者 b) 将他们调整后的格式转换回原来的格式。
很可能 a 是更好的选择,但谁知道呢。 'hobbies' 数据集看起来像这样:
new.hobbies <- hobbies
for (m1 in seq_len(ncol(hobbies))) {
new.hobbies[, m1] <- as.factor(paste(colnames(new.hobbies)[m1],
as.character(new.hobbies[, m1]),
sep = "_"))
}
对于您的用例中的爱好数据集,这实际上仍然会出错,因为 MCA 显然不会将列名称粘贴到从整数派生的因子上,但希望这能让您达到您想要的目的。如果您可以提供数据的实际示例,我们也许可以帮助您找到更清晰的解决方案。
我正在尝试使用 FactoMineR 包中的 MCA 从 R 中的 MCA 分析中获取新坐标。
其中 df 是数据帧,
res = MCA(df)
predict.MCA(res, df)
产生错误:
Error in predict.MCA(res, df) :
The following categories are not in the active dataset: 0.01.12.13.11.22.21.30.01.12.13.11.22.23.21.32.33.30.01.12.13.11.22.23.21.30.01.12.13.11.22.23.21.32.33.30.01.12.13.11.22.23.21.32.33.30.015.1610.111.215.2610.211.315.3610.3
我不确定类别有何不同,因为它在 MCA 和预测中是完全相同的数据帧 (df)。 (我这样做只是为了调试,因为我最初在尝试转换我的测试集时遇到了这个错误。)
我尝试对输入数据帧的每一列使用 droplevels,但我得到了同样的错误。
感谢任何帮助。
如果没有您提供的可重现示例,很难诊断此问题,但是有几个地方可以着手。
如果您查看 predict.mca() 函数中错误的来源,它来自这些行(经过编辑以更清晰易读):
olddata <- object$call$X[,
rownames(object$var$eta),
drop=FALSE]
newdata <- newdata[,
colnames(olddata),
drop = FALSE]
pb <- NULL
for (i in 1:ncol(newdata)) {
if (sum(!levels(newdata[ ,i]) %in% levels(olddata[ ,i])) > 0) {
pb <- c(pb, levels(newdata[, i])[which(!levels(newdata[, i]) %in% levels(olddata[ ,i]))])
}
}
if (!is.null(pb)) {
stop("The following categories are not in the active dataset: ",pb)
}
幸运的是,这个错误通过 FactoMiner 自己的一个例子重现了,这有点有趣,所以使用爱好数据集:
library(FactoMineR)
hobbies <- read.table("http://factominer.free.fr/course/doc/data_MCA_Hobbies.csv",
header = TRUE,
sep = ";")
hobbies[, "TV"] <- as.factor(hobbies[, "TV"])
res.mca <- MCA(hobbies,
quali.sup = 19:22,
quanti.sup = 23)
pred.obj <- predict.MCA(object = res.mca,
newdata = hobbies)
return错误:
Error in predict.MCA(object = res.mca, newdata = hobbies) :
The following categories are not in the active dataset: nynynynynynynynynynynynynynynynyny
这是怎么回事?如果你稍微破解 FactoMiner 的代码,return 他们的 'olddata' 和 'newdata' 对象,你会看到他们的 'olddata' 对象中的因素已经从 "n" 和 "y"(在爱好数据集中)到 "columnname_n/y"。
这只涉及插入:
return(list(olddata, newdata)
在 'predict.mca()' 中创建这些分配后的下一行,然后:
X <- predict.MCA(object = res.mca,
newdata = hobbies)
然后:
levels(X[[1]][, 1L])
[1] "Reading_n" "Reading_y"
levels(X[[2]][, 1L])
[1] "n" "y"
所以 FactoMiner 正在寻找新数据中的因素,以匹配旧数据中的因素。不是 FactoMiner 用户,我不完全清楚他们为什么要以这种方式编码他们的数据框。这可能是有原因的,但在我看来,这实际上会影响提供给该函数的任何数据。如果你愿意,你可以破解它 a) 只转换你的新数据以遵循这种格式,或者 b) 将他们调整后的格式转换回原来的格式。
很可能 a 是更好的选择,但谁知道呢。 'hobbies' 数据集看起来像这样:
new.hobbies <- hobbies
for (m1 in seq_len(ncol(hobbies))) {
new.hobbies[, m1] <- as.factor(paste(colnames(new.hobbies)[m1],
as.character(new.hobbies[, m1]),
sep = "_"))
}
对于您的用例中的爱好数据集,这实际上仍然会出错,因为 MCA 显然不会将列名称粘贴到从整数派生的因子上,但希望这能让您达到您想要的目的。如果您可以提供数据的实际示例,我们也许可以帮助您找到更清晰的解决方案。