r - 计算协方差矩阵并从 R 中的 cov() 中查看 NA 值
问题描述
我有以下价格数据:
treas <- read.csv(file = 'treas.csv', header = TRUE, stringsAsFactors = FALSE)
2YR 3YR 5YR 7YR 10YR 30YR
0.41 0.85 1.65 2.18 2.6 3.43
0.41 0.85 1.65 2.2 2.61 3.45
0.4 0.82 1.63 2.17 2.59 3.44
0.41 0.86 1.66 2.19 2.6 3.44
0.43 0.88 1.69 2.22 2.62 3.45
0.45 0.93 1.71 2.24 2.64 3.47
0.44 0.91 1.7 2.23 2.65 3.47
0.42 0.88 1.66 2.17 2.58 3.41
0.45 0.93 1.7 2.21 2.6 3.41
0.49 0.95 1.71 2.21 2.61 3.4
0.51 0.99 1.77 2.27 2.66 3.44
0.48 0.95 1.71 2.21 2.61 3.43
0.48 0.94 1.71 2.22 2.64 3.47
0.5 0.94 1.71 2.22 2.63 3.44
0.48 0.96 1.72 2.23 2.63 3.45
0.49 0.95 1.7 2.19 2.59 3.41
0.48 0.92 1.68 2.17 2.57 3.38
0.46 0.9 1.64 2.14 2.53 3.35
0.45 0.88 1.64 2.14 2.54 3.36
0.47 0.88 1.62 2.13 2.53 3.34
0.47 0.9 1.66 2.17 2.58 3.4
0.49 0.95 1.71 2.22 2.64 3.46
0.52 0.98 1.74 2.25 2.65 3.47
0.52 1 1.74 2.24 2.63 3.44
0.51 0.99 1.7 2.19 2.58 3.38
0.51 0.97 1.68 2.17 2.57 3.37
0.46 0.93 1.66 2.15 2.55 3.38
0.48 0.92 1.65 2.13 2.53 3.34
0.48 0.95 1.68 2.17 2.55 3.36
我使用该apply()
函数遍历所有列并使用Delt()
Quantmod 包中的函数计算每日收益。
apply(treas, 2, Delt)
这给了我们:
> treas_ret
X2YR X3YR X5YR X7YR X10YR X30YR
[1,] NA NA NA NA NA NA
[2,] 0.000000000 0.000000000 0.000000000 0.009174312 0.003846154 0.005830904
[3,] -0.024390244 -0.035294118 -0.012121212 -0.013636364 -0.007662835 -0.002898551
[4,] 0.025000000 0.048780488 0.018404908 0.009216590 0.003861004 0.000000000
[5,] 0.048780488 0.023255814 0.018072289 0.013698630 0.007692308 0.002906977
[6,] 0.046511628 0.056818182 0.011834320 0.009009009 0.007633588 0.005797101
[7,] -0.022222222 -0.021505376 -0.005847953 -0.004464286 0.003787879 0.000000000
[8,] -0.045454545 -0.032967033 -0.023529412 -0.026905830 -0.026415094 -0.017291066
[9,] 0.071428571 0.056818182 0.024096386 0.018433180 0.007751938 0.000000000
[10,] 0.088888889 0.021505376 0.005882353 0.000000000 0.003846154 -0.002932551
[11,] 0.040816327 0.042105263 0.035087719 0.027149321 0.019157088 0.011764706
[12,] -0.058823529 -0.040404040 -0.033898305 -0.026431718 -0.018796992 -0.002906977
[13,] 0.000000000 -0.010526316 0.000000000 0.004524887 0.011494253 0.011661808
[14,] 0.041666667 0.000000000 0.000000000 0.000000000 -0.003787879 -0.008645533
[15,] -0.040000000 0.021276596 0.005847953 0.004504505 0.000000000 0.002906977
[16,] 0.020833333 -0.010416667 -0.011627907 -0.017937220 -0.015209125 -0.011594203
[17,] -0.020408163 -0.031578947 -0.011764706 -0.009132420 -0.007722008 -0.008797654
[18,] -0.041666667 -0.021739130 -0.023809524 -0.013824885 -0.015564202 -0.008875740
[19,] -0.021739130 -0.022222222 0.000000000 0.000000000 0.003952569 0.002985075
[20,] 0.044444444 0.000000000 -0.012195122 -0.004672897 -0.003937008 -0.005952381
[21,] 0.000000000 0.022727273 0.024691358 0.018779343 0.019762846 0.017964072
[22,] 0.042553191 0.055555556 0.030120482 0.023041475 0.023255814 0.017647059
[23,] 0.061224490 0.031578947 0.017543860 0.013513514 0.003787879 0.002890173
[24,] 0.000000000 0.020408163 0.000000000 -0.004444444 -0.007547170 -0.008645533
[25,] -0.019230769 -0.010000000 -0.022988506 -0.022321429 -0.019011407 -0.017441860
[26,] 0.000000000 -0.020202020 -0.011764706 -0.009132420 -0.003875969 -0.002958580
[27,] -0.098039216 -0.041237113 -0.011904762 -0.009216590 -0.007782101 0.002967359
[28,] 0.043478261 -0.010752688 -0.006024096 -0.009302326 -0.007843137 -0.011834320
[29,] 0.000000000 0.032608696 0.018181818 0.018779343 0.007905138 0.005988024
最后,我将新创建的treas_ret
数据框传递给cov()
函数。
不幸的是,我们得到:
X2YR X3YR X5YR X7YR X10YR X30YR
X2YR NA NA NA NA NA NA
X3YR NA NA NA NA NA NA
X5YR NA NA NA NA NA NA
X7YR NA NA NA NA NA NA
X10YR NA NA NA NA NA NA
X30YR NA NA NA NA NA NA
str(treas_ret)
给我们:
- attr(*, "dimnames")=List of 2
..$ : NULL
..$ : chr [1:6] "X2YR" "X3YR" "X5YR" "X7YR" ...
我试图传递treas_ret
给该as.numeric
函数,但这似乎不起作用。
在传递给 cov() 函数之前,有没有办法确保每日收益是数字的?
谢谢!
解决方案
treas_ret
已经是一个数值矩阵。这是由于NA
矩阵中存在 s ,NA
您在使用 时会获得所有值cov
。
您可以删除NA
s 然后使用cov
library(quantmod)
treas_ret <- apply(treas, 2, function(x) na.omit(Delt(x)))
cov(treas_ret)
# X2YR X3YR X5YR X7YR X10YR X30YR
#X2YR 0.00189071490 0.0009671260 0.0004751261 0.0003592459 0.0002632325 0.00006466673
#X3YR 0.00096712596 0.0009824173 0.0004852795 0.0003843313 0.0002665753 0.00014473384
#X5YR 0.00047512612 0.0004852795 0.0003163515 0.0002553111 0.0001938068 0.00011919805
#X7YR 0.00035924594 0.0003843313 0.0002553111 0.0002219907 0.0001694694 0.00011048543
#X10YR 0.00026323252 0.0002665753 0.0001938068 0.0001694694 0.0001472908 0.00010040032
#X30YR 0.00006466673 0.0001447338 0.0001191980 0.0001104854 0.0001004003 0.00008497829
另一种选择是use = "complete.obs"
按照@H1 的建议使用,它给出了相同的结果。
treas_ret <- apply(treas, 2, Delt)
cov(treas_ret, use = "complete.obs")
推荐阅读
- kubernetes - 掌舵升级时出现集群类型错误
- pandas - 在同一列中查找具有非空值的行
- php - 您提供的来源不在收费状态 Stripe
- php - 计算 1 到 1000 范围内出现了多少个数字 5
- python - 每天在网页上生成加密文件
- python - 如何使用 pyspark 从数据框的日期列中提取年份
- assembly - LC3程序电源功能?
- angular - 在 Angular 中确定“组件值的变化”是否是检测到的变化的结果
- visual-studio-2019 - 为不同的发布文件分配不同的 sql 脚本
- ios - SwiftUI MVVM 发布的 var 未在不同视图之间更新