Изменить весовой аргумент в функции-обёртке для lm - PullRequest
0 голосов
/ 02 июля 2018

У меня есть функция-обертка для lm в R. Я хочу изменить аргумент весов, если он вызывается, перед передачей его в 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  

1 Ответ

0 голосов
/ 02 июля 2018

Вы никогда не передавали вектор весов в 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)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...