R Ошибка: какая-то группа слишком мала для «qda»

Я использовал qda{MASS}, чтобы найти классификатор для моих данных, и он всегда сообщал «some group is too small for 'qda'». Это связано с размером тестовых данных, которые я использовал для модели? Я увеличил размер тестовой выборки с 30 до 100, он сообщил о той же ошибке. Помогитепппппп.....

set.seed(1345)
AllMono <- AllData[AllData$type == "monocot",]
MonoSample <- sample (1:nrow(AllMono), size = 100, replace = F)
set.seed(1355)
AllEudi <- AllData[AllData$type == "eudicot",]
EudiSample <- sample (1:nrow(AllEudi), size = 100, replace = F)
testData <- rbind (AllMono[MonoSample,],AllEudi[EudiSample,])
plot (testData$mono_score, testData$eudi_score, col = as.numeric(testData$type), xlab = "mono_score", ylab = "eudi_score", pch = 19)
qda (type~mono_score+eudi_score, data = testData)

Вот мой пример данных

>head (testData)
                              sequence mono_score eudi_score    type
PhHe_4822_404_76       DTRPTAPGHSPGAGH    51.4930   39.55000 monocot
SoBi_10_265860_58      QTESTTPGHSPSIGH    33.1408    2.23333 monocot
EuGr_5_187924_158        AFRPTSPGHSPGAGH    27.0000   54.55000 eudicot
LuAn_AOCW01152859.1_2_79 NFRPTEPGHSPGVGH    20.6901   50.21670 eudicot
PoTr_Chr07_112594_90     DFRPTAPGHSPGVGH    43.8732   56.66670 eudicot
OrSa.JA_3_261556_75    GVRPTNPGHSPGIGH    55.0986   45.08330 monocot
PaVi_contig16368_21_57 QTDSTTPGHSPSIGH    25.8169    2.50000 monocot

>testData$type <- as.factor (testData$type)

> dim (testData)
[1] 200   4

> levels (testData$type)
[1] "eudicot" "monocot" "other" 

> table (testData$type)
eudicot monocot   other 
    100     100       0

> packageDescription("MASS")
Package: MASS
Priority: recommended
Version: 7.3-29
Date: 2013-08-17
Revision: $Rev: 3344 $
Depends: R (>= 3.0.0), grDevices, graphics, stats, utils

Моя версия R — R 3.0.2.


person user2993059    schedule 09.12.2013    source источник
comment
Тест в MASS:::qda.default — это if (any(counts < p + 1)) stop("some group is too small for 'qda'"), где counts — количество вхождений в каждой категории, а p — количество столбцов в матрице предикторов...   -  person Ben Bolker    schedule 10.12.2013
comment
Таким образом, количество вхождений в каждой категории в моей ситуации равно количеству вхождений в каждом типе (переменная ответа в модели), верно? p - это количество столбцов в testData? У меня есть только две категории в типе --- mono и eudi, оба числа должны быть 100, так как я сэмплировал их с размером 100. p равно 3 (в testData есть три столбца -- mono_score, eudi_score и type). Я думаю, что моя настройка удовлетворяет любому (считает › p + 1)   -  person user2993059    schedule 10.12.2013
comment
будет сложно помочь вам без воспроизводимого примера (tinyurl.com/ воспроизводимый000)   -  person Ben Bolker    schedule 10.12.2013
comment
Я разместил пример данных выше. Спасибо :) Это нормально?   -  person user2993059    schedule 10.12.2013
comment
нет, но у меня есть предположение (см. ниже).   -  person Ben Bolker    schedule 10.12.2013


Ответы (2)


tl;dr Я предполагаю, что ваши переменные-предикторы случайно превратились в факторы или векторы символов. Это может легко произойти, если у вас есть небольшой сбой в наборе данных, например, ложный символ в одной строке.

Вот способ составить набор данных, похожий на ваш:

set.seed(101)
mytest <- data.frame(type=rep(c("monocot","dicot"),each=100),
                 mono_score=runif(100,0,100),
                 dicot_score=runif(100,0,100))

Немного полезной диагностики:

str(mytest)
## 'data.frame':    200 obs. of  3 variables:
## $ type       : Factor w/ 2 levels "dicot","monocot": 2 2 22 2 2 2 ...
##  $ mono_score : num  37.22 4.38 70.97 65.77 24.99 ...
##  $ dicot_score: num  12.5 2.33 39.19 85.96 71.83 ...
summary(mytest)
##       type       mono_score      dicot_score     
##  dicot  :100   Min.   : 1.019   Min.   : 0.8594  
##  monocot:100   1st Qu.:24.741   1st Qu.:26.7358  
##                Median :57.578   Median :50.6275  
##                Mean   :52.502   Mean   :52.2376  
##                3rd Qu.:77.783   3rd Qu.:78.2199  
##                Max.   :99.341   Max.   :99.9288  
## 
with(mytest,table(type))
## type
##   dicot monocot 
##    100     100 

Важно отметить, что первые два (str() и summary()) показывают нам тип каждой переменной. Обновление: оказывается, что третий тест на самом деле важен в данном случае, поскольку проблема была ложным дополнительным уровнем: функция droplevel() должна позаботиться об этой проблеме...

Этот вымышленный пример, кажется, работает нормально, поэтому вы должны что-то не показывать нам в своем наборе данных...

library(MASS)
qda(type~mono_score+dicot_score,data=mytest)

Вот предположение. Если ваши score переменные на самом деле были факторами, а не числовыми, то qda автоматически попытается создать из них фиктивные переменные, которые затем сделают матрицу модели намного шире (101 столбец в этом примере) и спровоцируют ошибку, которую вы видишь...

bad <- transform(mytest,mono_score=factor(mono_score))
qda(type~mono_score+dicot_score,data=bad)
## Error in qda.default(x, grouping, ...) : 
##    some group is too small for 'qda'
person Ben Bolker    schedule 10.12.2013
comment
Думаю, я понял, почему мои данные неверны (новая редакция под вопросом). После того, как я использую уровни (testData $ type), я вижу, что есть 3 уровня для типа переменной фактора. table(testData$type) возвращает 0 вхождений на другом уровне. Думаю, что причина какая-то(число ‹ p + 1). - person user2993059; 10.12.2013
comment
Последующий вопрос: что, если я взял testData из AllData, я хочу, чтобы уровни (testData) были однодольными и эвдикотовыми. Что я должен делать ? уровни (testData$type) ‹- as.factor(c(однодольный, эвдикот)) не работает - person user2993059; 10.12.2013
comment
Теперь это работает. Большое спасибо. summary() и str() очень полезны :) - person user2993059; 10.12.2013

У меня тоже была эта ошибка, поэтому я объяснил, что пошло не так на моей стороне, для тех, кто наткнется на это в будущем.

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

Для меня я убрал уровень полностью, но в факторе все равно остался этот уровень.

Чтобы удалить это, вы должны сделать это

df$var %<>% factor

NB. %‹>% требует magrittr

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

person Hielke Walinga    schedule 08.04.2020