问题描述
我有一个数据集x
.我使用cov(x)
来计算x
的协方差.我想计算cov(x)
的平方根倒数.但是我得到cov(x)
的负特征值.
I have a data set x
. And I use cov(x)
to calculate the covariance of x
. I want to calculate the inverse square root of cov(x)
. But I get negative eigenvalue of cov(x)
.
这是我的代码
S11=cov(x)
S=eigen(S11,symmetric=TRUE)
R=solve(S$vectors %*% diag(sqrt(S$values)) %*% t(S$vectors))
这是S
的特征值.
c(0.897249923338732, 0.814314811717616, 0.437109871173458, 0.334921280373883,
0.291910583884559, 0.257388456770167, 0.166787180227719, 0.148268784967556,
0.121401731579852, 0.0588333377333529, 0.0519459283467876, 0.0472867806813002,
0.0438199555429584, 0.0355421239839632, 0.0325106968911777, 0.0282860419784165,
0.0222240269478354, 0.0174657163114068, 0.012318267910606, 0.00980611646284724,
0.00969450391092417, 0.00804912897151307, 0.00788628666010145,
0.00681419055130702, 0.00664707528670254, 0.00591471779140177,
0.00581608875646686, 0.0057489828718098, 0.00564645095578336,
0.00521029715741059, 0.00503304953884416, 0.0048677189522647,
0.00395692706081966, 0.00391665618240403, 0.00389825739725093,
0.00383611535401152, 0.00374242176786387, 0.0035160324422885,
0.00299245160843966, 0.0029501156885799, 0.00289484923017341,
0.00287327878694529, 0.0028447265712214, 0.00274130080219099,
0.00273159993035393, 0.00265595612239575, 0.00261856622830277,
0.0020004125628823, 0.00199834766485368, 0.00199579695856402,
0.00198945452395265, 0.00197999810684363, 0.00195954105720554,
0.00195502875017394, 0.00194143254092788, 0.00192530399875842,
0.00191287435824908, 0.00187418676921454, 0.00184304720875652,
0.00181132707713659, 0.00167004122321738, 0.00132136106130093,
0.001001001001001, 0.001001001001001, 0.001001001001001, 0.00100089827907564,
0.000999613336959707, 0.000999285885989665, 0.000995390174780253,
0.000990809217795241, 0.000987333916025995, 0.000984260717691378,
0.000982735942052615, 0.000971684328336702, 0.000964125499180901,
0.000961900381008093, 0.000947883827257506, 0.000922293473088298,
0.000862086463606162, 0.000829687294735196, 0.000732694198613695,
1.95782839335209e-17, 4.13905030077713e-18, 2.02289095736911e-18,
8.72989281345777e-19, 3.79161425300691e-19, -7.97468731082902e-20)
推荐答案
虽然理论上估计的协方差矩阵必须为正(半)定值,即没有负值,但实际上浮点误差会违反此规定.对我来说,87×87矩阵可能具有很小的负(约-1 * 10 ^(-19))特征值.
While in theory an estimated covariance matrix must be positive (semi-)definite, i.e. no negative values, in practice floating-point error can violate this. To me it's no surprise that an 87-by-87 matrix could have a tiny negative (about -1*10^(-19)) eigenvalue.
根据您要执行的操作,可以使用Matrix
包中的?nearPD
强制将协方差矩阵设为正定值:
Depending on what you want to do, you could use ?nearPD
from the Matrix
package to force your covariance matrix to be positive-definite:
此外,首先计算矩阵的Cholesky分解(?chol
)然后求反可能会更有效(原则上这很容易-我认为您可以使用backsolve()
).
Also, it will probably be more efficient to compute the Cholesky decomposition (?chol
) of your matrix first and then invert it (this is easy in principle -- I think you can use backsolve()
).
这篇关于R中协方差矩阵的特征值之一为负的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!