2014-10-03 66 views
2

使用不同的數據源,我編寫了一個小函數,該函數創建一個標準錯誤,t統計量和標準錯誤表,該表根據組後變量「cluster」線性迴歸模型。代碼如下所示在模型中使用{plm}中的所有變量R

cl1 <- function(modl,clust) { 
# model is the regression model 
# clust is the clustervariable 
# id is a unique identifier in ids 
    library(plm) 
    library(lmtest) 
     # Get Formula 
    form <- formula(modl$call) 
     # Get Data frame 
    dat <- eval(modl$call$data) 
    dat$row <- rownames(dat) 
    dat$id <- ave(dat$row, dat[[deparse(substitute(clust))]], FUN =seq_along)  
    pdat <- pdata.frame(dat, 
     index=c("id", deparse(substitute(clust))) 
     , drop.index= F, row.names= T) 
    # # Regression 
     reg <- plm(form, data=pdat, model="pooling") 
    # # Adjustments 
    G <- length(unique(dat[, deparse(substitute(clust))])) 
    N <- length(dat[,deparse(substitute(clust))]) 
    # # Resid degrees of freedom, adjusted 
    dfa <- (G/(G-1))*(N-1)/reg$df.residual 
    d.vcov <- dfa* vcovHC(reg, type="HC0", cluster="group", adjust=T) 
    table <- coeftest(reg, vcov=d.vcov) 
    # # Output: se, t-stat and p-val 
    cl1out <- data.frame(table[, 2:4]) 
    names(cl1out) <- c("se", "tstat", "pval") 
    # # Cluster VCE 
    return(cl1out) 

}

對於像reg1 <- lm (y ~ x1 + x2 , data= df)迴歸,調用函數cl1(reg1, cluster)會工作得很好。

不過,如果我使用像reg2 <- lm(y ~ . , data=df)的模型,我會得到錯誤信息:

Error in terms.formula(object) : '.' in formula and no 'data' argument 

一些測試,我猜,我不能使用後「」爲{plm}發信號「在數據幀中使用所有變量」。有什麼辦法可以用{plm}來做到這一點?否則,有關如何以不使用{plm}並接受線性模型的所有可能規格的方式來改進我的函數的任何想法?

+0

您已在此成立,'Y〜.'會的方式(嘗試......)包括除「y」之外的所有'pdat'列,但包括'row','id'和'clust'。你確定這是你想要做的嗎? – jlhoward 2014-10-03 17:52:15

+0

哦,謝謝!試圖解決我的「。」錯誤我沒有看到這個! – 2014-10-06 07:46:52

回答

3

事實上,您不能在plm pacakge內使用.表示法。

data("Produc", package = "plm") 
plm(gsp ~ .,data=Produc) 
Error in terms.formula(object) : '.' in formula and no 'data' argument 

一個想法是擴大公式,當你有一個.。下面是做這項工作的自定義函數(當然是其他包內完成):

expand_formula <- 
    function(form="A ~.",varNames=c("A","B","C")){ 
    has_dot <- any(grepl('.',form,fixed=TRUE)) 
    if(has_dot){ 
    ii <- intersect(as.character(as.formula(form)), 
      varNames) 
    varNames <- varNames[!grepl(paste0(ii,collapse='|'),varNames)] 

    exp <- paste0(varNames,collapse='+') 
    as.formula(gsub('.',exp,form,fixed=TRUE)) 

    } 
    else as.formula(form) 
} 

現在測試一下:

(eform = expand_formula("gsp ~ .",names(Produc))) 
# gsp ~ state + year + pcap + hwy + water + util + pc + emp + unemp 

plm(eform,data=Produc) 

# Model Formula: gsp ~ state + year + pcap + hwy + water + util + pc + emp + unemp 
# <environment: 0x0000000014c3f3c0>