【问题标题】:Passing the weights argument to a regression function inside an R function将权重参数传递给 R 函数内的回归函数
【发布时间】:2014-11-20 17:03:23
【问题描述】:

我正在尝试编写一个 R 函数来运行加权(可选)回归,但我很难让权重变量起作用。 这是该函数的简化版本。

HC <- function(data, FUN, formula, tau = 0.5, weights = NULL){
if(is.null(weights)){
est <- FUN(data = data, formula = formula, tau = tau)
intercept = est$coef[["(Intercept)"]]
zeroWorker <- exp(intercept)
}
 else {
est <- FUN(data = data, formula = formula, tau = tau, weights = weights)
intercept = est$coef[["(Intercept)"]]
zeroWorker <- exp(intercept)
}
return(zeroWorker)
}

如果我不使用 weights 参数,该函数可以完美运行。

mod1 <- HC(data = mydata, formula = lin.model, tau = 0.2, 
       FUN = rq)

但是,当我使用 weights 参数时会引发错误消息。

mod2 <- HC(data = mydata, formula = lin.model, tau = 0.2, 
       FUN = rq, weights = weig)

我用谷歌搜索了这个问题,这篇文章似乎与我的问题最接近,但我仍然无法让它工作。 R : Pass argument to glm inside an R function。 任何帮助将不胜感激。 我的问题可以通过以下方式复制:

library("quantreg")
data(engel)
mydata <- engel
mydata$weig <- with(mydata, log(sqrt(income))) # Create a fictive weigth variable
lin.model <- foodexp~income
mod1 <- HC(data = mydata, formula = lin.model, tau = 0.2, 
       FUN = rq) # This works perfectly
mod2 <- HC(data = mydata, formula = lin.model, tau = 0.2, 
       FUN = rq, weights = weig) # throws an error.

HC 中的错误(数据 = mydata,公式 = lin.model,tau = 0.2,FUN = rq,权重 = weig): 找不到对象“称重”

【问题讨论】:

    标签: r function if-statement regression


    【解决方案1】:

    你有两个问题。您遇到的错误是因为您尝试使用 weigh 变量而不将其引用为来自 mydata 数据集。尝试使用mydata$weig。这将解决您的第一个错误,但随后您会得到与使用 weights 参数相关的实际错误,即:

    Error in model.frame.default(formula = formula, data = data, weights = substitute(weights),  : 
    invalid type (symbol) for variable '(weights)'
    

    解决方案是将HCweights参数中指定的变量添加到数据帧中,然后再将其传递给FUN

    HC <- function(data, FUN, formula, tau = 0.5, weights = NULL){
      data$.weights <- weights
      if(is.null(weights)){
        est <- FUN(data = data, formula = formula, tau = tau)
      } else {
        est <- FUN(data = data, formula = formula, tau = tau, weights = .weights)
      }
      intercept = est$coef[["(Intercept)"]]
      zeroWorker <- exp(intercept)
      return(zeroWorker)
    }
    

    然后一切正常:

    mod2 <- HC(data = mydata, formula = lin.model, tau = 0.2, FUN = rq, weights = mydata$weig)
    mod2
    # [1] 4.697659e+47
    

    【讨论】:

    • 谢谢托马斯!你是救生员。现在完美运行。
    猜你喜欢
    • 1970-01-01
    • 2014-02-07
    • 2012-06-19
    • 1970-01-01
    • 1970-01-01
    • 2015-01-31
    • 2019-03-29
    • 2012-06-07
    相关资源
    最近更新 更多