对 R 中向量的连续元素应用 t.test
Apply t.test on consecutive elements of a vector in R
我有一个包含 n 个元素的向量。
我想知道如何以有效的方式执行以下操作(这基本上是一个滚动计算):
提取索引为1到k的元素
提取索引为k+1到2k的元素
- 对这些元素执行 t.test
- 提取索引为 2 到 k+1 的元素
- 提取索引为 k+2 到 2k+1 的元素
- 对这些元素执行 t.test
……
7.Repeat 直到矢量结束。
我不需要查看提取值,只需获取一些统计信息(例如 [1]$statistic)。
我可以用循环来完成,但我想知道如何用某些函数(例如应用)来完成。
祝一切顺利
从你的伪代码中不清楚你是否真的希望向量有 n = 3 * k 个元素,但这就是我编程的方式。
set.seed(123)
x = rnorm(15)
o = 1:5
k = 5
sapply(o, function(oi){
x1 = x[oi:(k + oi - 1)]
x2 = x[(k + oi):(2 * k + oi)]
t.test(x1, x2)$statistic
})
结果是
t t t t t
0.04435004 1.28433640 1.67879015 0.11191044 -0.19398686
您还可以计算出一些更新公式来为 t 检验中的每对向量添加和减去一个新元素,但这似乎不值得付出努力。
您可以使用 sapply
,为了清楚起见,这里用一个函数包装起来:
multiple_ttest <- function(vec, k)
{
sapply(seq(length(vec) - 2 * k), function(x){
t.test(vec[x + 1:k], vec[x + (k + 1):(2 * k)])$statistic
})
}
multiple_ttest(rnorm(100), 20)
#> t t t t t t t
#> -0.6253586 -1.1680595 -1.2979357 -1.1051207 -1.4668645 -0.6156220 -0.2470322
#> t t t t t t t
#> -1.2416802 -0.1763081 -0.1682269 -0.2490938 0.4569783 0.7721602 1.4383522
#> t t t t t t t
#> 1.5530524 2.1523397 2.3221591 2.1876903 1.7248729 1.6149827 1.6919704
#> t t t t t t t
#> 1.9747871 2.3833846 2.2826131 2.2337453 2.2225939 1.6284361 2.2067872
#> t t t t t t t
#> 1.2447557 1.1435925 0.6731618 -0.1737223 -0.5889784 -0.7339752 -1.2202893
#> t t t t t t t
#> -1.4936935 -1.5821069 -1.7795797 -1.6290700 -1.7760278 -1.4223367 -1.5931553
#> t t t t t t t
#> -2.6832755 -2.7733223 -2.7710590 -3.0889778 -2.3604743 -2.3510220 -1.5456745
#> t t t t t t t
#> -1.4098492 -0.5268468 -0.3187017 0.1878282 0.5208563 0.5656160 0.4952028
#> t t t t
#> 0.2005182 0.3769581 0.5093635 0.9358878
由 reprex package (v0.3.0)
于 2020-04-02 创建
我有一个包含 n 个元素的向量。
我想知道如何以有效的方式执行以下操作(这基本上是一个滚动计算):
提取索引为1到k的元素
提取索引为k+1到2k的元素
- 对这些元素执行 t.test
- 提取索引为 2 到 k+1 的元素
- 提取索引为 k+2 到 2k+1 的元素
- 对这些元素执行 t.test …… 7.Repeat 直到矢量结束。
我不需要查看提取值,只需获取一些统计信息(例如 [1]$statistic)。
我可以用循环来完成,但我想知道如何用某些函数(例如应用)来完成。 祝一切顺利
从你的伪代码中不清楚你是否真的希望向量有 n = 3 * k 个元素,但这就是我编程的方式。
set.seed(123)
x = rnorm(15)
o = 1:5
k = 5
sapply(o, function(oi){
x1 = x[oi:(k + oi - 1)]
x2 = x[(k + oi):(2 * k + oi)]
t.test(x1, x2)$statistic
})
结果是
t t t t t
0.04435004 1.28433640 1.67879015 0.11191044 -0.19398686
您还可以计算出一些更新公式来为 t 检验中的每对向量添加和减去一个新元素,但这似乎不值得付出努力。
您可以使用 sapply
,为了清楚起见,这里用一个函数包装起来:
multiple_ttest <- function(vec, k)
{
sapply(seq(length(vec) - 2 * k), function(x){
t.test(vec[x + 1:k], vec[x + (k + 1):(2 * k)])$statistic
})
}
multiple_ttest(rnorm(100), 20)
#> t t t t t t t
#> -0.6253586 -1.1680595 -1.2979357 -1.1051207 -1.4668645 -0.6156220 -0.2470322
#> t t t t t t t
#> -1.2416802 -0.1763081 -0.1682269 -0.2490938 0.4569783 0.7721602 1.4383522
#> t t t t t t t
#> 1.5530524 2.1523397 2.3221591 2.1876903 1.7248729 1.6149827 1.6919704
#> t t t t t t t
#> 1.9747871 2.3833846 2.2826131 2.2337453 2.2225939 1.6284361 2.2067872
#> t t t t t t t
#> 1.2447557 1.1435925 0.6731618 -0.1737223 -0.5889784 -0.7339752 -1.2202893
#> t t t t t t t
#> -1.4936935 -1.5821069 -1.7795797 -1.6290700 -1.7760278 -1.4223367 -1.5931553
#> t t t t t t t
#> -2.6832755 -2.7733223 -2.7710590 -3.0889778 -2.3604743 -2.3510220 -1.5456745
#> t t t t t t t
#> -1.4098492 -0.5268468 -0.3187017 0.1878282 0.5208563 0.5656160 0.4952028
#> t t t t
#> 0.2005182 0.3769581 0.5093635 0.9358878
由 reprex package (v0.3.0)
于 2020-04-02 创建