变量必须至少有两个级别(R 代码)

Variable must have at least two levels (R code)

我的训练数据是这样的:

A   B   C   D
1   1   1   1
1   1   1   2
1   1   2   1
1   1   2   1
1   1   2   2
1   1   2   2
1   2   1   1
1   2   1   1
1   2   1   2
1   2   1   2
1   2   2   1
1   2   2   2
2   1   1   1
2   1   1   1
2   1   1   2
2   1   1   2
2   1   2   1
2   1   2   1
2   1   2   2
2   1   2   2
2   2   1   1
2   2   1   2
2   2   2   1
2   2   2   2
2   2   2   2

而我的测试数据:

A   B   C   D
1   1   2   1
1   1   2   2
1   1   1   1
2   1   2   2

我使用以下方法进行拟合:

dag <- model2network("[A][B][C|A:B][D|A:B:C]")
training <- bn.fit(dag, trainingData, method = "mle", keep.fitted = TRUE)

我正在尝试使用以下方法预测 D 列的值:

predicted = predict(training, node = "D", data = testData,  method = "parents", prob = FALSE)

但是我得到了错误

Error in check.data(data, allow.levels = TRUE) : variable B must have at least two levels.

我该如何解决这个问题?我认为测试数据不需要包含训练数据中的所有级别 - 事实上,即使测试数据只有一个实例,也不应该可以预测吗?

由于您的变量都被编码为 factor 它们 "have" 一个因子水平列表。当您创建 training 时,您在 B 列中有 12,并且因子水平(隐含地,在后台)设置为 c(1, 2).但是,当您创建 testData 时,您在 B 列中只有 1,并且因子水平(隐含地,在后台)设置为仅 1.

我们可以通过明确声明 testData$B 具有级别 c(1, 2) 来解决此问题,即使数据中仅出现 1

testData$B <- factor(testData$B, levels=c(1, 2))

编辑:

修复了我写 training 而我完全打算写 testData

的愚蠢错误