全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 R语言论坛
3924 10
2022-05-19
# Initialization
rm(list=ls())
library(stochvol)
set.seed(1000) # for replication
options(digits=17)
vt   = read.table('vft2014.txt',sep = '\t')
T    = dim(vt)[1]
N    = dim(vt)[2]

for (i in 1:N){
        if(min(log(vt[,i]^2))== -Inf){
                vt[,i] = vt[,i] + 0.00001 #offset to avoid taking log of zero
        }
}

# Run MCMC algorithm and store draws
S    = 50000
burn = 50000
m    = matrix(0,T+3,N)
g    = matrix(0,3,N)
for (i in 1:N){
        draws  = svsample(vt[,i],draws=S,burnin=burn,quiet=TRUE,thinpara=10,thinlatent=10)
        all    = cbind(draws$para,draws$latent)
        m[,i]  = colMeans(all)
        g[,i]  = geweke.diag(draws$para)$z
        name   = sprintf('svfdraws%d.txt',i)
#        write(t(all),file=name,ncolumn=dim(all)[2])
}

Error in colMeans(all) : 'x'必需为数值



将循环语句改为也不行

for (i in 1:N){

       draws  =svsample(vt[,i],draws=S,burnin=burn,quiet=TRUE,thinpara=10,thinlatent=10)

       all    =cbind(draws$para,draws$latent)

find.numeric=sapply(all, is.numeric)

       m[,i]  = colMeans(all[,find.numeric])

       g[,i]  =geweke.diag(draws$para)$z

       name   =sprintf('svfdraws%d.txt',i)

#     write(t(all),file=name,ncolumn=dim(all)[2])


}



Error in colMeans(all[,find.numeric]) :
  'x'必需是阵列,而且至少得有两个维度


求大神指教


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2022-5-21 08:11:24
先不用改代码,用str(all)检查all的数据结构和类型,看看svsample的合并结果到底是不是numeric
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2022-5-31 00:23:16
求问楼主解决问题了吗?怎么解决的呀?{{{(>_<)}}}&#128591;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2022-10-10 22:45:46
楼主搞定了吗?我也是同样的问题
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2022-10-11 09:42:11
draws  = svsample(vt[,i],draws=S,burnin=burn,quiet=TRUE,thinpara=10,thinlatent=10)
all    = cbind(draws$para, draws$latent)
上面代码中的cbind的参数,draws$para和draws$latent,mcmc.list的数据类型;用cbind后,不是一个matrix或者data.frame这种矩阵形式。
可通过需要,预处理下这两个对象。
比如cbind(draws$para[[1]], draws$latent[[1]])之类的

如果要提取mcmc对象的信息,不妨试一试
summary(draws)这种现成的函数。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2022-10-11 14:27:00
for (i in 1:N){
        if(min(log(vt[,i]^2))== -Inf){
                vt[,i] = vt[,i] + 0.00001 #offset to avoid taking log of zero
        }
}

如果vt是各一个矩阵(或似矩阵的类型)
vt[vt < 1e-10] <- 1e-5 + vt[vt < 1e-10]
这种写法一行可以替代,表达更清晰自然点。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群