开发EM算法时遇R语言报错:object of type 'closure' is not subsettable
问题修复方案
核心错误原因
- 函数名与R内置常量冲突:你将CDF函数命名为
F,但F是R的内置逻辑常量(等价于FALSE),这会导致调用时出现类型混淆,触发object of type 'closure' is not subsettable错误。 - 未定义变量
frame:Aa函数中直接使用frame$y[j],但frame未被定义或传入函数,无法访问样本数据。 - 函数依赖全局变量:
Aa函数依赖全局环境中的数据,不符合函数封装原则,易引发变量作用域问题。
具体修复步骤
1. 重命名CDF函数
将原CDF函数F改为F_IPLE,避免与内置常量冲突:
# 修改后的CDF OF IPLE DISTRIBUTION F_IPLE <- function(alpha,beta,lambda,x){ y=1/((exp(lambda/(x)^beta)-1)^alpha +1) return(y) }
2. 定义样本数据变量
调用bl生成样本后,将结果赋值给frame:
n<-40 m<-10 par<-c(0.5,0.45,0.2) # 生成样本并赋值给frame frame <- bl(n,m,par)
3. 修改Aa函数,传入样本数据参数
修改Aa函数,新增data参数接收样本数据,替换原frame的使用,并更新CDF函数调用为F_IPLE:
# 修改后的积分函数 Aa <- function(par, m, data){ alpha <- par[[1]] beta <- par[[2]] lambda <- par[[3]] y <- numeric(m) # 预分配内存更高效 c_vec <- numeric(m) for(j in 1:m){ # 使用传入的data参数,调用重命名后的CDF函数 c_vec[j] <- 1/(1 - F_IPLE(alpha,beta,lambda, data$y[j])) g <- function(x){ log(x)*f(alpha,beta,lambda,x) } y[j] <- c_vec[j] * integrate(g, lower = data$y[j], upper=Inf)$value } return(y) }
4. 正确调用Aa函数
传入生成的样本数据:
Aa(par, m, frame)
修改后的完整代码示例
# The PDF of IPLE distribution f <- function(alpha,beta,lambda,x){ y=alpha*beta*lambda*(x)^(-beta-1)*exp((lambda/(x)^beta))*(exp((lambda/(x)^beta))-1)^(alpha-1)*((exp(lambda/(x)^beta)-1)^alpha +1)^(-2) return(y) } # 修改后的CDF OF IPLE DISTRIBUTION F_IPLE <- function(alpha,beta,lambda,x){ y=1/((exp(lambda/(x)^beta)-1)^alpha +1) return(y) } # GENERATING PROGRESSIVE TYPE II CENSORED SAMPLE bl <- function(n,m,par){ alpha=par[[1]] beta=par[[2]] lambda=par[[3]] regw<-function(x,aalpha=alpha,bbeta=beta,llambda=lambda){ q=llambda^(1/bbeta)*(log(((1/x)-1)^(1/aalpha)+1))^(-(1/bbeta)) return(q)} w=runif(m) r=c() r[1]=rbinom(1,n-m,0.2) int=seq(2,m-1) s=r[1] for(i in int){ r[i]=rbinom(1,n-m-s,0.2) s=s+r[i]} if(n-m-s>0) r[m]=n-m-s else r[m]=0 p=c() x=c() v=c() u=c() y=c() p=r[m] for (i in 1:m){ v[i]=w[i]^(1/(i+p)) p=p+r[m-i] } x=v[m] for (i in 1:m){ u[i]=1-x x=x*v[m-i] y[i]=regw(u[i],alpha,beta,lambda) } D=data.frame(y,r) return(D) } n<-40 m<-10 par<-c(0.5,0.45,0.2) # 生成样本并赋值给frame frame <- bl(n,m,par) # 修改后的积分函数 Aa <- function(par, m, data){ alpha <- par[[1]] beta <- par[[2]] lambda <- par[[3]] y <- numeric(m) c_vec <- numeric(m) for(j in 1:m){ c_vec[j] <- 1/(1 - F_IPLE(alpha,beta,lambda, data$y[j])) g <- function(x){ log(x)*f(alpha,beta,lambda,x) } y[j] <- c_vec[j] * integrate(g, lower = data$y[j], upper=Inf)$value } return(y) } # 正确调用Aa函数 Aa(par, m, frame)
内容的提问来源于stack exchange,提问作者MUIA DOMINIC MUTISO
相关产品推荐
相关产品推荐

