2014-11-20 90 views
0

我正在嘗試編寫一個R函數來運行加權(可選)迴歸,並且我很難讓權重變量正常工作。 以下是該功能的簡化版本。將權重參數傳遞給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) 
} 

如果我不使用權值參數,該函數可以很好地工作。

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

但是,當我使用權值參數時拋出錯誤消息。

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): 對象 'weig' 未找到

回答

0

你有兩個問題。您遇到的錯誤是因爲您嘗試使用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 
+0

謝謝托馬斯!你是一個拯救生命的人。它現在完美。 – sbik 2014-11-20 17:25:00