3

あなたが次のような配列を持っているとしましょう

dat <-  array(c(126, 100, 35, 61, 908, 688, 497, 807, 913, 747, 336, 598, 235, 172, 58, 121,402, 308, 121, 215, 182, 156, 72, 98, 60, 99, 11, 43, 104, 89, 21, 36), dim = c(2, 2, 8),dimnames = list(a = c(1, 0), b = c(1, 0), c = 1:8))


> > dat
, , c = 1

   b
a     1  0
  1 126 35
  0 100 61

, , c = 2

   b
a     1   0
  1 908 497
  0 688 807

, , c = 3

   b
a     1   0
  1 913 336
  0 747 598

, , c = 4

   b
a     1   0
  1 235  58
  0 172 121

, , c = 5

   b
a     1   0
  1 402 121
  0 308 215

, , c = 6

   b
a     1  0
  1 182 72
  0 156 98

, , c = 7

   b
a    1  0
  1 60 11
  0 99 43

, , c = 8

   b
a     1  0
  1 104 21
  0  89 36

ロジスティック回帰を当てはめて予測します。この配列からデータフレームを生成してglmで使用する簡単な方法はありますか?つまり、次のようなデータフレーム

a b c
1 1 1 for 126 rows then
...
0 1 1 for 100 rows, etc.

基本的に、カウント付きのテーブルが与えられたときに、ロジスティック回帰に適合するデータを取得する必要があります。手動でデータを生成せずにそれを行う簡単な方法があるはずのようです。

ありがとう

4

4 に答える 4

4

1つの方法は、パッケージmelt内の関数から始めることです。reshape2

library(reshape2)

datM <- melt(dat)
head(datM, 2)
#   a b c value
# 1 1 1 1   126
# 2 0 1 1   100

次にdcast、そのデータを使用して、1つの行の結果の数を取得します。

dat2 <- dcast(datM, b + c ~ a)
head(dat2, 2)
#   b c   0   1
# 1 0 1  61  35
# 2 0 2 807 497

次に、このデータを使用してglm、応答が成功と失敗の数を示す2列のマトリックスである場合に実行できます。

response <- as.matrix(dat2[, c(4, 3)])
bb <- dat2[, "b"]
cc <- dat2[, "c"]
glm1 <- glm(response ~ bb + cc, family = binomial(link = "logit"))

ただし、モデルの自由度(および対数尤度など)は、質問で要求したデータ構造を反映しません。目的の特定のデータ構造を取得するには、オブジェクトに戻ることができdatMます。

編集:

次のループは、列をdatM除くのすべての列をループし、値を何度もvalue繰り返します。datM$value

datRep <- lapply(datM[-grep("value", names(datM))], rep, times = datM$value)

次にcbind、に戻ってにmatrix変換しdata.frame、必要なデータ構造を取得します。

dat3 <- as.data.frame(do.call(cbind, datRep))

glm2 <- glm(a ~ b + c, data = dat3, family = binomial(link = "logit"))

2つのモデルの係数は同じです。

> coef(glm1)
(Intercept)          bb          cc 
-0.43854838  0.77039283 -0.03328575 
> coef(glm2)
(Intercept)           b           c 
-0.43854838  0.77039283 -0.03328575 

ただし、前述のように、自由度などは次のようにはなりません。

> glm1$deviance
[1] 29.39535
> glm2$deviance
[1] 11381.87
于 2012-12-09T22:29:51.033 に答える
1

罪のように醜いですが、この例に必要なことをします。

dat1 <- data.frame(value = as.vector(dat),
    a=dimnames(dat)$a,
    b=rep(dimnames(dat)$b, each=length(dimnames(dat)$a)),
    c=rep(dimnames(dat)$c, each=length(dimnames(dat)$a)*length(dimnames(dat)$b)))

melt@BenBarnesの回答のように、を使用することをお勧めします。これはより柔軟で、要因の作成を回避します。

dat1 <- melt(dat)

次に、展開された行を取得するには、次を使用できますrep

dat2 <- data.frame(a=rep(dat1$a, dat1$value),
                   b=rep(dat1$b, dat1$value),
                   c=rep(dat1$c, dat1$value))
于 2012-12-09T22:25:01.157 に答える
1

基本関数を使用してカウントデータを取得し、@MatthewLundbergの回答のように展開できる別の方法:

dat1 <- data.frame(do.call(expand.grid,dimnames(dat)),value=as.vector(dat))

   a b c value
1  1 1 1   126
2  0 1 1   100
3  1 0 1    35
4  0 0 1    61
5  1 1 2   908
...

前の回答から盗まれたように展開します...

dat2 <- data.frame(a=rep(dat1$a, dat1$value),
                   b=rep(dat1$b, dat1$value),
                   c=rep(dat1$c, dat1$value))
于 2012-12-09T23:27:41.723 に答える
1

配列をに変換する最初の部分を実行するための最小限の方法data.frameは、を使用することas.data.frame.tableです。次に、@MatthewLundbergまたは@thelatemailが提案するように進みます。

df0 <- as.data.frame.table(dat)

head(df0)
#    a b c Freq
# 1  1 1 1  126
# 2  0 1 1  100
# 3  1 0 1   35
# 4  0 0 1   61
# 5  1 1 2  908
# 6  0 1 2  688
于 2016-03-02T12:51:17.707 に答える