cv.glmnet предупреждения для модели логита (хотя биноминальные классы с более чем 8 obs)? - PullRequest
0 голосов
/ 08 октября 2019

У меня есть простая таблица, в которой я пытаюсь выяснить, связаны ли мои ко-вариации (гены) с больными раком. Поскольку существует много ко-вариаций (~ 800), я провожу логистическую регрессию с штрафом LASSO с glmnet() и перекрестной проверкой с cv.glmnet(). Первая часть работает нормально, без предупреждений. Именно на бите проверки я получаю эти сообщения:

Предупреждающие сообщения:

1: В lognet (x, is.sparse, ix, jx, y, weights,offset, alpha, nobs,:
один полиномиальный или биномиальный класс имеет менее 8 наблюдений; опасное основание

2: в логнете (x, is.sparse, ix, jx, y, веса, смещение,alpha, nobs,:
один полиномиальный или биномиальный класс имеет менее 8 наблюдений; опасное основание

3: опция сгруппирована = FALSE принудительно применяется в cv.glmnet, поскольку <3 наблюдения на каждый раз </p>

Это образец данных, которые я использую (только с 7 ко-вариациями):

> data
     Tumor     Probe_1     Probe_2    Probe_3      Probe_4    Probe_5    Probe_6     Probe_7
S_1     No -1.41509461 -3.92144111 -4.3319583 -4.894204000 -5.5379790  2.9031321  0.80587018
S_2     No -0.94584134 -2.77641045 -3.3560507 -2.211370963 -6.0006283  5.1775379  1.45389838
S_3     No -0.95188379 -3.47742475 -1.9058528 -3.019003727 -5.7203533  2.2121110  1.83080221
S_4     No -2.27462408 -3.83136845 -4.1285407 -1.691782991 -6.3683810  6.4500360  1.22882676
S_5     No -0.74983930 -2.51738976 -2.1747453 -2.279177452 -3.5778674  2.3518098  1.04400722
S_6     No -1.10189012 -3.12456412 -3.1800114 -2.567847449 -5.7474062  3.7589517  1.70868881
S_7    Yes  0.03970897 -1.98928788 -1.2119801 -0.686115233  1.0235521  0.3666321 -2.35612013
S_8    Yes  0.01597890 -1.20865821 -0.4579608 -1.192134064  1.4096178  2.4922013  0.40925359
S_9    Yes -0.27984931 -2.15706349 -2.4641827  0.047430187  1.6129360  0.5129123 -1.34833497
S_10   Yes  0.93021040 -1.97824406 -0.2918638  0.979103921 -2.5054538 -0.7654758 -2.48255982
S_11   Yes  0.83353713 -1.79506256 -2.0438707  0.460100440  0.9242979 -0.2319373 -1.51113570
S_12   Yes  0.18570649  0.05800963  0.2385482  0.433187887 -2.0097881  2.2284231  0.74761104
S_13   Yes  0.19232213 -0.95197653 -0.8496967 -0.105562938  1.0253468  0.6895510 -1.31659822
S_14   Yes  0.95731937 -1.53396032 -0.1456985  1.804472462 -3.3191177  0.2357909 -0.91231503
S_15   Yes  0.45860215 -1.36153814 -1.0998994 -0.003680416  2.0982345 -0.5042816 -1.07098039
S_16    No -0.02045748 -2.07952404 -1.5161549  1.095944357 -2.9224003  3.6426993  0.43034932
S_17    No  0.71109429 -1.19594432 -0.2472489 -0.333784895  0.7016542  0.1602559 -1.96375484
S_18    No  0.25009776 -0.98431835 -1.2113967 -0.062552222 -0.5772906  1.9909411  0.34956032
S_19    No  0.10396440 -1.43761294 -1.5490060 -0.900273908 -1.9889734  2.6280227  0.02848154
S_20    No -1.67179799 -0.69662635  0.3057564  0.497189699  1.8436791 -0.6753654 -1.74453932
S_21    No -0.33691459 -2.53752284 -2.7764968 -2.258180090  1.5861724  1.4335190  1.14224595
S_22    No -0.20888250 -3.32322098 -2.1782679  0.293379051 -5.8727867  2.3515395  1.89576377
S_23    No  0.48536983 -2.00023465 -0.8494739 -1.323411080 -6.1974792  0.2637433 -0.71707341
S_24    No  0.42733184 -2.23335363 -2.4388843  0.357150391 -2.8792254  0.4145872 -0.98182166

Столбец Tumor уже установлен как фактор:

> data$Tumor
 [1] No  No  No  No  No  No  Yes Yes Yes Yes Yes Yes Yes Yes Yes No  No  No  No  No  No  No  No  No 
Levels: No Yes

Подготовка данных и запуск функции glmnet():

b <- paste(colnames(data)[2:ncol(data)], collapse=" + ")
b <- as.formula(paste("~ ",b))

x <- model.matrix(b, data)

y <- data$Tumor

library("glmnet")
lasso_tumor <- glmnet(x, y, family="binomial", standardize=T, alpha=1, intercept = F)

Здесь нет ни сообщений об ошибках, ни предупреждений. Но если я сейчас запускаю cv.glmnet (), эти предупреждающие сообщения показываютup:

> cv.lasso_tumor <- cv.glmnet(x, y, family="binomial", standardize=T, alpha=1, nfolds=10, parallel=TRUE, intercept=F)
Warning messages:
1: In lognet(x, is.sparse, ix, jx, y, weights, offset, alpha, nobs,  :
  one multinomial or binomial class has fewer than 8  observations; dangerous ground
2: In lognet(x, is.sparse, ix, jx, y, weights, offset, alpha, nobs,  :
  one multinomial or binomial class has fewer than 8  observations; dangerous ground
3: Option grouped=FALSE enforced in cv.glmnet, since < 3 observations per fold

Я предполагаю, что Tumor слишком мало (n = 9) для запуска проверки, и потому чтошаг случайным образом разбивает группы, группа Tumor будет весьма ограничена. Имеет ли это хоть какой-то смысл? Я прочитал в этой теме , что это может быть проблемой, с которой можно справиться (комментарий @smci). Любая идея о том, как это можно сделать?

В качестве альтернативы, вы могли бы просто пропустить часть перекрестной проверки и перейти только с логитом с помощью лассо? В таком случае, что было бы разумным ограничением для лямбды, чтобы найти те гены (здесь называемые «пробами»), которые связаны с моей биномиальной классификацией?

Любая помощь очень ценится. Спасибо!

1 Ответ

1 голос
/ 08 октября 2019

Проблема в процедуре CV, как вы уже поняли. Может случиться, что в определенном фолде (оставленном для тестирования) может быть очень мало наблюдений определенного вида, что «опасно».

Вы можете попробовать выполнить стратифицированное CV (для этого есть аргумент)иначе, если вам просто не хватит наблюдений, то вы не сможете многое сделать. Вы можете попробовать уменьшить количество сгибов, скажем, с 10 до 5.

или LOOCV.

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