用户在R程序中指定的功能

时间:2015-01-12 05:56:36

标签: r functional-programming

我想创建一个可用于不同数据集的函数。这是我的功能(我把它作为源代码):

#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工作更多,并且完成模拟需要很长时间。有人可以帮忙吗?谢谢。

1 个答案:

答案 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