Почему я не могу использовать cv.glm для вывода bestglm? - PullRequest
1 голос
/ 04 апреля 2020

Я пытаюсь сделать лучший выбор подмножества для набора данных Wine, а затем хочу получить частоту ошибок теста, используя 10-кратное CV. Код, который я использовал, -

cost1 <- function(good, pi=0) mean(abs(good-pi) > 0.5)
res.best.logistic <-
    bestglm(Xy = winedata,
            family = binomial,          # binomial family for logistic
            IC = "AIC",                 # Information criteria
            method = "exhaustive")
res.best.logistic$BestModels
best.cv.err<- cv.glm(winedata,res.best.logistic$BestModel,cost1, K=10)

Однако, это дает ошибку -

Error in UseMethod("family") : no applicable method for 'family' applied to an object of class "NULL"

Я думал, что $ BestModel - это объект lm, который представляет наилучшее соответствие, и вот что руководство также говорит. Если это так, то почему я не могу найти ошибку теста с помощью 10-кратного CV с помощью cv.glm?

Набор данных - это набор данных белого вина из https://archive.ics.uci.edu/ml/datasets/Wine+Quality, и использовался пакет boot для cv.glm и пакет bestglm.

Данные были обработаны как -

winedata <- read.delim("winequality-white.csv", sep = ';')
winedata$quality[winedata$quality< 7] <- "0" #recode
winedata$quality[winedata$quality>=7] <- "1" #recode
winedata$quality <- factor(winedata$quality)# Convert the column to a factor
names(winedata)[names(winedata) == "quality"] <- "good"      #rename 'quality' to 'good'

1 Ответ

2 голосов
/ 04 апреля 2020

bestglm fit переставляет ваши данные и называет вашу переменную ответа как y, следовательно, если вы передадите ее обратно в cv.glm, у winedata не будет столбца y, и после этого все вылетает

Всегда полезно проверить что такое класс:

class(res.best.logistic$BestModel)
[1] "glm" "lm" 

Но если вы посмотрите на вызов res.best.logistic$BestModel:

res.best.logistic$BestModel$call

glm(formula = y ~ ., family = family, data = Xi, weights = weights)

head(res.best.logistic$BestModel$model)
  y fixed.acidity volatile.acidity citric.acid residual.sugar chlorides
1 0           7.0             0.27        0.36           20.7     0.045
2 0           6.3             0.30        0.34            1.6     0.049
3 0           8.1             0.28        0.40            6.9     0.050
4 0           7.2             0.23        0.32            8.5     0.058
5 0           7.2             0.23        0.32            8.5     0.058
6 0           8.1             0.28        0.40            6.9     0.050
  free.sulfur.dioxide density   pH sulphates
1                  45  1.0010 3.00      0.45
2                  14  0.9940 3.30      0.49
3                  30  0.9951 3.26      0.44
4                  47  0.9956 3.19      0.40
5                  47  0.9956 3.19      0.40
6                  30  0.9951 3.26      0.44

Вы можете заменить вещи в вызове et c, но это слишком большая часть беспорядка. Подгонка не требует больших затрат, поэтому подгоняйте winedata и передавайте ее на cv.glm:

best_var = apply(res.best.logistic$BestModels[,-ncol(winedata)],1,which)
# take the variable names for best model
best_var = names(best_var[[1]])
new_form = as.formula(paste("good ~", paste(best_var,collapse="+")))
fit = glm(new_form,winedata,family="binomial")

best.cv.err<- cv.glm(winedata,fit,cost1, K=10)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...