![](/img/trans.png)
[英]How to solve: the condition has length > 1 and only the first element will be used
[英]how to solve this problem in R: In while (t <= cc[i]) { ... : the condition has length > 1 and only the first element will be used
我选择除法 0 = d0 < d1 < 。 . . < dm =tau,然后,对于 t ∈ (dj−1, dj ],强度函数 λ(t) 等于 λj。
我的数据集
parlocation<-125.0949
parscale<-34.98857
tau<-365
trendlinier$coefficients[1]<-78.37888
trendlinier$coefficients[2]<--5.809776
lambdaj<-c(8.665351,178.934646,161.189187,57.680814,43.540869,102.405160,108.003538,157.690273,138.600075,269.314099,353.897407,197.891330)
deretbln2<-c(0,31,62,90,121,151,182,212,243,274,304,335,365)
然后,我为 R 中的 λ(t) 创建这个函数
lambda2 <- function(t){for (i in 1:12) {while (t <=deretbln2[i]) {return(lambdaj[i-1])}}}
我也在 R 中创建了这个函数
FU0 <- function(t){pcauchy((tau-t)*trendlinier$coefficients[1]/((trendlinier$coefficients[2]*t)+trendlinier$coefficients[1]),location=parlocation,scale=parscale)}
intensityIBNR <- function(t){lambda2(t)*(1-FU0(t))}
当我运行此代码时
c <- integrate(f=intensityIBNR, lower=0, upper=tau,
subdivisions=200)
它的结果是这样的
There were 50 or more warnings (use warnings() to see the first 50)
> warnings()
Warning messages:
1: In while (t <= deretbln2[i]) { ... :
the condition has length > 1 and only the first element will be used
请帮我解决这个问题..
边上的几点说明:
1) 对象trendlinier
在您的 MWE 中不存在; 因此, trendlinier$coefficients[1]
应该以错误结束。 我们需要先将该对象实例化为
trendlinier <- list(coefficients = NULL)
2)我建议不要在R 中使用t
或c
作为对象名称,因为两者都用于函数名称; 而是使用tt
或cc
(或者更好,具有更多含义的变量名称); 让我们继续使用tt
和cc
(并将lambda2
- 函数放在一边),我们将获得
parlocation<-125.0949
parscale<-34.98857
tau<-365
trendlinier$coefficients[1]<-78.37888
trendlinier$coefficients[2]<--5.809776
lambdaj<-c(8.665351,178.934646,161.189187,57.680814,43.540869,102.405160,108.003538,157.690273,138.600075,269.314099,353.897407,197.891330)
deretbln2<-c(0,31,62,90,121,151,182,212,243,274,304,335,365)
FU0 <- function(tt){pcauchy((tau-tt)*trendlinier$coefficients[1]/((trendlinier$coefficients[2]*tt)+trendlinier$coefficients[1]),location=parlocation,scale=parscale)}
intensityIBNR <- function(tt){lambda2(tt)*(1-FU0(tt))}
cc <- integrate(f=intensityIBNR, lower=0, upper=tau, subdivisions=200)
现在,请注意R的索引从 1 开始; 即关于for
-loop在lambda2
-function,对于i=1
,没有lambdaj[i-1]
您需要为i=1
和i>1
考虑并实现不同的例程(或向lambdaj
添加默认值;例如,如果0
在这种情况下是lambdaj <- c(0, lambdaj)
值,则lambdaj <- c(0, lambdaj)
)。 (旁边的另一个评论:语句while (expression) { return }
是if
子句的一个不寻常的实现)。 如果你不想改变lambdaj
你可以使用
lambda2 <- function(tt){for (i in 1:12) {if (i == 1) return(0) else if (tt <= deretbln2[i]) return(lambdaj[i-1])}}
PS:这不是排版R代码的最佳方式(参见Hadley 的风格指南)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.