coxph() X матрица, которая считается сингулярной;

У меня проблемы с использованием coxph(). Я имею две категориальные переменные: "tecnologia" и "pais", и я хочу оценить возможный эффект взаимодействия "pais" на "tecnologia". "Tecnologia" - это переменный фактор с двумя уровнями: gps и convencional. И "pais" как 2 уровня: PT и ES. Я не знаю, почему это предупреждение продолжает появляться. Здесь код и вывод:

cox_AC<-coxph(Surv(dados_temp$dias_seg,dados_temp$status)~tecnologia*pais,data=dados_temp)
Warning message:
In coxph(Surv(dados_temp$dias_seg, dados_temp$status) ~ tecnologia *  :
  X matrix deemed to be singular; variable 3

> cox_AC
Call:
coxph(formula = Surv(dados_temp$dias_seg, dados_temp$status) ~ 
    tecnologia * pais, data = dados_temp)


                       coef exp(coef) se(coef)     z     p
tecnologiagps        -0.152     0.859    0.400 -0.38 7e-01
paisPT                1.469     4.345    0.406  3.62 3e-04
tecnologiagps:paisPT     NA        NA    0.000    NA    NA

Likelihood ratio test=23.8  on 2 df, p=6.82e-06  n= 127, number of events= 64 

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

Может кто-нибудь мне помочь? спасибо

ОБНОВЛЕНИЕ: проблема не кажется идеальной классификацией

> xtabs(~status+tecnologia,data=dados)  

      tecnologia
status conv doppler gps  
     0   39       6  24  
     1   30       3  34 

> xtabs(~status+pais,data=dados)  

      pais  
status ES PT  
     0 71  8  
     1 49 28  
 > xtabs(~tecnologia+pais,data=dados)

          pais  
tecnologia ES PT
   conv    69  0
   doppler  1  8
   gps     30 28

Ответ 1

Вот простой пример, который, кажется, воспроизводит вашу проблему:

> library(survival)
> (df1 <- data.frame(t1=seq(1:6),
                    s1=rep(c(0, 1), 3),
                    te1=c(rep(0, 3), rep(1, 3)),
                    pa1=c(0,0,1,0,0,0)
                    ))
   t1 s1 te1 pa1
 1  1  0   0   0
 2  2  1   0   0
 3  3  0   0   1
 4  4  1   1   0
 5  5  0   1   0
 6  6  1   1   0

> (coxph(Surv(t1, s1) ~ te1*pa1, data=df1))
Call:
coxph(formula = Surv(t1, s1) ~ te1 * pa1, data = df1)


        coef exp(coef) se(coef)         z  p
te1      -23  9.84e-11    58208 -0.000396  1
pa1      -23  9.84e-11   100819 -0.000229  1
te1:pa1   NA        NA        0        NA NA

Теперь давайте посмотрим на "совершенную классификацию" следующим образом:

> (xtabs( ~ s1+te1, data=df1))
   te1
s1  0 1
  0 2 1
  1 1 2
> (xtabs( ~ s1+pa1, data=df1))
   pa1
s1  0 1
  0 2 1
  1 3 0

Обратите внимание, что значение 1 для pa1 точно предсказывает наличие статуса s1 равного 0. То есть, основываясь на ваших данных, если вы знаете, что pa1==1 то вы можете быть уверены, что s1==0. Таким образом, установка модели Cox не подходит в этой настройке и приведет к числовым ошибкам. Это можно увидеть с помощью

> coxph(Surv(t1, s1) ~ pa1, data=df1)

дающий

Warning message:
In fitter(X, Y, strats, offset, init, control, weights = weights,  :
  Loglik converged before variable  1 ; beta may be infinite. 

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

Если df1 добавить термин взаимодействия в df1 следующим образом:

> (df1 <- within(df1,
+               te1pa1 <- te1*pa1))
  t1 s1 te1 pa1 te1pa1
1  1  0   0   0      0
2  2  1   0   0      0
3  3  0   0   1      0
4  4  1   1   0      0
5  5  0   1   0      0
6  6  1   1   0      0

Затем проверьте это с помощью

> (xtabs( ~ s1+te1pa1, data=df1))
   te1pa1
s1  0
  0 3
  1 3

Мы видим, что это бесполезный классификатор, то есть он не позволяет прогнозировать статус s1.

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

Редактировать @JMarcelino: если вы посмотрите на предупреждающее сообщение из первой модели coxph в этом примере, вы увидите предупреждающее сообщение:

2: In coxph(Surv(t1, s1) ~ te1 * pa1, data = df1) :
  X matrix deemed to be singular; variable 3

Скорее всего, та же ошибка, которую вы получаете, и вызвана этой проблемой классификации. Кроме того, ваш третий кросс-таблицы xtabs(~ tecnologia+pais, data=dados) не так важен, как таблица status по времени interaction term. Вы можете сначала добавить термин взаимодействия вручную, как в приведенном выше примере, а затем проверить кросс-таблицу. Или вы могли бы сказать:

> with(df1,
       table(s1, pa1te1=pa1*te1))
   pa1te1
s1  0
  0 3
  1 3

Тем не менее, я заметил, что одна из ячеек в вашей третьей таблице имеет нуль (conv, PT), что означает, что у вас нет наблюдений с этой комбинацией предикторов. Это вызовет проблемы при попытке соответствовать.

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

Изменить 2 @user75782131 Да, вообще говоря, xtabs или аналогичная кросс-таблица должны выполняться в моделях, где результат и предикаты являются дискретными, т. xtabs Имеют ограниченный номер. уровней. Если присутствует "совершенная классификация", то предсказательная модель/регрессия может оказаться неприемлемой. Это справедливо, например, для логистической регрессии (результат двоичный), а также модели Кокса.