我有以下問題:
- 有一個資料框,即包含兩個向量“名稱”和“值”,一個是文本,一個是數值,有 20 行和 2 列
- 我想從“值”中提取“值”并隨機(以相同的權重)采樣 10 倍大小為 5 的子集并計算平均值。我想在另一個向量 10x1 中捕獲這些結果(平均值)。
- 我想做與步驟 2 相同的操作,但是,我不想對大小為 5 的子集進行采樣,而是希望進行更多觀察,即 15(來自 20 個值)。我取這 15 個值,計算平均值,然后將這一步重復 10 倍,將結果記錄在一個新的向量 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 回圈更好的方法,因為上面是一個例子,也沒有 NA 值,但是,原始資料集有 20k 行,它可能“包含”缺失值。
僅供參考,給你一個背景:價值是投資的回報數字,問題是擁有更多的投資有助于多元化。
非常感謝您的幫助!
uj5u.com熱心網友回復:
您可以使用replicate10 次抽取您的樣本。這將回傳一個矩陣,其中包含列中的樣本,因此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
uj5u.com熱心網友回復:
我知道這個問題已經得到解答,但是我在您的原始代碼中發現了導致它無法作業的錯誤。
您撰寫的代碼實際上可以按照您的意愿作業,但 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 回圈通常不是最優的,不依賴于回圈的解決方案可能更好,但我也認為你會欣賞為什么你的代碼一開始就不能正常運行的解釋。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/468174.html
上一篇:在距離k處檢測相等元素的有效函式
