Генерация внутренних возрастных и половых Z-показателей - PullRequest
0 голосов
/ 24 июня 2019

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

data <- data.frame(
child_id = 1:1000,
sex = rbinom(n = 1000, size = 1, prob = 0.5),
height_5 = rnorm(1000, mean = 80, sd = 5),
height_6 = rnorm(1000, mean = 90, sd = 5),
height_7 = rnorm(1000, mean = 100, sd = 5),
age_5 = rnorm(1000, mean = 5.2, sd = 1.5),
age_6 = rnorm(1000, mean = 6.1, sd = 1.5),
age_7 = rnorm(1000, mean = 7.3, sd = 1.5)
)

data$sex <- factor(data$sex,
                 levels = c(0,1),
                 labels = c("Male", "Female"))

### Generate SOME MISSING VALUES -----
data$height_5[which(data$height_5 %in% sample(data$height_5, 25))] <- NA
data$height_6[which(data$height_6 %in% sample(data$height_6, 25))] <- NA
data$height_7[which(data$height_7 %in% sample(data$height_7, 25))] <- NA

Я могу генерировать zscores для каждого измерения следующим образом

data$ht5z <- scale(data$height_5, center = TRUE, scale = TRUE)
data$ht6z <- scale(data$height_6, center = TRUE, scale = TRUE)
data$ht7z <- scale(data$height_7, center = TRUE, scale = TRUE)

Как я могу сгенерировать их для каждого пола и года, например, htzm3, если пол = мужчина и возраст> = 3 и <4, htzm4, если пол = мужчина и возраст> = 4 и <5 и т. Д. </p>

1 Ответ

1 голос
/ 24 июня 2019

Как насчет этого:

library(dplyr)
library(stringr)
library(tidyr)

data %>% 
  gather(key, value, age_5, age_6, age_7, height_5, height_6, height_7) %>% 
  separate(key, c("key", "obs_time"), "_") %>% 
  spread(key, value) %>% 
  mutate(whole_age = floor(age)) %>% 
  group_by(sex, whole_age) %>% 
  mutate(htz = scale(height), 
         sex_init = str_to_lower(str_extract(sex, "^.")), 
         sa = paste0("htz", sex_init, whole_age)) %>% 
  ungroup() %>%
  spread(sa, htz)

Сначала мы хотели бы привести данные в аккуратный формат.

Для этого мы сначала собираем все столбцы вашего возраста и роста в два столбца: key и value. key затем принимает имя исходной переменной в качестве значения, value принимает значение в соответствующей переменной, а другие переменные копируются как есть. Данные теперь выглядят так:

# A tibble: 6,000 x 4
   child_id sex   key      value
      <int> <fct> <chr>    <dbl>
 1        1 Male  age_5     5.67
 2        1 Male  age_6     7.02
 3        1 Male  age_7     8.86
 4        1 Male  height_5 79.2 
 5        1 Male  height_6 95.8 
 6        1 Male  height_7 85.0 
 7        2 Male  age_5     3.38
 8        2 Male  age_6     5.06
 9        2 Male  age_7     5.47
10        2 Male  height_5 79.2 
# ... with 5,990 more rows

Во-вторых, мы разделяем столбец key на два столбца: key и obs_time, используя «_» в качестве разделителя. Данные теперь выглядят так:

# A tibble: 6,000 x 5
   child_id sex   key    obs_time value
      <int> <fct> <chr>  <chr>    <dbl>
 1        1 Male  age    5         5.67
 2        1 Male  age    6         7.02
 3        1 Male  age    7         8.86
 4        1 Male  height 5        79.2 
 5        1 Male  height 6        95.8 
 6        1 Male  height 7        85.0 
 7        2 Male  age    5         3.38
 8        2 Male  age    6         5.06
 9        2 Male  age    7         5.47
10        2 Male  height 5        79.2 
# ... with 5,990 more rows

В-третьих, мы разбили значения на две переменные: age и height. Данные теперь выглядят так:

# A tibble: 3,000 x 5
   child_id sex   obs_time   age height
      <int> <fct> <chr>    <dbl>  <dbl>
 1        1 Male  5         5.67   79.2
 2        1 Male  6         7.02   95.8
 3        1 Male  7         8.86   85.0
 4        2 Male  5         3.38   79.2
 5        2 Male  6         5.06   81.8
 6        2 Male  7         5.47  102. 
 7        3 Male  5         5.04   80.4
 8        3 Male  6         6.37   95.3
 9        3 Male  7         7.01   97.4
10        4 Male  5         6.25   90.8
# ... with 2,990 more rows

В-четвертых, до седьмого мы изменяем возрастную категорию whole_age, а затем группируем по sex и whole_age, чтобы при масштабировании он применялся отдельно для каждой из этих групп. Затем мы выполняем масштабирование в каждой группе, извлекаем первый инициал из sex и создаем имена переменных, соответствующие только что масштабированным значениям, в одном столбце с именем sa. Затем мы можем удалить группировку. Данные теперь выглядят так:

# A tibble: 3,000 x 9
   child_id sex   obs_time   age height whole_age     htz sex_init sa   
      <int> <fct> <chr>    <dbl>  <dbl>     <dbl>   <dbl> <chr>    <chr>
 1        1 Male  5         5.67   79.2         5 -0.967  m        htzm5
 2        1 Male  6         7.02   95.8         7  0.345  m        htzm7
 3        1 Male  7         8.86   85.0         8 -1.20   m        htzm8
 4        2 Male  5         3.38   79.2         3 -0.580  m        htzm3
 5        2 Male  6         5.06   81.8         5 -0.681  m        htzm5
 6        2 Male  7         5.47  102.          5  1.55   m        htzm5
 7        3 Male  5         5.04   80.4         5 -0.829  m        htzm5
 8        3 Male  6         6.37   95.3         6  0.455  m        htzm6
 9        3 Male  7         7.01   97.4         7  0.529  m        htzm7
10        4 Male  5         6.25   90.8         6 -0.0366 m        htzm6
# ... with 2,990 more rows

Наконец, мы можем распределить данные в запрошенные вами переменные. И теперь у нас есть:

# A tibble: 3,000 x 32
   child_id sex   obs_time   age height whole_age sex_init htzf0 htzf1 htzf10 htzf11 htzf2 htzf3
      <int> <fct> <chr>    <dbl>  <dbl>     <dbl> <chr>    <dbl> <dbl>  <dbl>  <dbl> <dbl> <dbl>
 1        1 Male  5         5.67   79.2         5 m           NA    NA     NA     NA    NA    NA
 2        1 Male  6         7.02   95.8         7 m           NA    NA     NA     NA    NA    NA
 3        1 Male  7         8.86   85.0         8 m           NA    NA     NA     NA    NA    NA
 4        2 Male  5         3.38   79.2         3 m           NA    NA     NA     NA    NA    NA
 5        2 Male  6         5.06   81.8         5 m           NA    NA     NA     NA    NA    NA
 6        2 Male  7         5.47  102.          5 m           NA    NA     NA     NA    NA    NA
 7        3 Male  5         5.04   80.4         5 m           NA    NA     NA     NA    NA    NA
 8        3 Male  6         6.37   95.3         6 m           NA    NA     NA     NA    NA    NA
 9        3 Male  7         7.01   97.4         7 m           NA    NA     NA     NA    NA    NA
10        4 Male  5         6.25   90.8         6 m           NA    NA     NA     NA    NA    NA
# ... with 2,990 more rows, and 19 more variables: htzf4 <dbl>, htzf5 <dbl>, htzf6 <dbl>,
#   htzf7 <dbl>, htzf8 <dbl>, htzf9 <dbl>, htzm0 <dbl>, htzm1 <dbl>, htzm10 <dbl>, htzm11 <dbl>,
#   htzm12 <dbl>, htzm2 <dbl>, htzm3 <dbl>, htzm4 <dbl>, htzm5 <dbl>, htzm6 <dbl>, htzm7 <dbl>,
#   htzm8 <dbl>, htzm9 <dbl>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...