Как вычислить сводку по группе с помощью dplyr с функцией, которая принимает матрицу в качестве аргумента - PullRequest
1 голос
/ 10 ноября 2019

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

Мне удалось создатьфункция для получения 3-х вычислений (оценка, нижняя и верхняя граница) для каждой пары за один шаг, но я изо всех сил пытаюсь создать одно, позволяющее мне группировать результаты по дополнительным переменным.

Потому что мне нужно построить графикрезультаты, я хотел бы в конечном итоге вывод данных.

Для простоты я сделал игрушечный пример 8 переменных в кадре данных с именем dfSO

dput(dfSO)  
structure(list(qordi1T = structure(c(5L, 4L, 4L, 5L, 5L, 5L, 
5L, 5L, 4L, 5L, 5L, 4L, 2L, 5L, 5L, 3L), .Label = c("Je n'ai pas de médecin de médecin généraliste attitré", 
"Moins d'un an", "1 à 2 ans", "2 à 5 ans", "Plus de 5 ans"), class = c("ordered", 
"factor")), qordi2T = structure(c(3L, 3L, 2L, 4L, 4L, 4L, 1L, 
2L, 1L, 3L, 4L, 5L, 3L, 3L, 5L, 2L), .Label = c("Mauvaise", "Passable", 
"Bonne", "Très bonne", "Excellente"), class = c("ordered", "factor"
)), qnum1T = c(70L, 90L, 90L, 100L, 100L, 70L, 80L, 100L, 50L, 
40L, 100L, 100L, 75L, 75L, 95L, 40L), qnum2T = c(100L, 85L, 100L, 
100L, 100L, 100L, 100L, 85L, 100L, 70L, 100L, 100L, 95L, 75L, 
100L, 80L), qnomi1T = structure(c(2L, 2L, 2L, 1L, 1L, 1L, 2L, 
2L, 2L, 1L, 1L, 2L, 1L, 1L, 1L, 2L), .Label = c("Oui", "Non"), class = "factor"), 
    qnomi2T = structure(c(1L, 2L, 2L, 1L, 2L, 1L, 2L, 2L, 2L, 
    2L, 1L, 1L, 1L, 2L, 1L, 2L), .Label = c("Oui", "Non"), class = "factor"), 
    proT = structure(c(7L, 7L, 5L, 7L, 5L, 7L, 4L, 7L, 1L, 6L, 
    7L, 1L, 1L, 5L, 4L, 5L), .Label = c("Agriculteur exploitant", 
    "Artisan, commerçant, chef d'entreprise", "Cadre ou profession intellectuelle supérieure :- Profession libérale et assimilée- Cadre de la fonction publique- Profession intellectuelle et artistique- Cadre d'entreprise et ingénieur", 
    "Employé :- de la fonction publique- administratif d'entreprise- de commerce- Personnel de services directs aux particuliers", 
    "Ouvrier :- qualifié de type industriel, artisanal, de la manutention, du magasinage et du transport, chauffeurs- non qualifié de type industriel et artisanal- agricole", 
    "Profession intermédiaire :- de l'enseignement, de la santé, de la fonction publique et assimilés- administrative et commerciales des entreprises- Technicien- Contremaître, agent de maîtrise", 
    "N/A"), class = "factor"), sexT = structure(c(1L, 1L, 1L, 
    2L, 2L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 1L, 1L, 1L, 1L), .Label = c("Femme", 
    "Homme"), class = "factor"), qordi1RT = structure(c(5L, 3L, 
    4L, 5L, 5L, 5L, 5L, 5L, 4L, 4L, 5L, 4L, 2L, 5L, 5L, 2L), .Label = c("Je n'ai pas de médecin de médecin généraliste attitré", 
    "Moins d'un an", "1 à 2 ans", "2 à 5 ans", "Plus de 5 ans"
    ), class = c("ordered", "factor")), qordi2RT = structure(c(3L, 
    4L, 1L, 4L, 4L, 5L, 2L, 2L, 2L, 3L, 4L, 5L, 3L, 3L, 5L, 2L
    ), .Label = c("Mauvaise", "Passable", "Bonne", "Très bonne", 
    "Excellente"), class = c("ordered", "factor")), qnum1RT = c(67L, 
    87L, 88L, 100L, 94L, 79L, 100L, 100L, 50L, 55L, 100L, 99L, 
    88L, 70L, 89L, 18L), qnum2RT = c(98L, 89L, 99L, 100L, 81L, 
    100L, 100L, 100L, 100L, 77L, 63L, 99L, 98L, 71L, 100L, 100L
    ), qnomi1RT = structure(c(2L, 2L, 2L, 2L, 1L, 1L, 2L, 2L, 
    2L, 1L, 1L, 2L, 2L, 1L, 1L, 2L), .Label = c("Oui", "Non"), class = "factor"), 
    qnomi2RT = structure(c(1L, 2L, 2L, 1L, 2L, 1L, 2L, 2L, 1L, 
    2L, 1L, 1L, 1L, 2L, 2L, 2L), .Label = c("Oui", "Non"), class = "factor"), 
    proRT = structure(c(7L, 7L, 5L, 4L, 7L, 7L, 4L, 7L, 1L, 6L, 
    4L, 1L, 1L, 5L, 4L, 7L), .Label = c("Agriculteur exploitant", 
    "Artisan, commerçant, chef d'entreprise", "Cadre ou profession intellectuelle supérieure :- Profession libérale et assimilée- Cadre de la fonction publique- Profession intellectuelle et artistique- Cadre d'entreprise et ingénieur", 
    "Employé :- de la fonction publique- administratif d'entreprise- de commerce- Personnel de services directs aux particuliers", 
    "Ouvrier :- qualifié de type industriel, artisanal, de la manutention, du magasinage et du transport, chauffeurs- non qualifié de type industriel et artisanal- agricole", 
    "Profession intermédiaire :- de l'enseignement, de la santé, de la fonction publique et assimilés- administrative et commerciales des entreprises- Technicien- Contremaître, agent de maîtrise", 
    "N/A"), class = "factor"), sexRT = structure(c(1L, 1L, 1L, 
    2L, 2L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 1L, 1L, 1L, 1L), .Label = c("Femme", 
    "Homme"), class = "factor")), row.names = c(NA, -16L), class = "data.frame")

Есть 2 порядковых переменных, 4 номинальных и 2 числовых, каждая из которых измеряется при тестировании (T)и повторите тестирование (RT)

> str(dfSO)
'data.frame':   16 obs. of  16 variables:
 $ qordi1T : Ord.factor w/ 5 levels "Je n'ai pas de médecin de médecin généraliste attitré"<..: 5 4 4 5 5 5 5 5 4 5 ...
 $ qordi2T : Ord.factor w/ 5 levels "Mauvaise"<"Passable"<..: 3 3 2 4 4 4 1 2 1 3 ...
 $ qnum1T  : int  70 90 90 100 100 70 80 100 50 40 ...
 $ qnum2T  : int  100 85 100 100 100 100 100 85 100 70 ...
 $ qnomi1T : Factor w/ 2 levels "Oui","Non": 2 2 2 1 1 1 2 2 2 1 ...
 $ qnomi2T : Factor w/ 2 levels "Oui","Non": 1 2 2 1 2 1 2 2 2 2 ...
 $ proT    : Factor w/ 7 levels "Agriculteur exploitant",..: 7 7 5 7 5 7 4 7 1 6 ...
 $ sexT    : Factor w/ 2 levels "Femme","Homme": 1 1 1 2 2 1 1 1 1 2 ...
 $ qordi1RT: Ord.factor w/ 5 levels "Je n'ai pas de médecin de médecin généraliste attitré"<..: 5 3 4 5 5 5 5 5 4 4 ...
 $ qordi2RT: Ord.factor w/ 5 levels "Mauvaise"<"Passable"<..: 3 4 1 4 4 5 2 2 2 3 ...
 $ qnum1RT : int  67 87 88 100 94 79 100 100 50 55 ...
 $ qnum2RT : int  98 89 99 100 81 100 100 100 100 77 ...
 $ qnomi1RT: Factor w/ 2 levels "Oui","Non": 2 2 2 2 1 1 2 2 2 1 ...
 $ qnomi2RT: Factor w/ 2 levels "Oui","Non": 1 2 2 1 2 1 2 2 1 2 ...
 $ proRT   : Factor w/ 7 levels "Agriculteur exploitant",..: 7 7 5 4 7 7 4 7 1 6 ...
 $ sexRT   : Factor w/ 2 levels "Femme","Homme": 1 1 1 2 2 1 1 1 1 2 ...

Чтобы вычислить статистику соответствия по качественной переменной, функция rel :: gac принимает в качестве входных данных матрицу с n субъектами идва наблюдения (матрица n * 2)

Я сделал следующую функцию для извлечения оценок Gwet AC2 (квадратичного пондерения) и его начальной загрузки CI для упорядоченных переменных

library("rel")
library("boot")

ordiTF <- sapply(dfSO[, 1:8], is.ordered)
ordi <- which(ordiTF == TRUE)

g <- function(data, x)
  gac(data[x, c(1, 2)], weight = "quadratic", conf.level = 1-(0.05/8))[[5]]

offset <- 8
B <- 500  
item <- c()
est <- c()
lci <- c()
uci <- c()
for (i in ordi) {
  item <- c(item, i)
  est <- c(est, gac(data = dfSO[ , c(i, i + offset)], weight = "quadratic", conf.level = 1-(0.05/8))[[5]])
  b <- boot(dfSO[ ,c(i, i + offset)], g, B)
  lci <- c(lci, boot.ci(b, type = "bca")$bca[4])
  uci <- c(uci, boot.ci(b, type = "bca")$bca[5])
}
data.frame(item = item, est = est, lci = lci, uci = uci)

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

Например, если я хочу вычислить AC2 между ordi1 при тестировании и повторно протестировать по полу с помощью dplyr , я больше не знаю, как задать эти переменные. Я пробовал разные варианты, среди которых:

dfSO %>% 
  group_by(sexT) %>% 
  select(sexT, qordi1T, qordi1RT) %$%
  gac(as.matrix(qordi1T, qordi1RT), weight = "quadratic")[[5]]

Но ни один из них не справился с работой

Поскольку я не являюсь носителем английского языка, мое первое ограничение при ответе на этот вопрос - моя трудность в Googleэто, и я знаю, что этот вопрос, возможно, уже задавался, но если так, я не смог найти его.

Спасибо за ваше время и вашу помощь

Следуя @ 42 замечаниям, я сделал несколько правок

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

  1. Ошибка вывода

Вот вывод ошибки яполучено

    > dfSO %>% 
    +     group_by(sexT) %>% 
    +     select(sexT, qordi1T, qordi1RT) %$%
    +     gac(as.matrix(qordi1T, qordi1RT), weight = "quadratic")[[5]]

    Error in gac(as.matrix(qordi1T, qordi1RT), weight = "quadratic") : 
      The data frame needs to be formatted as a n*2 matrix!
Я сделал неправильную копию-вставку в своем исходном коде, копируя отчаянную попытку использовать % $% вместо %>% (это то, что я имел в виду, говоря «ни один изони сделали свою работу "). Это должно было быть
    dfSO %>% 
        group_by(sexT) %>% 
        select(sexT, qordi1T, qordi1RT) %>%
        gac(as.matrix(qordi1T, qordi1RT), weight = "quadratic")

с той же ошибкой

    Error in gac(., as.matrix(qordi1T, qordi1RT), weight = "quadratic") : 
      The data frame needs to be formatted as a n*2 matrix!

Обратите внимание, что цитирование в gac () не подавляет ошибку

    dfSO %>% 
        group_by(sexT) %>% 
        select(sexT, qordi1T, qordi1RT) %>%
        gac(as.matrix('qordi1T', 'qordi1RT'), weight = "quadratic")

Error in gac(., as.matrix("qordi1T", "qordi1RT"), weight = "quadratic") : 
  The data frame needs to be formatted as a n*2 matrix!
Пока все идет поиск без группировки
    dfSO %>%
        select(qordi1T, qordi1RT) %>%
        gac(as.matrix('qordi1T', 'qordi1RT'), weight = "quadratic")
    Call:
    gac(data = ., kat = as.matrix("qordi1T", "qordi1RT"), weight = "quadratic")

          Estimate   StdErr  LowerCB UpperCB
    Const 0.860780 0.097708 0.652520   1.069

    Confidence level = 95%
    Sample size = 16
Наконец, использование magrittr :: extract2 () позволяет извлечь оценку (замените [[5]] часть функции g )
    dfSO %>% 
      select(qordi1T, qordi1RT) %>%
      gac(as.matrix('qordi1T', 'qordi1RT'), weight = "quadratic") %>% 
      extract2('est')
        Const 
    0.8607799

Теперь вернемся к моей проблеме с группировкой. Поскольку я группирую по третьей переменной, я не могу вычислить коэффициент для каждого его уровня (см. Правку № 2). Я считаю, что проблема заключается в том, что gac () принимает в качестве входных данных матрицу, а не фрейм данных.

В идеале, я хотел бы получить фрейм данных, подобный этому

    > AC2_ordi_bySexT
      item  SexT       AC2    AC2_lci   AC2_uci
    1    1 Homme 0.6551724  0.4182536 0.9832149
    2    2 Homme 1.0000000 -0.4163015 0.9023788
    3    1 Femme 0.8734663  0.5308729 0.9780148
    4    2 Femme 0.4605954 -0.3208255 0.9073359

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

Наконец, я отредактировал свой титульный вопрос. Я надеюсь, что теперь он лучше соответствует своему содержанию.

...