Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R程序中的用户指定函数_R_Functional Programming - Fatal编程技术网

R程序中的用户指定函数

R程序中的用户指定函数,r,functional-programming,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) } 然后

我想创建一个可以用于不同数据集的函数。这是我的函数,我将其作为源代码:

#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返回: likfuncpara中出错,数据:找不到对象“para”


我在做模拟。以前,每当有新数据集时,我都会运行该函数。然后我得到了一个建议,因为我的代码将使R工作得更多,并且需要很长时间才能完成模拟。有人能帮忙吗?谢谢。

首先,错误消息是因为您尚未在全局环境中定义对象参数。另一方面,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

:未找到对象“para”-您没有名为para的对象,并且在调用maxLiklogLik=likfuncpara,data…时试图将其传递到函数中。若要修复此问题,请添加一个dat=data参数,并仅将函数传递给maxLik:maxLiklogLik=likfunc,dat=data,start=calpha=2,lambda=0.5。另外,似乎您的似然度返回的是一个向量而不是标量。@J.R您是对的!我明白了。谢谢,谢谢。我的目的是使likfunc可用于许多数据集。该函数适用于单个数据集。让我详细解释一下我的问题。我想模拟1000个数据集。在每个数据集中,我将执行需要likfunc的maxLik。对于每个模拟数据集,我将执行非参数引导,并获得另外2000个引导样本。同样,我将对这些引导示例执行maxLik。我在循环中应用likfunc,这会使R太慢。这就是为什么我在考虑方法调用likfunc 1次,只更改数据集。