1
votes

Comment calculer les pourcentages des lignes et des colonnes dans un tableau croisé?

J'ai un tableau de contingence à 3 niveaux pour lequel j'essaie de calculer les pourcentages pour chaque cellule du tableau en fonction du total des lignes de somme pour chaque ligne, puis en fonction du total de la colonne de somme pour chaque colonne. Voici les données pour lesquelles je veux calculer les pourcentages:

"Row percentages"
                     0_15m    15_30m   30_>40m

<35yrs  0_4cm    86.800000 12.000000  1.200000
        20_80cm  83.431953 12.426036  4.142012
        4_20cm   54.404145 31.433506 14.162349
>=35yrs 0_4cm    83.500000 15.750000  0.750000
        20_80cm  75.980392 18.382353  5.637255
        4_20cm   67.868339 17.241379 14.890282

 "Column Percentages"
                       0_15m      15_30m     30_>40m

<35yrs  0_4cm     11.4754098   1.5864622   0.1586462
        20_80cm   56.1752988   8.3665339   2.7888446
        4_20cm   143.1818182  82.7272727  37.2727273
>=35yrs 0_4cm     17.6626124   3.3315706   0.1586462
        20_80cm   61.7529880  14.9402390   4.5816733
        4_20cm   196.8181818  50.0000000  43.1818182

J'ai essayé d'utiliser la fonction colPercent ainsi que de calculer manuellement (voir exemple):

Où A2 est la table des données ci-dessus:

rpc <- A2 / rowSums(A2) * 100
cpc <- A2 / colSums(A2) * 100


Comme vous pouvez le voir, les pourcentages de ligne sont calculés correctement (tous totalisent 100 sur les lignes), cependant les pourcentages de colonne sont dans certains cas supérieur à 100% et ne doit donc pas avoir été calculé correctement.

"A2"
                 0_15m 15_30m 30_>40m

<35yrs  0_4cm      217     30       3
        20_80cm    282     42      14
        4_20cm     315    182      82
>=35yrs 0_4cm      334     63       3
        20_80cm    310     75      23
        4_20cm     433    110      95

dput(A2)

structure(c(217L, 282L, 315L, 334L, 310L, 433L, 30L, 42L, 182L, 
63L, 75L, 110L, 3L, 14L, 82L, 3L, 23L, 95L), .Dim = c(6L, 3L), class = "ftable", row.vars = structure(list(
    c("<35yrs", ">=35yrs"), c("0_4cm", "20_80cm", "4_20cm")), .Names = c("", 
"")), col.vars = structure(list(c("0_15m", "15_30m", "30_>40m"
)), .Names = ""))


2 commentaires

Pouvez-vous modifier votre message pour afficher la sortie de dput (A2) ?


Bien sûr, vous y allez


3 Réponses :


1
votes

Je ne sais pas pourquoi colSums ne fonctionne pas. Cela a probablement à voir avec la structure de la table, mais la méthode apply semble fonctionner,

apply(df, 2, function(i)i*100 / sum(i))

#                    0_15m    15_30m   30_>40m
#  <35yrs_0_4cm    11.47541  5.976096  1.363636
#  <35yrs_20_80cm  14.91274  8.366534  6.363636
#  <35yrs_4_20cm   16.65785 36.254980 37.272727
#  >=35yrs_0_4cm   17.66261 12.549801  1.363636
#  >=35yrs_20_80cm 16.39344 14.940239 10.454545
#  >=35yrs_4_20cm  22.89794 21.912351 43.181818


0 commentaires

2
votes

La division fonctionne par ligne et non par colonne selon les besoins ici. Pour que colSums fonctionne, vous pouvez transposer, diviser puis transposer à nouveau

A2 / colSums(A2)[col(A2)] * 100

Ou une autre option est

t(t(as.matrix(A2))/colSums(A2)) * 100

#                 0_15m 15_30m 30_>40m
#                                     
#<35yrs  0_4cm    11.48   5.98    1.36
#        20_80cm  14.91   8.37    6.36
#        4_20cm   16.66  36.25   37.27
#>=35yrs 0_4cm    17.66  12.55    1.36
#        20_80cm  16.39  14.94   10.45
#        4_20cm   22.90  21.91   43.18


1 commentaires

Brillant merci! Cette dernière commande a fonctionné comme espéré.



1
votes

J'ai trouvé CrossTable qui calcule automatiquement tout comme je le voulais, y compris les pourcentages de ligne et de colonne et les résidus de cellule standardisés.

library(gmodels)
CrossTable(data_tf$Height_fac, data_tf$Dia_fac, digits=2, expected=TRUE, prop.r=TRUE, prop.c=TRUE, prop.t=FALSE, prop.chisq=TRUE, sresid=TRUE, format=c("SPSS"), dnn = c("Height","Diameter"))


   Cell Contents
|-------------------------|
|                   Count |
|         Expected Values |
| Chi-square contribution |
|             Row Percent |
|          Column Percent |
|            Std Residual |
|-------------------------|

Total Observations in Table:  2613 

             | Diameter 
      Height |    0_4cm  |  20_80cm  |   4_20cm  | Row Total | 
-------------|-----------|-----------|-----------|-----------|
       0_15m |      551  |      592  |      748  |     1891  | 
             |   470.40  |   539.87  |   880.73  |           | 
             |    13.81  |     5.03  |    20.00  |           | 
             |    29.14% |    31.31% |    39.56% |    72.37% | 
             |    84.77% |    79.36% |    61.46% |           | 
             |     3.72  |     2.24  |    -4.47  |           | 
-------------|-----------|-----------|-----------|-----------|
      15_30m |       93  |      117  |      292  |      502  | 
             |   124.88  |   143.32  |   233.81  |           | 
             |     8.14  |     4.83  |    14.48  |           | 
             |    18.53% |    23.31% |    58.17% |    19.21% | 
             |    14.31% |    15.68% |    23.99% |           | 
             |    -2.85  |    -2.20  |     3.81  |           | 
-------------|-----------|-----------|-----------|-----------|
     30_>40m |        6  |       37  |      177  |      220  | 
             |    54.73  |    62.81  |   102.46  |           | 
             |    43.38  |    10.61  |    54.22  |           | 
             |     2.73% |    16.82% |    80.45% |     8.42% | 
             |     0.92% |     4.96% |    14.54% |           | 
             |    -6.59  |    -3.26  |     7.36  |           | 
-------------|-----------|-----------|-----------|-----------|
Column Total |      650  |      746  |     1217  |     2613  | 
             |    24.88% |    28.55% |    46.57% |           | 
-------------|-----------|-----------|-----------|-----------|


Statistics for All Table Factors

Pearson's Chi-squared test 
------------------------------------------------------------
Chi^2 =  174.51     d.f. =  4     p =  1.125591e-36 



0 commentaires