全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 R语言论坛
1585 6
2020-02-06
zonghedata1<-zonghedata
break_year<-2010
T<-break_year-1970+1
n<-2014-break_year
D_all<-matrix(rep(0,17*41), 17,41)
E_all<-matrix(rep(0,17*41),17,41)
m_all<-matrix(rep(0,17*41),17,41)
lnm_all<-matrix(rep(0,17*41),17,41)
for(t in 1:T){
  for (x in 1:17)
  {D_all[x,t]<-zonghedata1[x+17*(t-1),3]
  E_all[x,t]<-zonghedata1[x+17*(t-1),4]
  m_all[x,t]<-D_all[x,t]/E_all[x,t]
  lnm_all[x,t]<-log(m_all[x,t])
  }
}
D<-D_all[,1:t]
E<-E_all[,1:t]
m<-m_all[,1:t]
lnm<-lnm_all[,1:t]
age<-zonghedata1[1:17,2]
year<-as.numeric(levels(factor(zonghedata1[,1])))
#step1:set the start value for a0,b0,k0
a<-c(rep(0,17))
b<-c(rep(1,17))
k<-c(rep(0,41))
#step2: construct the log_likelihood function
logL<-function(a,b,k){
  L<-matrix(rep(NA,17*t),17,t)
  for (x in 1:17) {for(t in 1:T){
    L[x,t]<-D[x,t]*log(1-exp(-exp(a[x]+b[x]*k[t])))-D[x,t]*exp(a[x]+b[x]*k[t])####对数似然函数
  }}
  logL<-sum(L)
  return(logL)
}
#step3:the estimated number of deaths
dd<-function(a,b,k){
  q<-matrix(rep(0,17*t),17,t)
  for(t in 1:T){
    for (x in 1:17) {
      q[x,t]<-1-exp(-exp(a[x]+b[x]*k[t]))
    }
  }
  return(q)
}
#step4:set the iteration rule of a(x)
aa<-function(a,b,k){
  q<-dd(a,b,k)
  for (x in 1:17){
  a[x]<-a[x]-sum((exp(a[x]-b[x]*k[t]))*(D[x,]/q[x,]-E[x,]))/sum((exp(a[x]-b[x]*k[t])*((D[x,]*q[x,]+D[x,]*exp(a[x]+b[x]*k[t])*exp(-exp(a[x]+b[x]*k[t]))))/(q[x,])^2-E[x,]))
  }
  return(a)
}
# step5:set the iteration rule of k(t)
kk<-function(a,b,k){
  q<-dd(a,b,k)
  for (t in 1:T) {k[t]<-k[t]-sum((b*exp(a[x]+b[x]*k[t]))*(D[,t]/q[,t]-E[,t]))/sum((b^2)*exp(a[x]+b[x]*k[t])*(((D[,t]*q[,t]+D[,t]*exp(a[x]+b[x]*k[t])*exp(-exp(a[x]+b[x]*k[t]))))/(q[,t])^2-E[,t]))
  }
  return(k)
}
#step6: set the iteration of b(x)
bb<- function(a,b,k){
  q<-dd(a,b,k)
  for (x in 1:17) {b[x]<-b[x]-sum((k*exp(a[x]+b[x]*k[t]))*(D[x,]/q[x,]-E[x,]))/sum((k^2)*exp(a[x]+b[x]*k[t])*(((D[x,]*q[x,]+D[x,]*exp(a[x]+b[x]*k[t])*exp(-exp(a[x]+b[x]*k[t]))))/(q[x,])^2-E[x,]))
  }
  return(b)
}
#step7:iteration process
j=1
diff_L<-logL(a,b,k)
while(abs(diff_L)>10^(-10))
{logL0<-logL(a,b,k)
if(j%%3==1){a<-aa(a,b,k)}
if(j%%3==2){k<-kk(a,b,k)}
if(j%%3==0){b<-bb(a,b,k)}
logL1<-logL(a,b,k)
diff_L<-logL1-logL0
j=j+1
}
Error in while (abs(diff_L) > 10^(-10)) { :
  missing value where TRUE/FALSE needed
#step8:parameter adjustment
a1<-a
b1<-b
k1<-k
c1<-sum(b1)
c2<-c1*sum(k1)/T
A_MLE<-a1+c2*b/c1
B_MLE<-b1/c1
K_MLE<-c1*k1-c2


提示我出现缺失值,找了好久不都不知道为什么

二维码

扫码加我 拉你入群

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

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

全部回复
2020-2-7 09:24:05
abs(diff_L) > 10^(-10)  是空值
二维码

扫码加我 拉你入群

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

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

2020-2-7 17:01:54
cheetahfly 发表于 2020-2-7 09:24
abs(diff_L) > 10^(-10)  是空值
我换了一个数据就好了,没有提示这个错误,这个while结构应该返回的是一个逻辑值
二维码

扫码加我 拉你入群

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

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

2020-2-8 09:13:11
jacksenone 发表于 2020-2-7 17:01
我换了一个数据就好了,没有提示这个错误,这个while结构应该返回的是一个逻辑值
while结构不是“返回”一个逻辑值,而是“需要”一个逻辑值来执行下一步的代码。
换一个数据就好了,说明代码本身没有问题,是数据的问题,
上一个数据中abs(diff_L) > 10^(-10)应该是个空值或者异常值,这是出错信息告诉我们的,可以循着这个逻辑去寻找具体的错误所在
二维码

扫码加我 拉你入群

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

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

2020-2-9 17:22:46
cheetahfly 发表于 2020-2-8 09:13
while结构不是“返回”一个逻辑值,而是“需要”一个逻辑值来执行下一步的代码。
换一个数据就好了,说明 ...
感谢感谢
二维码

扫码加我 拉你入群

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

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

2020-2-18 16:17:38
已解决
二维码

扫码加我 拉你入群

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

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

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

说点什么

分享

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