R:来自数据框的 Select 向量(数字),样本 n=10 个大小为 i=5 且 i=10 的子集在向量中并计算每个样本的平均值
R: Select vector (numeric) from data frame, sample n=10 subsets of size i=5 and i= 10 within vector and calculate mean for each of these samples
我有以下问题:
- 有一个数据框,即包含两个向量“名称”和“值”,一个为文本,一个为数值,有 20 行和 2 列
- 我想从“值”中提取“值”并随机抽样(权重相等)10 倍大小为 5 的子集并计算平均值。我想在另一个 10x1 向量中捕获这些结果(平均值)。
- 我想做与第 2 步相同的操作,但是,我不想对大小为 5 的子集进行采样,而是希望有更多的观察结果,即 15(来自 20 个值)。我采用这 15 个值,计算 re-iterate 这一步的平均值 10x,将结果记录到新向量 10x1 中。
(4. 最后,我想比较这两个向量之间的一些描述性统计数据,即期望较小的子集大小向量会有更粗的尾巴、更负偏斜等)。
开始创建数据框
Name <- c("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t")
Values <- c(0.1, 0.05, 0.03, 0.06, -0.1, -0.3, -0.05, 0.5, 0.12, 0.06, 0.04, 0.15, 0.13, 0.16, -0.12, -0.03, -0.5, 0.05, 0.07, 0.03)
data <- data.frame(Name, Values)
相关部分:
# extract Values column
Values <- data$Values
# define sizes of subset and number of iterations
n_small <- 5
n_large <- 15
n_iterations <- 10
set.seed(123456)
# Initialize result vector
Averages_small <- NULL
Averages_large <- NULL
# Calculate average of the subset and allocate it to the result vector
for (i in n_iterations) {
Averages_small[i] <- mean(sample(Values, n_small, replace = FALSE))
Averages_large[i] <- mean(sample(Values, n_large, replace = FALSE))
}
不知何故,这给了 ma 9x NA 和一个数字。我做错了什么?有没有比 for-loop 更好的方法呢,因为上面是一个例子,也没有 NA 值,但是,原始数据集有 20k 行,它可能“包含”缺失值。
fyi,给你一个背景:价值是 return 投资数字,问题是拥有更多的投资有助于多元化。
非常感谢您的帮助!
您可以使用 replicate
抽取 10 次样本。这个 returns 一个矩阵,样本列在列中,所以这个矩阵的 colMeans
给你你正在寻找的向量:
set.seed(1) # For reproducibility
vec5 <- colMeans(replicate(10, sample(data$Values, 5)))
vec15 <- colMeans(replicate(10, sample(data$Values, 15)))
vec5
#> [1] -0.014 0.148 0.044 -0.026 0.062 0.020 -0.032 -0.130 0.166 0.040
vec15
#> [1] 0.058000000 0.024666667 0.051333333 0.045333333 0.024000000
#> [6] 0.010666667 0.022666667 -0.010000000 0.003333333 -0.001333333
可以看到vec5
的标准差确实比较大:
sd(vec5)
#> [1] 0.08711908
sd(vec15)
#> [1] 0.02297406
我知道这个问题已经有人回答了,但我发现你的原始代码中的错误导致它无法运行。
您编写的代码实际上可以按您希望的那样运行,但是 for 循环只触发一次; for (i in v)
遍历向量,重复列出的每个值。请记住,您设置了
n_iterations <- 10
所以在你的循环中,你实际上有 for (i in 10)
,这样循环只被调用一次,这意味着整个结构最终是
Averages_small[10] <- mean(sample(Values, n_small, replace = FALSE))
Averages_large[10] <- mean(sample(Values, n_large, replace = FALSE))
你想要的是for (i in 1:10)
,它创建了一个向量。这可以通过定义 n_iterations <- 1:10
、 或 (使用您的原始设置)
来解决
set.seed(123456)
for (i in 1:n_iterations) {
Averages_small[i] <- mean(sample(Values, n_small, replace = FALSE))
Averages_large[i] <- mean(sample(Values, n_large, replace = FALSE))
}
Averages_small
#> [1] -0.066 0.042 0.036 0.018 0.080 0.016 -0.038 -0.180 0.132 0.042
Averages_large
#> [1] -0.02600000 -0.01266667 0.02000000 0.04666667 0.03533333 -0.02200000 -0.01533333 -0.00400000 0.03266667 0.07333333
我知道 for 循环通常不是最优的,不依赖于循环的解决方案可能更好,但我也认为您会很感激您首先解释为什么您的代码无法正常运行.
我有以下问题:
- 有一个数据框,即包含两个向量“名称”和“值”,一个为文本,一个为数值,有 20 行和 2 列
- 我想从“值”中提取“值”并随机抽样(权重相等)10 倍大小为 5 的子集并计算平均值。我想在另一个 10x1 向量中捕获这些结果(平均值)。
- 我想做与第 2 步相同的操作,但是,我不想对大小为 5 的子集进行采样,而是希望有更多的观察结果,即 15(来自 20 个值)。我采用这 15 个值,计算 re-iterate 这一步的平均值 10x,将结果记录到新向量 10x1 中。 (4. 最后,我想比较这两个向量之间的一些描述性统计数据,即期望较小的子集大小向量会有更粗的尾巴、更负偏斜等)。
开始创建数据框
Name <- c("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t")
Values <- c(0.1, 0.05, 0.03, 0.06, -0.1, -0.3, -0.05, 0.5, 0.12, 0.06, 0.04, 0.15, 0.13, 0.16, -0.12, -0.03, -0.5, 0.05, 0.07, 0.03)
data <- data.frame(Name, Values)
相关部分:
# extract Values column
Values <- data$Values
# define sizes of subset and number of iterations
n_small <- 5
n_large <- 15
n_iterations <- 10
set.seed(123456)
# Initialize result vector
Averages_small <- NULL
Averages_large <- NULL
# Calculate average of the subset and allocate it to the result vector
for (i in n_iterations) {
Averages_small[i] <- mean(sample(Values, n_small, replace = FALSE))
Averages_large[i] <- mean(sample(Values, n_large, replace = FALSE))
}
不知何故,这给了 ma 9x NA 和一个数字。我做错了什么?有没有比 for-loop 更好的方法呢,因为上面是一个例子,也没有 NA 值,但是,原始数据集有 20k 行,它可能“包含”缺失值。
fyi,给你一个背景:价值是 return 投资数字,问题是拥有更多的投资有助于多元化。
非常感谢您的帮助!
您可以使用 replicate
抽取 10 次样本。这个 returns 一个矩阵,样本列在列中,所以这个矩阵的 colMeans
给你你正在寻找的向量:
set.seed(1) # For reproducibility
vec5 <- colMeans(replicate(10, sample(data$Values, 5)))
vec15 <- colMeans(replicate(10, sample(data$Values, 15)))
vec5
#> [1] -0.014 0.148 0.044 -0.026 0.062 0.020 -0.032 -0.130 0.166 0.040
vec15
#> [1] 0.058000000 0.024666667 0.051333333 0.045333333 0.024000000
#> [6] 0.010666667 0.022666667 -0.010000000 0.003333333 -0.001333333
可以看到vec5
的标准差确实比较大:
sd(vec5)
#> [1] 0.08711908
sd(vec15)
#> [1] 0.02297406
我知道这个问题已经有人回答了,但我发现你的原始代码中的错误导致它无法运行。
您编写的代码实际上可以按您希望的那样运行,但是 for 循环只触发一次; for (i in v)
遍历向量,重复列出的每个值。请记住,您设置了
n_iterations <- 10
所以在你的循环中,你实际上有 for (i in 10)
,这样循环只被调用一次,这意味着整个结构最终是
Averages_small[10] <- mean(sample(Values, n_small, replace = FALSE))
Averages_large[10] <- mean(sample(Values, n_large, replace = FALSE))
你想要的是for (i in 1:10)
,它创建了一个向量。这可以通过定义 n_iterations <- 1:10
、 或 (使用您的原始设置)
set.seed(123456)
for (i in 1:n_iterations) {
Averages_small[i] <- mean(sample(Values, n_small, replace = FALSE))
Averages_large[i] <- mean(sample(Values, n_large, replace = FALSE))
}
Averages_small
#> [1] -0.066 0.042 0.036 0.018 0.080 0.016 -0.038 -0.180 0.132 0.042
Averages_large
#> [1] -0.02600000 -0.01266667 0.02000000 0.04666667 0.03533333 -0.02200000 -0.01533333 -0.00400000 0.03266667 0.07333333
我知道 for 循环通常不是最优的,不依赖于循环的解决方案可能更好,但我也认为您会很感激您首先解释为什么您的代码无法正常运行.