【问题标题】:Modify weights argument in wrapper function for lm修改 lm 的包装函数中的权重参数
【发布时间】:2018-12-11 01:05:32
【问题描述】:

我在 R 中有一个 lm 的包装函数。我想在将其传递给 lm 之前修改权重参数(如果调用)。有没有办法做到这一点?

例如,包装函数 myfunc 应将权重重置为 1,从而给出与未加权 lm 相同的系数。但是,这不会发生在这里:

#Load data
library(MASS)
data(Boston)

#Wrapper function for lm
myfunc <- function(formula, data, ...){
  if (!is.null(weights)){
    weights <- rep(1, nrow(data))
  }
  fit <- lm(formula, data, ...)
  return(fit)
}

#Build functions
myfunc('medv ~ .', Boston)
Call:
lm(formula = formula, data = data)

Coefficients:
(Intercept)         crim           zn        indus         chas          nox           rm          age  
  3.646e+01   -1.080e-01    4.642e-02    2.056e-02    2.687e+00   -1.777e+01    3.810e+00    6.922e-04  
        dis          rad          tax      ptratio        black        lstat  
 -1.476e+00    3.060e-01   -1.233e-02   -9.527e-01    9.312e-03   -5.248e-01  

myfunc('medv~.', Boston, weights=Boston$crim)
Call:
lm(formula = formula, data = data, weights = ..1)

Coefficients:
(Intercept)         crim           zn        indus         chas          nox           rm          age  
  83.809053    -0.117041     0.115602    -0.053765    10.245815   -38.463510    -0.580526     0.035360  
        dis          rad          tax      ptratio        black        lstat  
  -2.163867     0.265246    -0.008546    -1.311419     0.003468    -0.568235  

【问题讨论】:

  • 看起来你不是在给lm()打电话。

标签: r parameter-passing lm


【解决方案1】:

您实际上从未将权重向量传递给lm()... 不只是传递函数中存在的任何变量。而且你不能真正修改... 中的变量。如果要更改它们,则需要捕获它们。

myfunc <- function(formula, data, weights=NULL, ...){
  formula <- as.formula(formula)
  environment(formula) <- environment()
  if (!is.null(weights)){
    weights <- rep(1, nrow(data))
  }
  fit <- lm(formula, data, weights=weights, ...)
  return(fit)
}

【讨论】:

  • 该调用引发错误:invalid type (closure) for variable '(weights)
  • @utubun 我更新了答案。 lm 函数期望权重变量与公式处于相同的环境中。这解决了这个问题。
  • @utubun 是的。在您总是想删除任何权重参数的情况下,对 NULL 进行硬编码应该可以在不弄乱公式环境的情况下工作。但是,如果您尝试在默认值之外指定任何其他类型的权重,就会遇到这个问题。
  • 我认为这里不需要设置环境。只需在函数内指定formula &lt;- as.formula(formula) 就足够了。
  • @Mankind_008。是的。如果你传入一个可能是真的字符串。但是,如果您确实传递了 ab 实际公式(通常是这样做的),例如myfunc(medv ~ ., Boston),那么它会再次中断。这应该适用于所有情况。
猜你喜欢
  • 1970-01-01
  • 2023-02-23
  • 1970-01-01
  • 2018-05-24
  • 1970-01-01
  • 2017-12-20
  • 2021-04-18
  • 1970-01-01
  • 2015-06-22
相关资源
最近更新 更多