BNlearn R错误“变量Variable1必须至少具有两个级别。”

5
尝试使用BNlearn创建Bayesian网络,但一直出现错误;
Error in check.data(data, allowed.types = discrete.data.types) : variable Variable1 must have at least two levels.

即使我的所有变量都是因素且具有多个级别,它仍然为每个变量给出了该错误。如您所见,在此示例中,我的变量“model”有4个级别。

由于我无法共享变量和数据集,因此我创建了一个小数据集以及相关代码。我遇到了相同的问题。我知道我只分享了2个变量,但我对所有变量都得到了同样的错误。

library(tidyverse)
library (bnlearn)
library(openxlsx)

DataFull <- read.xlsx("(.....)/test.xlsx", sheet = 1, startRow = 1, colNames = TRUE)
set.seed(600)
DataFull <- as_tibble(DataFull)

DataFull$Variable1 <- as.factor(DataFull$Variable1)
DataFull$TargetVar <- as.factor(DataFull$TargetVar)

DataFull <- na.omit(DataFull)
DataFull <- droplevels(DataFull)

DataFull <- DataFull[sample(nrow(DataFull)),]
Data <- DataFull[1:as.integer(nrow(DataFull)*0.70)-1,]
Datatest <- DataFull[as.integer(nrow(DataFull)*0.70):nrow(DataFull),]
nrow(Data)+nrow(Datatest)==nrow(DataFull)

FocusVar <- as.character("TargetVar")
BN.naive <- naive.bayes(Data, FocusVar) 

使用str(data),我可以看到该变量已经有2个或更多级别:

str(Data)

Classes ‘tbl_df’, ‘tbl’ and 'data.frame':   27586 obs. of  2 variables:
 $ Variable1: Factor w/ 3 levels "Small","Medium",..: 2 2 3 3 3 3 3 3 3 3 ...
 $ TargetVar: Factor w/ 2 levels "Yes","No": 1 1 1 1 1 1 2 1 1 1 ...

链接至数据集:https://drive.google.com/open?id=1VX2xkPdeHKdyYqEsD0FSm1BLu1UCtOj9eVIVfA_KJ3g
1个回答

8

bnlearn 期望一个 data.frame :不支持使用 tibbles,因此请通过省略以下这行代码将您的数据保留为 data.frameDataFull <- as_tibble(DataFull)

示例

library(tibble)
library (bnlearn)

d <- as_tibble(learning.test)
hc(d)

检查数据时出错:变量A必须至少有两个水平。

特别地,这是来自 bnlearn:::check.data 的代码行。

if (nlevels(x[, col]) < 2) 
      stop("variable ", col, " must have at least two levels.")

在标准的数据框中,learning.test[,"A"] 返回一个向量,因此 nlevels(learning.test[,"A"]) 能够正常工作。然而,设计上,您无法像这样从 tibbles 中提取向量:d[,"A"] 仍然是一个 tbl_df 而不是向量,因此 nlevels(d[,"A"]) 不能正常工作,并且返回零。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接