Изменить форму на основе подкласса по отношению к 2 сопоставленным когортам, затем выполнить последовательные тесты McNemar

#r #match #reshape #chi-squared

#r #совпадение #изменить форму #хи-квадрат

Вопрос:

Я хочу

  • измените форму моих сопоставленных данных (MR против MS), чтобы они были такими, как показано на прилагаемом скриншоте; в основном с теми же заголовками столбцов, но с добавлением «.1», который относится ко 2-му набору (MS). Это результат сопоставления 2 когорт после того, как я отсортировал их, чтобы получить совпадающие пары (в столбце с именем subclass ), чтобы после этого я мог выполнить тест McNemar.
  • напишите функцию для выполнения теста McNemar для последовательных похожих групп, например Gender , vs Gender.1 , Smoking_2gps vs Smoking_2gps.1 , Diabetes1.0 vs Diabetes1.0.1 . и т. Д. В группе MR по сравнению с группой MS

Набор данных здесь (показан лист 1 для вертикального формата и лист 2 для горизонтального необходимого формата).

Я думаю о изменении формы на основе подкласса по отношению к 2 сопоставленным когортам MS против MR в Status.of.Mitral.Valve переменной

введите описание изображения здесь

В качестве поправки

Когда я попытался использовать mcnemar , я получил list() . Вот str(df ** Примечание: * wide набор данных — это тот, который имеет горизонтальный формат, который нам нужно сделать mcnemar на его основе.

 > str(df)
'data.frame':   124 obs. of  17 variables:
 $ Serial.ID                          : int  39 862 458 581 869 774 888 83 433 655 ...
 $ Status.of.Mitral.Valve             : chr  "MR" "MR" "MR" "MR" ...
 $ Age                                : int  65 60 56 33 50 75 56 79 42 46 ...
 $ Gender                             : Factor w/ 2 levels "female","male": 2 2 2 2 2 2 2 2 2 2 ...
 $ Smoking_2gps                       : int  1 0 0 0 0 1 0 1 0 0 ...
 $ COPD                               : Factor w/ 2 levels "no","yes": 1 1 1 1 1 1 1 1 1 1 ...
 $ Diabetes1.0                        : int  0 0 0 0 0 0 0 1 0 0 ...
 $ Urgent.emergent_procedure          : Factor w/ 2 levels "elective","Urgent/emergent procedure": 1 1 1 1 2 1 1 1 1 1 ...
 $ MAE                                : Factor w/ 2 levels "no","yes": 1 1 1 1 1 1 1 1 1 1 ...
 $ Postop.Deep.Sternal.Wound.Infection: Factor w/ 1 level "no": 1 1 1 1 1 1 1 1 1 1 ...
 $ Myocardial.Infarction              : Factor w/ 1 level "no": 1 1 1 1 1 1 1 1 1 1 ...
 $ postop.newDialysis                 : Factor w/ 2 levels "no","yes": 1 1 1 1 1 1 1 1 1 1 ...
 $ Takeback.for.Bleeding              : Factor w/ 2 levels "no","yes": 1 1 1 1 1 1 1 1 1 1 ...
 $ Discharge.Status                   : Factor w/ 1 level "alive": 1 1 1 1 1 1 1 1 1 1 ...
 $ distance                           : num  0.021 0.339 0.193 0.206 0.105 ...
 $ weights                            : int  1 1 1 1 1 1 1 1 1 1 ...
 $ subclass                           : int  1 2 3 6 7 9 10 11 12 13 ...
  

Комментарии:

1. проверьте редактирование.

Ответ №1:

Метод, который я использую, заключается в разделении data.frame, затем cbind его повторном редактировании, а затем изменении colnames

 df <- df[nzchar(df$Status.of.Mitral.Valve), ]
wide <- do.call(cbind, split(df, df$Status.of.Mitral.Valve))
# run install.packages("stringr") if you don't have stringr installed
colnames(wide) <- stringr::str_replace_all(colnames(wide), c("^MS\.(. )$"="\1.1", "^MR\."=""))
  

И тогда мы можем lapply все переменные, которые имеют символьный тип, ввести в тест Макнемара:

 sapply(colnames(df)[sapply(df, is.factor)], function(x){
 tib <- table(wide[paste0(x, c("",".1"))])
 if(any(dim(tib)<2)) NULL else mcnemar.test(tib)$p.value 
}) -> lst

lst <- lst[!sapply(lst, is.null)] 
data.frame(vars=names(lst) , p.value=unlist(lst, use.names=F))
  

Это дает желаемый результат:

                        vars p.value
1                    Gender       1
2                      COPD       1
3 Urgent.emergent_procedure       1
4                       MAE       1
  

Комментарии:

1. Большое спасибо за ваш вклад. Я попробовал ваш код и получил эту ошибку df <- df[nzchar(df$Status.of.Mitral.Valve)] ‘Ошибка в [.data.frame (df, nzchar (df $Status.of.Mitral.Valve)): ‘nzchar()’ требуется вектор символов’ затем после преобразования его в символ df$Status.of.Mitral.Valve<-as.character((df$Status.of.Mitral.Valve)) df <- df[nzchar(df$Status.of.Mitral.Valve)] ‘Ошибка в [.data.frame (df, nzchar (df $ Status.of.Mitral.Valve.Valve)): выбраны неопределенные столбцы ‘ . Пожалуйста, посоветуйте мне.

2. @MohamedRahouma Я отредактировал ответ после вашего редактирования, и нет, мы должны это сделать, df потому что я использую его для получения qualitative переменных для lapply

3. @MohamedRahouma просто измените значение lapply на sapply , я отредактировал ответ

4. @MohamedRahouma Это дает правильный результат см. Мой обновленный ответ

5. @MohamedRahouma извините, что я забыл отредактировать sapply , проверьте редактирование