4

我有一个似然函数,它作为参数输入maxLik到 maxLik 包的函数中。例如:

library(maxLik) 

likFun <- function(param, x, y, h) {

  dep   <- as.matrix(x[,y])
  indep <- as.matrix(x[,h])
  indep <- as.matrix(cbind(cons=1, indep))
  k     <- dim(indep)[2] 
  beta  <- as.matrix(param[1:k])
  xbeta <- crossprod(t(indep), beta)
  sig   <- param[k+1]
  res   <- (dep-xbeta)/sig
  sum(  (-(1/2)*log(2*pi)) - ((1/2)*log((sig)^2)) - ((res^2)/2)  )

}
model <- maxLik(likFun, start=c(0,0,0,1), grad=NULL, hess=NULL, x=mtcars, 
                y="mpg", h=c("cyl", "hp"))
summary(model)

基本上,上述似然函数将最大似然用于多元回归模型。我的问题是如何formula在 R 中创建一个(用于包),lm以便用户能够输入因变量和自变量和数据。我已经检查过model.matrix,但我不确定它是否是我应该寻找的。在这方面的任何建议将不胜感激。

4

2 回答 2

3

为了能够使用类似的东西mpg ~ cyl + hp而不是y="mpg", h=c("cyl", "hp")在参数中调用您的函数,您可以使用公式对象。默认情况下它们是未评估的,因此您不需要substitutenor match.call

如果你想要的东西比简单地去掉公式两边的符号更复杂,你必须编写自己的解析器。否则,使用函数all.vars

f <- function(data, formula){
    print("Right hand side:")
    print(head(data[,all.vars(formula[[3]]), drop=FALSE]))
    print("Left hand side:")
    print(head(data[,all.vars(formula[[2]]), drop=FALSE]))
}

结果:

> f(mtcars, mpg ~ cyl + hp)
[1] "Right hand side:"
                  cyl  hp
Mazda RX4           6 110
Mazda RX4 Wag       6 110
Datsun 710          4  93
Hornet 4 Drive      6 110
Hornet Sportabout   8 175
Valiant             6 105
[1] "Left hand side:"
                   mpg
Mazda RX4         21.0
Mazda RX4 Wag     21.0
Datsun 710        22.8
Hornet 4 Drive    21.4
Hornet Sportabout 18.7
Valiant           18.1
于 2013-09-15T18:53:04.287 回答
2

粗略地说,您eval在函数内部使用。但是,您首先需要在未评估的上下文中获取函数参数(以便您可以将变量替换到公式中)。为此,您需要match.call. 这是一个非常基本的示例:

f <- function (.FUN, ...) {
    args <- match.call(expand.dots = FALSE)
    eval(args$.FUN, args$...)
}

这将捕获 中的公式.FUN和 中的实际参数...,可以通过 访问(作为列表)args$...

现在您可以调用该函数,类似于lm

> f(x + y, x = 1, y = 2)
3

作为 的替代方法match.call,您还可以使用substitute在未评估的上下文中获取函数参数:

f <- function (.FUN, ...)
    eval(substitute(.FUN), list(...))
于 2013-09-15T16:46:47.507 回答