【问题标题】:r functions calling lm with subsetsr 函数调用带有子集的 lm
【发布时间】:2015-02-22 18:14:01
【问题描述】:

我正在编写一些代码,我发现了一些奇怪的东西。 当我在某些面板数据的子集上运行 LM 时,它运行良好,如下所示:

library('plm')
data(Cigar)
lm(log(price) ~ log(pop) + log(ndi), data=Cigar, subset=Cigar$state==1)

Call:
lm(formula = log(price) ~ log(pop) + log(ndi), data = Cigar, 
subset = Cigar$state == 1)


Coefficients:
(Intercept)     log(pop)     log(ndi)  
  -26.4919       3.2749       0.4265  

但是当我尝试将其包装在一个函数中时,我得到:

myfunction <- function(formula, data, subset){
  return(lm(formula, data, subset))
}

myfunction(formula = log(price) ~ log(pop) + log(ndi), data = Cigar, subset = Cigar$state==1)

Error in xj[i] : invalid subscript type 'closure'

我真的不明白这里发生了什么,但它破坏了我编写的其他代码,所以我想知道。

【问题讨论】:

  • 只是猜测,试试subset = state==1

标签: r function subset lm


【解决方案1】:

问题似乎不在于子集。当我更改为 subset = (state == 1) 时,我从你的函数中得到了同样的错误。您的函数的参数未正确传递和评估。

我认为你最好使用do.call

myfunction <- function(formula, data, subset) {
    do.call("lm", as.list(match.call()[-1]))
}

myfunction(log(price) ~ log(pop) + log(ndi), Cigar, state == 1)    
# Call:
# lm(formula = log(price) ~ log(pop) + log(ndi), data = Cigar, 
#     subset = state == 1)
#
# Coefficients:
# (Intercept)     log(pop)     log(ndi)  
#    -26.4919       3.2749       0.4265  

【讨论】:

    【解决方案2】:

    您很可能会遇到非标准评估的问题(lm 函数使用非标准评估)。使用非标准求值的函数在命令行中很方便,但在从其他函数中调用时可能会导致问题。

    关于该主题的一些额外阅读包括高级 R 中的 Standard Nonstandard Evaluation Rulesthis chapter

    【讨论】:

      猜你喜欢
      • 2022-06-19
      • 2011-11-23
      • 1970-01-01
      • 2020-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-09
      • 2020-10-07
      相关资源
      最近更新 更多