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

我有以下问题:

  1. 有一个数据框,即包含两个向量“名称”和“值”,一个为文本,一个为数值,有 20 行和 2 列
  2. 我想从“值”中提取“值”并随机抽样(权重相等)10 倍大小为 5 的子集并计算平均值。我想在另一个 10x1 向量中捕获这些结果(平均值)。
  3. 我想做与第 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 循环通常不是最优的,不依赖于循环的解决方案可能更好,但我也认为您会很感激您首先解释为什么您的代码无法正常运行.