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

尝试使用BNlearn创建BN,但我不断收到错误;

Error in check.data(data, allowed.types = discrete.data.types) : variable Variable1 must have at least two levels.

即使变量是所有因素并且具有多个级别,它也会为我带来每个变量的错误,如您所见-在这种情况下,我的变量“模型”具有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

最佳答案
bnlearn希望有一个data.frame:不能与小标题一起使用,因此,通过省略行DataFull<-as_tibble(DataFull),将数据保留为data.frame 例

library(tibble)
library (bnlearn)

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

Error in check.data(x) : variable A must have at least two levels.

特别是bnlearn ::: check.data中的行

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

在标准data.frame中,learning.test [,“ A”]返回一个向量,因此nlevels(learning.test [,“ A”])可以按预期工作,但是,根据设计,您不能从小动作中提取这样的向量:d [,“ A”])仍然是tbl_df而不是向量,因此nlevels(d [,“ A”])不能按预期工作,并返回零.

转载注明原文:BNlearn R错误“变量Variable1必须至少具有两个级别.” - 代码日志