Переменная должна иметь как минимум два уровня (код R) - PullRequest
0 голосов
/ 27 февраля 2020

Мои тренировочные данные выглядят так:

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 должна иметь как минимум два уровня.

Как это исправить? Я считал, что тестовые данные не обязательно должны иметь все уровни, включенные в обучающие данные - на самом деле, разве нельзя иметь возможность прогнозировать, даже если тестовые данные имеют только один экземпляр?

1 Ответ

1 голос
/ 27 февраля 2020

Поскольку все ваши переменные закодированы как factor, они "имеют" список уровней факторов. Когда вы создаете training, у вас есть 1 и 2 в столбце B, а уровни факторов (неявно на заднем плане) устанавливаются на c (1, 2). Но когда вы создаете testData, у вас есть только 1 в столбце B, а уровни факторов (неявно в фоновом режиме) устанавливаются на 1.

Мы можем исправить это, явно указав, что testData$B имеет уровни c(1, 2), хотя в данных отображается только 1.

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

Редактировать:

Исправлена ​​глупая ошибка, когда я писал training, пока я полностью предназначен для записи testData

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