有效地分割数据和拟合分布

时间:2018-07-13 15:39:31

标签: r subset simulation distribution purrr

对于一个项目,我已经收到了大量的机密患者级别数据,我需要将这些数据拟合到分布中以便在仿真模型中使用。我正在使用R。

问题是我需要拟合分布以获取至少288个独立分布(至少48个6个变量的子集)的形状/速率数据。变量之间的过程会略有不同(取决于该变量的分布方式),但我希望能够为每个变量设置一个函数或循环,并为我定义的每个子集生成形状和速率数据。

一个例子:我需要找到患者亚群的住院天数。有48个患者子集。我目前这样做的方式是手动过滤数据,然后将其提取到向量中,然后使用fitdist将数据拟合到向量中。

即对于伽马分布的变量:

vector1 <- los_data %>%
filter(group == 1, setting == 1, diagnosis == 1)

fitdist(vector1, "gamma")

我对数据科学和数据处理还很陌生,我知道必须有比手工更简单的方法!我假设与矩阵有关,但是我对如何最好地进行一无所知。

2 个答案:

答案 0 :(得分:0)

好的,您的示例在这里不是很可重复,但是我认为您想要的答案将类似于以下内容:

result <- los_data %>%
group_by(group, setting, diagnosis) %>%
do({
  fit <- fitdist(.$my_column, "gamma")
  data_frame(group=.$group[1], setting=.$setting[1], diagnosis=.$diagnosis[1], fit = list(fit))
}) %>%
ungroup()

这将为您提供所有拟合的数据框,其中包含用于分组,设置,诊断的列以及包含每个拟合的列表列。由于它是一个列表列,因此您将需要使用双括号来提取单个拟合。示例:

# Get the fit in the first row
result$fit[[1]]

答案 1 :(得分:0)

一种常见的做法是使用V21.X1 V21.X2 A 02:01:03 A 02:01:04 拆分数据,然后在该组上应用感兴趣的功能。假设这里有四列,组,设置,诊断和stay.length。前三个有两个级别。

split

执行df <- data.frame( group = sample(1:2, 64, TRUE), setting = sample(1:2, 64, TRUE), diagnosis = sample(1:2, 64, TRUE), stay.length = sample(1:5, 64, TRUE) ) > head(df) group setting diagnosis var 1 1 1 1 4 2 1 1 2 5 3 1 1 2 4 4 2 1 2 3 5 1 2 2 3 6 1 1 2 5 ,您会得到split的分裂:

List

然后,我们可以使用dfl <- split(df$stay.length, list(df$group, df$setting, df$diagnosis)) > head(dfl) $`1.1.1` [1] 5 3 4 1 4 5 4 2 1 $`2.1.1` [1] 5 4 5 4 3 1 5 3 1 $`1.2.1` [1] 4 2 5 4 5 3 5 3 $`2.2.1` [1] 2 1 4 3 5 4 4 $`1.1.2` [1] 5 4 4 4 3 2 4 4 5 1 5 5 $`2.1.2` [1] 5 4 4 5 3 2 4 5 1 2 对列表中的每个组执行任何功能。例如,我们可以应用lapply

mean

根据您的情况,您可以应用dflm <- lapply(dfl, mean) > dflm $`1.1.1` [1] 3.222222 . . . . $`2.2.2` [1] 2.8 或任何其他功能。

fitdist