微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

矩阵每一行的偏方差

如何解决矩阵每一行的偏方差

我通过以下方式生成了一系列 10,000 个随机数:

rand_x = rf(10000,3,5)

现在我想生成一个包含每个点的方差的系列,即该列如下所示:

[variance(first two numbers)]
[variance(first three numbers)]
[variance(first four numbers)]
[variance(first five numbers)]
.
.
.
.
[variance of 10,000 numbers]

我已将代码编写为:

c ( var(rand_x[1:1]) : var(rand_x[1:10000])

但我在列中只得到 157 个元素而不是 10,000 个。有人可以指导我在这里做错了什么吗?

解决方法

一个选项是在 sapply 中循环从 2 到 10000 的索引,将 'rand_x' 的元素从位置 1 提取到循环索引,应用 var 并返回一个 {{1 }} 的方差输出

vector
,

您的代码创建了一个递增 1 的序列,其中前两个元素的方差作为起始值,整个向量的方差作为限制。

var(rand_x[1:2]):var(rand_x[1:n])
# [1] 0.9026262 1.9026262 2.9026262

## compare:
.9026262:3.33433
# [1] 0.9026262 1.9026262 2.9026262

您想要的是循环遍历向量索引,使用 seq_along 来获得增长一的序列方差。为了了解需要做什么,我首先向您展示了一个(相当慢的)for 循环。

vars <- numeric()  ## initialize numeric vector
for (i in seq_along(rand_x)) {
  vars[i] <- var(rand_x[1:i])
}
vars
#  [1]        NA 0.9026262 1.4786540 1.2771584 1.7877717 1.6095619
#  [7] 1.4483273 1.5653797 1.8121144 1.6192175 1.4821020 3.5005254
# [13] 3.3771453 3.1723564 2.9464537 2.7620001 2.7086317 2.5757641
# [19] 2.4330738 2.4073546 2.4242747 2.3149455 2.3192964 2.2544765
# [25] 3.1333738 3.0343781 3.0354998 2.9230927 2.8226541 2.7258979
# [31] 2.6775278 2.6651541 2.5995346 3.1333880 3.0487177 3.0392603
# [37] 3.0483917 4.0446074 4.0463367 4.0465158 3.9473870 3.8537925
# [43] 3.8461463 3.7848464 3.7505158 3.7048694 3.6953796 3.6605357
# [49] 3.6720684 3.6580296

第一个元素必须是 NA,因为没有定义一个元素的方差(除以零)。

但是,for 循环很慢。由于 R 是矢量化的,我们宁愿使用 *apply family 中的函数,例如vapply快得多。在 vapply 中,我们使用 numeric(1)(或只是 0)进行初始化,因为每次迭代的结果长度为 1。

vars <- vapply(seq_along(rand_x),function(i) var(rand_x[1:i]),numeric(1))
vars
#  [1]        NA 0.9026262 1.4786540 1.2771584 1.7877717 1.6095619
#  [7] 1.4483273 1.5653797 1.8121144 1.6192175 1.4821020 3.5005254
# [13] 3.3771453 3.1723564 2.9464537 2.7620001 2.7086317 2.5757641
# [19] 2.4330738 2.4073546 2.4242747 2.3149455 2.3192964 2.2544765
# [25] 3.1333738 3.0343781 3.0354998 2.9230927 2.8226541 2.7258979
# [31] 2.6775278 2.6651541 2.5995346 3.1333880 3.0487177 3.0392603
# [37] 3.0483917 4.0446074 4.0463367 4.0465158 3.9473870 3.8537925
# [43] 3.8461463 3.7848464 3.7505158 3.7048694 3.6953796 3.6605357
# [49] 3.6720684 3.6580296

数据:

n <- 50
set.seed(42)
rand_x <- rf(n,3,5)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。