滚动 PCA 并绘制主成分的比例方差

2023-11-29

我使用以下代码来执行 PCA:

PCA <- prcomp(Ret1, center = TRUE, scale. = TRUE) 
summary(PCA)

我得到以下结果:

#Importance of components:
#                          PC1    PC2     PC3     PC4
#Standard deviation     1.6338 0.9675 0.60446 0.17051
#Proportion of Variance 0.6673 0.2340 0.09134 0.00727
#Cumulative Proportion  0.6673 0.9014 0.99273 1.00000

我想做的是针对特定窗口(例如 180 天)的滚动 PCA。结果应该是一个矩阵,显示所有主成分的“方差比例”随时间的演变。

我尝试过

rollapply(Ret1, 180, prcomp)

但这不起作用,我不知道如何保存矩阵中每个时间步长的“方差比例”。

输出矩阵应如下所示:

#          PC1    PC2     PC3     PC4
#Period 1  0.6673 0.2340 0.09134 0.00727
#Period 2  0.7673 0.1340 0.09134 0.00727
# ....

这是我的数据的一个小子集Ret1:

             Cats            Dogs         Human           Frogs
2016-12-13  0.0084041063  6.518479e-03  6.096295e-04  5.781271e-03
2016-12-14 -0.0035340384 -8.150321e-03  4.418382e-04 -5.978296e-03
2016-12-15  0.0107522782  3.875708e-03 -1.784663e-02  3.012253e-03
2016-12-16  0.0033034130 -1.752174e-03 -1.753624e-03 -4.448850e-04
2016-12-17  0.0000000000  0.000000e+00  0.000000e+00  0.000000e+00
2016-12-18  0.0000000000  0.000000e+00  0.000000e+00  0.000000e+00
2016-12-19  0.0019876743  1.973190e-03 -8.577261e-03  1.996151e-03
2016-12-20  0.0033235161  3.630921e-03 -4.757395e-03  4.594355e-03
2016-12-21  0.0003401156 -2.460351e-03  3.708875e-03 -1.636413e-03
2016-12-22 -0.0010940147 -1.864724e-03 -7.991572e-03 -1.158029e-03
2016-12-23 -0.0005387228  1.250898e-03 -2.843725e-03  7.492594e-04
2016-12-24  0.0000000000  0.000000e+00  0.000000e+00  0.000000e+00
2016-12-25  0.0000000000  0.000000e+00  0.000000e+00  0.000000e+00
2016-12-26  0.0000000000  0.000000e+00  0.000000e+00  0.000000e+00
2016-12-27  0.0019465877  2.245918e-03  0.000000e+00  5.632058e-04
2016-12-28  0.0002396803 -8.391658e-03  8.307552e-03 -5.598988e-03
2016-12-29 -0.0020884556 -2.933868e-04  1.661246e-03 -7.010738e-04
2016-12-30  0.0026172923 -4.647865e-03  9.574997e-03 -2.889166e-03

我尝试了以下方法:

PCA <- function(x){
  Output=cumsum((apply((prcomp(x,center = TRUE, scale. = TRUE))$x, 2, var))/sum(vars))
  return(Output)}

window <- 10
data <- Ret1
result <- rollapply(data, window,PCA)
plot(result)

#Gives you the Proportion of Variance = cumsum((apply((prcomp(x,center = TRUE, scale. = TRUE))$x, 2, var))/sum(vars))

首先,适合您的目的的正确函数可以写成如下,使用$sdev的结果prcomp。我还剩下center = TRUE and scale. = TRUE因为它们是默认功能。

PCA <- function(x){
  oo <- prcomp(x)$sdev
  oo / sum(oo)
  }

现在,我们可以轻松使用sapply进行滚动操作:

## for your mini dataset of 18 rows
window <- 10
n <- nrow(Ret1)
oo <- sapply(seq_len(n - window + 1), function (i) PCA(Ret1[i:(i + window - 1), ]))
oo <- t(oo)  ## an extra transposition as `sapply` does `cbind`

#           [,1]      [,2]       [,3]       [,4]
# [1,] 0.5206345 0.3251099 0.12789683 0.02635877
# [2,] 0.5722264 0.2493518 0.14588631 0.03253553
# [3,] 0.6051199 0.1973694 0.16151859 0.03599217
# [4,] 0.5195527 0.2874197 0.16497219 0.02805543
# [5,] 0.5682829 0.3100708 0.09456654 0.02707977
# [6,] 0.5344804 0.3149862 0.08912882 0.06140464
# [7,] 0.5954948 0.2542775 0.10434155 0.04588616
# [8,] 0.5627977 0.2581071 0.13068875 0.04840648
# [9,] 0.6089650 0.2559285 0.11022974 0.02487672

每一列都是一个 PC,而每一行给出该时期内每个组件的比例方差。

要进一步绘制结果,您可以使用matplot:

matplot(oo, type = "l", lty = 1, col = 1:4,
        xlab = "period", ylab = "proportional variance")

enter image description here

PCA 1-4以1:4的颜色绘制,即“黑”、“红”、“绿”和“蓝”。


补充评论:

  • 如果你想使用zoo::rollapply, do

    oo <- zoo::rollapply(Ret1, window, PCA, by.column = FALSE)
    
  • 准确地说,我正在报告比例标准差。如果你真的想要比例方差,机会PCA功能:

    PCA <- function(x){
      oo <- prcomp(x)$sdev ^ 2
      oo / sum(oo)
      }
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

滚动 PCA 并绘制主成分的比例方差 的相关文章

  • 在 for 循环中绘制的多个 ggplot2 绘图的网格

    作为一个新的 ggplot2 用户 我对可能性的数量感到有点迷失 并且很难在网上找到我认为简单问题的简单答案 我想在同一张纸上显示 ggplot2 的多个图 但知道这些图来自 for 循环 以下示例无法编译 仅用于说明 for i in c
  • profvis() 何时以及为何显示“源不可用”?

    我经常分析 R 代码 并大量使用 profvis 对于某些函数 浏览器窗口的上半部分会显示源代码 有时则不会 我不知道什么时候会出现这种情况 对我来说这似乎是随机的 有谁知道 profvis 何时以及为什么无法在顶部窗口中显示代码 发生这种
  • 如何从 data.frame 中选择行和列的子集

    我有这个 d d Age gt 2 它返回 Age 超过 2 的所有行 但我只想返回几列中的值 例如 d X 和 d Y 而不是全部 无论如何我可以做到这一点吗 Thanks d d Age gt 2 c X Y
  • R - 根据另一个数据框查找每组的重叠日期

    我有一个数据框 其中包含多个雨量计的降雨测量值 如下例所示 gt rnfl ID date value 1 250 2000 03 01 5 37 2 250 2000 03 02 0 00 3 250 2000 03 03 2 94 4
  • CSR 矩阵 - 矩阵乘法

    我有两个方阵A and B 我必须转换B to CSR Format并确定产品C A B csr C 我在网上找到了很多关于CSR 矩阵 向量乘法 http www mathcs emory edu cheung Courses 561 S
  • 包检查时如何有效处理未压缩的保存?

    在最近开发一个包的过程中 我将数据集包含在data 我的包的文件夹 在我的具体情况下 我有 5 个数据集 所有这些数据集都位于data table格式 尽管我在下面描述的问题仍然存在 如果我将它们保留为data frame 我已将每个人单独
  • ggplot 中跨组的连续线

    我有一个数据时间序列 其中观察了一些数据 模拟了一些数据 我想生成整个数据系列随时间变化的图 其中颜色表示数据源 但是 我只能弄清楚如何使 ggplot 中的 geom line 连接同一组中的点 这是一个例子来说明 Create samp
  • R 中 write.table 文件名中的变量

    请帮助我解决一个幼稚的问题 已经用谷歌搜索 并尝试了很多变体 但失败了 如何使用 R 中 write table 的文件名中的变量保存文件 脚本循环遍历 dir 中的文件 应用一些函数 然后将结果保存到具有相同名称但附加结尾的文件中 谢谢
  • R 条形图中的 X 轴

    我想问一个关于 barplot 轴的问题 首先请看我的数据 SerNo DOY Rain 1 350 0 2 351 0 3 352 0 4 353 0 5 354 0 6 355 0 7 356 0 8 357 0 9 358 0 10
  • 使用 SparkR 1.5 从 RStudio 中的 hdfs 读取大文件(纯文本、xml、json、csv)的选项

    我是 Spark 新手 想知道除了下面的选项之外是否还有其他选项可以使用 SparkR 从 RStudio 读取存储在 hdfs 中的数据 或者我是否正确使用它们 数据可以是任何类型 纯文本 csv json xml 或任何包含关系表的数据
  • 如何在R中逐行写入文件

    我正在尝试逐行读取 csv 文件 并且仅选择左侧的第二个和第三个单元格以及右侧的第三个单元格 例如 如果这一行中有 17 个单元格 我将选取第 15 个单元格 然后我想合并这 3 个单元格 用逗号分隔 然后将此行写入一个新的 csv 文件
  • 带有嵌套分组变量的多行轴标签,用于 - R 中的堆积条形图

    我想使用 ggplot 制作一个包含多个类别的堆叠条形图 并带有嵌套的标记 X 轴 类似于我使用 Excel 制作的条形图 如此处所示 我尝试使用给出的例子here https stackoverflow com questions 181
  • R 中带有边缘箱线图的直方图

    如何使直方图中的 X 轴与边缘箱线图匹配 data lt rnorm 1000 nf lt layout mat matrix c 1 2 2 1 byrow TRUE height c 1 3 layout show nf par mar
  • 分割单个 SpatialPolygons 对象的多边形部分

    在 R 中 我有一个SpatialPolygons包含数百个多边形的对象 即多个多边形 我想分割这个SpatialPolygons对象放入列表中Polygons 即孔应保持连接到父多边形 知道如何做到这一点吗 EDITED 使用以下提供的示
  • 创建序列组合

    我正在尝试解决以下问题 考虑 5 个简单序列 0 100 100 0 rep 0 101 rep 50 101 rep 100 101 我需要 3 个数字变量的集合 它们的所有组合都具有上述序列 由于有 5 个序列和 3 个变量 因此可以有
  • 使用 dplyr 的 select 引用变量名[重复]

    这个问题在这里已经有答案了 通常我会想要选择变量的子集 其中该子集是函数的结果 在这个简单的例子中 我首先获取与宽度特征相关的所有变量名称 library dplyr library magrittr data iris width var
  • 求解非线性方程组

    我正在尝试求解以下四个方程组 我尝试过使用 rootSolve 包 但似乎我无法通过这种方式找到解决方案 我正在使用的代码如下 model lt function x F1 lt sqrt x 1 2 x 3 2 1 F2 lt sqrt
  • 如何处理包内部的 R 数据?

    我正在开发的 R 包需要多个 R 数据对象 例如预先计算的模型和参数 目前 我将包的 数据 目录中的每个对象放在单独的 RData 文件中 使用该包时 用户可以使用 数据 功能将这些对象附加到他们的环境中 我想要的行为是 在加载包时 数据对
  • 替换rmarkdown/knitr/pdf中字幕的自动编号

    我正在使用 Rmarkdown 生成 PDF 文档 我想在其中手动定义图号 下面是一个块的示例 r chunk26 fig cap Fig 5 3 My figure caption plot 1 1 我使用特殊的编号来遵循文档的章节 问题
  • R 在安装包依赖项时不考虑最大版本

    假设我正在开发一个名为magicr做一些统计魔术 我希望它使用另一个名为的包中的函数fairydust 假设 存在于 CRAN 上 很遗憾fairydust刚刚向 CRAN 发布了 2 0 0 版本 完全破坏了我计划使用的功能 所以我更新了

随机推荐

  • 从 NumberPicker 获取 float/double

    我正在尝试https github com SimonVT android numberpicker图书馆和参考是https developer android com reference android widget NumberPick
  • Java批处理:jobContexttransientUserData未通过步骤

    我正在使用 jsr 352 规范的 JBeret 实现 简而言之 这是我的工作配置
  • 同时使用 css 显示图像裁剪图像的顶部和底部

    我正在尝试显示来自 YouTube 的视频图像 显示内容大小 height 180px width 270px 来自 youtube 的图片顶部和底部有一些黑色斑点 ex 我喜欢显示这样的图像 在互联网上搜索答案 发现这些链接很有帮助 但没
  • 为什么 Python 不会通过“-> type”函数定义抛出类型异常? [复制]

    这个问题在这里已经有答案了 在其他语言中 类似示例的任何内容都会引发类型错误 为什么不用Python呢 gt gt gt def foo a int gt str return a 1 gt gt gt foo 5 6 Python 中的类
  • 如何用bash生成0到3之间的随机十进制数?

    我想生成一个从 0 到 3 的随机十进制数 结果应该如下所示 0 2 1 5 2 9 我知道的唯一命令是 echo 0 RANDOM 500 500 但这总是会产生0 xxx 我怎么做 Bash 不支持非整数 您的代码片段刚刚生成一个 50
  • 在 C# 中使用鼠标在运行时调整按钮大小

    我正在使用以下代码在运行时通过鼠标创建和移动按钮 我还想用鼠标调整它们的大小 此代码由 KekuSemau 提供 非常感谢 KekuSemau 的贡献 它帮助了我 private Point Origin Cursor private Po
  • MailTo 在 Android WebView 中不起作用

    我正在开发一个网站的 Android Webview 我有包括mailto用于联系和发送电子邮件给朋友 网站中的代码片段 联系方式 a href email protected a 发送电子邮件给朋友 a href title Email
  • 如何在我的 Android 应用程序中使用 ScreenShotClient

    我正在开发一个应用程序 可以帮助用户捕获 Android 屏幕截图 Android 4 x 我知道 android ICS 上的帧缓冲区已损坏 我听说我们可以使用 ScreenShotClient 来执行此操作 如下所示 Screensho
  • 带下拉列表的 Laravel 5.2 过滤器

    我想做下拉列表过滤 我有一个网页 显示了一些带有标题和类别的帖子 该页面有一个下拉菜单nav blade php 我从类别表动态生成下拉列表 但是 当我选择下拉菜单中的一项 例如类别名称 时 我希望页面仅显示该类别的帖子 我还创建了类别和帖
  • 简单的 istream_iterator 问题

    我是 C 新手 如果这是一个愚蠢的问题 我很抱歉 我似乎无法弄清楚为什么这不起作用 它复制到第一个向量中 并且似乎跳过第二个复制调用 include
  • 在通过 $sce.trustAsHtml 添加的字符串中绑定 Angular js 中的数据

    我正在为遗留系统实现一个网络界面 因此来自服务器的数据是固定的 该服务器数据指定要向用户显示的各种控件 例如组合框 按钮等 我已经解析了服务器数据并通过 sce trustAsHtml 添加了控件的 HTML 问题是控件没有绑定到模型 如果
  • 如何动态获取文本框中datagridview列的总和

    我想获得 datagridview 列的总和并将其显示在文本框中 每次输入后 总和应动态更改 为此 我使用文本框的 textChanged 事件 但是当输入内容时 它不会显示任何结果 我想在文本框中动态获取结果 我想避免使用求和按钮 下面是
  • 导出android库项目以供重用,无需源代码

    出于安全原因 我需要导出没有源代码的库项目 不幸的是 库项目中生成的 jar 文件不包含资源 我不能指望这个图书馆的用户能够处理图书馆所需的任何资源 已经有类似的帖子了 但我还没有看到解决方案 以下食谱曾经有效 尽管我最近没有尝试过 步骤
  • Java 进程 - 无法解压缩 zip 文件

    我正在尝试解压缩一些 zip 文件 它大约有 65 兆 代码片段如下 这个方法实际上解压一个文件 public synchronized void execute Path zipFile final ProcessBuilder buil
  • 动态创建匿名类型? [复制]

    这个问题在这里已经有答案了 我想创建一个可以动态设置属性名称的匿名类型 它不必是匿名类型 我想要实现的就是动态设置任何对象属性名称 它可以是 ExpandoObject 但字典对我不起作用 您有什么建议 Only ExpandoObject
  • Python 3.2.2 open('C:\file.txt') 不起作用

    诚然 我是一个新手 但是 我认为 我按照教程所说的进行了操作 对于我安装的版本 但我无法让 Python 读取文件 其他人遇到过长文件名或路径的问题 但我让我的文件名或路径简短而甜蜜 所以我想 文件本身在一行中包含一个单词 print st
  • XSLT 中的词频计数器

    我正在尝试用 XSLT 制作一个词频计数器 我希望它使用停用词 我开始了迈克尔 凯的书 但我很难让停用词发挥作用 此代码适用于任何源 XML 文件
  • 为空数据框创建异常

    我正在接受用户输入来获取特定股票的历史数据 我想处理 2 个可能的错误 第一个是由于错误输入而生成的错误 并且代码生成错误 第二个是如果输入错误但代码被执行并且我得到一个空数据框 while True try us input Enter
  • 获取对 std::thread::_M_start_thread 的未定义引用

    我正在构建一个使用我从源代码构建的第三方库 Box2D MT 的应用程序 链接时 我收到此未定义的引用错误 b2Threading cpp text ZNSt6threadC2IM12b2ThreadPoolFviEJPS1 iEEEOT
  • 滚动 PCA 并绘制主成分的比例方差

    我使用以下代码来执行 PCA PCA lt prcomp Ret1 center TRUE scale TRUE summary PCA 我得到以下结果 Importance of components PC1 PC2 PC3 PC4 St