Как деагрегировать данные о биномиальных ответах от лиц с одинаковыми ковариатами по Бернулли и наоборот? - PullRequest
3 голосов
/ 30 июня 2019

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

Ниже я представляю результаты моих попыток. Он успешно реплицирует строки с соответствующими ковариатами, но еще не генерирует двоичную переменную. Любая помощь приветствуется.

# Структура входных биномиальных данных #

DT<-tibble::tibble(Successes = c(2,3,3), Trials=c(3,4,5), X1=c("Yes", "No", "Yes"), X2=c(10.7, 11.3, 9.9))
# A tibble: 3 x 4
  Successes Trials X1       X2
      <dbl>  <dbl> <chr> <dbl>
         2      3 Yes    10.7
         3      4 No     11.3
         3      5 Yes     9.9

# Мои попытки до сих пор #

DT.expanded <- DT[rep(seq(nrow(DT)), DT$Trials), ]

DT.expanded
# A tibble: 12 x 4
   Successes Trials X1       X2
       <dbl>  <dbl> <chr> <dbl>
          2      3 Yes    10.7
          2      3 Yes    10.7
          2      3 Yes    10.7
          3      4 No     11.3
          3      4 No     11.3
          3      4 No     11.3
          3      4 No     11.3
          3      5 Yes     9.9
          3      5 Yes     9.9
          3      5 Yes     9.9
          3      5 Yes     9.9
          3      5 Yes     9.9

# Ожидаемая структура выходных двоичных данных #

# A tibble: 12 x 4
    Success   X1       X2
       <chr>  <chr> <dbl>
         1    Yes    10.7
         1    Yes    10.7
         0    Yes    10.7
         1    No     11.3
         1    No     11.3
         1    No     11.3
         0    No     11.3
         1    Yes     9.9
         1    Yes     9.9
         1    Yes     9.9
         0    Yes     9.9
         0    Yes     9.9

Заранее спасибо за любую помощь.

Ответы [ 2 ]

2 голосов
/ 30 июня 2019

Для такого рода расширения я считаю, что проще всего создать столбец списка, где элемент списка для каждой строки представляет собой двоичный вектор для этой строки, который можно создать с помощью c и rep для соответствующего числа.0 и 1.Получив столбец списка, вы можете расширить фрейм данных до нужного размера.Например,

library(tidyverse)

df <- tibble(
    Successes = c(2,3,3), 
    Trials = c(3,4,5), 
    X1 = c("Yes", "No", "Yes"), 
    X2 = c(10.7, 11.3, 9.9)
)

df <- df %>% mutate(binary = map2(Successes, Trials, 
                                  ~ c(rep(1, .x), 
                                      rep(0, .y - .x))))
df
#> # A tibble: 3 x 5
#>   Successes Trials X1       X2 binary   
#>       <dbl>  <dbl> <chr> <dbl> <list>   
#> 1         2      3 Yes    10.7 <dbl [3]>
#> 2         3      4 No     11.3 <dbl [4]>
#> 3         3      5 Yes     9.9 <dbl [5]>

df2 <- df %>% unnest()
df2
#> # A tibble: 12 x 5
#>    Successes Trials X1       X2 binary
#>        <dbl>  <dbl> <chr> <dbl>  <dbl>
#>  1         2      3 Yes    10.7      1
#>  2         2      3 Yes    10.7      1
#>  3         2      3 Yes    10.7      0
#>  4         3      4 No     11.3      1
#>  5         3      4 No     11.3      1
#>  6         3      4 No     11.3      1
#>  7         3      4 No     11.3      0
#>  8         3      5 Yes     9.9      1
#>  9         3      5 Yes     9.9      1
#> 10         3      5 Yes     9.9      1
#> 11         3      5 Yes     9.9      0
#> 12         3      5 Yes     9.9      0
1 голос
/ 01 июля 2019

Подход с использованием data.table и replace:

library(data.table)
setDT(DT)
DT[, .(Success=replace(rep(0L, Trials), seq_len(Successes), 1L), 
       X1, X2), 
    by=seq_len(DT[,.N])][, -1L]

выход:

    Success  X1   X2
 1:       1 Yes 10.7
 2:       1 Yes 10.7
 3:       0 Yes 10.7
 4:       1  No 11.3
 5:       1  No 11.3
 6:       1  No 11.3
 7:       0  No 11.3
 8:       1 Yes  9.9
 9:       1 Yes  9.9
10:       1 Yes  9.9
11:       0 Yes  9.9
12:       0 Yes  9.9
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...