全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 R语言论坛
3731 4
2017-03-13
rm(list=ls(all=TRUE))
library(LearnBayes)  ##multivariate M-H
library(SuppDists)##Sampling inverse Gaussian
library(bayesm)###截尾正态分布
#### real values
theta<-1.2 # 1.000125 10
sigma<-1.5# 0.019   5
mu<-1.81  #0.00395   5
T<-200 #外循环
###########################################
t<-c(0,100,400,1000,2000) #seq(0,1500,by=50)
lt<-length(t) ##
lamda<-rep(0,lt-1)
for(i in 2:length(t)){
  lamda[i-1]<-t-t[i-1]
}
S0<-50
S<-c(83,133,173) ##Stress
s<-numeric(3)
for(i in 1:3){   ##标准化stress
  s=(1/S-1/S0)/(1/S[3]-1/S0)
}
h<-s
h<-numeric(3)
for(i in 1:3){
  h=s/s[1]
}
sn<-c(50,50,50)#######每个压力水平下的样本个数
N<-sn*(lt-1)  ##每个压力水平下总共的样本点数
sN<-sum(N)

########## defined function #################
lamdai<-sum(lamda)*sn


#####定义后验所需函数######
fphi<-function(params){#(theta,sigma,mu)
  alpha<-sum(y1^2/(2*params[1]^h[1]*lamda))+sum(y2^2/(2*params[1]^h[2]*lamda))+sum(y3^2/(2*params[1]^h[3]*lamda))
  beta<-sum(y1/params[1]^h[1])+sum(y2/params[1]^h[2])+sum(y3/params[1]^h[3])
  gamma<-lamdai[1]/(2*params[1]^h[1])+lamdai[2]/(2*params[1]^h[2])+lamdai[3]/(2*params[1]^h[3])
  phi<-(alpha-beta*params[3]+params[3]^2*gamma)/(2*params[2]^2)                  
  return(phi)
}

######pij####
transpostpij<-function(theta0){
  theta<-exp(theta0[1])+1
  sigma<-exp(theta0[2])
  mu<-exp(theta0[3])
  logphi2<--sN*log(2*pi)/2-(sN+1)*log(sigma)-
    (h[1]*N[1]+h[2]*N[2]+h[3]*N[3]+2)*log(theta)/2-
    fphi(c(theta,sigma,mu))-lamdayijk+theta0[1]+theta0[2]+theta0[3]
  return(logphi2)
}


####################compute################
start=c(0,1,1)
iteration=2000
probs=seq(0,1,by=0.01)

paramspij<-matrix(0,nrow = T,ncol = 3)

CPsigma<-numeric(4)    ##用于累计sigma覆盖个数
CPtheta<-numeric(4)   ##用于累计theta覆盖个数
CPmu<-numeric(4)   ##用于累计mu覆盖个数

for (k in 1:T) {
  ##sampling delta y1
  y1<-matrix(0,ncol = sn[1],nrow = lt-1)
  for(j in 1:sn[1]){
    for (i in 1:(lt-1)) {
      y1[i,j]<-rnorm(1,mu*lamda, (sigma*theta^h[1]*lamda)^1/2)
    }
  }
  ##sampling delta y2
  y2<-matrix(0,ncol = sn[2],nrow = lt-1)
  for(j in 1:sn[2]){
    for (i in 1:(lt-1)) {
      y2[i,j]<-rnorm(1,mu*lamda, (sigma*theta^h[2]*lamda)^1/2)
    }
  }
  ##sampling delta y3
  y3<-matrix(0,ncol = sn[3],nrow = lt-1)
  for(j in 1:sn[3]){
    for (i in 1:(lt-1)) {
      y3[i,j]<-rnorm(1,mu*lamda, (sigma*theta^h[3]*lamda)^1/2)
    }
  }

  lamdayijk<-sum(sn)*(log(lamda[1]*lamda[2]*lamda[3]*lamda[4]))
  #############################################

  #######pij
  laplacefit=laplace(transpostpij,start)###这一步是套用别人的公式
  proposal=list(var=laplacefit$var,scale=1.5)###运行报错就是在两步
  sj=rwmetrop(transpostpij,proposal,laplacefit$mode,iteration)
  Btheta<-exp(sj$par[,1])+1
  Bsigma<-exp(sj$par[,2])
  Bmu<-exp(sj$par[,3])
  paramspij[k,]<-c(mean(Btheta),mean(Bsigma),mean(Bmu))
  #####
  cisigma<-c(quantile(Bsigma,0.025),quantile(Bsigma,0.975))
  citheta<-c(quantile(Btheta,0.025),quantile(Btheta,0.975))
  cimu<-c(quantile(Bmu,0.025),quantile(Bmu,0.975))
  if(sigma>cisigma[1]&&sigma<cisigma[2]){CPsigma[1]<-CPsigma[1]+1}
  if(theta>citheta[1]&&theta<citheta[2]){CPtheta[1]<-CPtheta[1]+1}
  if(mu>cimu[1]&&mu<cimu[2]){CPmu[1]<-CPmu[1]+1}
  plot(1,1,xlab=k)
}

######

这是报错
Error in chol.default(proposal$var) :
  the leading minor of order 3 is not positive definite
In addition: Warning message:
In log(det(h)) : NaNs produced


二维码

扫码加我 拉你入群

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

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

全部回复
2017-3-13 12:13:39
如果改变参数值的话也可能是这种报错the leading minor of order1/2 is not positive definite.
如果不会出错,但抽样得到的参数MSE和覆盖率很差。明显有问题。


二维码

扫码加我 拉你入群

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

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

2017-3-13 20:05:44
not positive definite    要保证是正定矩阵
二维码

扫码加我 拉你入群

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

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

2017-3-14 11:09:39
bbslover 发表于 2017-3-13 20:05
not positive definite    要保证是正定矩阵
我可以理解为输入某些参数可以保证是正定的,可以抽样计算,但是另外一些参数就不是正定的了所以报错吗?
二维码

扫码加我 拉你入群

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

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

2017-3-14 11:10:28
bbslover 发表于 2017-3-13 20:05
not positive definite    要保证是正定矩阵
the leading minor of order 3
这是说什么位置不是正定的呢?
二维码

扫码加我 拉你入群

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

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

相关推荐
栏目导航
热门文章
推荐文章

分享

扫码加好友,拉您进群