R中多元t分布的估计

时间:2014-03-10 08:07:57

标签: r

如果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等,然后计算每个代码行的可能性。然后,选择最高。那是对的吗?

1 个答案:

答案 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