【问题标题】:R: fix model call in model using as.formulaR:使用 as.formula 修复模型中的模型调用
【发布时间】:2016-03-04 18:54:18
【问题描述】:

我有一个gls 模型,我在其中为模型分配了一个公式(来自另一个对象):

equation <- as.formula(aic.obj[row,'model'])
> equation
temp.avg ~ I(year - 1950)
mod1 <- gls(equation, data = dat)

> mod1
Generalized least squares fit by maximum likelihood
  Model: equation 
  Data: dat 
  Log-likelihood: -2109.276

然而我不希望“模型”是“方程”,而是方程本身!我该怎么做??

【问题讨论】:

    标签: r formula regression modeling nlme


    【解决方案1】:

    这是相当标准的,即使lm 也会这样做。一种方法:劫持print.gls函数

    library('nlme')
    
    (form <- follicles ~ sin(2*pi*Time) + cos(2*pi*Time))
    # follicles ~ sin(2 * pi * Time) + cos(2 * pi * Time)
    
    (fm1 <- gls(form, Ovary))
    
    # Generalized least squares fit by REML
    #   Model: form
    #   Data: Ovary 
    #   Log-restricted-likelihood: -898.434
    # 
    # Coefficients:
    #   (Intercept) sin(2 * pi * Time) cos(2 * pi * Time) 
    #    12.2155822         -3.3396116         -0.8697358 
    # 
    # Degrees of freedom: 308 total; 305 residual
    # Residual standard error: 4.486121 
    
    print.gls <- function(x, ...) {
      x$call$model <- get(as.character(x$call$model))
      nlme:::print.gls(x, ...)
    }
    
    fm1
    
    # Generalized least squares fit by REML
    #   Model: follicles ~ sin(2 * pi * Time) + cos(2 * pi * Time) 
    #   Data: Ovary 
    #   Log-restricted-likelihood: -898.434
    # 
    # Coefficients:
    #   (Intercept) sin(2 * pi * Time) cos(2 * pi * Time) 
    #    12.2155822         -3.3396116         -0.8697358 
    # 
    # Degrees of freedom: 308 total; 305 residual
    # Residual standard error: 4.486121 
    

    【讨论】:

      【解决方案2】:

      您可以通过巧妙地使用语言修饰来解决此问题。这将创建(未评估的)gls 调用,其中直接插入模型方程,然后对其进行评估。

      cl <- substitute(gls(.equation, data=dat), list(.equation=equation))
      mod1 <- eval(cl)
      

      【讨论】:

      • 这太棒了!简单并完成工作。你能解释一下它实际上在做什么吗?我很感兴趣,以便了解它更广泛的应用。谢谢!
      • 您可能想阅读高级 R 的后续章节
      猜你喜欢
      • 2019-04-24
      • 2023-03-20
      • 2019-07-12
      • 2023-03-26
      • 2023-01-28
      • 1970-01-01
      • 1970-01-01
      • 2016-05-09
      • 2018-04-27
      相关资源
      最近更新 更多