3  第3章

第3章は3元表に対する部分連関モデルを扱う.パッケージはtidyverse(データセットの処理のため),magrittr(パイプ演算子),DescTools(記述統計を求めるため),vcdパッケージ(カテゴリカルデータの分析のため),broom(回帰係数の整理),gnm(連関分析の処理のため),broom(tidyな回帰分析の結果の表示)を使用する.

library(tidyverse)
library(magrittr)
library(gnm)
library(broom)

またモデル適合度を表示するための関数をここでも準備しておく.すべてgnmによって推定を行う.

# 引数となるobjはgnmの結果
model.summary <- function(obj, Model = NULL){
  if (sum(class(obj) == "gnm") != 1)
    stop("estimate with gnm")
  aic <- obj$deviance - obj$df * 2 # AIC(L2)
  bic <- obj$deviance - obj$df * log(sum(obj$y)) #BIC(L2)
  delta <- 100 * sum(abs(obj$y - obj$fitted.values)) / (2 * sum(obj$y))
  p <- pchisq(obj$deviance, obj$df, lower.tail = FALSE)
  result <- matrix(0, 1, 7)
  if (is.null(Model)){ 
  Model <- deparse(substitute(obj))
  }
  result <- tibble(
    "Model Description" = Model,
    "df" = obj$df,
    "L2" = obj$deviance,
    #"AIC(L2)" = aic,
    "BIC" = bic,
    "Delta" = delta,
    "p" = p
  )
  return(result)
}

3.1 表3.1A

表3.1Aをまずベクトルとして入力する.

# 表3.1
Freq <- c(  9, 5, 5, 1,    1, 6, 5, 1,    2, 2, 2, 1,
           17,13, 7, 4,   13,22, 9, 1,    7,13, 6, 2,
            8,14, 6, 0,   10,29,10, 0,    5,14, 6, 2,
           20,38,24, 8,   23,72,34,10,   17,67,36,12,
            4,21,12, 4,    7,30, 9, 1,    9,19,14, 2,
            2, 9, 8, 3,    1,16,19, 2,   11,28,28,11,
            0, 1, 5, 0,    2, 3, 3, 2,    2, 7, 6, 6)

次に行変数,列変数,層変数を入力する.gl(n = 水準数, k = 繰り返しの数, length = 長さ)を注意しながら設定する.

polviews <- gl(n = 7, k = 4*3, length = length(Freq))
fefam <- gl(n = 4, k = 1, length = length(Freq))
natfare <- gl(n = 3, k = 4, length = length(Freq))

対応しているのかを確認したければ,matrix形式で示すとよい.

matrix(polviews, nrow = 7, ncol = 12, byrow = TRUE)
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
[1,] "1"  "1"  "1"  "1"  "1"  "1"  "1"  "1"  "1"  "1"   "1"   "1"  
[2,] "2"  "2"  "2"  "2"  "2"  "2"  "2"  "2"  "2"  "2"   "2"   "2"  
[3,] "3"  "3"  "3"  "3"  "3"  "3"  "3"  "3"  "3"  "3"   "3"   "3"  
[4,] "4"  "4"  "4"  "4"  "4"  "4"  "4"  "4"  "4"  "4"   "4"   "4"  
[5,] "5"  "5"  "5"  "5"  "5"  "5"  "5"  "5"  "5"  "5"   "5"   "5"  
[6,] "6"  "6"  "6"  "6"  "6"  "6"  "6"  "6"  "6"  "6"   "6"   "6"  
[7,] "7"  "7"  "7"  "7"  "7"  "7"  "7"  "7"  "7"  "7"   "7"   "7"  
matrix(fefam, nrow = 7, ncol = 12, byrow = TRUE)
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
[1,] "1"  "2"  "3"  "4"  "1"  "2"  "3"  "4"  "1"  "2"   "3"   "4"  
[2,] "1"  "2"  "3"  "4"  "1"  "2"  "3"  "4"  "1"  "2"   "3"   "4"  
[3,] "1"  "2"  "3"  "4"  "1"  "2"  "3"  "4"  "1"  "2"   "3"   "4"  
[4,] "1"  "2"  "3"  "4"  "1"  "2"  "3"  "4"  "1"  "2"   "3"   "4"  
[5,] "1"  "2"  "3"  "4"  "1"  "2"  "3"  "4"  "1"  "2"   "3"   "4"  
[6,] "1"  "2"  "3"  "4"  "1"  "2"  "3"  "4"  "1"  "2"   "3"   "4"  
[7,] "1"  "2"  "3"  "4"  "1"  "2"  "3"  "4"  "1"  "2"   "3"   "4"  
matrix(natfare, nrow = 7, ncol = 12, byrow = TRUE)
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
[1,] "1"  "1"  "1"  "1"  "2"  "2"  "2"  "2"  "3"  "3"   "3"   "3"  
[2,] "1"  "1"  "1"  "1"  "2"  "2"  "2"  "2"  "3"  "3"   "3"   "3"  
[3,] "1"  "1"  "1"  "1"  "2"  "2"  "2"  "2"  "3"  "3"   "3"   "3"  
[4,] "1"  "1"  "1"  "1"  "2"  "2"  "2"  "2"  "3"  "3"   "3"   "3"  
[5,] "1"  "1"  "1"  "1"  "2"  "2"  "2"  "2"  "3"  "3"   "3"   "3"  
[6,] "1"  "1"  "1"  "1"  "2"  "2"  "2"  "2"  "3"  "3"   "3"   "3"  
[7,] "1"  "1"  "1"  "1"  "2"  "2"  "2"  "2"  "3"  "3"   "3"   "3"  

tableのデータ(tab_3.1)とセルを単位としたデータ(freq_tab_3.1)を作成する.

tab_3.1 <- xtabs(Freq ~ polviews + fefam + natfare)
freq_tab_3.1 <- tibble(Freq, polviews, fefam, natfare)

表3.2のモデルで推定を行う.モデル6から8まではスコアパラメータの正則化が必要であるが,適合度については問題なく求めることができる.

# Model 1 - 独立モデル
M1 <- freq_tab_3.1 |>
  gnm(
    Freq ~ polviews + fefam + natfare,
    family = poisson,
    data = _,
    trace = F,
    tolerance = 1e-12
  )

# Model 2 - 完全2元交互作用モデル
M2 <- freq_tab_3.1 |>
  gnm(
    Freq ~ polviews * fefam + fefam * natfare + polviews * natfare,
    family = poisson,
    data = _,
    trace = F,
    tolerance = 1e-12
  )

# Model 3 - 条件付き独立 (polviews)
M3 <- freq_tab_3.1 |>
  gnm(
    Freq ~ polviews * fefam + polviews * natfare,
    family = poisson,
    data = _,
    trace = F,
    tolerance = 1e-12
  )

# Model 4 - 条件付き独立 (fefam)
M4 <- freq_tab_3.1 |>
  gnm(
    Freq ~ polviews * fefam + fefam * natfare,
    family = poisson,
    data = _,
    trace = F,
    tolerance = 1e-12
  )

# Model 5 - 条件付き独立 (natfare)
M5 <- freq_tab_3.1 |>
  gnm(
    Freq ~ fefam * natfare + polviews * natfare,
    family = poisson,
    data = _,
    trace = F,
    tolerance = 1e-12
  )

# Model 6 - RC(1)+RL(1) 部分連関
# 値の正則化が必要
M6 <- freq_tab_3.1 |>
  gnm(
    Freq ~ polviews + fefam + natfare + 
      Mult(1, polviews, fefam) + 
      Mult(1, polviews, natfare),
    data = _,
    family = poisson,
    tolerance = 1e-12
  )
Initialising
Running start-up iterations..
Running main iterations.........................................................
................
Done
# Model 7 - RC(1)+RL(1) 部分連関 (一貫した行スコア - polviews)
# 値の正則化が必要
M7 <- freq_tab_3.1 |>
  gnm(
    Freq ~ polviews + fefam + natfare + 
      Mult(1, polviews, fefam + natfare),
    data = _,
    family = poisson,
    tolerance = 1e-12
  )
Initialising
Running start-up iterations..
Running main iterations........................................................
Done
# Model 8 - RC(1)+RL(1) 部分連関 (一貫した行スコア - polviews)
# 行スコアへの等値制約
# 値の正則化が必要

# 等値制約をかけたいセルの水準を同じにする
freq_tab_3.1 <- freq_tab_3.1 |> 
  mutate(polviews.c = case_when(polviews == 1 ~ 1,  # mu1 = mu2
                                polviews == 2 ~ 1,  # mu1 = mu2
                                polviews == 3 ~ 2,
                                polviews == 4 ~ 3,  # mu4 = mu5
                                polviews == 5 ~ 3,  # mu4 = mu5
                                polviews == 6 ~ 4,
                                polviews == 7 ~ 5) |>
           factor())

M8 <- freq_tab_3.1 |>
  gnm(
    Freq ~ polviews + fefam + natfare + 
      Mult(1, polviews.c, fefam + natfare),
    data = _,
    family = poisson,
    tolerance = 1e-12
  )
Initialising
Running start-up iterations..
Running main iterations.........................................................
...
Done

モデル間の比較は次のように行う.

# Model 3 と Model 2の比較
pchisq(q = M3$deviance - M2$deviance,
       df = M3$df.residual - M2$df.residual,
       lower.tail = FALSE)
[1] 0.06425806
# Model 6 と Model 3の比較
pchisq(q = M6$deviance - M3$deviance,
       df = M6$df.residual - M3$df.residual,
       lower.tail = FALSE)
[1] 0.1266967
# Model 13 と Model 8の比較
## Model 13が推定できないため表の値を用いる
pchisq(q = 9.22,
       df = 6,
       lower.tail = FALSE)
[1] 0.1615782

3.2 表3.2

表3.2を再現する.

## 表3.2

# リストを作成
M <- list()
# モデルの適合度をリストに順に格納
M[[1]] <- model.summary(M1, "1. Complete independence") 
M[[2]] <- model.summary(M2, "2. Full two-way interaction") 
M[[3]] <- model.summary(M3, "3. Conditional independence on POLVIEWS") 
M[[4]] <- model.summary(M4, "4. Conditional independence on FEFAM")
M[[5]] <- model.summary(M5, "5. Conditional independence on NATFARE")
M[[6]] <- model.summary(M6, "6. RC(1) + RL(1) partial association")
M[[7]] <- model.summary(M7, "7. Model 6 plus consisitent row (POLVIEWS) score restrictions")
M[[8]] <- model.summary(M8, "8. Model 6 plus consisitent and equality restrictions on row (POLVIEWS) scores (mu_1 = mu_2, mu_4 = mu_5)")
# リストを行方向に合併する
M |> bind_rows()
# A tibble: 8 × 6
  `Model Description`                               df    L2   BIC Delta       p
  <chr>                                          <int> <dbl> <dbl> <dbl>   <dbl>
1 1. Complete independence                          72 168.  -324. 14.1  1.37e-9
2 2. Full two-way interaction                       36  35.4 -211.  5.72 4.99e-1
3 3. Conditional independence on POLVIEWS           42  47.3 -240.  7.30 2.67e-1
4 4. Conditional independence on FEFAM              48  87.3 -241. 10.3  4.50e-4
5 5. Conditional independence on NATFARE            54  91.0 -278. 10.1  1.21e-3
6 6. RC(1) + RL(1) partial association              57  68.6 -321.  8.83 1.40e-1
7 7. Model 6 plus consisitent row (POLVIEWS) sc…    62  72.8 -351.  9.07 1.65e-1
8 8. Model 6 plus consisitent and equality rest…    64  73.6 -364.  9.21 1.93e-1

3.3 表3.3

表3.3を再現するために,モデル6から8までのスコアパラメータの正則化を行う.

まずはモデル6である.

# Estimating standard error
# Model 6

# 変数と係数と係数の順番を表示
pickCoef(M6, "[.]polviews")
  Mult(1, ., fefam).polviews1   Mult(1, ., fefam).polviews2 
                           14                            15 
  Mult(1, ., fefam).polviews3   Mult(1, ., fefam).polviews4 
                           16                            17 
  Mult(1, ., fefam).polviews5   Mult(1, ., fefam).polviews6 
                           18                            19 
  Mult(1, ., fefam).polviews7 Mult(1, ., natfare).polviews1 
                           20                            26 
Mult(1, ., natfare).polviews2 Mult(1, ., natfare).polviews3 
                           27                            28 
Mult(1, ., natfare).polviews4 Mult(1, ., natfare).polviews5 
                           29                            30 
Mult(1, ., natfare).polviews6 Mult(1, ., natfare).polviews7 
                           31                            32 
pickCoef(M6, "[.]fefam")
Mult(1, polviews, .).fefam1 Mult(1, polviews, .).fefam2 
                         21                          22 
Mult(1, polviews, .).fefam3 Mult(1, polviews, .).fefam4 
                         23                          24 
pickCoef(M6, "[.]natfare")
Mult(1, polviews, .).natfare1 Mult(1, polviews, .).natfare2 
                           33                            34 
Mult(1, polviews, .).natfare3 
                           35 
data.frame(var = names(M6$coefficients),
           estimate = M6$coefficients) |> 
  mutate(estimate = estimate,
         number = row_number())
                                                        var    estimate number
(Intercept)                                     (Intercept)  0.44889506      1
polviews2                                         polviews2  1.11173082      2
polviews3                                         polviews3  1.07062463      3
polviews4                                         polviews4  2.38620551      4
polviews5                                         polviews5  1.37103186      5
polviews6                                         polviews6  1.30913698      6
polviews7                                         polviews7 -0.07836634      7
fefam2                                               fefam2  0.98038359      8
fefam3                                               fefam3  0.43295515      9
fefam4                                               fefam4 -0.87285503     10
natfare2                                           natfare2  0.35356150     11
natfare3                                           natfare3  0.29974988     12
Mult(., polviews, fefam).         Mult(., polviews, fefam).  2.72741175     13
Mult(1, ., fefam).polviews1     Mult(1, ., fefam).polviews1  0.21153027     14
Mult(1, ., fefam).polviews2     Mult(1, ., fefam).polviews2  0.57366789     15
Mult(1, ., fefam).polviews3     Mult(1, ., fefam).polviews3  0.45026306     16
Mult(1, ., fefam).polviews4     Mult(1, ., fefam).polviews4 -0.02697483     17
Mult(1, ., fefam).polviews5     Mult(1, ., fefam).polviews5  0.04038332     18
Mult(1, ., fefam).polviews6     Mult(1, ., fefam).polviews6 -0.61521139     19
Mult(1, ., fefam).polviews7     Mult(1, ., fefam).polviews7 -0.94507437     20
Mult(1, polviews, .).fefam1     Mult(1, polviews, .).fefam1  0.33829591     21
Mult(1, polviews, .).fefam2     Mult(1, polviews, .).fefam2  0.07300986     22
Mult(1, polviews, .).fefam3     Mult(1, polviews, .).fefam3 -0.19982036     23
Mult(1, polviews, .).fefam4     Mult(1, polviews, .).fefam4 -0.36614113     24
Mult(., polviews, natfare).     Mult(., polviews, natfare).  3.04182815     25
Mult(1, ., natfare).polviews1 Mult(1, ., natfare).polviews1 -1.17242040     26
Mult(1, ., natfare).polviews2 Mult(1, ., natfare).polviews2 -0.56839055     27
Mult(1, ., natfare).polviews3 Mult(1, ., natfare).polviews3 -0.35469807     28
Mult(1, ., natfare).polviews4 Mult(1, ., natfare).polviews4  0.05233282     29
Mult(1, ., natfare).polviews5 Mult(1, ., natfare).polviews5 -0.15794806     30
Mult(1, ., natfare).polviews6 Mult(1, ., natfare).polviews6  0.86877820     31
Mult(1, ., natfare).polviews7 Mult(1, ., natfare).polviews7  0.87257574     32
Mult(1, polviews, .).natfare1 Mult(1, polviews, .).natfare1 -0.19244649     33
Mult(1, polviews, .).natfare2 Mult(1, polviews, .).natfare2 -0.06881662     34
Mult(1, polviews, .).natfare3 Mult(1, polviews, .).natfare3  0.19771269     35

各スコアの両端のカテゴリ,つまり上記推定値のリストの 14,20,21,24,26,32,33,35番目の8つの値についてスコアを求め,固定する.

# R POLVIEWS mu1[i], i = 1 to 7
mu1 <- getContrasts(model = M6, 
                    set = pickCoef(M6, "fefam)[.]polviews"),
                    ref = "mean",
                    scaleRef = "mean", 
                    scaleWeights = "unit")
# C FEFAM nu[j], j = 1 to 4
nu <- getContrasts(model = M6, 
                   set = pickCoef(M6, "[.]fefam"), 
                   ref = "mean",
                   scaleRef = "mean", 
                   scaleWeights = "unit")
# R POLVIEWS mu2[i], i = 1 to 7
mu2 <- getContrasts(model = M6, 
                    set = pickCoef(M6, "natfare)[.]polviews"), 
                    ref = "mean",
                    scaleRef = "mean", 
                    scaleWeights = "unit")
# L NATFARE eta[k], k = 1 to 3
eta <- getContrasts(model = M6, 
                    set = pickCoef(M6, "[.]natfare"), 
                    ref = "mean",
                    scaleRef = "mean", 
                    scaleWeights = "unit")

# 確認 
list(mu1 = mu1, nu = nu, mu2 = mu2, eta = eta)
$mu1
                               Estimate Std. Error
Mult(1, ., fefam).polviews1  0.18890704 0.17539812
Mult(1, ., fefam).polviews2  0.45611586 0.11238050
Mult(1, ., fefam).polviews3  0.36505971 0.11498236
Mult(1, ., fefam).polviews4  0.01292237 0.08199631
Mult(1, ., fefam).polviews5  0.06262362 0.11058185
Mult(1, ., fefam).polviews6 -0.42111705 0.12367540
Mult(1, ., fefam).polviews7 -0.66451154 0.10976226

$nu
                              Estimate Std. Error
Mult(1, polviews, .).fefam1  0.7026886 0.06444123
Mult(1, polviews, .).fefam2  0.2081705 0.09371704
Mult(1, polviews, .).fefam3 -0.3004108 0.10956493
Mult(1, polviews, .).fefam4 -0.6104483 0.09158453

$mu2
                                 Estimate Std. Error
Mult(1, ., natfare).polviews1 -0.60584367 0.12394769
Mult(1, ., natfare).polviews2 -0.27518966 0.11469790
Mult(1, ., natfare).polviews3 -0.15821154 0.11316687
Mult(1, ., natfare).polviews4  0.06460260 0.07187236
Mult(1, ., natfare).polviews5 -0.05050796 0.10030828
Mult(1, ., natfare).polviews6  0.51153570 0.10405220
Mult(1, ., natfare).polviews7  0.51361453 0.12512860

$eta
                                Estimate Std. Error
Mult(1, polviews, .).natfare1 -0.6073482 0.07616839
Mult(1, polviews, .).natfare2 -0.1689209 0.11149916
Mult(1, polviews, .).natfare3  0.7762692 0.03533078

正則化したスコアを求めることができたので, 各スコアの両端のカテゴリを取り出し,conとする.

con <- c(mu1$qvframe[,1][c(1,7)], 
         nu$qvframe[,1][c(1,4)],
         mu2$qvframe[,1][c(1,7)], 
         eta$qvframe[,1][c(1,3)])

conを用いて制約を課す.制約を課す対象となるパラメータはconstrainで指定する.

M6_SE <- freq_tab_3.1 |>
  gnm(Freq ~ polviews + fefam + natfare + 
        Mult(1, polviews, fefam) + Mult(1, polviews, natfare),
      constrain = c(14,20,21,24,26,32,33,35), 
      constrainTo = con,
      data = _, 
      family = poisson, 
      tolerance = 1e-12)
Initialising
Running start-up iterations..
Running main iterations.........................................................
.............................
Done
M6_SE_coef <- tidy(M6_SE)
M6_SE_coef |> print(n = Inf)
# A tibble: 35 × 5
   term                          estimate std.error statistic   p.value
   <chr>                            <dbl>     <dbl>     <dbl>     <dbl>
 1 (Intercept)                     0.491      0.271    1.81    7.07e- 2
 2 polviews2                       1.03       0.229    4.52    6.06e- 6
 3 polviews3                       0.993      0.226    4.39    1.12e- 5
 4 polviews4                       2.33       0.212   11.0     3.35e-28
 5 polviews5                       1.32       0.218    6.08    1.24e- 9
 6 polviews6                       1.26       0.282    4.49    7.13e- 6
 7 polviews7                      -0.0882     0.355   -0.248   8.04e- 1
 8 fefam2                          1.01       0.188    5.40    6.70e- 8
 9 fefam3                          0.498      0.340    1.46    1.43e- 1
10 fefam4                         -0.787      0.449   -1.75    7.96e- 2
11 natfare2                        0.329      0.127    2.60    9.35e- 3
12 natfare3                        0.222      0.314    0.706   4.80e- 1
13 Mult(., polviews, fefam).       1.98       0.744    2.66    7.73e- 3
14 Mult(1, ., fefam).polviews1     0.189     NA       NA      NA       
15 Mult(1, ., fefam).polviews2     0.456      0.308    1.48    1.39e- 1
16 Mult(1, ., fefam).polviews3     0.365      0.285    1.28    2.00e- 1
17 Mult(1, ., fefam).polviews4     0.0129     0.184    0.0703  9.44e- 1
18 Mult(1, ., fefam).polviews5     0.0626     0.212    0.296   7.67e- 1
19 Mult(1, ., fefam).polviews6    -0.421      0.205   -2.06    3.98e- 2
20 Mult(1, ., fefam).polviews7    -0.665     NA       NA      NA       
21 Mult(1, polviews, .).fefam1     0.703     NA       NA      NA       
22 Mult(1, polviews, .).fefam2     0.208      0.152    1.37    1.71e- 1
23 Mult(1, polviews, .).fefam3    -0.300      0.185   -1.62    1.05e- 1
24 Mult(1, polviews, .).fefam4    -0.610     NA       NA      NA       
25 Mult(., polviews, natfare).     1.57       0.405    3.87    1.10e- 4
26 Mult(1, ., natfare).polviews1  -0.606     NA       NA      NA       
27 Mult(1, ., natfare).polviews2  -0.275      0.200   -1.38    1.68e- 1
28 Mult(1, ., natfare).polviews3  -0.158      0.191   -0.828   4.08e- 1
29 Mult(1, ., natfare).polviews4   0.0646     0.156    0.414   6.79e- 1
30 Mult(1, ., natfare).polviews5  -0.0505     0.177   -0.286   7.75e- 1
31 Mult(1, ., natfare).polviews6   0.512      0.211    2.43    1.53e- 2
32 Mult(1, ., natfare).polviews7   0.514     NA       NA      NA       
33 Mult(1, polviews, .).natfare1  -0.607     NA       NA      NA       
34 Mult(1, polviews, .).natfare2  -0.169      0.175   -0.967   3.34e- 1
35 Mult(1, polviews, .).natfare3   0.776     NA       NA      NA       

モデル7は少し難しい.モデル7は一貫した制約を課している.このモデルからまず一貫したpolviewsについて正則化した場合の値を求める.これが求まったら,次は一貫した制約を課していないモデルに,先ほどの正則化したスコアをRCとRLのそれぞれの部分に適用する.

# Model 7

# 変数と係数と係数の順番を表示
pickCoef(M7, "[.]polviews")
Mult(1, ., fefam + natfare).polviews1 Mult(1, ., fefam + natfare).polviews2 
                                   14                                    15 
Mult(1, ., fefam + natfare).polviews3 Mult(1, ., fefam + natfare).polviews4 
                                   16                                    17 
Mult(1, ., fefam + natfare).polviews5 Mult(1, ., fefam + natfare).polviews6 
                                   18                                    19 
Mult(1, ., fefam + natfare).polviews7 
                                   20 
pickCoef(M7, "[.]fefam")
Mult(1, polviews, . + natfare).fefam1 Mult(1, polviews, . + natfare).fefam2 
                                   21                                    22 
Mult(1, polviews, . + natfare).fefam3 Mult(1, polviews, . + natfare).fefam4 
                                   23                                    24 
pickCoef(M7, "[.]natfare")
Mult(1, polviews, fefam + .).natfare2 Mult(1, polviews, fefam + .).natfare3 
                                   25                                    26 
data.frame(var = names(M7$coefficients),
           estimate = M7$coefficients) |> 
  mutate(estimate = estimate,
         number = row_number())
                                                                        var
(Intercept)                                                     (Intercept)
polviews2                                                         polviews2
polviews3                                                         polviews3
polviews4                                                         polviews4
polviews5                                                         polviews5
polviews6                                                         polviews6
polviews7                                                         polviews7
fefam2                                                               fefam2
fefam3                                                               fefam3
fefam4                                                               fefam4
natfare2                                                           natfare2
natfare3                                                           natfare3
Mult(., polviews, fefam + natfare).     Mult(., polviews, fefam + natfare).
Mult(1, ., fefam + natfare).polviews1 Mult(1, ., fefam + natfare).polviews1
Mult(1, ., fefam + natfare).polviews2 Mult(1, ., fefam + natfare).polviews2
Mult(1, ., fefam + natfare).polviews3 Mult(1, ., fefam + natfare).polviews3
Mult(1, ., fefam + natfare).polviews4 Mult(1, ., fefam + natfare).polviews4
Mult(1, ., fefam + natfare).polviews5 Mult(1, ., fefam + natfare).polviews5
Mult(1, ., fefam + natfare).polviews6 Mult(1, ., fefam + natfare).polviews6
Mult(1, ., fefam + natfare).polviews7 Mult(1, ., fefam + natfare).polviews7
Mult(1, polviews, . + natfare).fefam1 Mult(1, polviews, . + natfare).fefam1
Mult(1, polviews, . + natfare).fefam2 Mult(1, polviews, . + natfare).fefam2
Mult(1, polviews, . + natfare).fefam3 Mult(1, polviews, . + natfare).fefam3
Mult(1, polviews, . + natfare).fefam4 Mult(1, polviews, . + natfare).fefam4
Mult(1, polviews, fefam + .).natfare2 Mult(1, polviews, fefam + .).natfare2
Mult(1, polviews, fefam + .).natfare3 Mult(1, polviews, fefam + .).natfare3
                                         estimate number
(Intercept)                            0.53383944      1
polviews2                              1.05910145      2
polviews3                              1.00850170      3
polviews4                              2.28433681      4
polviews5                              1.28035534      5
polviews6                              1.15025088      6
polviews7                             -0.24284087      7
fefam2                                 0.99266224      8
fefam3                                 0.45226874      9
fefam4                                -0.84193457     10
natfare2                               0.34921745     11
natfare3                               0.30640340     12
Mult(., polviews, fefam + natfare).   -1.05643325     13
Mult(1, ., fefam + natfare).polviews1 -1.36835469     14
Mult(1, ., fefam + natfare).polviews2 -1.28039686     15
Mult(1, ., fefam + natfare).polviews3 -0.90102278     16
Mult(1, ., fefam + natfare).polviews4  0.06170142     17
Mult(1, ., fefam + natfare).polviews5 -0.20795228     18
Mult(1, ., fefam + natfare).polviews6  1.57835547     19
Mult(1, ., fefam + natfare).polviews7  1.92456047     20
Mult(1, polviews, . + natfare).fefam1  0.61653553     21
Mult(1, polviews, . + natfare).fefam2  0.30072953     22
Mult(1, polviews, . + natfare).fefam3  0.03156322     23
Mult(1, polviews, . + natfare).fefam4 -0.13260419     24
Mult(1, polviews, fefam + .).natfare2 -0.15612825     25
Mult(1, polviews, fefam + .).natfare3 -0.57283168     26
# mu[i], i = 1 to 7
mu <- getContrasts(model = M7, 
                   set = pickCoef(M7, "[.]polviews")[1:7], 
                   ref = "mean",
                   scaleRef = "mean", 
                   scaleWeights = "unit")

con <- c(mu$qvframe[,1][c(1:7)], 
         mu$qvframe[,1][c(1:7)])

ここでは一貫した制約を課さないモデルを用い,制約で一貫したスコアを割り当てる.そして,制約のない列スコアと層スコアを正則化する.

M7_SE <- freq_tab_3.1 |>
  gnm(Freq ~ polviews + fefam + natfare + 
        Mult(1, polviews, fefam) + 
        Mult(1, polviews, natfare),
      constrain = c(14:20, 26:32), 
      constrainTo = con,
      data = _, 
      family = poisson, 
      tolerance = 1e-12)
Initialising
Running start-up iterations..
Running main iterations...
Done
# nu[j], j = 1 to 4
nu <- getContrasts(model = M7_SE, 
                   set = pickCoef(M7_SE, "[.]fefam"), 
                   ref = "mean",
                   scaleRef = "mean", 
                   scaleWeights = "unit")
# eta[k], k = 1 to 3
eta <- getContrasts(model = M7_SE, 
                    set = pickCoef(M7_SE, "[.]natfare"), 
                    ref = "mean",
                    scaleRef = "mean", 
                    scaleWeights = "unit")

con <- c(mu$qvframe[,1][c(1:7)], 
         nu$qvframe[,1][c(1,4)],
         mu$qvframe[,1][c(1:7)], 
         eta$qvframe[,1][c(1,3)])

最後に一貫したスコア(行)と正則化したスコア(列と層)を用いて再度推定を行う.

M7_SE <- freq_tab_3.1 |>
  gnm(Freq ~ polviews + fefam + natfare + 
        Mult(1, polviews, fefam) + 
        Mult(1, polviews, natfare),
      constrain = c(14:20,21,24,26:32,33,35), 
      constrainTo = con,
      data = _, 
      family = poisson, 
      trace = T, 
      tolerance = 1e-12)
Initialising
Initial Deviance = 151.608771
Running start-up iterations
Start-up iteration 1. Deviance = 74.992568
Start-up iteration 2. Deviance = 72.948285
Running main iterations
Iteration 1. Deviance = 72.773956
Iteration 2. Deviance = 72.773834
Iteration 3. Deviance = 72.773834
Done
M7_SE_coef <- tidy(M7_SE)
M7_SE_coef |> print(n = Inf)
# A tibble: 35 × 5
   term                          estimate std.error statistic   p.value
   <chr>                            <dbl>     <dbl>     <dbl>     <dbl>
 1 (Intercept)                     0.497     0.200      2.49   1.28e- 2
 2 polviews2                       1.06      0.184      5.78   7.52e- 9
 3 polviews3                       1.03      0.190      5.42   5.91e- 8
 4 polviews4                       2.34      0.200     11.7    1.01e-31
 5 polviews5                       1.33      0.202      6.59   4.46e-11
 6 polviews6                       1.27      0.287      4.42   9.73e- 6
 7 polviews7                      -0.107     0.338     -0.317  7.51e- 1
 8 fefam2                          0.983     0.0947    10.4    3.01e-25
 9 fefam3                          0.435     0.104      4.19   2.73e- 5
10 fefam4                         -0.864     0.150     -5.77   7.72e- 9
11 natfare2                        0.345     0.0853     4.04   5.28e- 5
12 natfare3                        0.290     0.0869     3.33   8.54e- 4
13 Mult(., polviews, fefam).       1.95      0.374      5.21   1.92e- 7
14 Mult(1, ., fefam).polviews1    -0.413    NA         NA     NA       
15 Mult(1, ., fefam).polviews2    -0.386    NA         NA     NA       
16 Mult(1, ., fefam).polviews3    -0.269    NA         NA     NA       
17 Mult(1, ., fefam).polviews4     0.0275   NA         NA     NA       
18 Mult(1, ., fefam).polviews5    -0.0555   NA         NA     NA       
19 Mult(1, ., fefam).polviews6     0.494    NA         NA     NA       
20 Mult(1, ., fefam).polviews7     0.601    NA         NA     NA       
21 Mult(1, polviews, .).fefam1    -0.726    NA         NA     NA       
22 Mult(1, polviews, .).fefam2    -0.170     0.150     -1.14   2.55e- 1
23 Mult(1, polviews, .).fefam3     0.304     0.189      1.61   1.08e- 1
24 Mult(1, polviews, .).fefam4     0.593    NA         NA     NA       
25 Mult(., polviews, natfare).    -1.44      0.226     -6.36   2.03e-10
26 Mult(1, ., natfare).polviews1  -0.413    NA         NA     NA       
27 Mult(1, ., natfare).polviews2  -0.386    NA         NA     NA       
28 Mult(1, ., natfare).polviews3  -0.269    NA         NA     NA       
29 Mult(1, ., natfare).polviews4   0.0275   NA         NA     NA       
30 Mult(1, ., natfare).polviews5  -0.0555   NA         NA     NA       
31 Mult(1, ., natfare).polviews6   0.494    NA         NA     NA       
32 Mult(1, ., natfare).polviews7   0.601    NA         NA     NA       
33 Mult(1, polviews, .).natfare1   0.580    NA         NA     NA       
34 Mult(1, polviews, .).natfare2   0.207     0.186      1.12   2.64e- 1
35 Mult(1, polviews, .).natfare3  -0.788    NA         NA     NA       

モデル8は1,1,2,3,3,4,5という制約があり,結局は1,2,3,4,5の5つのパラメータを推定することになる.しかし,あくまで1,1,2,3,3,4,5という7つのパラメータにウェイトをかける必要がある.そこでc(2,1,2,1,1)/7とすることで,等値制約をかけている部分は平均を2倍にし,c(2,1,2,1,1)とすることでウェイトも2倍にしている.

# Model 8
# mu[i], i = 1 to 7
mu <- getContrasts(model = M8,
                   set = pickCoef(M8, "[.]polviews.c"),
                   ref = c(2, 1, 2, 1, 1) / 7,
                   scaleRef = c(2, 1, 2, 1, 1) / 7,
                   scaleWeights = c(2, 1, 2, 1, 1))

mu <- getContrasts(model = M8,
                   set = pickCoef(M8, "[.]polviews.c"),
                   ref = c(2, 1, 2, 1, 1) / 7,
                   scaleRef = c(2, 1, 2, 1, 1) / 7,
                   scaleWeights = c(2, 1, 2, 1, 1))
mu;mu
                                            Estimate Std. Error
Mult(1, ., fefam + natfare).polviews.c1 -0.402725149 0.04298356
Mult(1, ., fefam + natfare).polviews.c2 -0.278981096 0.08172199
Mult(1, ., fefam + natfare).polviews.c3 -0.001961895 0.04688021
Mult(1, ., fefam + natfare).polviews.c4  0.491602614 0.08428340
Mult(1, ., fefam + natfare).polviews.c5  0.596752569 0.08715205
                                            Estimate Std. Error
Mult(1, ., fefam + natfare).polviews.c1 -0.402725149 0.04298356
Mult(1, ., fefam + natfare).polviews.c2 -0.278981096 0.08172199
Mult(1, ., fefam + natfare).polviews.c3 -0.001961895 0.04688021
Mult(1, ., fefam + natfare).polviews.c4  0.491602614 0.08428340
Mult(1, ., fefam + natfare).polviews.c5  0.596752569 0.08715205
con <- c(mu$qvframe[, 1][c(1, 1, 2, 3, 3, 4, 5)], 
         mu$qvframe[, 1][c(1, 1, 2, 3, 3, 4, 5)])

一貫した行スコア(等値制約あり)を指定して再推定.

M8 <- freq_tab_3.1 |> 
  gnm(Freq ~ polviews + fefam + natfare + 
        Mult(1, polviews, fefam) + 
        Mult(1, polviews, natfare),
      constrain = c(14:20,26:32),
      constrainTo = con,
      data = _, 
      family = poisson, 
      tolerance = 1e-12)
Initialising
Running start-up iterations..
Running main iterations...
Done
tidy(M8)
# A tibble: 35 × 5
   term        estimate std.error statistic   p.value
   <chr>          <dbl>     <dbl>     <dbl>     <dbl>
 1 (Intercept)    0.497   NA          NA    NA       
 2 polviews2      1.05     0.184       5.70  1.20e- 8
 3 polviews3      1.01    NA          NA    NA       
 4 polviews4      2.32    NA          NA    NA       
 5 polviews5      1.32    NA          NA    NA       
 6 polviews6      1.25    NA          NA    NA       
 7 polviews7     -0.131   NA          NA    NA       
 8 fefam2         0.993    0.0956     10.4   2.62e-25
 9 fefam3         0.451    0.104       4.33  1.52e- 5
10 fefam4        -0.840    0.149      -5.64  1.72e- 8
# ℹ 25 more rows
glance(M8)
# A tibble: 1 × 8
  null.deviance df.null logLik   AIC   BIC deviance df.residual  nobs
          <dbl>   <dbl>  <dbl> <dbl> <dbl>    <dbl>       <int> <int>
1            NA      NA  -189.  412.  453.     73.6          67    84

次は列スコアと層スコアの正則化をおこなう.

# nu[j], j = 1 to 4
nu <- getContrasts(model = M8, 
                   set = pickCoef(M8, "[.]fefam"), 
                   ref = "mean",
                   scaleRef = "mean", 
                   scaleWeights = "unit")

# eta[k], k = 1 to 3
eta <- getContrasts(model = M8, 
                    set = pickCoef(M8, "[.]natfare"), 
                    ref = "mean",
                    scaleRef = "mean", 
                    scaleWeights = "unit")

con <- c(mu$qvframe[,1][c(1,1,2,3,3,4,5)], 
         nu$qvframe[,1][c(1,4)],
         mu$qvframe[,1][c(1,1,2,3,3,4,5)], 
         eta$qvframe[,1][c(1,3)])

一貫した行スコア(等値制約あり)のすべて,列スコア(最初と最後),層スコア(最初と最後)を指定して再推定.

M8_SE <- freq_tab_3.1 |> 
  gnm(Freq ~ polviews + fefam + natfare + 
        Mult(1, polviews, fefam) + 
        Mult(1, polviews, natfare),
      constrain = c(14:20,21,24,26:32,33,35), 
      constrainTo = con,
      data = _, 
      family = poisson, 
      tolerance = 1e-12)
Initialising
Running start-up iterations..
Running main iterations........
Done
M8_SE_coef <- tidy(M8_SE)
M8_SE_coef |> print(n = Inf)
# A tibble: 35 × 5
   term                          estimate std.error statistic   p.value
   <chr>                            <dbl>     <dbl>     <dbl>     <dbl>
 1 (Intercept)                    0.494      0.199      2.49   1.29e- 2
 2 polviews2                      1.05       0.184      5.70   1.20e- 8
 3 polviews3                      1.02       0.189      5.38   7.41e- 8
 4 polviews4                      2.33       0.195     12.0    6.32e-33
 5 polviews5                      1.32       0.207      6.39   1.62e-10
 6 polviews6                      1.25       0.286      4.39   1.12e- 5
 7 polviews7                     -0.123      0.337     -0.366  7.14e- 1
 8 fefam2                         0.993      0.0956    10.4    2.62e-25
 9 fefam3                         0.451      0.104      4.33   1.52e- 5
10 fefam4                        -0.840      0.149     -5.64   1.72e- 8
11 natfare2                       0.346      0.0856     4.04   5.36e- 5
12 natfare3                       0.302      0.0868     3.48   5.01e- 4
13 Mult(., polviews, fefam).      1.94       0.374      5.19   2.16e- 7
14 Mult(1, ., fefam).polviews1   -0.403     NA         NA     NA       
15 Mult(1, ., fefam).polviews2   -0.403     NA         NA     NA       
16 Mult(1, ., fefam).polviews3   -0.279     NA         NA     NA       
17 Mult(1, ., fefam).polviews4   -0.00196   NA         NA     NA       
18 Mult(1, ., fefam).polviews5   -0.00196   NA         NA     NA       
19 Mult(1, ., fefam).polviews6    0.492     NA         NA     NA       
20 Mult(1, ., fefam).polviews7    0.597     NA         NA     NA       
21 Mult(1, polviews, .).fefam1   -0.733     NA         NA     NA       
22 Mult(1, polviews, .).fefam2   -0.162      0.150     -1.08   2.78e- 1
23 Mult(1, polviews, .).fefam3    0.313      0.191      1.64   1.01e- 1
24 Mult(1, polviews, .).fefam4    0.582     NA         NA     NA       
25 Mult(., polviews, natfare).    1.41       0.226      6.25   4.03e-10
26 Mult(1, ., natfare).polviews1 -0.403     NA         NA     NA       
27 Mult(1, ., natfare).polviews2 -0.403     NA         NA     NA       
28 Mult(1, ., natfare).polviews3 -0.279     NA         NA     NA       
29 Mult(1, ., natfare).polviews4 -0.00196   NA         NA     NA       
30 Mult(1, ., natfare).polviews5 -0.00196   NA         NA     NA       
31 Mult(1, ., natfare).polviews6  0.492     NA         NA     NA       
32 Mult(1, ., natfare).polviews7  0.597     NA         NA     NA       
33 Mult(1, polviews, .).natfare1 -0.569     NA         NA     NA       
34 Mult(1, polviews, .).natfare2 -0.222      0.190     -1.17   2.42e- 1
35 Mult(1, polviews, .).natfare3  0.791     NA         NA     NA       

すべてのスコアを列方向に合併し,表3.3を再現.

bind_cols(
  M6_SE_coef |> dplyr::select(term, Model6 = estimate),
  M7_SE_coef |> dplyr::select(Model7 = estimate),
  M8_SE_coef |> dplyr::select(Model8 = estimate)) |>
  dplyr::filter(grepl("Mult", term)) |> 
  print(n = Inf)
# A tibble: 23 × 4
   term                           Model6  Model7   Model8
   <chr>                           <dbl>   <dbl>    <dbl>
 1 Mult(., polviews, fefam).      1.98    1.95    1.94   
 2 Mult(1, ., fefam).polviews1    0.189  -0.413  -0.403  
 3 Mult(1, ., fefam).polviews2    0.456  -0.386  -0.403  
 4 Mult(1, ., fefam).polviews3    0.365  -0.269  -0.279  
 5 Mult(1, ., fefam).polviews4    0.0129  0.0275 -0.00196
 6 Mult(1, ., fefam).polviews5    0.0626 -0.0555 -0.00196
 7 Mult(1, ., fefam).polviews6   -0.421   0.494   0.492  
 8 Mult(1, ., fefam).polviews7   -0.665   0.601   0.597  
 9 Mult(1, polviews, .).fefam1    0.703  -0.726  -0.733  
10 Mult(1, polviews, .).fefam2    0.208  -0.170  -0.162  
11 Mult(1, polviews, .).fefam3   -0.300   0.304   0.313  
12 Mult(1, polviews, .).fefam4   -0.610   0.593   0.582  
13 Mult(., polviews, natfare).    1.57   -1.44    1.41   
14 Mult(1, ., natfare).polviews1 -0.606  -0.413  -0.403  
15 Mult(1, ., natfare).polviews2 -0.275  -0.386  -0.403  
16 Mult(1, ., natfare).polviews3 -0.158  -0.269  -0.279  
17 Mult(1, ., natfare).polviews4  0.0646  0.0275 -0.00196
18 Mult(1, ., natfare).polviews5 -0.0505 -0.0555 -0.00196
19 Mult(1, ., natfare).polviews6  0.512   0.494   0.492  
20 Mult(1, ., natfare).polviews7  0.514   0.601   0.597  
21 Mult(1, polviews, .).natfare1 -0.607   0.580  -0.569  
22 Mult(1, polviews, .).natfare2 -0.169   0.207  -0.222  
23 Mult(1, polviews, .).natfare3  0.776  -0.788   0.791  

3.4 表3.4

表3.4のデータを入力する.

# 表3.1
Freq <- c(76, 14, 15,  4,
        32, 17,  7,  3,
        64, 23, 28, 15,
        41, 11, 27, 16,
        15,  2,  7,  4,
        27, 20,  9,  5,
        57, 31, 24, 15,
        27,  9, 22, 16,
        13,  6, 13,  5,
        12, 13, 10,  6,
        46, 32, 75, 20,
        54, 26, 58, 55,
        7,  6,  7,  6,
        7,  2,  3,  6,
        12, 11, 31, 15,
        52, 36, 80,101)

行,列,層のカテゴリを入力し,matrixで確認する.

L <- gl(4, 16, 64)
R <- gl(4, 4, 64)
C <- gl(4, 1, 64)

# 確認する
L |> matrix(nrow = 16, ncol = 4, byrow = TRUE)
      [,1] [,2] [,3] [,4]
 [1,] "1"  "1"  "1"  "1" 
 [2,] "1"  "1"  "1"  "1" 
 [3,] "1"  "1"  "1"  "1" 
 [4,] "1"  "1"  "1"  "1" 
 [5,] "2"  "2"  "2"  "2" 
 [6,] "2"  "2"  "2"  "2" 
 [7,] "2"  "2"  "2"  "2" 
 [8,] "2"  "2"  "2"  "2" 
 [9,] "3"  "3"  "3"  "3" 
[10,] "3"  "3"  "3"  "3" 
[11,] "3"  "3"  "3"  "3" 
[12,] "3"  "3"  "3"  "3" 
[13,] "4"  "4"  "4"  "4" 
[14,] "4"  "4"  "4"  "4" 
[15,] "4"  "4"  "4"  "4" 
[16,] "4"  "4"  "4"  "4" 
R |> matrix(nrow = 16, ncol = 4, byrow = TRUE)
      [,1] [,2] [,3] [,4]
 [1,] "1"  "1"  "1"  "1" 
 [2,] "2"  "2"  "2"  "2" 
 [3,] "3"  "3"  "3"  "3" 
 [4,] "4"  "4"  "4"  "4" 
 [5,] "1"  "1"  "1"  "1" 
 [6,] "2"  "2"  "2"  "2" 
 [7,] "3"  "3"  "3"  "3" 
 [8,] "4"  "4"  "4"  "4" 
 [9,] "1"  "1"  "1"  "1" 
[10,] "2"  "2"  "2"  "2" 
[11,] "3"  "3"  "3"  "3" 
[12,] "4"  "4"  "4"  "4" 
[13,] "1"  "1"  "1"  "1" 
[14,] "2"  "2"  "2"  "2" 
[15,] "3"  "3"  "3"  "3" 
[16,] "4"  "4"  "4"  "4" 
C |> matrix(nrow = 16, ncol = 4, byrow = TRUE)
      [,1] [,2] [,3] [,4]
 [1,] "1"  "2"  "3"  "4" 
 [2,] "1"  "2"  "3"  "4" 
 [3,] "1"  "2"  "3"  "4" 
 [4,] "1"  "2"  "3"  "4" 
 [5,] "1"  "2"  "3"  "4" 
 [6,] "1"  "2"  "3"  "4" 
 [7,] "1"  "2"  "3"  "4" 
 [8,] "1"  "2"  "3"  "4" 
 [9,] "1"  "2"  "3"  "4" 
[10,] "1"  "2"  "3"  "4" 
[11,] "1"  "2"  "3"  "4" 
[12,] "1"  "2"  "3"  "4" 
[13,] "1"  "2"  "3"  "4" 
[14,] "1"  "2"  "3"  "4" 
[15,] "1"  "2"  "3"  "4" 
[16,] "1"  "2"  "3"  "4" 

以上をtibbleでまとめ,データを作成する.

freq_tab_3.1 <- tibble(Freq, L, R, C) |> arrange(L, R, C)
freq_tab_3.1
# A tibble: 64 × 4
    Freq L     R     C    
   <dbl> <fct> <fct> <fct>
 1    76 1     1     1    
 2    14 1     1     2    
 3    15 1     1     3    
 4     4 1     1     4    
 5    32 1     2     1    
 6    17 1     2     2    
 7     7 1     2     3    
 8     3 1     2     4    
 9    64 1     3     1    
10    23 1     3     2    
# ℹ 54 more rows

行,列,層について整数スコアを作成する.

freq_tab_3.1 <- freq_tab_3.1 |> 
  mutate(Rscore = as.numeric(R),
         Cscore = as.numeric(C),
         Lscore = as.numeric(L))
freq_tab_3.1
# A tibble: 64 × 7
    Freq L     R     C     Rscore Cscore Lscore
   <dbl> <fct> <fct> <fct>  <dbl>  <dbl>  <dbl>
 1    76 1     1     1          1      1      1
 2    14 1     1     2          1      2      1
 3    15 1     1     3          1      3      1
 4     4 1     1     4          1      4      1
 5    32 1     2     1          2      1      1
 6    17 1     2     2          2      2      1
 7     7 1     2     3          2      3      1
 8     3 1     2     4          2      4      1
 9    64 1     3     1          3      1      1
10    23 1     3     2          3      2      1
# ℹ 54 more rows

それではモデル1から15までを用いた推定を行う.ただしgnmではモデル3と5の推定はできない. また

# Model 1 - Complete Independence
model1 <- freq_tab_3.1 |>
  gnm(
    Freq ~ R + C + L,
    data = _,
    family = poisson,
    trace = F,
    tolerance = 1e-12
  )

# Model 2 - Unrestricted RC(1)+RL(1)+CL(1)
model2 <- freq_tab_3.1 |>
  gnm(
    Freq ~ R + C + L + Mult(1, R, C) + Mult(1, R, L) + Mult(1, C, L),
    data = _,
    family = poisson,
    trace = F,
    tolerance = 1e-12
  )
Initialising
Running start-up iterations..
Running main iterations.........................................................
..................................
Done
# Model 3 - Restricted RC(1)+RL(1)+CL(1) with consistent score
# It may not be fitted with gnm package!

# Model 4 - Model 2 with consistent cells fitted exactly
freq_tab_3.1 <- freq_tab_3.1 |>
  mutate(consistent.cells = factor(ifelse((R == C) & (C == L), R, 0)))
model4 <- freq_tab_3.1 |>
  gnm(
    Freq ~ R + C + L + consistent.cells +
      Mult(1, R, C) + Mult(1, R, L) + Mult(1, C, L),
    data = _,
    family = poisson,
    trace = F,
    tolerance = 1e-12
  )
Initialising
Running start-up iterations..
Running main iterations.........................................................
........
Done
# Model 5 - Model 3 with consistent cells fitted exactly
# It may not be fitted with gnm package!

# Model 6 - Full Two-way interaction
model6 <- freq_tab_3.1 |>
  gnm(
    Freq ~ R * C + R * L + C * L,
    data = _,
    family = poisson,
    trace = F,
    tolerance = 1e-12
  )
summary(model6)

Call:
gnm(formula = Freq ~ R * C + R * L + C * L, family = poisson, 
    data = freq_tab_3.1, tolerance = 1e-12, trace = F)

Deviance Residuals: 
      Min         1Q     Median         3Q        Max  
-1.685582  -0.504109  -0.008581   0.460359   1.299438  

Coefficients:
            Estimate Std. Error z value Pr(>|z|)    
(Intercept)  4.26029    0.11066  38.499  < 2e-16 ***
R2          -0.79606    0.18519  -4.299 1.72e-05 ***
R3          -0.09579    0.14996  -0.639  0.52299    
R4          -0.43476    0.16083  -2.703  0.00687 ** 
C2          -1.63953    0.22829  -7.182 6.89e-13 ***
C3          -1.39351    0.20261  -6.878 6.08e-12 ***
C4          -2.33707    0.28019  -8.341  < 2e-16 ***
R2:C2        0.90120    0.28232   3.192  0.00141 ** 
R3:C2        0.63274    0.25192   2.512  0.01202 *  
R4:C2        0.33707    0.26138   1.290  0.19719    
R2:C3       -0.06534    0.29098  -0.225  0.82232    
R3:C3        0.66917    0.22004   3.041  0.00236 ** 
R4:C3        0.60286    0.22215   2.714  0.00665 ** 
R2:C4        0.34284    0.36220   0.947  0.34388    
R3:C4        0.56412    0.29673   1.901  0.05729 .  
R4:C4        1.27643    0.28261   4.517 6.29e-06 ***
L2          -1.48502    0.22186  -6.694 2.18e-11 ***
L3          -1.52970    0.20833  -7.343 2.10e-13 ***
L4          -2.08728    0.24553  -8.501  < 2e-16 ***
R2:L2        1.34634    0.28170   4.779 1.76e-06 ***
R3:L2        1.28703    0.24739   5.203 1.97e-07 ***
R4:L2        1.03853    0.26517   3.916 8.99e-05 ***
R2:L3        0.67005    0.28444   2.356  0.01849 *  
R3:L3        1.21742    0.22757   5.350 8.81e-08 ***
R4:L3        1.59671    0.23321   6.847 7.56e-12 ***
R2:L4        0.17240    0.35528   0.485  0.62750    
R3:L4        0.61348    0.27149   2.260  0.02384 *  
R4:L4        2.16906    0.25643   8.459  < 2e-16 ***
C2:L2        0.35033    0.21463   1.632  0.10263    
C3:L2        0.22827    0.20862   1.094  0.27389    
C4:L2        0.49174    0.25839   1.903  0.05703 .  
C2:L3        0.65539    0.20819   3.148  0.00164 ** 
C3:L3        1.09826    0.18400   5.969 2.39e-09 ***
C4:L3        1.11150    0.23123   4.807 1.53e-06 ***
C2:L4        0.87747    0.23892   3.673  0.00024 ***
C3:L4        1.29956    0.20753   6.262 3.80e-10 ***
C4:L4        1.79692    0.23862   7.530 5.06e-14 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for poisson family taken to be 1)

Residual deviance: 28.998 on 27 degrees of freedom
AIC: 397.32

Number of iterations: 5
# Model 7 - Model 6 with consistent cells fitted exactly
model7 <- freq_tab_3.1 |>
  gnm(
    Freq ~ R * C + R * L + C * L + consistent.cells,
    data = _,
    family = poisson,
    trace = F,
    tolerance = 1e-12
  )
summary(model7)

Call:
gnm(formula = Freq ~ R * C + R * L + C * L + consistent.cells, 
    family = poisson, data = freq_tab_3.1, tolerance = 1e-12,     trace = F)

Deviance Residuals: 
       Min          1Q      Median          3Q         Max  
-1.505e+00  -4.123e-01  -1.490e-08   3.008e-01   1.562e+00  

Coefficients:
                  Estimate Std. Error z value Pr(>|z|)    
(Intercept)        3.70806    0.31642  11.719  < 2e-16 ***
R2                -0.26471    0.33752  -0.784 0.432870    
R3                 0.43595    0.31473   1.385 0.166007    
R4                 0.04506    0.31538   0.143 0.886401    
C2                -1.23787    0.31573  -3.921 8.83e-05 ***
C3                -0.95472    0.29544  -3.232 0.001231 ** 
C4                -2.00687    0.35086  -5.720 1.07e-08 ***
R2:C2              0.49806    0.36012   1.383 0.166653    
R3:C2              0.33263    0.30439   1.093 0.274482    
R4:C2              0.02956    0.30915   0.096 0.923826    
R2:C3             -0.37252    0.33538  -1.111 0.266684    
R3:C3              0.21202    0.29412   0.721 0.470997    
R4:C3              0.33724    0.27290   1.236 0.216553    
R2:C4              0.06257    0.39636   0.158 0.874574    
R3:C4              0.29993    0.33550   0.894 0.371334    
R4:C4              1.06332    0.33951   3.132 0.001737 ** 
L2                -1.05809    0.31923  -3.314 0.000918 ***
L3                -1.09080    0.29894  -3.649 0.000263 ***
L4                -1.74115    0.32163  -5.413 6.18e-08 ***
R2:L2              0.91597    0.36361   2.519 0.011766 *  
R3:L2              0.93125    0.31450   2.961 0.003066 ** 
R4:L2              0.67771    0.32813   2.065 0.038888 *  
R2:L3              0.33649    0.33467   1.005 0.314694    
R3:L3              0.75119    0.30376   2.473 0.013399 *  
R4:L3              1.28290    0.29072   4.413 1.02e-05 ***
R2:L4             -0.12414    0.39162  -0.317 0.751243    
R3:L4              0.33826    0.31651   1.069 0.285199    
R4:L4              1.91005    0.31369   6.089 1.14e-09 ***
C2:L2              0.17440    0.24791   0.704 0.481744    
C3:L2              0.12343    0.21731   0.568 0.570049    
C4:L2              0.38519    0.26377   1.460 0.144196    
C2:L3              0.54622    0.21620   2.526 0.011522 *  
C3:L3              0.78217    0.22762   3.436 0.000590 ***
C4:L3              0.98203    0.23833   4.120 3.78e-05 ***
C2:L4              0.75925    0.24670   3.078 0.002087 ** 
C3:L4              1.14125    0.21839   5.226 1.73e-07 ***
C4:L4              1.79914    0.31902   5.640 1.70e-08 ***
consistent.cells1  0.62268    0.33657   1.850 0.064303 .  
consistent.cells2  0.25993    0.39723   0.654 0.512891    
consistent.cells3  0.47364    0.26552   1.784 0.074458 .  
consistent.cells4 -0.16248    0.31471  -0.516 0.605666    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for poisson family taken to be 1)

Residual deviance: 21.934 on 23 degrees of freedom
AIC: 398.25

Number of iterations: 5
# Model 8 - Unrestricted uniform and log-multiplicative association in all partial
# association
model8 <- freq_tab_3.1 |>
  gnm(
    Freq ~ R + C + L +
      Rscore:Cscore +
      Mult(1, R, C) +
      Rscore:Lscore +
      Mult(1, R, L) +
      Cscore:Lscore +
      Mult(1, C, L),
    data = _,
    family = poisson,
    trace = F,
    tolerance = 1e-12
  )
Initialising
Running start-up iterations..
Running main iterations.........................................................
..............
Done
summary(model8)

Call:
gnm(formula = Freq ~ R + C + L + Rscore:Cscore + Mult(1, R, C) + 
    Rscore:Lscore + Mult(1, R, L) + Cscore:Lscore + Mult(1, C, 
    L), family = poisson, data = freq_tab_3.1, tolerance = 1e-12,     trace = F)


Deviance Residuals: 
     Min        1Q    Median        3Q       Max  
-1.64348  -0.68031  -0.02712   0.48954   2.01814  

Coefficients:
                   Estimate Std. Error z value Pr(>|z|)    
(Intercept)       3.5843655         NA      NA       NA    
R2               -0.9844527         NA      NA       NA    
R3               -0.7522372         NA      NA       NA    
R4               -1.5738349         NA      NA       NA    
C2               -1.6097190         NA      NA       NA    
C3               -2.0783249         NA      NA       NA    
C4               -3.4330190         NA      NA       NA    
L2               -1.4738150         NA      NA       NA    
L3               -2.2418273         NA      NA       NA    
L4               -3.8020714         NA      NA       NA    
Rscore:Cscore     0.1296440  0.0272792   4.752 2.01e-06 ***
Mult(., R, C).    0.3755915         NA      NA       NA    
Mult(1, ., C).R1  0.1452548         NA      NA       NA    
Mult(1, ., C).R2 -0.3244586         NA      NA       NA    
Mult(1, ., C).R3 -0.1448572         NA      NA       NA    
Mult(1, ., C).R4  0.1841136         NA      NA       NA    
Mult(1, R, .).C1  0.5249563         NA      NA       NA    
Mult(1, R, .).C2 -3.3891552         NA      NA       NA    
Mult(1, R, .).C3 -0.2655787         NA      NA       NA    
Mult(1, R, .).C4  2.5859285         NA      NA       NA    
Rscore:Lscore     0.2544964  0.0280285   9.080  < 2e-16 ***
Mult(., R, L).    3.2515305         NA      NA       NA    
Mult(1, ., L).R1  0.2882521         NA      NA       NA    
Mult(1, ., L).R2 -0.3021096         NA      NA       NA    
Mult(1, ., L).R3 -0.2384094         NA      NA       NA    
Mult(1, ., L).R4  0.1714509         NA      NA       NA    
Mult(1, R, .).L1  0.0455793         NA      NA       NA    
Mult(1, R, .).L2 -0.4419901         NA      NA       NA    
Mult(1, R, .).L3 -0.0811452         NA      NA       NA    
Mult(1, R, .).L4  0.5224424         NA      NA       NA    
Cscore:Lscore     0.2017249  0.0258549   7.802  < 2e-16 ***
Mult(., C, L).   -0.8754712         NA      NA       NA    
Mult(1, ., L).C1  0.3002275         NA      NA       NA    
Mult(1, ., L).C2 -0.0412263         NA      NA       NA    
Mult(1, ., L).C3 -0.9734008         NA      NA       NA    
Mult(1, ., L).C4  0.3744697         NA      NA       NA    
Mult(1, C, .).L1 -0.0237909         NA      NA       NA    
Mult(1, C, .).L2 -0.1650570         NA      NA       NA    
Mult(1, C, .).L3  0.2543660         NA      NA       NA    
Mult(1, C, .).L4 -0.0006375         NA      NA       NA    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for poisson family taken to be 1)

Std. Error is NA where coefficient has been constrained or is unidentified

Residual deviance: 45.854 on 36 degrees of freedom
AIC: 396.17

Number of iterations: 71
pickCoef(model8, "[.]R")
Mult(1, ., C).R1 Mult(1, ., C).R2 Mult(1, ., C).R3 Mult(1, ., C).R4 
              13               14               15               16 
Mult(1, ., L).R1 Mult(1, ., L).R2 Mult(1, ., L).R3 Mult(1, ., L).R4 
              23               24               25               26 
pickCoef(model8, "[.]C")
Mult(1, R, .).C1 Mult(1, R, .).C2 Mult(1, R, .).C3 Mult(1, R, .).C4 
              17               18               19               20 
Mult(1, ., L).C1 Mult(1, ., L).C2 Mult(1, ., L).C3 Mult(1, ., L).C4 
              33               34               35               36 
pickCoef(model8, "[.]L")
Mult(1, R, .).L1 Mult(1, R, .).L2 Mult(1, R, .).L3 Mult(1, R, .).L4 
              27               28               29               30 
Mult(1, C, .).L1 Mult(1, C, .).L2 Mult(1, C, .).L3 Mult(1, C, .).L4 
              37               38               39               40 
data.frame(var = names(model8$coefficients),
           estimate = model8$coefficients) |> 
  mutate(estimate = estimate,
         number = row_number())
                              var      estimate number
(Intercept)           (Intercept)  3.5843654594      1
R2                             R2 -0.9844527452      2
R3                             R3 -0.7522372217      3
R4                             R4 -1.5738348698      4
C2                             C2 -1.6097190368      5
C3                             C3 -2.0783248718      6
C4                             C4 -3.4330189812      7
L2                             L2 -1.4738149842      8
L3                             L3 -2.2418272853      9
L4                             L4 -3.8020714474     10
Rscore:Cscore       Rscore:Cscore  0.1296439973     11
Mult(., R, C).     Mult(., R, C).  0.3755915111     12
Mult(1, ., C).R1 Mult(1, ., C).R1  0.1452548156     13
Mult(1, ., C).R2 Mult(1, ., C).R2 -0.3244585766     14
Mult(1, ., C).R3 Mult(1, ., C).R3 -0.1448572169     15
Mult(1, ., C).R4 Mult(1, ., C).R4  0.1841135671     16
Mult(1, R, .).C1 Mult(1, R, .).C1  0.5249563024     17
Mult(1, R, .).C2 Mult(1, R, .).C2 -3.3891551966     18
Mult(1, R, .).C3 Mult(1, R, .).C3 -0.2655787314     19
Mult(1, R, .).C4 Mult(1, R, .).C4  2.5859285336     20
Rscore:Lscore       Rscore:Lscore  0.2544963888     21
Mult(., R, L).     Mult(., R, L).  3.2515305041     22
Mult(1, ., L).R1 Mult(1, ., L).R1  0.2882521361     23
Mult(1, ., L).R2 Mult(1, ., L).R2 -0.3021096268     24
Mult(1, ., L).R3 Mult(1, ., L).R3 -0.2384094176     25
Mult(1, ., L).R4 Mult(1, ., L).R4  0.1714508503     26
Mult(1, R, .).L1 Mult(1, R, .).L1  0.0455792508     27
Mult(1, R, .).L2 Mult(1, R, .).L2 -0.4419900743     28
Mult(1, R, .).L3 Mult(1, R, .).L3 -0.0811452356     29
Mult(1, R, .).L4 Mult(1, R, .).L4  0.5224423967     30
Cscore:Lscore       Cscore:Lscore  0.2017248677     31
Mult(., C, L).     Mult(., C, L). -0.8754712159     32
Mult(1, ., L).C1 Mult(1, ., L).C1  0.3002274500     33
Mult(1, ., L).C2 Mult(1, ., L).C2 -0.0412263278     34
Mult(1, ., L).C3 Mult(1, ., L).C3 -0.9734007547     35
Mult(1, ., L).C4 Mult(1, ., L).C4  0.3744696897     36
Mult(1, C, .).L1 Mult(1, C, .).L1 -0.0237909080     37
Mult(1, C, .).L2 Mult(1, C, .).L2 -0.1650570164     38
Mult(1, C, .).L3 Mult(1, C, .).L3  0.2543660164     39
Mult(1, C, .).L4 Mult(1, C, .).L4 -0.0006375429     40
# mu1: 13-16
mu1 <- getContrasts(
  model8,
  pickCoef(model8, "[.]R")[1:4],
  ref = "mean",
  scaleRef = "mean",
  scaleWeights = "unit"
)
mu1
                   Estimate Std. Error
Mult(1, ., C).R1  0.4291986 0.18120993
Mult(1, ., C).R2 -0.6893016 0.09977232
Mult(1, ., C).R3 -0.2616277 0.15931019
Mult(1, ., C).R4  0.5217306 0.15976113
# nu1: 17-20
nu1 <- getContrasts(
  model8,
  pickCoef(model8, "[.]C")[1:4],
  ref = "mean",
  scaleRef = "mean",
  scaleWeights = "unit"
)
nu1
                    Estimate Std. Error
Mult(1, R, .).C1  0.15388700 0.15383900
Mult(1, R, .).C2 -0.75746716 0.08227847
Mult(1, R, .).C3 -0.03017965 0.15480459
Mult(1, R, .).C4  0.63375980 0.11651692
# mu2: 23-26
mu2 <- getContrasts(
  model8,
  pickCoef(model8, "[.]R")[5:8],
  ref = "mean",
  scaleRef = "mean",
  scaleWeights = "unit"
)
mu2
                   Estimate Std. Error
Mult(1, ., L).R1  0.6061444 0.08512883
Mult(1, ., L).R2 -0.5539702 0.08877502
Mult(1, ., L).R3 -0.4287935 0.09713147
Mult(1, ., L).R4  0.3766193 0.10554742
# eta1: 27-30
eta1 <- getContrasts(
  model8,
  pickCoef(model8, "[.]L")[1:4],
  ref = "mean",
  scaleRef = "mean",
  scaleWeights = "unit"
)
eta1
                    Estimate Std. Error
Mult(1, R, .).L1  0.04977493 0.08992116
Mult(1, R, .).L2 -0.65658058 0.06234704
Mult(1, R, .).L3 -0.13381443 0.08765352
Mult(1, R, .).L4  0.74062008 0.04970264
# nu2: 33-36
nu2 <- getContrasts(
  model8,
  pickCoef(model8, "[.]C")[5:8],
  ref = "mean",
  scaleRef = "mean",
  scaleWeights = "unit"
)
nu2
                    Estimate Std. Error
Mult(1, ., L).C1  0.35910324  0.2995712
Mult(1, ., L).C2  0.04079069  0.3606231
Mult(1, ., L).C3 -0.82820782  0.1075525
Mult(1, ., L).C4  0.42831389  0.3177968
# eta2: 37-40
eta2 <- getContrasts(
  model8,
  pickCoef(model8, "[.]L")[5:8],
  ref = "mean",
  scaleRef = "mean",
  scaleWeights = "unit"
)
eta2
                    Estimate Std. Error
Mult(1, C, .).L1 -0.13230141  0.3592002
Mult(1, C, .).L2 -0.59941504  0.2494518
Mult(1, C, .).L3  0.78745843  0.1409196
Mult(1, C, .).L4 -0.05574198  0.3241035
con <- c(mu1$qvframe[, 1][c(1,4)],
         nu1$qvframe[, 1][c(1,4)],
         mu2$qvframe[, 1][c(1,4)],
         eta1$qvframe[, 1][c(1,4)],
         nu2$qvframe[, 1][c(1,4)],
         eta2$qvframe[, 1][c(1,4)])


model8_se <- freq_tab_3.1 |>
  gnm(
    Freq ~ R + C + L +
      Rscore:Cscore +
      Mult(1, R, C) +
      Rscore:Lscore +
      Mult(1, R, L) +
      Cscore:Lscore +
      Mult(1, C, L),
#    constrain = c(13,16,17,20,23,26,27,30,33,36,37,40),
#    constrainTo = con,
    data = _,
    family = poisson,
    trace = F,
    tolerance = 1e-15
  )
Initialising
Running start-up iterations..
Running main iterations.........................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
...........................................
Done
summary(model8_se)

Call:
gnm(formula = Freq ~ R + C + L + Rscore:Cscore + Mult(1, R, C) + 
    Rscore:Lscore + Mult(1, R, L) + Cscore:Lscore + Mult(1, C, 
    L), family = poisson, data = freq_tab_3.1, tolerance = 1e-15,     trace = F)


Deviance Residuals: 
     Min        1Q    Median        3Q       Max  
-1.64348  -0.68031  -0.02712   0.48954   2.01814  

Coefficients:
                  Estimate Std. Error z value Pr(>|z|)    
(Intercept)       3.578416         NA      NA       NA    
R2               -0.944753         NA      NA       NA    
R3               -0.738628         NA      NA       NA    
R4               -1.588272         NA      NA       NA    
C2               -1.595823         NA      NA       NA    
C3               -2.098590         NA      NA       NA    
C4               -3.442358         NA      NA       NA    
L2               -1.486233         NA      NA       NA    
L3               -2.173240         NA      NA       NA    
L4               -3.816157         NA      NA       NA    
Rscore:Cscore     0.129644   0.027279   4.752 2.01e-06 ***
Mult(., R, C).    0.259905         NA      NA       NA    
Mult(1, ., C).R1 -1.608369         NA      NA       NA    
Mult(1, ., C).R2  3.138381         NA      NA       NA    
Mult(1, ., C).R3  1.323396         NA      NA       NA    
Mult(1, ., C).R4 -2.001061         NA      NA       NA    
Mult(1, R, .).C1 -0.139469         NA      NA       NA    
Mult(1, R, .).C2  0.420250         NA      NA       NA    
Mult(1, R, .).C3 -0.026422         NA      NA       NA    
Mult(1, R, .).C4 -0.434189         NA      NA       NA    
Rscore:Lscore     0.254496   0.028029   9.080  < 2e-16 ***
Mult(., R, L).   -1.396314         NA      NA       NA    
Mult(1, ., L).R1 -0.559839         NA      NA       NA    
Mult(1, ., L).R2  0.539134         NA      NA       NA    
Mult(1, ., L).R3  0.420554         NA      NA       NA    
Mult(1, ., L).R4 -0.342411         NA      NA       NA    
Mult(1, R, .).L1  0.031112         NA      NA       NA    
Mult(1, R, .).L2 -0.578807         NA      NA       NA    
Mult(1, R, .).L3 -0.127413         NA      NA       NA    
Mult(1, R, .).L4  0.627638         NA      NA       NA    
Cscore:Lscore     0.201725   0.025855   7.802  < 2e-16 ***
Mult(., C, L).   -0.860457         NA      NA       NA    
Mult(1, ., L).C1 -0.362025         NA      NA       NA    
Mult(1, ., L).C2 -0.141578         NA      NA       NA    
Mult(1, ., L).C3  0.460249         NA      NA       NA    
Mult(1, ., L).C4 -0.409957         NA      NA       NA    
Mult(1, C, .).L1  0.003017         NA      NA       NA    
Mult(1, C, .).L2  0.225644         NA      NA       NA    
Mult(1, C, .).L3 -0.435340         NA      NA       NA    
Mult(1, C, .).L4 -0.033471         NA      NA       NA    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for poisson family taken to be 1)

Std. Error is NA where coefficient has been constrained or is unidentified

Residual deviance: 45.854 on 36 degrees of freedom
AIC: 396.17

Number of iterations: 500
options(contrasts = c(factor="contr.treatment",
                      ordered="contr.treatment"))
# Model 9 - Model 8 with consistent row scores
model9 <- freq_tab_3.1 |>
  gnm(
    Freq ~ R + C + L +
      Rscore:Cscore +
      Mult(1, R, C + L) +
      Rscore:Lscore +
      Cscore:Lscore +
      Mult(1, C, L),
    data = _,
    family = poisson,
    trace = F,
    tolerance = 1e-12
  )
Initialising
Running start-up iterations..
Running main iterations.........................................................
...................................
Done
summary(model9)

Call:
gnm(formula = Freq ~ R + C + L + Rscore:Cscore + Mult(1, R, C + 
    L) + Rscore:Lscore + Cscore:Lscore + Mult(1, C, L), family = poisson, 
    data = freq_tab_3.1, tolerance = 1e-12, trace = F)

Deviance Residuals: 
     Min        1Q    Median        3Q       Max  
-1.56526  -0.67024  -0.02438   0.54037   1.98333  

Coefficients:
                     Estimate Std. Error z value Pr(>|z|)    
(Intercept)           3.57990         NA      NA       NA    
R2                   -0.94951         NA      NA       NA    
R3                   -0.72054         NA      NA       NA    
R4                   -1.55484         NA      NA       NA    
C2                   -1.62289         NA      NA       NA    
C3                   -2.02529         NA      NA       NA    
C4                   -3.45997         NA      NA       NA    
L2                   -1.42960         NA      NA       NA    
L3                   -2.28435         NA      NA       NA    
L4                   -3.75862         NA      NA       NA    
Rscore:Cscore         0.13353    0.02535   5.266 1.39e-07 ***
Mult(., R, C + L).    2.92403         NA      NA       NA    
Mult(1, ., C + L).R1 -0.20409         NA      NA       NA    
Mult(1, ., C + L).R2  0.27631         NA      NA       NA    
Mult(1, ., C + L).R3  0.19241         NA      NA       NA    
Mult(1, ., C + L).R4 -0.14679         NA      NA       NA    
Mult(1, R, . + L).C1 -0.15289         NA      NA       NA    
Mult(1, R, . + L).C2  0.33409         NA      NA       NA    
Mult(1, R, . + L).C3 -0.02460         NA      NA       NA    
Mult(1, R, . + L).C4 -0.42106         NA      NA       NA    
Mult(1, R, C + .).L2  0.66532         NA      NA       NA    
Mult(1, R, C + .).L3  0.16531         NA      NA       NA    
Mult(1, R, C + .).L4 -0.64176         NA      NA       NA    
Rscore:Lscore         0.24848    0.02722   9.127  < 2e-16 ***
Cscore:Lscore         0.20270    0.02562   7.913  < 2e-16 ***
Mult(., C, L).       -2.02786         NA      NA       NA    
Mult(1, ., L).C1     -0.00891         NA      NA       NA    
Mult(1, ., L).C2     -0.09883         NA      NA       NA    
Mult(1, ., L).C3     -0.43722         NA      NA       NA    
Mult(1, ., L).C4      0.01948         NA      NA       NA    
Mult(1, C, .).L1     -0.11190         NA      NA       NA    
Mult(1, C, .).L2     -0.31604         NA      NA       NA    
Mult(1, C, .).L3      0.22080         NA      NA       NA    
Mult(1, C, .).L4     -0.10226         NA      NA       NA    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for poisson family taken to be 1)

Std. Error is NA where coefficient has been constrained or is unidentified

Residual deviance: 47.134 on 38 degrees of freedom
AIC: 393.45

Number of iterations: 92
mu <- getContrasts(
  model9,
  pickCoef(model9, "[.]R"),
  ref = "mean",
  scaleRef = "mean",
  scaleWeights = "unit"
)

nu2 <- getContrasts(
  model9,
  pickCoef(model9, "[.]C")[5:8],
  ref = "mean",
  scaleRef = "mean",
  scaleWeights = "unit"
)

eta2 <- getContrasts(
  model9,
  pickCoef(model9, "[.]L")[4:7],
  ref = "mean",
  scaleRef = "mean",
  scaleWeights = "unit"
)

model9.extended <-
  freq_tab_3.1 |> gnm(
    Freq ~ R + C + L +
      Rscore:Cscore +
      Mult(1, R, C) +
      Rscore:Lscore +
      Mult(1, R, L) +
      Cscore:Lscore +
      Mult(1, C, L),
    constrain = c(13:16, 23:26),
    constrainTo = c(mu$qvframe[, 1], mu$qvframe[, 1]),
    data = _,
    family = poisson,
    trace = F,
    tolerance = 1e-12
  )
Initialising
Running start-up iterations..
Running main iterations.........................................................
...............
Done
summary(model9.extended)

Call:
gnm(formula = Freq ~ R + C + L + Rscore:Cscore + Mult(1, R, C) + 
    Rscore:Lscore + Mult(1, R, L) + Cscore:Lscore + Mult(1, C, 
    L), constrain = c(13:16, 23:26), constrainTo = c(mu$qvframe[, 
    1], mu$qvframe[, 1]), family = poisson, data = freq_tab_3.1, 
    tolerance = 1e-12, trace = F)

Deviance Residuals: 
     Min        1Q    Median        3Q       Max  
-1.56526  -0.67024  -0.02438   0.54037   1.98333  

Coefficients:
                 Estimate Std. Error z value Pr(>|z|)    
(Intercept)       3.58684         NA      NA       NA    
R2               -1.00837         NA      NA       NA    
R3               -0.76912         NA      NA       NA    
R4               -1.56186         NA      NA       NA    
C2               -1.58868         NA      NA       NA    
C3               -2.05112         NA      NA       NA    
C4               -3.48062         NA      NA       NA    
L2               -1.39505         NA      NA       NA    
L3               -2.23301         NA      NA       NA    
L4               -3.81283         NA      NA       NA    
Rscore:Cscore     0.13353    0.02520   5.300 1.16e-07 ***
Mult(., R, C).    0.18009         NA      NA       NA    
Mult(1, ., C).R1 -0.56136         NA      NA       NA    
Mult(1, ., C).R2  0.59333         NA      NA       NA    
Mult(1, ., C).R3  0.39165         NA      NA       NA    
Mult(1, ., C).R4 -0.42362         NA      NA       NA    
Mult(1, R, .).C1 -0.51254         NA      NA       NA    
Mult(1, R, .).C2  2.77718         NA      NA       NA    
Mult(1, R, .).C3  0.35407         NA      NA       NA    
Mult(1, R, .).C4 -2.32416         NA      NA       NA    
Rscore:Lscore     0.24848    0.02521   9.856  < 2e-16 ***
Mult(., R, L).   -0.14415         NA      NA       NA    
Mult(1, ., L).R1 -0.56136         NA      NA       NA    
Mult(1, ., L).R2  0.59333         NA      NA       NA    
Mult(1, ., L).R3  0.39165         NA      NA       NA    
Mult(1, ., L).R4 -0.42362         NA      NA       NA    
Mult(1, R, .).L1  0.29632         NA      NA       NA    
Mult(1, R, .).L2 -5.31844         NA      NA       NA    
Mult(1, R, .).L3 -1.09875         NA      NA       NA    
Mult(1, R, .).L4  5.71226         NA      NA       NA    
Cscore:Lscore     0.20270    0.02560   7.919  < 2e-16 ***
Mult(., C, L).   -0.56592         NA      NA       NA    
Mult(1, ., L).C1  0.12534         NA      NA       NA    
Mult(1, ., L).C2 -0.11925         NA      NA       NA    
Mult(1, ., L).C3 -1.03970         NA      NA       NA    
Mult(1, ., L).C4  0.20256         NA      NA       NA    
Mult(1, C, .).L1 -0.09148         NA      NA       NA    
Mult(1, C, .).L2 -0.36040         NA      NA       NA    
Mult(1, C, .).L3  0.34681         NA      NA       NA    
Mult(1, C, .).L4 -0.07878         NA      NA       NA    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for poisson family taken to be 1)

Std. Error is NA where coefficient has been constrained or is unidentified

Residual deviance: 47.134 on 40 degrees of freedom
AIC: 389.45

Number of iterations: 72
nu1 <- getContrasts(
  model9.extended,
  pickCoef(model9.extended, "[.]C")[1:4],
  ref = "mean",
  scaleRef = "mean",
  scaleWeights = "unit"
)

eta1 <- getContrasts(
    model9.extended,
    pickCoef(model9.extended, "[.]L")[1:4],
    ref = "mean",
    scaleRef = "mean",
    scaleWeights = "unit"
  )

model9.phis <-
  freq_tab_3.1 |>  gnm(
    Freq ~ R + C + L + 
      Rscore:Cscore + 
      Mult(1, R, C) +
      Rscore:Lscore + 
      Mult(1, R, L) + 
      Cscore:Lscore + 
      Mult(1, C, L),
    constrain = c(13:20, 23:30, 33:40),
    constrainTo = c(
      mu$qvframe[, 1],
      nu1$qvframe[, 1],
      mu$qvframe[, 1],
      eta1$qvframe[, 1],
      nu2$qvframe[, 1],
      eta2$qvframe[, 1]
    ),
    data = _,
    family = poisson,
    trace = F,
    tolerance = 1e-12
  )
Initialising
Running main iterations.
Done
summary(model9.phis)

Call:
gnm(formula = Freq ~ R + C + L + Rscore:Cscore + Mult(1, R, C) + 
    Rscore:Lscore + Mult(1, R, L) + Cscore:Lscore + Mult(1, C, 
    L), constrain = c(13:20, 23:30, 33:40), constrainTo = c(mu$qvframe[, 
    1], nu1$qvframe[, 1], mu$qvframe[, 1], eta1$qvframe[, 1], 
    nu2$qvframe[, 1], eta2$qvframe[, 1]), family = poisson, data = freq_tab_3.1, 
    tolerance = 1e-12, trace = F)

Deviance Residuals: 
     Min        1Q    Median        3Q       Max  
-1.56526  -0.67024  -0.02438   0.54037   1.98333  

Coefficients:
                 Estimate Std. Error z value Pr(>|z|)    
(Intercept)       3.56903    0.08137  43.862  < 2e-16 ***
R2               -0.97605    0.11881  -8.215  < 2e-16 ***
R3               -0.74245    0.14810  -5.013 5.36e-07 ***
R4               -1.55801    0.22175  -7.026 2.13e-12 ***
C2               -1.59504    0.10577 -15.081  < 2e-16 ***
C3               -2.08142    0.17240 -12.073  < 2e-16 ***
C4               -3.47861    0.26841 -12.960  < 2e-16 ***
L2               -1.42666    0.10739 -13.285  < 2e-16 ***
L3               -2.18148    0.17791 -12.262  < 2e-16 ***
L4               -3.81133    0.27937 -13.643  < 2e-16 ***
Rscore:Cscore     0.13353    0.02486   5.371 7.83e-08 ***
Mult(., R, C).    0.66121    0.14008   4.720 2.36e-06 ***
Mult(1, ., C).R1 -0.56136         NA      NA       NA    
Mult(1, ., C).R2  0.59333         NA      NA       NA    
Mult(1, ., C).R3  0.39165         NA      NA       NA    
Mult(1, ., C).R4 -0.42362         NA      NA       NA    
Mult(1, R, .).C1 -0.15965         NA      NA       NA    
Mult(1, R, .).C2  0.73633         NA      NA       NA    
Mult(1, R, .).C3  0.07638         NA      NA       NA    
Mult(1, R, .).C4 -0.65306         NA      NA       NA    
Rscore:Lscore     0.24848    0.02515   9.879  < 2e-16 ***
Mult(., R, L).   -1.13662    0.13964  -8.140  < 2e-16 ***
Mult(1, ., L).R1 -0.56136         NA      NA       NA    
Mult(1, ., L).R2  0.59333         NA      NA       NA    
Mult(1, ., L).R3  0.39165         NA      NA       NA    
Mult(1, ., L).R4 -0.42362         NA      NA       NA    
Mult(1, R, .).L1  0.05054         NA      NA       NA    
Mult(1, R, .).L2 -0.66157         NA      NA       NA    
Mult(1, R, .).L3 -0.12640         NA      NA       NA    
Mult(1, R, .).L4  0.73743         NA      NA       NA    
Cscore:Lscore     0.20270    0.02315   8.756  < 2e-16 ***
Mult(., C, L).   -0.28351    0.10068  -2.816  0.00486 ** 
Mult(1, ., L).C1  0.33661         NA      NA       NA    
Mult(1, ., L).C2  0.08944         NA      NA       NA    
Mult(1, ., L).C3 -0.84069         NA      NA       NA    
Mult(1, ., L).C4  0.41464         NA      NA       NA    
Mult(1, C, .).L1 -0.08991         NA      NA       NA    
Mult(1, C, .).L2 -0.62111         NA      NA       NA    
Mult(1, C, .).L3  0.77584         NA      NA       NA    
Mult(1, C, .).L4 -0.06482         NA      NA       NA    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for poisson family taken to be 1)

Std. Error is NA where coefficient has been constrained or is unidentified

Residual deviance: 47.134 on 48 degrees of freedom
AIC: 373.45

Number of iterations: 1
mu
                       Estimate Std. Error
Mult(1, ., C + L).R1 -0.5613577 0.07946201
Mult(1, ., C + L).R2  0.5933253 0.06976100
Mult(1, ., C + L).R3  0.3916506 0.08375491
Mult(1, ., C + L).R4 -0.4236182 0.08896023
nu1
                    Estimate Std. Error
Mult(1, R, .).C1 -0.15964986 0.14637516
Mult(1, R, .).C2  0.73633460 0.08871449
Mult(1, R, .).C3  0.07637713 0.15684115
Mult(1, R, .).C4 -0.65306187 0.10868144
eta1
                    Estimate Std. Error
Mult(1, R, .).L1  0.05053742 0.08981862
Mult(1, R, .).L2 -0.66156822 0.06038098
Mult(1, R, .).L3 -0.12639555 0.08679365
Mult(1, R, .).L4  0.73742635 0.04940126
nu2
                    Estimate Std. Error
Mult(1, ., L).C1  0.33661004 0.30087703
Mult(1, ., L).C2  0.08944163 0.36058729
Mult(1, ., L).C3 -0.84069369 0.08936905
Mult(1, ., L).C4  0.41464201 0.32252708
eta2
                    Estimate Std. Error
Mult(1, C, .).L1 -0.08990831  0.3610226
Mult(1, C, .).L2 -0.62111332  0.2399524
Mult(1, C, .).L3  0.77584334  0.1519881
Mult(1, C, .).L4 -0.06482171  0.3227342
model.summary(model9)
# A tibble: 1 × 6
  `Model Description`    df    L2   BIC Delta     p
  <chr>               <int> <dbl> <dbl> <dbl> <dbl>
1 model9                 38  47.1 -231.  6.25 0.147
# Model 10 - Model 8 with consistent col scores
model10 <-
  freq_tab_3.1 |> gnm(
    Freq ~ R + C + L + 
      Rscore:Cscore + 
      Mult(1, C, R + L) +
      Rscore:Lscore + 
      Mult(1, R, L) + 
      Cscore:Lscore,
    data = _,
    family = poisson,
    trace = F,
    tolerance = 1e-12
  )
Initialising
Running start-up iterations..
Running main iterations.........................................................
...............................................................
Done
model.summary(model10)
# A tibble: 1 × 6
  `Model Description`    df    L2   BIC Delta      p
  <chr>               <int> <dbl> <dbl> <dbl>  <dbl>
1 model10                38  50.9 -227.  6.31 0.0788
# Model 11 - Model 8 with consistent layer scores
model11 <-
  freq_tab_3.1 |> gnm(
    Freq ~ R + C + L + 
      Rscore:Cscore + 
      Mult(1, L, R + C) +
      Rscore:Lscore +
      Mult(1, R, C) +
      Cscore:Lscore,
    data = _,
    family = poisson,
    trace = F,
    tolerance = 1e-12
  )
Initialising
Running start-up iterations..
Running main iterations.........................................................
................
Done
model.summary(model11)
# A tibble: 1 × 6
  `Model Description`    df    L2   BIC Delta      p
  <chr>               <int> <dbl> <dbl> <dbl>  <dbl>
1 model11                38  53.6 -225.  6.58 0.0477
# Model 12 - Modek 9 + U(RL)=U(CL)
# To impose equality constraint on U(RL) & U(CL),
# a covariate is created in following manner:

freq_tab_3.1 <- freq_tab_3.1|> 
  mutate(cov_rcl = Rscore * Lscore + Cscore * Lscore)
model12 <-
  freq_tab_3.1 |> gnm(
    Freq ~ R + C + L + 
      Rscore:Cscore + 
      Mult(1, R, C + L) +
      cov_rcl + 
      Mult(1, C, L),
    data = _,
    family = poisson,
    trace = F,
    tolerance = 1e-12
  )
Initialising
Running start-up iterations..
Running main iterations.........................................................
.............................................
Done
#summary(model12)
model.summary(model12)
# A tibble: 1 × 6
  `Model Description`    df    L2   BIC Delta     p
  <chr>               <int> <dbl> <dbl> <dbl> <dbl>
1 model12                39  48.6 -237.  6.57 0.140
mu <- getContrasts(
  model12,
  pickCoef(model12, "[.]R"),
  ref = "mean",
  scaleRef = "mean",
  scaleWeights = "unit"
)

nu2 <-
  getContrasts(
    model12,
    pickCoef(model12, "[.]C")[5:8],
    ref = "mean",
    scaleRef = "mean",
    scaleWeights = "unit"
  )

eta2 <-
  getContrasts(
    model12,
    pickCoef(model12, "[.]L")[4:7],
    ref = "mean",
    scaleRef = "mean",
    scaleWeights = "unit"
  )

model12.extended <-
  freq_tab_3.1 |>
  gnm(Freq ~ R + C + L + 
        Rscore:Cscore + 
        Mult(1, R, C) +
        cov_rcl + 
        Mult(1, R, L) + 
        Mult(1, C, L),
      constrain = c(13:16, 23:26),
      constrainTo = c(mu$qvframe[, 1], mu$qvframe[, 1]),
      data = _,
      family = poisson,
    trace = F,
    tolerance = 1e-12
  )
Initialising
Running start-up iterations..
Running main iterations.........................................................
.................................
Done
summary(model12.extended)

Call:
gnm(formula = Freq ~ R + C + L + Rscore:Cscore + Mult(1, R, C) + 
    cov_rcl + Mult(1, R, L) + Mult(1, C, L), constrain = c(13:16, 
    23:26), constrainTo = c(mu$qvframe[, 1], mu$qvframe[, 1]), 
    family = poisson, data = freq_tab_3.1, tolerance = 1e-12,     trace = F)

Deviance Residuals: 
     Min        1Q    Median        3Q       Max  
-1.58844  -0.76809   0.02278   0.56330   1.92999  

Coefficients:
                 Estimate Std. Error z value Pr(>|z|)    
(Intercept)       3.59464         NA      NA       NA    
R2               -0.99884         NA      NA       NA    
R3               -0.69917         NA      NA       NA    
R4               -1.39870         NA      NA       NA    
C2               -1.63854         NA      NA       NA    
C3               -2.18983         NA      NA       NA    
C4               -3.65220         NA      NA       NA    
L2               -1.45492         NA      NA       NA    
L3               -2.06941         NA      NA       NA    
L4               -3.75963         NA      NA       NA    
Rscore:Cscore     0.13336    0.02542   5.246 1.55e-07 ***
Mult(., R, C).    0.72034         NA      NA       NA    
Mult(1, ., C).R1 -0.53827         NA      NA       NA    
Mult(1, ., C).R2  0.59767         NA      NA       NA    
Mult(1, ., C).R3  0.38941         NA      NA       NA    
Mult(1, ., C).R4 -0.44880         NA      NA       NA    
Mult(1, R, .).C1 -0.14477         NA      NA       NA    
Mult(1, R, .).C2  0.67497         NA      NA       NA    
Mult(1, R, .).C3  0.08782         NA      NA       NA    
Mult(1, R, .).C4 -0.55348         NA      NA       NA    
cov_rcl           0.22423    0.01709  13.123  < 2e-16 ***
Mult(., R, L).    1.15302         NA      NA       NA    
Mult(1, ., L).R1 -0.53827         NA      NA       NA    
Mult(1, ., L).R2  0.59767         NA      NA       NA    
Mult(1, ., L).R3  0.38941         NA      NA       NA    
Mult(1, ., L).R4 -0.44880         NA      NA       NA    
Mult(1, R, .).L1 -0.00175         NA      NA       NA    
Mult(1, R, .).L2  0.69740         NA      NA       NA    
Mult(1, R, .).L3  0.16390         NA      NA       NA    
Mult(1, R, .).L4 -0.68683         NA      NA       NA    
Mult(., C, L).   -0.51691         NA      NA       NA    
Mult(1, ., L).C1 -0.74057         NA      NA       NA    
Mult(1, ., L).C2 -0.56691         NA      NA       NA    
Mult(1, ., L).C3  0.67430         NA      NA       NA    
Mult(1, ., L).C4 -0.93238         NA      NA       NA    
Mult(1, C, .).L1 -0.01977         NA      NA       NA    
Mult(1, C, .).L2  0.26471         NA      NA       NA    
Mult(1, C, .).L3 -0.33064         NA      NA       NA    
Mult(1, C, .).L4  0.03623         NA      NA       NA    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for poisson family taken to be 1)

Std. Error is NA where coefficient has been constrained or is unidentified

Residual deviance: 48.569 on 41 degrees of freedom
AIC: 388.89

Number of iterations: 90
nu1 <- getContrasts(
  model12.extended,
  pickCoef(model12.extended, "[.]C")[1:4],
  ref = "mean",
  scaleRef = "mean",
  scaleWeights = "unit"
)

eta1 <-
  getContrasts(
    model12.extended,
    pickCoef(model12.extended, "[.]L")[1:4],
    ref = "mean",
    scaleRef = "mean",
    scaleWeights = "unit"
  )

model12.phis <-
  freq_tab_3.1 |> gnm(
    Freq ~ R + C + L + Rscore:Cscore + Mult(1, R, C) +
      cov_rcl + Mult(1, R, L) + Mult(1, C, L),
    constrain = c(13:20, 23:30, 32:39),
    constrainTo = c(mu$qvframe[, 1], nu1$qvframe[, 1],
                    mu$qvframe[, 1], eta1$qvframe[, 1], 
                    nu2$qvframe[, 1], eta2$qvframe[, 1]),
    data = _,
    family = poisson, 
    trace = F, 
    tolerance = 1e-12)
Initialising
Running main iterations........
Done
summary(model12.phis)

Call:
gnm(formula = Freq ~ R + C + L + Rscore:Cscore + Mult(1, R, C) + 
    cov_rcl + Mult(1, R, L) + Mult(1, C, L), constrain = c(13:20, 
    23:30, 32:39), constrainTo = c(mu$qvframe[, 1], nu1$qvframe[, 
    1], mu$qvframe[, 1], eta1$qvframe[, 1], nu2$qvframe[, 1], 
    eta2$qvframe[, 1]), family = poisson, data = freq_tab_3.1, 
    tolerance = 1e-12, trace = F)

Deviance Residuals: 
     Min        1Q    Median        3Q       Max  
-1.58844  -0.76809   0.02278   0.56330   1.92999  

Coefficients:
                 Estimate Std. Error z value Pr(>|z|)    
(Intercept)       3.55535    0.08106  43.859  < 2e-16 ***
R2               -0.92909    0.11339  -8.194  < 2e-16 ***
R3               -0.64221    0.12609  -5.093 3.52e-07 ***
R4               -1.39320    0.17746  -7.851  < 2e-16 ***
C2               -1.63743    0.10043 -16.304  < 2e-16 ***
C3               -2.18079    0.15608 -13.973  < 2e-16 ***
C4               -3.65343    0.23846 -15.321  < 2e-16 ***
L2               -1.39736    0.10537 -13.261  < 2e-16 ***
L3               -2.13230    0.17235 -12.372  < 2e-16 ***
L4               -3.74831    0.27154 -13.804  < 2e-16 ***
Rscore:Cscore     0.13336    0.02490   5.357 8.48e-08 ***
Mult(., R, C).    0.64007    0.13725   4.663 3.11e-06 ***
Mult(1, ., C).R1 -0.53827         NA      NA       NA    
Mult(1, ., C).R2  0.59766         NA      NA       NA    
Mult(1, ., C).R3  0.38941         NA      NA       NA    
Mult(1, ., C).R4 -0.44880         NA      NA       NA    
Mult(1, R, .).C1 -0.18108         NA      NA       NA    
Mult(1, R, .).C2  0.74146         NA      NA       NA    
Mult(1, R, .).C3  0.08067         NA      NA       NA    
Mult(1, R, .).C4 -0.64105         NA      NA       NA    
cov_rcl           0.22423    0.01636  13.707  < 2e-16 ***
Mult(., R, L).    1.13998    0.13669   8.340  < 2e-16 ***
Mult(1, ., L).R1 -0.53827         NA      NA       NA    
Mult(1, ., L).R2  0.59766         NA      NA       NA    
Mult(1, ., L).R3  0.38941         NA      NA       NA    
Mult(1, ., L).R4 -0.44880         NA      NA       NA    
Mult(1, R, .).L1 -0.04544         NA      NA       NA    
Mult(1, R, .).L2  0.66170         NA      NA       NA    
Mult(1, R, .).L3  0.12210         NA      NA       NA    
Mult(1, R, .).L4 -0.73836         NA      NA       NA    
Mult(., C, L).   -0.27613    0.10158  -2.718  0.00656 ** 
Mult(1, ., L).C1  0.27770         NA      NA       NA    
Mult(1, ., L).C2  0.13959         NA      NA       NA    
Mult(1, ., L).C3 -0.84752         NA      NA       NA    
Mult(1, ., L).C4  0.43024         NA      NA       NA    
Mult(1, C, .).L1  0.01743         NA      NA       NA    
Mult(1, C, .).L2 -0.65220         NA      NA       NA    
Mult(1, C, .).L3  0.74916         NA      NA       NA    
Mult(1, C, .).L4 -0.11439         NA      NA       NA    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for poisson family taken to be 1)

Std. Error is NA where coefficient has been constrained or is unidentified

Residual deviance: 48.569 on 49 degrees of freedom
AIC: 372.89

Number of iterations: 8
mu
                       Estimate Std. Error
Mult(1, ., C + L).R1 -0.5382715 0.07940991
Mult(1, ., C + L).R2  0.5976649 0.06869502
Mult(1, ., C + L).R3  0.3894076 0.08390695
Mult(1, ., C + L).R4 -0.4488010 0.08495489
nu1
                    Estimate Std. Error
Mult(1, R, .).C1 -0.18108336  0.1505749
Mult(1, R, .).C2  0.74145909  0.0888159
Mult(1, R, .).C3  0.08066998  0.1598862
Mult(1, R, .).C4 -0.64104571  0.1141041
eta1
                   Estimate Std. Error
Mult(1, R, .).L1 -0.0454423 0.08895571
Mult(1, R, .).L2  0.6617033 0.05943373
Mult(1, R, .).L3  0.1220991 0.08507409
Mult(1, R, .).L4 -0.7383601 0.04862532
nu2
                   Estimate Std. Error
Mult(1, ., L).C1  0.2776974 0.30818568
Mult(1, ., L).C2  0.1395889 0.36977790
Mult(1, ., L).C3 -0.8475231 0.08001496
Mult(1, ., L).C4  0.4302368 0.32326672
eta2
                    Estimate Std. Error
Mult(1, C, .).L1  0.01742597  0.3681779
Mult(1, C, .).L2 -0.65219849  0.2296758
Mult(1, C, .).L3  0.74916478  0.1797929
Mult(1, C, .).L4 -0.11439226  0.3321123
model.summary(model12)
# A tibble: 1 × 6
  `Model Description`    df    L2   BIC Delta     p
  <chr>               <int> <dbl> <dbl> <dbl> <dbl>
1 model12                39  48.6 -237.  6.57 0.140
# Model 15
freq_tab_3.1 <-
  freq_tab_3.1 |> mutate(cov_rcl = Rscore * Lscore + Cscore * Lscore)
model15 <- freq_tab_3.1 |>
  gnm(
    Freq ~ R + C + L + Rscore:Cscore + Mult(1, R, C + L) + cov_rcl,
    data = _,
    family = poisson,
    trace = F,
    tolerance = 1e-12
  )
Initialising
Running start-up iterations..
Running main iterations................................................
Done
summary(model15)

Call:
gnm(formula = Freq ~ R + C + L + Rscore:Cscore + Mult(1, R, C + 
    L) + cov_rcl, family = poisson, data = freq_tab_3.1, tolerance = 1e-12, 
    trace = F)

Deviance Residuals: 
     Min        1Q    Median        3Q       Max  
-1.98677  -0.75501   0.01756   0.52206   2.97799  

Coefficients:
                     Estimate Std. Error z value Pr(>|z|)    
(Intercept)           3.58914         NA      NA       NA    
R2                   -0.98648         NA      NA       NA    
R3                   -0.69914         NA      NA       NA    
R4                   -1.42479         NA      NA       NA    
C2                   -1.70214         NA      NA       NA    
C3                   -2.18510         NA      NA       NA    
C4                   -3.66751         NA      NA       NA    
L2                   -1.48988         NA      NA       NA    
L3                   -2.17766         NA      NA       NA    
L4                   -3.74647         NA      NA       NA    
Rscore:Cscore         0.13307    0.02552   5.215 1.84e-07 ***
Mult(., R, C + L).   -0.52349         NA      NA       NA    
Mult(1, ., C + L).R1 -1.46764         NA      NA       NA    
Mult(1, ., C + L).R2  2.24813         NA      NA       NA    
Mult(1, ., C + L).R3  1.56595         NA      NA       NA    
Mult(1, ., C + L).R4 -1.13897         NA      NA       NA    
Mult(1, R, . + L).C1  0.07175         NA      NA       NA    
Mult(1, R, . + L).C2 -0.27342         NA      NA       NA    
Mult(1, R, . + L).C3 -0.01853         NA      NA       NA    
Mult(1, R, . + L).C4  0.24861         NA      NA       NA    
Mult(1, R, C + .).L2 -0.47172         NA      NA       NA    
Mult(1, R, C + .).L3 -0.11903         NA      NA       NA    
Mult(1, R, C + .).L4  0.46232         NA      NA       NA    
cov_rcl               0.22862    0.01709  13.377  < 2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for poisson family taken to be 1)

Std. Error is NA where coefficient has been constrained or is unidentified

Residual deviance: 55.984 on 44 degrees of freedom
AIC: 390.3

Number of iterations: 48
model.summary(model15)
# A tibble: 1 × 6
  `Model Description`    df    L2   BIC Delta     p
  <chr>               <int> <dbl> <dbl> <dbl> <dbl>
1 model15                44  56.0 -266.  6.83 0.106
mu <- getContrasts(
  model15,
  pickCoef(model15, "[.]R"),
  ref = "mean",
  scaleRef = "mean",
  scaleWeights = "unit"
)

nu <- getContrasts(
  model15,
  pickCoef(model15, "[.]C"),
  ref = "mean",
  scaleRef = "mean",
  scaleWeights = "unit"
)

model15.extended <-
  freq_tab_3.1 |> gnm(
    Freq ~ R + C + L + 
      Rscore:Cscore + 
      Mult(1, R, C) +
      cov_rcl + 
      Mult(1, R, L),
    constrain = c(13:16, 23:26),
    constrainTo = c(mu$qvframe[, 1], mu$qvframe[, 1]),
    data = _,
    family = poisson,
    trace = F,
    tolerance = 1e-12
  )
Initialising
Running start-up iterations..
Running main iterations....
Done
summary(model15.extended)

Call:
gnm(formula = Freq ~ R + C + L + Rscore:Cscore + Mult(1, R, C) + 
    cov_rcl + Mult(1, R, L), constrain = c(13:16, 23:26), constrainTo = c(mu$qvframe[, 
    1], mu$qvframe[, 1]), family = poisson, data = freq_tab_3.1, 
    tolerance = 1e-12, trace = F)

Deviance Residuals: 
     Min        1Q    Median        3Q       Max  
-1.98677  -0.75501   0.01756   0.52206   2.97799  

Coefficients:
                 Estimate Std. Error z value Pr(>|z|)    
(Intercept)       3.58597         NA      NA       NA    
R2               -1.00362         NA      NA       NA    
R3               -0.71313         NA      NA       NA    
R4               -1.42630         NA      NA       NA    
C2               -1.64759    0.10152  -16.23  < 2e-16 ***
C3               -2.17084    0.15843  -13.70  < 2e-16 ***
C4               -3.69546    0.24129  -15.32  < 2e-16 ***
L2               -1.41533    0.10612  -13.34  < 2e-16 ***
L3               -2.15885    0.17266  -12.50  < 2e-16 ***
L4               -3.81953    0.27268  -14.01  < 2e-16 ***
Rscore:Cscore     0.13307    0.02539    5.24  1.6e-07 ***
Mult(., R, C).   -1.10096         NA      NA       NA    
Mult(1, ., C).R1 -0.54368         NA      NA       NA    
Mult(1, ., C).R2  0.59799         NA      NA       NA    
Mult(1, ., C).R3  0.38839         NA      NA       NA    
Mult(1, ., C).R4 -0.44270         NA      NA       NA    
Mult(1, R, .).C1  0.08925         NA      NA       NA    
Mult(1, R, .).C2 -0.44493         NA      NA       NA    
Mult(1, R, .).C3 -0.05047         NA      NA       NA    
Mult(1, R, .).C4  0.36295         NA      NA       NA    
cov_rcl           0.22862    0.01643   13.91  < 2e-16 ***
Mult(., R, L).    0.34715         NA      NA       NA    
Mult(1, ., L).R1 -0.54368         NA      NA       NA    
Mult(1, ., L).R2  0.59799         NA      NA       NA    
Mult(1, ., L).R3  0.38839         NA      NA       NA    
Mult(1, ., L).R4 -0.44270         NA      NA       NA    
Mult(1, R, .).L1 -0.02587         NA      NA       NA    
Mult(1, R, .).L2  2.28937         NA      NA       NA    
Mult(1, R, .).L3  0.55836         NA      NA       NA    
Mult(1, R, .).L4 -2.29498         NA      NA       NA    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for poisson family taken to be 1)

Std. Error is NA where coefficient has been constrained or is unidentified

Residual deviance: 55.984 on 46 degrees of freedom
AIC: 386.3

Number of iterations: 4
eta <-
  getContrasts(
    model15.extended,
    pickCoef(model15.extended, "[.]L"),
    ref = "mean",
    scaleRef = "mean",
    scaleWeights = "unit"
  )

model15.phis <-
  freq_tab_3.1 |> gnm(
    Freq ~ R + C + L + 
      Rscore:Cscore + 
      Mult(1, R, C) + 
      cov_rcl + 
      Mult(1, R, L),
    constrain = c(13:20, 23:30),
    constrainTo = c(mu$qvframe[, 1], 
                    nu$qvframe[, 1], 
                    mu$qvframe[, 1], 
                    eta$qvframe[, 1]),
    data = _,
    family = poisson,
    trace = F,
    tolerance = 1e-12
  )
Initialising
Running main iterations..
Done
summary(model15.phis)

Call:
gnm(formula = Freq ~ R + C + L + Rscore:Cscore + Mult(1, R, C) + 
    cov_rcl + Mult(1, R, L), constrain = c(13:20, 23:30), constrainTo = c(mu$qvframe[, 
    1], nu$qvframe[, 1], mu$qvframe[, 1], eta$qvframe[, 1]), 
    family = poisson, data = freq_tab_3.1, tolerance = 1e-12,     trace = F)

Deviance Residuals: 
     Min        1Q    Median        3Q       Max  
-1.98677  -0.75501   0.01756   0.52206   2.97799  

Coefficients:
                 Estimate Std. Error z value Pr(>|z|)    
(Intercept)       3.55464    0.08091  43.935  < 2e-16 ***
R2               -0.93784    0.11339  -8.271  < 2e-16 ***
R3               -0.65943    0.12613  -5.228 1.71e-07 ***
R4               -1.42048    0.17754  -8.001  < 2e-16 ***
C2               -1.64759    0.10044 -16.404  < 2e-16 ***
C3               -2.17084    0.15588 -13.927  < 2e-16 ***
C4               -3.69546    0.23861 -15.488  < 2e-16 ***
L2               -1.41533    0.10551 -13.414  < 2e-16 ***
L3               -2.15885    0.17245 -12.519  < 2e-16 ***
L4               -3.81953    0.27221 -14.032  < 2e-16 ***
Rscore:Cscore     0.13307    0.02492   5.341 9.24e-08 ***
Mult(., R, C).   -0.64172    0.13829  -4.641 3.48e-06 ***
Mult(1, ., C).R1 -0.54368         NA      NA       NA    
Mult(1, ., C).R2  0.59799         NA      NA       NA    
Mult(1, ., C).R3  0.38839         NA      NA       NA    
Mult(1, ., C).R4 -0.44270         NA      NA       NA    
Mult(1, R, .).C1  0.17165         NA      NA       NA    
Mult(1, R, .).C2 -0.74481         NA      NA       NA    
Mult(1, R, .).C3 -0.06806         NA      NA       NA    
Mult(1, R, .).C4  0.64122         NA      NA       NA    
cov_rcl           0.22862    0.01640  13.939  < 2e-16 ***
Mult(., R, L).    1.13826    0.13726   8.293  < 2e-16 ***
Mult(1, ., L).R1 -0.54368         NA      NA       NA    
Mult(1, ., L).R2  0.59799         NA      NA       NA    
Mult(1, ., L).R3  0.38839         NA      NA       NA    
Mult(1, ., L).R4 -0.44270         NA      NA       NA    
Mult(1, R, .).L1 -0.04806         NA      NA       NA    
Mult(1, R, .).L2  0.65804         NA      NA       NA    
Mult(1, R, .).L3  0.13012         NA      NA       NA    
Mult(1, R, .).L4 -0.74010         NA      NA       NA    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for poisson family taken to be 1)

Std. Error is NA where coefficient has been constrained or is unidentified

Residual deviance: 55.984 on 50 degrees of freedom
AIC: 378.3

Number of iterations: 2
mu
                       Estimate Std. Error
Mult(1, ., C + L).R1 -0.5436794 0.07818382
Mult(1, ., C + L).R2  0.5979869 0.06871974
Mult(1, ., C + L).R3  0.3883879 0.08391754
Mult(1, ., C + L).R4 -0.4426954 0.08454001
nu
                        Estimate Std. Error
Mult(1, R, . + L).C1  0.17164747 0.14998137
Mult(1, R, . + L).C2 -0.74480785 0.08583798
Mult(1, R, . + L).C3 -0.06806188 0.15421719
Mult(1, R, . + L).C4  0.64122226 0.11322236
eta
                    Estimate Std. Error
Mult(1, R, .).L1 -0.04806244 0.08932196
Mult(1, R, .).L2  0.65804171 0.05969167
Mult(1, R, .).L3  0.13011596 0.08427834
Mult(1, R, .).L4 -0.74009523 0.04837401
model.summary(model15)
# A tibble: 1 × 6
  `Model Description`    df    L2   BIC Delta     p
  <chr>               <int> <dbl> <dbl> <dbl> <dbl>
1 model15                44  56.0 -266.  6.83 0.106
bind_rows(model.summary(model1, "Model 1"),
          model.summary(model2, "Model 2"),
          model.summary(model4, "Model 4"),
          model.summary(model6, "Model 6"),
          model.summary(model7, "Model 7"),
          model.summary(model8, "Model 8"),
          model.summary(model9, "Model 9"),
          model.summary(model10, "Model 10"),
          model.summary(model11, "Model 11"),
          model.summary(model12, "Model 12"),
          model.summary(model15, "Model 15"))
# A tibble: 11 × 6
   `Model Description`    df    L2   BIC Delta        p
   <chr>               <int> <dbl> <dbl> <dbl>    <dbl>
 1 Model 1                54 544.   149. 23.7  3.44e-82
 2 Model 2                39 109.  -176.  9.81 1.42e- 8
 3 Model 4                35  37.7 -218.  4.63 3.47e- 1
 4 Model 6                27  29.0 -169.  4.86 3.61e- 1
 5 Model 7                23  21.9 -146.  3.70 5.24e- 1
 6 Model 8                36  45.9 -218.  6.25 1.26e- 1
 7 Model 9                38  47.1 -231.  6.25 1.47e- 1
 8 Model 10               38  50.9 -227.  6.31 7.88e- 2
 9 Model 11               38  53.6 -225.  6.58 4.77e- 2
10 Model 12               39  48.6 -237.  6.57 1.40e- 1
11 Model 15               44  56.0 -266.  6.83 1.06e- 1

練習問題

問題3.1 Goodman (1979) の表5A,表5B,表5Cの結果を再現しよう.使用するデータはmentalHealthのデータである.表5Aのモデルは,(1) Null Association,(2) Uniform Association,(3) Row-Effect Association,(4) Column-Effect Association,(5) Row and Column Effects (I), (6) Row and Column Effects (II) の6つである.

  • 問題3.1.1:Goodman (1979) の表5Bの分析(全体効果の分解)を再現する.表5Bではまずモデル (1) と (2) の比較から一般的な効果(General Effect)を求めている.次に,モデル (2) と (5) の比較から,行・列効果を求めている. 他の効果はモデル (5) で示され,全体効果はモデル (1) となる.
  • 問題3.1.2:Goodman (1979) の表5Cの分析(行と列効果の分割)を再現する.モデル (2) と (3) から行効果が,さらにモデル (3) と (5) から行効果が,そして,モデル (2) と (5) から行・列効果の要素を取り出すことができる.

参考文献

Goodman, Leo A. 1979. “Simple Models for the Analysis of Association in Cross-Classifications Having Ordered Categories.” Journal of the American Statistical Association 74 (367): 537–52.