如果R中有任何函数可以估算多变量t分布的df,我想知道。
问题很简单:我有一个包含5个变量(列)的矩阵,其中包含75个观察值(行)。我想估计该样本的多变量t的df。
谢谢,
涓。
*** 版本:在fabians建议之后我实施了dmvt()公式 < EM> * ** *
# "residuals" is a matrix with residuals from a model. I want to estimate the df of
# that sample assuming multivariate-t
sigma<-cor(residuals, use="pairwise.complete.obs", method="pearson")
my_means<-vector(length = 8)
for (i in 1:8){
my_means[i]<-mean(my_matrix[,i])
}
residuals.scaled<-scale(residuals)
df.1 <-dmvt(residuals.scaled, my_means, sigma, log= FALSE, type = "shifted", df = 1)
我有一些疑问: 1)缩放:我也是数据的中心。不知道这是否正确。 2)使用log = FALSE,因为我不知道为什么在我的情况下应该以log(d)给出密度 3)从这里我应该估计每个df的样本数据的相似性。因此,应添加更多代码行,如df.2,df.3等,然后计算每个代码行的可能性。然后,选择最高。那是对的吗?
答案 0 :(得分:1)
包mvtnorm
提供函数dmvt
中(移位的)多元t分布的密度。您可以输入(缩放的)数据及其样本相关性,并计算不同值df
的数据的可能性。选择最大化数据可能性的df
值。
编辑:
library(mvtnorm)
set.seed(12121212)
################################################################################
## simulate n vectors of p-dim. t-distributed data in matrix X:
n <- 300
p <- 8
# draw random column means
means <- 10 * rnorm(p)
# correlation is AR(1) with correlation rho=.8
rho <- 0.8
sigma <- rho ^ abs(outer(1:p, 1:p, "-"))
# column s.d.s are sqrt(1:8)
df <- 3
X <- t(t(rmvt(n, sigma=sigma, delta=means, df=df)) * sqrt(1:8))
################################################################################
# evaluate t-likelihood for scaled X:
X_scale <- scale(X)
sigma_est <- cor(X_scale)
df_candidates <- seq(1, 20, by=2)
loglik <- numeric(length(df_candidates))
names(loglik) <- df_candidates
for(df in df_candidates){
# no need for delta since we're working on scaled & centered data.
# use sum(log(likelihood)), not prod(likelihood) to avoid numeric over/underflow
loglik[as.character(df)] <- sum(dmvt(x=X_scale, sigma=sigma_est,
df=df, log=TRUE))
}
loglik
# 1 3 5 7 9 11 13
#-1788.219 -1756.301 -1768.885 -1783.724 -1797.386 -1809.556 -1820.382
# 15 17 19
#-1830.066 -1838.788 -1846.698
## --> maximal for df=3, as used for the simulation.
## verify that mean shift can be incorporated into pre-processing as above:
dmvt(X[1,], delta=means) == dmvt(X[1,] - means)
#[1] TRUE