有效地拆分数据和拟合分布
Splitting data and fitting distributions efficiently
对于一个项目,我收到了大量机密的患者级别数据,我需要对这些数据进行分布拟合,以便在仿真模型中使用它们。我正在使用 R。
问题是我需要拟合分布以获得至少 288 个独立分布(至少 6 个变量的 48 个子集)的 shape/rate 数据。该过程在变量之间会略有不同(取决于该变量的分布方式),但我希望能够为每个变量设置一个函数或循环,并为我定义的每个子集生成形状和速率数据。
例如:我需要找到部分患者的住院时间数据。有 48 个患者子集。我目前这样做的方法是手动过滤数据,然后将它们提取到向量中,然后使用 fitdist
将数据拟合到向量中。
即对于伽马分布的变量:
vector1 <- los_data %>%
filter(group == 1, setting == 1, diagnosis == 1)
fitdist(vector1, "gamma")
我对数据科学和数据处理还很陌生,我知道一定有比手工更简单的方法!我假设与矩阵有关,但我完全不知道如何最好地进行。
好的,您的示例在这里不太可重现,但我认为您想要的答案如下所示:
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]]
一种常见的做法是使用 split
拆分数据,然后对该组应用感兴趣的函数。假设这里有四列,组、设置、诊断和 stay.length。前三个有两个级别。
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
或任何其他函数。
dfl.fitdist <- lapply(dfl, function(x) fitdist(x, "gamma"))
> dfl
$`1.1.1`
Fitting of the distribution ' gamma ' by maximum likelihood
Parameters:
estimate Std. Error
shape 3.38170 2.2831073
rate 1.04056 0.7573495
.
.
.
$`2.2.2`
Fitting of the distribution ' gamma ' by maximum likelihood
Parameters:
estimate Std. Error
shape 4.868843 2.5184018
rate 1.549188 0.8441106
对于一个项目,我收到了大量机密的患者级别数据,我需要对这些数据进行分布拟合,以便在仿真模型中使用它们。我正在使用 R。
问题是我需要拟合分布以获得至少 288 个独立分布(至少 6 个变量的 48 个子集)的 shape/rate 数据。该过程在变量之间会略有不同(取决于该变量的分布方式),但我希望能够为每个变量设置一个函数或循环,并为我定义的每个子集生成形状和速率数据。
例如:我需要找到部分患者的住院时间数据。有 48 个患者子集。我目前这样做的方法是手动过滤数据,然后将它们提取到向量中,然后使用 fitdist
将数据拟合到向量中。
即对于伽马分布的变量:
vector1 <- los_data %>%
filter(group == 1, setting == 1, diagnosis == 1)
fitdist(vector1, "gamma")
我对数据科学和数据处理还很陌生,我知道一定有比手工更简单的方法!我假设与矩阵有关,但我完全不知道如何最好地进行。
好的,您的示例在这里不太可重现,但我认为您想要的答案如下所示:
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]]
一种常见的做法是使用 split
拆分数据,然后对该组应用感兴趣的函数。假设这里有四列,组、设置、诊断和 stay.length。前三个有两个级别。
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
或任何其他函数。
dfl.fitdist <- lapply(dfl, function(x) fitdist(x, "gamma"))
> dfl
$`1.1.1`
Fitting of the distribution ' gamma ' by maximum likelihood
Parameters:
estimate Std. Error
shape 3.38170 2.2831073
rate 1.04056 0.7573495
.
.
.
$`2.2.2`
Fitting of the distribution ' gamma ' by maximum likelihood
Parameters:
estimate Std. Error
shape 4.868843 2.5184018
rate 1.549188 0.8441106