Справка по перекрестной проверке: ошибка в model.frame.default (as.formula (delete.response (Термины)), новые данные,: переменные длины отличаются (найдено для «забавного фактора») - PullRequest
0 голосов
/ 21 февраля 2019

Итак, у меня есть конкретная ошибка, которую я не могу понять.В результате поиска я обнаружил, что модель и набор перекрестной проверки не имеют данных с одинаковыми уровнями для соответствия модели.Я пытаюсь понять полностью с моим вариантом использования.В основном я строю модель QDA для прогнозирования страны транспортного средства на основе числовых значений.Этот код будет работать для всех, поскольку он является общедоступным документом Google.Для тех из вас, кто следит за Дугом Демуро на YouTube, это может показаться немного интересным.

#load dataset into r
library(gsheet)
url = 'https://docs.google.com/spreadsheets/d/1KTArYwDWrn52fnc7B12KvjRb6nmcEaU6gXYehWfsZSo/edit'
doug_df = read.csv(text=gsheet2text(url, format='csv'), stringsAsFactors=FALSE,header=FALSE)

#begin cleanup. remove first blank rows of data
doug_df = doug_df[-c(1,2,3), ]
attach(doug_df)

#name columns appropriately
names(doug_df) = c("year","make","model","styling","acceleration","handling","fun factor","cool factor","total weekend score","features","comfort","quality","practicality","value","total daily score","dougscore","video duration","filming city","filming state","vehicle country")

#removing categorical columns and columns not being used for discriminate analysis to include totals columns
library(dplyr)
doug_df = doug_df %>% dplyr::select (-c(make,model,`total weekend score`,`total daily score`,dougscore,`video duration`,`filming city`,`filming state`))

#convert from character to numeric
num.cols <- c("year","styling","acceleration","handling","fun factor","cool factor","features","comfort","quality","practicality","value")
doug_df[num.cols] <- sapply(doug_df[num.cols], as.numeric)
`vehicle country` = as.factor(`vehicle country`)

#create a new column to reflect groupings for response variable
doug_df$country.group=ifelse(`vehicle country`=='Germany','Germany',
                          ifelse(`vehicle country`=='Italy','Italy',
                                 ifelse(`vehicle country`=='Japan','Japan',
                                        ifelse(`vehicle country`=='UK','UK',
                                               ifelse(`vehicle country`=='USA','USA','Other')))))

#remove the initial country column
doug_df = doug_df %>% dplyr::select (-c(`vehicle country`))

#QDA with multiple predictors
library(MASS)
qdafit1 = qda(country.group~styling+acceleration+handling+`fun factor`+`cool factor`+features+comfort+quality+value,data=doug_df)

#predict using model and compute error
n=dim(doug_df)[1]
fittedclass = predict(qdafit1,data=doug_df)$class
table(doug_df$country.group,fittedclass)
Error = sum(doug_df$country.group != fittedclass)/n; Error

#conduct k 10 fold cross validation
allpredictedCV1 = rep("NA",n)

cvk = 10
groups = c(rep(1:cvk,floor(n/cvk)))
set.seed(4)
cvgroups = sample(groups,n,replace=TRUE)

for (i in 1:cvk)  {
  qdafit1 = qda(country.group~styling+acceleration+handling+`fun factor`+`cool factor`+features+comfort+quality+value,data=doug_df,subset=(cvgroups!=i))
  newdata1i = data.frame(doug_df[cvgroups==i,])
  allpredictedCV1[cvgroups==i] = as.character(predict(qdafit1,newdata1i)$class)
}
table(doug_df$country.group,allpredictedCV1)
CVmodel1 = sum(allpredictedCV1!=doug_df$country.group)/n; CVmodel1

Это приводит к ошибке последней части кода с перекрестной проверкой:

Ошибка в model.frame.default (as.formula (delete.response (Термины)), новые данные,: переменные длины различаются (найдено для «забавного фактора»)

Может кто-нибудь помочь объяснить это немного большеМне кажется, что переменный фактор удовольствия не имеет одинаковых уровней в каждом сгибе перекрестной проверки, как это было в модели. Теперь мне нужно знать свои варианты, чтобы это исправить. Заранее спасибо!

РЕДАКТИРОВАТЬ

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

#build a dummy review and predict it using multiple models
dummy_review = data.frame(year=2014,styling=8,acceleration=6,handling=6,`fun factor`=8,`cool factor`=8,features=4,comfort=4,quality=6,practicality=3,value=5)

#predict vehicle country for dummy data using model 1
predict(qdafit1,dummy_review)$class

Возвращает следующую ошибку:

Ошибка в model.frame.default (as.formula (delete.response (Terms)), newdata,: переменные длины отличаются (найдено для «fun factor»))

...