coxph: **Ошибка в if (any(infs)) warning(paste(Loglik сходится перед переменной,: отсутствует значение там, где требуется TRUE/FALSE**

Я решаю проблему мультисенсорной атрибуции, используя функцию coxph(). Это большой набор данных с примерно 1 миллионом данных, но в настоящее время я использую подмножество из ~ 100000. Я удалил все недостающие значения из моих данных. я получаю сообщение об ошибке

Error in if (any(infs)) warning(paste("Loglik converged before variable ", 
 :missing value where TRUE/FALSE needed

Вот функция Кокса:

SurvObj <- Surv(Final_Data$NormalizedStartTime,Final_Data$NormalizedEndTime,event = Final_Data$Converted)

model2 <- coxph(SurvObj ~  Clicks + RFR + Impressions + Other + `Site-ID` + `Creative-ID`, data = Final_Data1)

Заранее спасибо за помощь :) Ошибка и сводка Final_Data


person Anuj Sao    schedule 19.10.2016    source источник
comment
Вам лучше построить Surv-объект внутри формулы. При его построении теряется связь с объектом Final_Data во время последней обработки. Также опасна практика оставлять тире (знаки минус) внутри имен переменных. Гораздо лучше использовать точки или символы подчеркивания, чтобы вам не приходилось заключать формулы в кавычки.   -  person IRTFM    schedule 23.11.2016


Ответы (2)


Строка выше, "Loglik" и так далее, предназначена для предоставления информации о сомнительном тесте, в котором loglik заранее сходится. Полная строка, если она создана правильно, должна выглядеть примерно так:

«Логлик сошелся перед переменной 100; бета может быть бесконечной».

И это создается следующим кодом в agreg.Rnw https://r-forge.r-project.org/scm/viewvc.php/pkg/survival/noweb/agreg.Rnw?diff_format=c&sortdir=down&sortby=author&revision=11529&root=survival&view=markup

if (any(infs))
        warning(paste("Loglik converged before variable ",
                      paste((1:nvar)[infs],collapse=","),
                  "; beta may be infinite. "))

Отсюда мы можем видеть, что any() ожидает, что infs будет числом. Если infs имеет значение NaN, функция не будет работать.

Внутренняя часть работает следующим образом:

paste("Loglik converged before variable ",
                      paste((1:1)[NaN],collapse=","),
                  "; beta may be infinite. ")
[1] "Loglik converged before variable  NA ; beta may be infinite. "

поэтому эта часть функции будет работать, если она сможет добраться до внутренней части. Но это не так, поскольку оценка

infs <- NaN
if (any(infs))
warning(paste("Loglik converged before variable ",
                      paste((1:nvar)[infs],collapse=","),
                  "; beta may be infinite. "))

Error in if (any(infs)) warning(paste("Loglik converged before variable ",  : 
missing value where TRUE/FALSE needed

точная ошибка у вас была. Переменная infs генерируется раньше через infs ‹-abs(agfit$u %*% var). И agfit создается через .Call(Cagfit4.....), поэтому проблема заключается в базовом коде C для функции.

Для некоторых моих данных и agfit$u, и agfit$imat являются NaN. $u и $imat генерируются из

u2 =    SET_VECTOR_ELT(rlist, 1, allocVector(REALSXP, nvar));
u = REAL(u2);

а также

PROTECT(imat2 = allocVector(REALSXP, nvar*nvar));
nprotect =1;
if (NAMED(covar2)>0) {
    PROTECT(covar2 = duplicate(covar2)); 
    nprotect++;
    }
covar= dmatrix(REAL(covar2), nused, nvar);
imat = dmatrix(REAL(imat2),  nvar, nvar);

соответственно, в коде agfit4 C. Я не так хорош в C, поэтому я не могу сказать, в чем проблема в области кода C. Это может быть ошибка, или функция Кокса не может использоваться для ваших данных, или и то, и другое. Тем не менее, с этим нужно что-то делать, так как я видел, как другие тоже спрашивали об этой ошибке. Но, к сожалению, я недостаточно опытен, чтобы исправить это, я могу только указать на проблему и крикнуть: "Эй! Кто-нибудь еще, пожалуйста, позаботьтесь об этом" :-).

Мои возможные решения:

1) проверьте, можно ли вообще использовать ваши данные с функцией Кокса (например, если у вас есть 2000 случаев 0 и 2 случая 1, функция Кокса может в любом случае не подходить, и ошибка предлагает вам найти другой способ анализа :-))

2) изменить код для выполнения оценки any(infs), удалив NA, что приведет к FALSE и пропуску ошибки следующим образом: if (any(infs, na.rm=T)) (может испортить код, хотя )

3) исправить код C, чтобы agfit4 не выдавал NaN в выходном объекте. (только для опытных, не я)

person Mi-Go    schedule 08.03.2017
comment
Как изменить код, чтобы выполнить оценку, удалив NA? Мои данные можно использовать с функцией Кокса, но я все еще получаю эту ошибку. - person Aashay Mehta; 24.01.2020

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

person Iyar Lin    schedule 17.01.2018
comment
что вы имеете в виду, когда говорите, что переменные имеют бесконечные значения? В настоящее время я сталкиваюсь с этой же проблемой, но не могу найти решение. - person Aashay Mehta; 24.01.2020
comment
Это означает, что одна из переменных-предикторов имеет один (или несколько) элементов, принимающих бесконечное значение. Это может произойти, например, когда в процессе вычисления этой переменной один из элементов был разделен на 0 - person Iyar Lin; 26.01.2020