3

さまざまなソースを使用して、線形回帰モデルの後にグループ変数「クラスター」に従ってクラスター化された標準誤差、t 統計、および標準誤差を含むテーブルを作成する小さな関数を作成しました。コードは次のとおりです。

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} を使用せず、線形モデルのすべての可能な仕様を受け入れる方法で関数を改善する方法についてのアイデアはありますか?

4

1 に答える 1

6

.実際、パッケージ内の数式に表記法を使用することはできませんplm

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

1 つのアイデアは、 があるときに式を拡張することです.。これは、ジョブを実行するカスタム関数です (確かに他のパッケージ内で実行されます)。

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>
于 2014-10-03T17:27:54.227 に答える