尝试使用 BNlearn 创建 BN,但我不断收到错误;
Error in check.data(data, allowed.types = discrete.data.types) : variable Variable1 must have at least two levels.
它为我的每个变量提供了误差,即使它们都是因子并且具有 1 个以上的水平,如您所见 - 在这种情况下,我的变量"模型"有 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(数据)
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
:不适用于tibbles
,所以通过省略行来保持你的数据作为data.frame
DataFull <- as_tibble(DataFull)
例
library(tibble)
library (bnlearn)
d <- as_tibble(learning.test)
hc(d)
check.data(x) 中的错误:变量 A 必须至少有两个级别。
特别是,它是来自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"])
按预期工作,但是,根据设计,你不能从tibbles
中提取这样的向量:d[,"A"])
仍然是一个tbl_df
而不是一个向量,因此nlevels(d[,"A"])
不能按预期工作,并返回零。