我想创建一个可用于不同数据集的函数。这是我的功能(我把它作为源代码):
#Log-likelihood function
likfunc<-function(para,dat){
alpha<-para[1]
lambda<-para[2]
a<-log(para[1])+log(para[2])+(para[1]-1)*log(dat$z)
b<-para[2]*(dat$z)^para[1]
return((dat$d*a)+b)
}
然后我尝试运行以下代码(这是第一组数据):
library(maxLik)
set.seed(201)
u<-runif(20,min=0,max=1) #to simulate t
c<-rexp(20,rate=0.05)
t<-(-log(u)/0.5)^(1/2) #initial vale alpha=2,lambda=0.5
z<-pmin(t,c)
d<-as.numeric(c>t)
samp<-cbind(t,c,z,d)
data<-as.data.frame(samp)
mle<-maxLik(logLik=likfunc(para,data),start=c(alpha=2,lambda=0.5))
mle
但是R回归: likfunc(para,data)出错:找不到对象'para'
我在做模拟。以前我每次有新数据集时都会运行该函数。然后我得到一个建议,因为我的代码将使R工作更多,并且完成模拟需要很长时间。有人可以帮忙吗?谢谢。
答案 0 :(得分:0)
首先,错误消息是因为您尚未在全局环境中定义对象 para 。另一方面,maxLik有一个函数作为参数,所以不应该评估函数,而应该调用它:
library(maxLik)
# Define the function only with para as argument
likfunc<-function(para){
alpha<-para[1]
lambda<-para[2]
# Call dat inside the function as it will be defined in the global environment
a<-log(para[1])+log(para[2])+(para[1]-1)*log(dat$z)
b<-para[2]*(dat$z)^para[1]
return((dat$d*a)+b)
}
# Your example
set.seed(201)
u<-runif(20,min=0,max=1) #to simulate t
c<-rexp(20,rate=0.05)
#para <- c(alpha = 2, lambda = 0.5) #initial value alpha=2,lambda=0.5
t<-(-log(u)/2)^(0.5)
z<-pmin(t,c)
d<-as.numeric(c>t)
samp<-cbind(t,c,z,d)
# dat defined in the global environment
dat<-as.data.frame(samp)
mle<-maxLik(logLik=likfunc,start=c(alpha=2,lambda=0.5))
mle