BNlearn R error «переменная Variable1 должна иметь как минимум два уровня». - PullRequest
0 голосов
/ 28 февраля 2019

Попытка создать BN с использованием BNlearn, но я получаю сообщение об ошибке;

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

Это дает мне эту ошибку для каждой моей переменной, даже если они все факторы и имеют более 1уровни, как вы можете видеть - в этом случае моя переменная "модель" имеет 4 уровня

Поскольку я не могу поделиться переменными и набором данных, я создал небольшой набор и код принадлежности к набору данных.У меня та же проблема.Я знаю, что у меня есть только две переменные, но я получаю одинаковую ошибку для всех переменных.

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

1 Ответ

0 голосов
/ 01 марта 2019

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"]) не работает должным образом и возвращает ноль.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...