Я просто бьюсь головой о стену, пытаясь заставить работать разложение Холецкого, чтобы смоделировать коррелированные движения цен.
Я использую следующий код:
cormat <- as.matrix(read.csv("http://pastebin.com/raw/qGbkfiyA"))
cormat <- cormat[,2:ncol(cormat)]
rownames(cormat) <- colnames(cormat)
cormat <- apply(cormat,c(1,2),FUN = function(x) as.numeric(x))
chol(cormat)
#Error in chol.default(cormat) :
# the leading minor of order 8 is not positive definite
cholmat <- chol(cormat, pivot=TRUE)
#Warning message:
# In chol.default(cormat, pivot = TRUE) :
# the matrix is either rank-deficient or indefinite
rands <- array(rnorm(ncol(cholmat)), dim = c(10000,ncol(cholmat)))
V <- t(t(cholmat) %*% t(rands))
#Check for similarity
cor(V) - cormat ## Not all zeros!
#Check the standard deviations
apply(V,2,sd) ## Not all ones!
Я не совсем уверен, как правильно использовать оператор pivot = TRUE
для генерации моих коррелированных движений. Результаты выглядят совершенно фальшивыми.
Даже если у меня есть простая матрица, и я попробую "разворот", я получу фальшивые результаты ...
cormat <- matrix(c(1,.95,.90,.95,1,.93,.90,.93,1), ncol=3)
cholmat <- chol(cormat)
# No Error
cholmat2 <- chol(cormat, pivot=TRUE)
# No warning... pivot changes column order
rands <- array(rnorm(ncol(cholmat)), dim = c(10000,ncol(cholmat)))
V <- t(t(cholmat2) %*% t(rands))
#Check for similarity
cor(V) - cormat ## Not all zeros!
#Check the standard deviations
apply(V,2,sd) ## Not all ones!
cormat
действительно p.d. но имеет некоторые собственные значения, которые близки к нулю, что вызывает числовые затруднения. Вы можете доказать или опровергнуть это, вычислив собственные значения. Кстати, а каково происхождениеcormat
? Если у вас есть некоторый контроль над этим, можете ли вы гарантировать, чтоcormat
будет более определенным? (например, добавьте постоянный множитель к диагонали или сконструируйте его таким образом, чтобы гарантировать p.d.-ness.) - person Robert Dodier   schedule 11.02.2016