2

年、国、および会社の識別子を含むデータのパネルがあります。を使用して、各年の国のサブセットにロジット モデルを当てはめたいと思いdata.tableます。モデルに適合するために各年の国サブセットに十分なエントリがある場合は問題ありませんが、年と国のサブセットに十分なデータがない場合glm、エラーがスローされ、すべてのモデルに適合できません。 . (本質的には と同じエラーが発生しlmます。)

内に解決策はありますdata.tableか? それとも、データが不十分な年の国のサブセットがないことを確認するために、上流でデータを整理する必要がありますか?

ありがとう!

library(data.table)

# similar data
DT <- data.table(year=rep(2001:2010, each=100),
                 country=rep(rep(1:10, each=10), 10), 
                 firm=rep(1:100, 10), 
                 y=round(runif(100)), 
                 x=runif(100)
                 )
setkey(DT, year, country)

# no problems if there are enough data per year-country subset
DT2 <- DT[, as.list(coef(glm(y ~ x), family="binomial")), by="year,country"]

# but `lm` throws and error if there are missing data
DT[(DT$year == 2001) & (DT$country == 1), "y"] <- NA
DT3 <- DT[, as.list(coef(glm(y ~ x, family="binomial"))), by="year,country"]

収量

> DT3 <- DT[, as.list(coef(glm(y ~ x, family="binomial"))), by="year,country"]
Error in family$linkfun(mustart) : 
  Argument mu must be a nonempty numeric vector
4

1 に答える 1

4

これはどう?

fn <- function(x, y) {
  if (length(na.omit(y)) == 0)
    NULL
  else
    as.list(coef(glm(y ~ x, family="binomial")))
}

DT3 <- DT[, fn(x, y), by="year,country"]

fn特定の目的に合わせてエラーチェックインを調整できることは明らかです。

更新しますfnデータ テーブル内の複数の列を処理する可能性がある場合の解決策を次に示します。

fn <- function(df) {
  if (length(na.omit(df$y)) == 0)
    NULL
  else
    as.list(coef(glm(df$y ~ df$x, family="binomial")))
}

DT3 <- DT[, fn(.SD), by="year,country"]

マシューから編集

それはあなたが使用するはずの方法ではありませんdata.table。関数を定義する必要はありません。次のように変数を直接使用するだけです。

DT3 <- DT[, 
  if (length(na.omit(y)) == 0)
    NULL
  else
    as.list(coef(glm(y ~ x, family="binomial")))
, by="year,country"]

を使用してすべての列を実際に使用していない限り、df$内部fn()と呼び出しの繰り返しはfn(.SD)お勧めしません。として非常に大きな複数行を持つのが一般的です。data.table.SD.SDcols{ ... }j

于 2013-02-08T19:33:07.783 に答える