【问题标题】:Variable must have at least two levels (R code)变量必须至少有两个级别(R 代码)
【发布时间】:2020-02-27 10:01:54
【问题描述】:

我的训练数据如下所示:

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)

但我得到了错误

check.data(data, allow.levels = TRUE) 中的错误:变量 B 必须 至少有两个级别。

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

【问题讨论】:

    标签: r r-factor


    【解决方案1】:

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

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

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

    编辑:

    修正了我写training而我完全打算写testData的愚蠢错误

    【讨论】:

    • 我已经使用以下代码将训练和测试数据转换为因子:datacols &lt;- c("A", "B", "C", "D")for (i in 1:ncol(testData)) {testData[,datacols[i]] &lt;- factor(testData[,datacols[i]])}
    • 你试过我给你的答案了吗?它没有解决错误吗?您在此评论中显示的转换正是错误的原因。
    • 是的,我试过了。你分享的代码给出了这个错误:Error in check.dnode(value, node = name) :the conditional probability distribution of node B must be a table, a matrix or a multidimensional array.
    • 嗯,这很有趣。在您对因子进行建议的重新调整之前和之后,str(testData) 的输出是什么?
    • 等等,当我在 test data 上运行您的代码时,错误消失了。似乎在逻辑上是正确的,因为它是测试数据,似乎没有所有级别。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-22
    • 2021-01-04
    • 2019-02-20
    • 2021-05-13
    • 1970-01-01
    • 2019-06-29
    • 1970-01-01
    相关资源
    最近更新 更多