用户在R程序中指定的功能 [英] user specified function in R program

查看:106
本文介绍了用户在R程序中指定的功能的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

 #对数似然函数
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)#模拟t
c <-rexp(20,rate = 0.05)
t < - ( - log(u)/0.5)^(1 / 2)#初始值α= 2,λ= 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更加工作,并且需要很长时间才能完成模拟。任何人都可以帮忙吗?谢谢。

解决方案

首先,错误信息是因为您尚未定义对象 para 全球环境。另一方面,maxLik有一个作为参数的函数,所以不要评估函数,而应该调用它:

  library(maxLik )
#仅以para作为参数定义函数
likfunc< -function(para){
alpha< -para [1]
lambda< -para [2]
#在函数中调用dat,因为它将在全局环境中定义
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)
}
#您的示例
set.seed(201)
u <-runif(20,min = 0,max = 1)#to模拟t
c <-rexp(20,rate = 0.05)
#para <-c(alpha = 2,lambda = 0.5)#初始值α= 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)$ b $在全局环境中定义的b#dat
dat< -as.data.frame(samp)
mle< -maxLik(logLik = likfunc,start = c(alpha = 2,lambda = 0.5))
mle


I would like to create a function which can be use for different sets of data. This is my function (I make it as source code):

#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)
}

Then I try to run the following code (this is 1st set of data):

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

But the R return: Error in likfunc(para, data) : object 'para' not found

I am doing simulation. Previously I run the function every time when there is a new dataset. Then I get an advice as my code will make the R work more and it take very long time to complete the simulation. Anyone can help on this? Thank you.

解决方案

First the error message is because you haven't defined object para in the global environment. On the other hand maxLik has a function as argument, so instead of evaluating the function you should just call it:

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

这篇关于用户在R程序中指定的功能的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆