自己计算协方差矩阵(不使用“cov”)

2023-12-24

我正在关注有关协方差矩阵的教程,可以在这里找到:http://stats.seandolinar.com/making-a-covariance-matrix-in-r/ http://stats.seandolinar.com/making-a-covariance-matrix-in-r/

它包括以下步骤:

#create a dataframe
a <- c(1,2,3,4,5,6)
b <- c(2,3,5,6,1,9)
c <- c(3,5,5,5,10,8)     
d <- c(10,20,30,40,50,55)
e <- c(7,8,9,4,6,10)

#create matrix from vectors
M <- cbind(a,b,c,d,e)
M_mean <- matrix(data=1, nrow=n) %*% cbind(mean(a),mean(b),mean(c),mean(d),mean(e)) 

k <- ncol(M) #number of variables
n <- nrow(M) #number of subjects

然后创建一个像这样的差异矩阵:

D <- M - M_mean

这对我来说非常简单。但下一步是创建协方差矩阵:

C <- (n-1)^-1 t(D) %*% D

我知道 t(D) % 部分% D 除以 (n-1)^1 = 6。但我不知道 t(D) % 到底是多少%D 正在建立。

有人可以向我解释一下吗?


但我不明白 t(D) %% D 到底是如何建立的。

这是矩阵叉积,矩阵乘法的一种特殊形式。如果您不明白它在做什么,请考虑以下 R 循环来帮助您理解这一点:

DtD <- matrix(0, nrow = ncol(D), ncol = ncol(D))
for (j in 1:ncol(D)) 
  for (i in 1:ncol(D))
    DtD[i, j] <- sum(D[, i] * D[, j])

请注意,实际上没有人会为此编写 R 循环;这只是为了帮助您理解算法。


原答案

假设我们有一个矩阵X,其中每列给出特定随机变量的观测值,通常我们只使用 R 基函数cov(X)得到协方差矩阵。

现在你想自己编写一个协方差函数;这也不难(我很久以前就这样做了作为练习)。需要 3 个步骤:

  • 列居中(即对所有变量进行去均值);
  • 矩阵叉积;
  • 平均(超过nrow(X) - 1 not nrow(X)用于偏置调整)。

这个简短的代码可以做到这一点:

crossprod(sweep(X, 2L, colMeans(X))) / (nrow(X) - 1L)

考虑一个小例子

set.seed(0)
## 3 variable, each with 10 observations
X <- matrix(rnorm(30), nrow = 10, ncol = 3)

## reference computation by `cov`
cov(X)
#           [,1]        [,2]        [,3]
#[1,]  1.4528358 -0.20093966 -0.10432388
#[2,] -0.2009397  0.46086672 -0.05828058
#[3,] -0.1043239 -0.05828058  0.48606879

## own implementation
crossprod(sweep(X, 2L, colMeans(X))) / (nrow(X) - 1L)
#           [,1]        [,2]        [,3]
#[1,]  1.4528358 -0.20093966 -0.10432388
#[2,] -0.2009397  0.46086672 -0.05828058
#[3,] -0.1043239 -0.05828058  0.48606879

如果想得到相关矩阵怎么办?

有很多方法。如果我们想直接获取它,请执行以下操作:

crossprod(scale(X)) / (nrow(X) - 1L)
#           [,1]       [,2]       [,3]
#[1,]  1.0000000 -0.2455668 -0.1241443
#[2,] -0.2455668  1.0000000 -0.1231367
#[3,] -0.1241443 -0.1231367  1.0000000

如果我们想首先获得协方差,然后(对称地)通过根对角线重新缩放它以获得相关性,我们可以这样做:

## covariance first
V <- crossprod(sweep(X, 2L, colMeans(X))) / (nrow(X) - 1L)

## symmetric rescaling
V / tcrossprod(diag(V) ^ 0.5)
#           [,1]       [,2]       [,3]
#[1,]  1.0000000 -0.2455668 -0.1241443
#[2,] -0.2455668  1.0000000 -0.1231367
#[3,] -0.1241443 -0.1231367  1.0000000

我们还可以使用服务 R 函数cov2cor将协方差转换为相关性:

cov2cor(V)
#           [,1]       [,2]       [,3]
#[1,]  1.0000000 -0.2455668 -0.1241443
#[2,] -0.2455668  1.0000000 -0.1231367
#[3,] -0.1241443 -0.1231367  1.0000000
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自己计算协方差矩阵(不使用“cov”) 的相关文章

随机推荐

  • 将 Java byte[] 对象插入 H2 表中,然后再次检索它

    我正在尝试将 Java byte 插入 H2 数据库表中 然后再次检索它 但我没有取得成功 根据这一页 http www h2database com html datatypes html binary type BINARY 数据类型直
  • 无法使用 jdbcStorageHandler 创建 Hive 外部表

    我正在 Amazone EMR 中运行一个小型集群 以便使用 Apache Hive 2 3 5 据我了解 Apache Hive 可以从远程数据库导入数据并让集群运行查询 我正在遵循 Apache Hive Web 文档中提供的示例 ht
  • 遵循 Python/Flask Heroku 教程时出现“foreman start”错误

    遵循所有指示 运行的时候出现这个错误foreman start C Program Files x86 ruby 1 9 3 lib ruby gems 1 9 1 gems foreman 0 47 0 lib fo reman engi
  • 使窗口成为桌面的一部分

    我想创建一个窗口 CreateWindowEx WS EX TOOLWINDOW WS EX LAYERED wc lpszClassName 0 WS POPUP WS VISIBLE WS SYSMENU a part桌面的 我知道这可
  • 2020 年以上,Typescript 在运行时使用类型防护按类型或接口检查对象

    对我来说 大多数时候 需要动态检查来验证获取响应 我在想 对于具有多个道具和附加检查的任何类型的对象 可以使用用户定义的类型保护以通用方式完成此操作 因此可以使用类似的方法 这是一个带有示例对象的示例 但我想要一个没有它的函数 https
  • postgresql 中的慢 OR 语句

    我目前的 postgresql 查询由于 OR 语句而变慢 因此 它显然没有使用索引 到目前为止 重写此查询失败 查询 EXPLAIN ANALYZE SELECT a0 id AS id0 FROM advert a0 INNER JOI
  • 抑制 Xcode 中已弃用的警告

    由于所有 SDK 都在使用 因此能够方便地针对多个 SDK 和平台进行构建 然而 从 3 2 跳到 3 0 甚至偶尔跳到 2 x 我经常收到涉及已更改或被取代的方法的弃用警告 warning UIKeyboardBoundsUserInfo
  • JPA - 仅针对给定查询强制延迟加载

    如何仅针对给定的 NamedQuery 实施延迟加载策略 例如 考虑下面的伪代码 只是为了解释这种情况 我有一个实体 Entity class Xyz int a int b Fetch EAGER Set
  • pandas 数据框 groupby 和 join

    让我们假设有这样的 np random seed 123 df pd DataFrame A foo bar foo bar foo bar foo foo B one one two three two two one three C n
  • NLTK - 获取并简化标签列表

    我正在使用布朗语料库 我想要某种方法来打印所有可能的标签及其名称 而不仅仅是标签缩写 标签也不少 有没有办法 简化 标签呢 我所说的简化是指将两个极其相似的标签合并为一个 然后用另一个标签重新标记合并后的单词 之前以某种方式讨论过 Java
  • 仅 DIV 的两列 CSS 布局

    我正在重新设计当前使用表格进行两列设计的布局 并遇到了一些问题 div div div blah div div div div blah div div blah div div div leftCol margin right 10px
  • 如何使用反射获取泛型类的名称?

    如何使用反射获取泛型类的名称 eg public class SomeGenericClass
  • Android 地理围栏的最大限制?

    我从 Google Play 服务的地理围栏 API 开始 我想我理解了一般概念 但我不知道地理围栏是否有限制 我将地理围栏列表提供给位置客户端 然后由他处理其余的事情 但是我可以将多少个地理围栏传递给位置客户端 我想要多少就多少 每个设备
  • 直接在 .htaccess 文件内生成随机数

    目前我正在添加一个随机数到我的结束Ajax通过 Javascript 或 PHP 的 URL 我想知道我是否可以在我的内心做同样的事情 htaccess文件 当我使用 mod rewrite 重写它们时 有什么办法可以制作一个随机数 or
  • ng-click刷新页面而不是提交

    您好 我有一个有角度的 Web 表单 它接受用户的输入并插入到数据库中 我正在使用 jersey jackson Rest Web 服务和 hibernate 但是当我尝试提交表单时 上一页有指向当前页面的超链接刷新页面并再次重新加载当前页
  • spring boot数据库错误数据源“org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaConfiguration”

    我正在使用 spring boot hibernate 和 my sql 但出现错误 org springframework beans factory UnsatisfiedDependencyException Error creati
  • 从 UICollectionViewCell 实例访问图像时遇到问题

    我正在按照本教程对我的项目进行一些修改 http www appcoda com ios programming uicollectionview tutorial http www appcoda com ios programming
  • PhoneGap 和 WhatsApp

    我希望你能帮助我找到解决我问题的问题 我正在开发一个应该使用 WhatsApp 的应用程序 该应用程序使用 HTML5 CSS3 和 Javascript 我正在使用此链接通过 WhatsApp 发送消息 a href 当您直接使用浏览器时
  • 如何配置S3BotoStorage或collectstatic上传到s3存储桶子目录

    有没有办法配置 django 的collectstatic命令上传到s3存储桶中的子目录 而不仅仅是顶级目录 Thanks 如果您正在使用S3BotoStorage发动机来自django storages然后有一个名为的设置变量AWS LO
  • 自己计算协方差矩阵(不使用“cov”)

    我正在关注有关协方差矩阵的教程 可以在这里找到 http stats seandolinar com making a covariance matrix in r http stats seandolinar com making a c