Goldberg (2006) described a hierarchical factor structure organization from the “top down". The original idea was to do successive factor analyses from 1 to nf factors organized by factor score correlations from one level to the next. Waller (2007) discussed a simple way of doing this for components without finding the scores. Using the factor correlations (from Gorsuch) to organize factors hierarchically results may be organized at many different levels. The algorithm may be applied to principal components (pca) or to true factor analysis.

bassAckward(r, nfactors = 1, fm = "minres", rotate = "oblimin", scores = "tenBerge",
   adjust=TRUE, plot=TRUE,cut=.3, use = "pairwise", cor = "cor", weight = NULL,
   correct = 0.5,...)
bassAckward.diagram(x,digits=2,cut = .3,labels=NULL,marg=c(1.5,.5,1.0,.5),
   main="BassAckward",items=TRUE,sort=TRUE,lr=TRUE,curves=FALSE,organize=TRUE,
   values=FALSE,...)

Arguments

r

A correlation matrix or a data matrix suitable for factoring

nfactors

Factors from 1 to nfactors will be extracted. If nfactors is a a vector, then just the number of factors specified in the vector will be extracted. (See examples).

fm

Factor method. The default is 'minres' factoring. Although to be consistent with the original Goldberg article, we can also do principal components (fm ="pca").

rotate

What type of rotation to apply. The default for factors is oblimin. Unlike the normal call to pca where the default is varimax, in bassAckward the default for pca is oblimin.

scores

What factor scoring algorithm should be used. The default is "tenBerge", other possibilities include "regression", or "bartlett"

adjust

If using any other scoring proceure that "tenBerge" should we adjust the correlations for the lack of factor score fit?

plot

By default draw a bassAckward diagram

use

How to treat missing data. Use='pairwise" finds pairwise complete correlations.

cor

What kind of correlation to find. The default is Pearson.

weight

Should cases be weighted? Default, no.

correct

If finding tetrachoric or polychoric correlations, what correction should be applied to empty cells (defaults to .5)

x

The object returned by bassAckward

digits

Number of digits to display on each path

cut

Values greater than the abs(cut) will be displayed in a path diagram.

labels

Labels may be taken from the output of the bassAckward function or can be specified as a list.

marg

Margins are set to be slightly bigger than normal to allow for a cleaner diagram

main

The main title for the figure

items

if TRUE, show the items associated with the factors

sort

if TRUE, sort the items by factor loadings

lr

Should the graphic be drawn left to right or top to bottom

curves

Should we show the correlations between factors at the same level

organize

Rename and sort the factors at two lowest levels for a more pleasing figure

values

If TRUE, then show the percent variance accounted for by this factor.

...

Other graphic parameters (e.g., cex)

Details

This is essentially a wrapper to the fa and pca combined with the faCor functions. They are called repeatedly and then the weights from the resulting solutions are used to find the factor/component correlations.

Although the default is do all factor solutions from 1 to the nfactors, this can be simplified by specifying just some of the factor solutions. Thus, for the 135 items of the spi, it is more reasonable to ask for 3,5, and 27 item solutions.

The function bassAckward.diagram may be called using the diagram function or may be called directly.

The output from bassAckward.diagram is the sorted factor structure suitable for using fa.lookup.

Although not particularly pretty, it is possible to do Schmid-Leiman rotations at each level. Specify the rotation as rotate="schmid".

Value

Call

Echo the call

fm

Echos the factor method used

fa

A list of the factor loadings at each level

bass.ack

A list of the factor correlations at each level

summary

The factors at each level

sumnames

Summary of the factor names

labels

Factor labels including items for each level

r

The correlation matrix analyzed

Phi

The factor correlations at each level

fa

The factor analysis loadings at each level, now includes Phi values

fa.vac

The variance accounted for by each factor at each level

References

Goldberg, L.R. (2006) Doing it all Bass-Ackwards: The development of hierarchical factor structures from the top down. Journal of Research in Personality, 40, 4, 347-358.

Gorsuch, Richard, (1983) Factor Analysis. Lawrence Erlebaum Associates.

Revelle, William. (in prep) An introduction to psychometric theory with applications in R. Springer. Working draft available at https://personality-project.org/r/book/

Waller, N. (2007), A general method for computing hierarchical component structures by Goldberg's Bass-Ackwards method, Journal of Research in Personality, 41, 4, 745-752, DOI: 10.1016/j.jrp.2006.08.005

Author

William Revelle

Note

Goldberg calculated factor/component scores and then correlated these. Waller suggests just looking at the unrotated components and then examining the correlations when rotating different numbers of components. I do not follow the Waller procedure, but rather find successive factors and then find factor/component correlations following Gorsuch.

It is important to note that the BassAckward solution is not a hierarchical solution in the standard meaning. The factors are not factors of factors as is found in a hierarchical model (e.g. sim.hierarchical or omega, but is merely way of organising solutions with a different number of factors. In each case, unlike omega the factors are of the original variables, not the lower level factors. Thus, detailed statistics for any level of the hierarchy may be found by doing a factoring with that particular number of factors.

To find basic statistics for the multiple factorings, examine the fa object. For more detail just do the factoring at that level.

To see the items associated with the lowest level factors, use fa.lookup. For the items associated with other levels, use fa.lookup specifying the level. (See examples.)

See also

fa, pca, omega and iclust for alternative hierarchical solutions. link{fa.lookup} to show the items in the lowest level of the solution.

Examples

bassAckward(Thurstone,4,main="Thurstone data set")

#> 
#> Call: bassAckward(r = Thurstone, nfactors = 4, main = "Thurstone data set")
#> 
#>  1 F1
#>  2 F1
#>  3 F1 F2
#>  4 F1 F2 F3
#> Use print with the short = FALSE option to see the correlations, or use the summary command.
f.labels <- list(level1=cs(Approach,Avoid),level2=cs(PosAffect,NegAffect,Constraint), 
level3 = cs(Extraversion,Agreeableness,Neuroticism,Conscientiousness,Openness))

ba <- bassAckward(bfi[1:25],c(2,3,5),labels=f.labels,
        main="bfi data set from psychTools", values=TRUE)

print(ba,short=FALSE)
#> 
#> Call: bassAckward(r = bfi[1:25], nfactors = c(2, 3, 5), labels = f.labels, 
#>     main = "bfi data set from psychTools", values = TRUE)
#> 
#>  1 F1 F2
#>  2 F1 F2
#>  3 F2 F1 F3
#> Factor correlations
#>        F1    F2
#> F1  1.00 -0.17
#> F2 -0.17  1.00
#> 
#> Factor correlations
#>        F1    F2
#> F1  0.89 -0.15
#> F2 -0.13  0.99
#> F3  0.49 -0.17
#> 
#> Factor correlations
#>       F1    F2    F3
#> F1 0.05  0.87  0.18
#> F2 0.81 -0.17  0.42
#> F3 0.28 -0.03  0.67
#> F4 0.77 -0.03  0.46
#> F5 0.23 -0.03 -0.19
#show the items associated with the 5 level solution
fa.lookup(ba,dictionary=bfi.dictionary)
#>       F1    F2    F3    F4    F5 ItemLabel
#> E2 -0.68 -0.05 -0.06  0.10 -0.02    q_901 
#> E4  0.59  0.29 -0.08  0.01  0.02    q_1410
#> E1 -0.56 -0.08 -0.10 -0.06  0.11    q_712 
#> E5  0.42  0.05  0.21  0.15  0.27    q_1768
#> E3  0.42  0.25  0.28  0.08  0.00    q_1205
#> A3  0.12  0.66  0.03 -0.03  0.02    q_1206
#> A2  0.00  0.64  0.03 -0.02  0.08    q_1162
#> A5  0.23  0.53  0.04 -0.11  0.01    q_1419
#> A4  0.06  0.43 -0.15 -0.06  0.19    q_1364
#> A1  0.17 -0.41 -0.06  0.21  0.07    q_146 
#> O3  0.15  0.08  0.61  0.03  0.02    q_492 
#> O5  0.10  0.04 -0.54  0.13 -0.03    q_1964
#> O1  0.10  0.02  0.51  0.02  0.07    q_128 
#> O2  0.06  0.16 -0.46  0.19 -0.08    q_316 
#> O4 -0.32  0.17  0.37  0.13 -0.02    q_1738
#> N1  0.10 -0.11 -0.05  0.81  0.00    q_952 
#> N2  0.04 -0.09  0.01  0.78  0.01    q_974 
#> N3 -0.10  0.08  0.02  0.71 -0.04    q_1099
#> N5 -0.20  0.21 -0.15  0.49  0.00    q_1505
#> N4 -0.39  0.09  0.08  0.47 -0.14    q_1479
#> C2 -0.09  0.08  0.04  0.15  0.67    q_530 
#> C4  0.00  0.04 -0.05  0.17 -0.61    q_626 
#> C3 -0.06  0.09 -0.07  0.03  0.57    q_619 
#> C5 -0.14  0.02  0.09  0.19 -0.55    q_1949
#> C1 -0.03 -0.02  0.15  0.07  0.55    q_124 
#>                                         Item     Giant3                Big6
#> E2 Find it difficult to approach others.     Plasticity Extraversion       
#> E4 Make friends easily.                      Plasticity Extraversion       
#> E1 Don't talk a lot.                         Plasticity Extraversion       
#> E5 Take charge.                              Plasticity Extraversion       
#> E3 Know how to captivate people.             Plasticity Extraversion       
#> A3 Know how to comfort others.               Cohesion   Agreeableness      
#> A2 Inquire about others' well-being.         Cohesion   Agreeableness      
#> A5 Make people feel at ease.                 Cohesion   Agreeableness      
#> A4 Love children.                            Cohesion   Agreeableness      
#> A1 Am indifferent to the feelings of others. Cohesion   Agreeableness      
#> O3 Carry the conversation to a higher level. Plasticity Openness           
#> O5 Will not probe deeply into a subject.     Plasticity Openness           
#> O1 Am full of ideas.                         Plasticity Openness           
#> O2 Avoid difficult reading material.         Plasticity Openness           
#> O4 Spend time reflecting on things.          Plasticity Openness           
#> N1 Get angry easily.                         Stability  Emotional Stability
#> N2 Get irritated easily.                     Stability  Emotional Stability
#> N3 Have frequent mood swings.                Stability  Emotional Stability
#> N5 Panic easily.                             Stability  Emotional Stability
#> N4 Often feel blue.                          Stability  Emotional Stability
#> C2 Continue until everything is perfect.     Stability  Conscientiousness  
#> C4 Do things in a half-way manner.           Stability  Conscientiousness  
#> C3 Do things according to a plan.            Stability  Conscientiousness  
#> C5 Waste my time.                            Stability  Conscientiousness  
#> C1 Am exacting in my work.                   Stability  Conscientiousness  
#>           Little12 Keying IPIP100
#> E2 Sociability         -1    B5:E
#> E4 Sociability          1    B5:E
#> E1 Sociability         -1    B5:E
#> E5 Assertiveness        1    B5:E
#> E3 Assertiveness        1    B5:E
#> A3 Compassion           1    B5:A
#> A2 Compassion           1    B5:A
#> A5 Compassion           1    B5:A
#> A4 Compassion           1    B5:A
#> A1 Compassion          -1    B5:A
#> O3 Intellect            1    B5:O
#> O5 Openness            -1    B5:O
#> O1 Intellect            1    B5:O
#> O2 Intellect           -1    B5:O
#> O4 Openness             1    B5:O
#> N1 Balance             -1    B5:N
#> N2 Balance             -1    B5:N
#> N3 Balance             -1    B5:N
#> N5 Balance             -1    B5:N
#> N4 Balance             -1    B5:N
#> C2 Orderliness          1    B5:C
#> C4 Industriousness     -1    B5:C
#> C3 Orderliness          1    B5:C
#> C5 Industriousness     -1    B5:C
#> C1 Orderliness          1    B5:C
#now show the items associated with the 3 level solution
fa.lookup(ba$fa[[2]],dictionary=bfi.dictionary)
#>       F1    F2    F3 ItemLabel                                      Item
#> E4  0.69 -0.07 -0.09    q_1410 Make friends easily.                     
#> A5  0.64 -0.06 -0.02    q_1419 Make people feel at ease.                
#> A3  0.63  0.06  0.01    q_1206 Know how to comfort others.              
#> E3  0.63  0.09  0.07    q_1205 Know how to captivate people.            
#> E2 -0.58  0.21  0.03    q_901  Find it difficult to approach others.    
#> E1 -0.54  0.01  0.11    q_712  Don't talk a lot.                        
#> A2  0.52  0.07  0.07    q_1162 Inquire about others' well-being.        
#> E5  0.44  0.09  0.29    q_1768 Take charge.                             
#> A4  0.36 -0.04  0.09    q_1364 Love children.                           
#> O3  0.35  0.11  0.25    q_492  Carry the conversation to a higher level.
#> A1 -0.21  0.09  0.02    q_146  Am indifferent to the feelings of others.
#> N3  0.03  0.76  0.00    q_1099 Have frequent mood swings.               
#> N2  0.00  0.74  0.02    q_974  Get irritated easily.                    
#> N1  0.01  0.74 -0.02    q_952  Get angry easily.                        
#> N4 -0.19  0.59 -0.04    q_1479 Often feel blue.                         
#> N5 -0.01  0.52 -0.05    q_1505 Panic easily.                            
#> O4 -0.01  0.27  0.17    q_1738 Spend time reflecting on things.         
#> C2  0.02  0.11  0.63    q_530  Continue until everything is perfect.    
#> C4  0.04  0.23 -0.59    q_626  Do things in a half-way manner.          
#> C1 -0.01  0.04  0.59    q_124  Am exacting in my work.                  
#> C3  0.01 -0.01  0.48    q_619  Do things according to a plan.           
#> C5 -0.07  0.29 -0.44    q_1949 Waste my time.                           
#> O1  0.23  0.08  0.27    q_128  Am full of ideas.                        
#> O2  0.06  0.13 -0.27    q_316  Avoid difficult reading material.        
#> O5 -0.03  0.03 -0.26    q_1964 Will not probe deeply into a subject.    
#>        Giant3                Big6        Little12 Keying IPIP100
#> E4 Plasticity Extraversion        Sociability          1    B5:E
#> A5 Cohesion   Agreeableness       Compassion           1    B5:A
#> A3 Cohesion   Agreeableness       Compassion           1    B5:A
#> E3 Plasticity Extraversion        Assertiveness        1    B5:E
#> E2 Plasticity Extraversion        Sociability         -1    B5:E
#> E1 Plasticity Extraversion        Sociability         -1    B5:E
#> A2 Cohesion   Agreeableness       Compassion           1    B5:A
#> E5 Plasticity Extraversion        Assertiveness        1    B5:E
#> A4 Cohesion   Agreeableness       Compassion           1    B5:A
#> O3 Plasticity Openness            Intellect            1    B5:O
#> A1 Cohesion   Agreeableness       Compassion          -1    B5:A
#> N3 Stability  Emotional Stability Balance             -1    B5:N
#> N2 Stability  Emotional Stability Balance             -1    B5:N
#> N1 Stability  Emotional Stability Balance             -1    B5:N
#> N4 Stability  Emotional Stability Balance             -1    B5:N
#> N5 Stability  Emotional Stability Balance             -1    B5:N
#> O4 Plasticity Openness            Openness             1    B5:O
#> C2 Stability  Conscientiousness   Orderliness          1    B5:C
#> C4 Stability  Conscientiousness   Industriousness     -1    B5:C
#> C1 Stability  Conscientiousness   Orderliness          1    B5:C
#> C3 Stability  Conscientiousness   Orderliness          1    B5:C
#> C5 Stability  Conscientiousness   Industriousness     -1    B5:C
#> O1 Plasticity Openness            Intellect            1    B5:O
#> O2 Plasticity Openness            Intellect           -1    B5:O
#> O5 Plasticity Openness            Openness            -1    B5:O
# compare the 3 factor solution to what get by extracting 3 factors directly
f3 <- fa(bfi[1:25],3)
f3$loadings - ba$fa[[2]]$loadings   # these are the same
#> 
#> Loadings:
#>    MR1 MR2 MR3
#> A1            
#> A2            
#> A3            
#> A4            
#> A5            
#> C1            
#> C2            
#> C3            
#> C4            
#> C5            
#> E1            
#> E2            
#> E3            
#> E4            
#> E5            
#> N1            
#> N2            
#> N3            
#> N4            
#> N5            
#> O1            
#> O2            
#> O3            
#> O4            
#> O5            
#> 
#>                MR1 MR2 MR3
#> SS loadings      0   0   0
#> Proportion Var   0   0   0
#> Cumulative Var   0   0   0
 #do pca instead of factors  just summarize, don't plot
summary(bassAckward(bfi[1:25],c(1,3,5,7),fm="pca",
       main="Components",plot=FALSE))
#> Warning: NaNs produced
#> 
#> Call: bassAckward(r = bfi[1:25], nfactors = c(1, 3, 5, 7), fm = "pca", 
#>     plot = FALSE, main = "Components")
#> 
#> Factor correlations
#>     C1
#> C1  1
#> 
#> Factor correlations
#>        C1
#> C1  0.83
#> C2 -0.56
#> C3  0.59
#> 
#> Factor correlations
#>        C1    C2    C3
#> C1 -0.13  0.99 -0.10
#> C2  0.84 -0.24  0.17
#> C3  0.25 -0.21  0.86
#> C4  0.70 -0.01  0.14
#> C5  0.17  0.08  0.61
#> 
#> Factor correlations
#>        C1    C2    C3    C4    C5
#> C1  0.97 -0.17 -0.15 -0.10 -0.03
#> C2 -0.15  0.95  0.15  0.25  0.17
#> C3 -0.10  0.15  0.99  0.13  0.15
#> C4 -0.05  0.45  0.29  0.78  0.02
#> C5  0.23 -0.09 -0.20  0.06 -0.84
#> C6  0.32 -0.02 -0.08  0.34  0.63
#> C7  0.15  0.21  0.06 -0.61  0.01
##not run, but useful example
# \donttest{  
f.labels <- list(level1 = cs(Neg,Pos,Constrain),level2 = cs(Extra,Neuro,Cons,Open,Agree),
level3 = cs(attnseeking,sociability,impulsivity,
   charisma,sensationseek,emotexpr,humor,anxiety,
   emotstab,irritability,wellbeing,industry,order,author,honesty,perfect,easygoing,
   selfcontrol,conservatism,creativity,introspect,art,
   intellect,conform,adaptability,compassion,trust))
if(require("psychTools") ) {
sp5 <- bassAckward(psychTools::spi[11:145], c(3,5,27),labels=f.labels,
           main="spi data set from psychTools")}
#> Loading required package: psychTools
#> Warning: there is no package called ‘psychTools’
# }