R — подбор модели для каждого субъекта с использованием data.table или dplyr

У меня есть набор наблюдений по многим предметам, и я хотел бы подобрать модель для каждого предмета.

Я использую пакеты data.table и fitdistrplus, но могу также попробовать использовать dlpyr.

Скажем, мои данные имеют следующую форму:

#subject_id #observation
1           35
1           38
2           44
2           49

Вот что я пробовал до сих пор:

 subject_models <- dt[,fitdist(observation, "norm", method = "mme"), by=subject_id]

Я думаю, что это вызывает ошибку, потому что вызов fitdist возвращает объект fitdist, который невозможно сохранить в таблице данных/фрейме данных.

Есть ли интуитивно понятный способ сделать это с помощью data.table или dplyr?

EDIT: Был предоставлен ответ dplyr, но я также был бы признателен за data.table, я попытаюсь провести некоторые тесты против двух.


person Bar    schedule 06.07.2016    source источник
comment
Вставьте модель в столбец списка, пока вы не сможете упростить ее. Вот видео о том, как сделать это в tidyverse.   -  person alistaire    schedule 06.07.2016


Ответы (1)


Этого легко добиться с помощью пакета purrr.

Я предполагаю, что это то же самое, что предложил @alistaire

library(purrr)
library(dplyr)
library(fitdistrplus)
dt %>% split(dt$subject_id) %>%  map( ~ fitdist(.$observation, "norm", method = "mme"))

В качестве альтернативы, без purrr,

dt %>% split(dt$subject_id) %>%  lapply(., function(x) fitdist(x$observation, "norm", method = "mme"))
person Sumedh    schedule 06.07.2016
comment
Спасибо за ответ @Sumedh. Есть ли простой способ распараллелить вызов карты в R/dplyr? - person Bar; 07.07.2016
comment
@Bar, мне недостаточно распараллеливания в R, чтобы ответить - person Sumedh; 07.07.2016
comment
@Bar в соответствии с вашим комментарием о том, как распараллелить - вы можете открыть новый вопрос, показав эту технику, а затем показав, что вы пытались распараллелить. - person JasonAizkalns; 07.07.2016
comment
@JasonAizkalns, конечно, сейчас открою. - person Bar; 07.07.2016