根据我在 R 中的数据分布生成新的随机分布
Generate new random distributions based on distribution of my data in R
我有一个包含 27 个观测值的数据集以及相关的观测概率(介于 0 和 1 之间),如下所示
数据Prob_1Prob_2
1 .1 1
2 0 1
3 0 1
4 0 .8
5 .3 .5
6 .6 .2
7 .9 .1
8 1 0
9 1 0
10 .6 0
11 .2 0
12 .2 .1
13 .6 .3
14 .4 .4
15 .1 .5
16 .1 .3
17 .4 0
18 .7 0
19 1 0
20 1 .1
21 1 .4
22 .8 .8
23 .4 1
24 .2 1
25 .1 1
26 0 1
27 0 1
我想从这些分布中为 prob_1 和 prob_2 生成 100-250 个随机样本。
我还想将它们与方差带一起绘制以查看随机样本如何变化。
到目前为止我已经试过了
test_dist = sample(1:27,150,
replace=TRUE,
prob=c(1,1,1,.8,.5,.2,.1,0,0,0,0,.1,.3,.4,.5,.3,0,0,0,.1,.4,.8,1,1,1,1,1)
)
一旦我有了 test_dist,我不确定如何绘制它来查看为点 1 到 27 生成的新数据的概率和方差带。
我什至不确定这是否是根据我的分布生成随机样本分布的最佳方式。
谢谢!
主要思想
要从现有数据生成分布,您需要计算它的 mean
和 sd
,
您可以按如下方式进行操作。
(d_summary <- d %>% select(-Data,) %>% summarise_all(.funs = lst(mean,sd)))
# A tibble: 1 x 4
Prob_1_mean Prob_2_mean Prob_1_sd Prob_2_sd
<dbl> <dbl> <dbl> <dbl>
1 0.433 0.463 0.376 0.419
然后使用这些使用 rnorm
生成新的 150 个样本,如下所示。
with(d_summary, tibble(Id = 1:150,
prob_1_generated = rnorm(n = 150, mean = Prob_1_mean, sd = Prob_1_sd),
prob_2_generated = rnorm(n = 150, mean = Prob_2_mean, sd = Prob_2_sd)
)
)
输出
# A tibble: 6 x 3
Id prob_1_generated prob_2_generated
<int> <dbl> <dbl>
1 1 0.0283 0.999
2 2 0.525 0.447
3 3 0.247 0.617
4 4 0.519 -0.0744
5 5 0.817 0.520
6 6 0.375 0.678
希望这就是您要找的。
d_out <- tibble(
Id = 1:500,
prob_1_sample = sample(d$Prob_1, 500, replace = T),
prob_2_sample = sample(d$Prob_2, 500, replace = T)
)
输出数据
# A tibble: 500 x 3
Id prob_1_sample prob_2_sample
<int> <dbl> <dbl>
1 1 0.8 0
2 2 1 1
3 3 0.8 0.3
4 4 0.1 0
5 5 0.8 0
6 6 0.1 0.8
7 7 0 0
8 8 0.6 1
9 9 1 1
10 10 0.6 0.4
# ... with 490 more rows
输入数据
structure(list(Prob_1 = c(0.1, 0, 0, 0, 0.3, 0.6, 0.9, 1, 1,
0.6, 0.2, 0.2, 0.6, 0.4, 0.1, 0.1, 0.4, 0.7, 1, 1, 1, 0.8, 0.4,
0.2, 0.1, 0, 0), Prob_2 = c(1, 1, 1, 0.8, 0.5, 0.2, 0.1, 0, 0,
0, 0, 0.1, 0.3, 0.4, 0.5, 0.3, 0, 0, 0, 0.1, 0.4, 0.8, 1, 1,
1, 1, 1)), row.names = c(NA, -27L), class = c("tbl_df", "tbl",
"data.frame")) ->d
注意:总是使用dput(your_data_frame)
到post你的输入数据。
整洁的格式 使用 ggplot
可以轻松绘制
d_tidy <- d_out %>% pivot_longer(cols = -Id, names_to = "hist_name",values_to = "sample_values")
密度图
d_tidy %>%
ggplot(aes(x = sample_values, group = hist_name, color = hist_name))+
geom_density()
输出
点范围图用于mean
和sd
比较。
d_tidy %>%
group_by(hist_name) %>%
summarise(Mean = mean(sample_values), SD = sd(sample_values)) %>%
ggplot(aes(x = factor(hist_name), y = Mean)) +
geom_pointrange(aes(ymax = Mean + SD,
ymin = Mean - SD))
输出
我有一个包含 27 个观测值的数据集以及相关的观测概率(介于 0 和 1 之间),如下所示
数据Prob_1Prob_2 1 .1 1 2 0 1 3 0 1 4 0 .8 5 .3 .5 6 .6 .2 7 .9 .1 8 1 0 9 1 0 10 .6 0 11 .2 0 12 .2 .1 13 .6 .3 14 .4 .4 15 .1 .5 16 .1 .3 17 .4 0 18 .7 0 19 1 0 20 1 .1 21 1 .4 22 .8 .8 23 .4 1 24 .2 1 25 .1 1 26 0 1 27 0 1
我想从这些分布中为 prob_1 和 prob_2 生成 100-250 个随机样本。 我还想将它们与方差带一起绘制以查看随机样本如何变化。 到目前为止我已经试过了
test_dist = sample(1:27,150,
replace=TRUE,
prob=c(1,1,1,.8,.5,.2,.1,0,0,0,0,.1,.3,.4,.5,.3,0,0,0,.1,.4,.8,1,1,1,1,1)
)
一旦我有了 test_dist,我不确定如何绘制它来查看为点 1 到 27 生成的新数据的概率和方差带。
我什至不确定这是否是根据我的分布生成随机样本分布的最佳方式。
谢谢!
主要思想
要从现有数据生成分布,您需要计算它的 mean
和 sd
,
您可以按如下方式进行操作。
(d_summary <- d %>% select(-Data,) %>% summarise_all(.funs = lst(mean,sd)))
# A tibble: 1 x 4
Prob_1_mean Prob_2_mean Prob_1_sd Prob_2_sd
<dbl> <dbl> <dbl> <dbl>
1 0.433 0.463 0.376 0.419
然后使用这些使用 rnorm
生成新的 150 个样本,如下所示。
with(d_summary, tibble(Id = 1:150,
prob_1_generated = rnorm(n = 150, mean = Prob_1_mean, sd = Prob_1_sd),
prob_2_generated = rnorm(n = 150, mean = Prob_2_mean, sd = Prob_2_sd)
)
)
输出
# A tibble: 6 x 3
Id prob_1_generated prob_2_generated
<int> <dbl> <dbl>
1 1 0.0283 0.999
2 2 0.525 0.447
3 3 0.247 0.617
4 4 0.519 -0.0744
5 5 0.817 0.520
6 6 0.375 0.678
希望这就是您要找的。
d_out <- tibble(
Id = 1:500,
prob_1_sample = sample(d$Prob_1, 500, replace = T),
prob_2_sample = sample(d$Prob_2, 500, replace = T)
)
输出数据
# A tibble: 500 x 3
Id prob_1_sample prob_2_sample
<int> <dbl> <dbl>
1 1 0.8 0
2 2 1 1
3 3 0.8 0.3
4 4 0.1 0
5 5 0.8 0
6 6 0.1 0.8
7 7 0 0
8 8 0.6 1
9 9 1 1
10 10 0.6 0.4
# ... with 490 more rows
输入数据
structure(list(Prob_1 = c(0.1, 0, 0, 0, 0.3, 0.6, 0.9, 1, 1,
0.6, 0.2, 0.2, 0.6, 0.4, 0.1, 0.1, 0.4, 0.7, 1, 1, 1, 0.8, 0.4,
0.2, 0.1, 0, 0), Prob_2 = c(1, 1, 1, 0.8, 0.5, 0.2, 0.1, 0, 0,
0, 0, 0.1, 0.3, 0.4, 0.5, 0.3, 0, 0, 0, 0.1, 0.4, 0.8, 1, 1,
1, 1, 1)), row.names = c(NA, -27L), class = c("tbl_df", "tbl",
"data.frame")) ->d
注意:总是使用dput(your_data_frame)
到post你的输入数据。
整洁的格式 使用 ggplot
可以轻松绘制d_tidy <- d_out %>% pivot_longer(cols = -Id, names_to = "hist_name",values_to = "sample_values")
密度图
d_tidy %>%
ggplot(aes(x = sample_values, group = hist_name, color = hist_name))+
geom_density()
输出
点范围图用于mean
和sd
比较。
d_tidy %>%
group_by(hist_name) %>%
summarise(Mean = mean(sample_values), SD = sd(sample_values)) %>%
ggplot(aes(x = factor(hist_name), y = Mean)) +
geom_pointrange(aes(ymax = Mean + SD,
ymin = Mean - SD))
输出