R语言Weibull分布成本率计算函数调用报错排查
问题分析与解决方案
首先,你的报错原因完全命中了你的猜测——内部定义的cum、survival函数,尤其是用于积分的cycle_length,没有正确获取到外部函数CR_age中的lambda和k参数。
具体来说,问题出在integrate(cycle_length, 0, T)这一行:你用Vectorize(survival, "T")生成了cycle_length,但这个向量化后的函数只被设置为接收T参数。当integrate调用它时,只会传入积分区间内的T值,完全没传递lambda和k,而survival本身需要这三个参数,所以R会提示lambda缺失。
下面给你两种可行的修正方案:
方案1:让内部函数直接捕获外部参数
修改内部的cum和survival函数,去掉参数列表里的lambda和k,让它们直接从CR_age的函数环境中读取这两个参数:
CR_age <- function(T,lambda,k,cpm,ccm) { cum <- function(T) { return(1 - exp((-T/lambda)^k)) } survival <- function(T) { return(exp((-T/lambda)^k)) } mean_cost <- ccm * cum(T) + cpm * survival(T) cycle_length <- Vectorize(survival, "T") mean_cycle_length <- integrate(cycle_length, 0, T) costRate <- mean_cost / mean_cycle_length$value return(costRate) }
方案2:调用integrate时显式传递额外参数
如果你想保留内部函数的完整参数列表,那可以在调用integrate时,通过...参数把lambda和k传递给cycle_length:
CR_age <- function(T,lambda,k,cpm,ccm) { cum <- function(T,lambda,k) { return(1 - exp((-T/lambda)^k)) } survival <- function(T,lambda,k) { return(exp((-T/lambda)^k)) } mean_cost <- ccm * cum(T,lambda,k) + cpm * survival(T,lambda,k) cycle_length <- Vectorize(survival, "T") # 这里添加lambda和k作为额外参数传递给cycle_length mean_cycle_length <- integrate(cycle_length, 0, T, lambda=lambda, k=k) costRate <- mean_cost / mean_cycle_length$value return(costRate) }
现在你再调用CR_age(2,0.1,1,3,1),就可以正常计算成本率了。
内容的提问来源于stack exchange,提问作者Deng Cheng Long
相关产品推荐
相关产品推荐

