Data analysis pilot study: test framing and bioinspired items

Author

Julius Fenn, Stephanie Bugler

1 Notes

2 global variables

Define your global variables (can take some time to run):

3 create raw data files

# sets the directory of location of this script as the current directory
# setwd(dirname(rstudioapi::getSourceEditorContext()$path))

### load packages
require(pacman)
p_load('tidyverse', 'jsonlite',
       'stargazer',  'DT', 'psych',
       'writexl', 'moments', 'lavaan', 'semPlot', 'mirt', 'MplusAutomation',
       'afex', 'emmeans', 'jtools')


setwd("../01_dataPreperation/outputs")
# Load dataset
dat <- read_rds(file = "questionnaire.rds")

# --- Remove duplicate Prolific IDs ---
tmp_removeIDs <- names(table(dat$PROLIFIC_PID))[table(dat$PROLIFIC_PID) >= 2]
dat <- dat[!dat$PROLIFIC_PID %in% tmp_removeIDs,]

# Check new N
dim(dat)  # should now be 582 rows
[1] 582  47
# Continue with descriptives, EFA, CFA, etc.


### load functions
setwd("../../../functions")
for(i in 1:length(dir())){
  # print(dir()[i])
  source(dir()[i], encoding = "utf-8")
}

rm(i)


### summary function
data_summary <- function(data, varname, groupnames){
  require(plyr)
  summary_func <- function(x, col){
    c(mean = mean(x[[col]], na.rm=TRUE),
      se = sd(x[[col]], na.rm=TRUE) / sqrt(length(x[[col]])))
  }
  data_sum<-ddply(data, groupnames, .fun=summary_func,
                  varname)
  data_sum <- plyr::rename(data_sum, c("mean" = varname))
  return(data_sum)
}

4 Evaluate questionnaires

4.1 Descriptives

To describe sample

psych::describe(dat[, c("sociodemo_age")])
   vars   n  mean    sd median trimmed   mad min max range skew kurtosis   se
X1    1 582 45.85 13.48     45   45.64 16.31  18  83    65 0.13    -0.86 0.56
table(dat$sociodemo_gender)

female   male 
   260    322 
table(dat$sociodemo_priorExperience)

             new         not_sure somewhat_similar     very_similar 
             549               10               17                6 

To describe length of study:

psych::describe(dat[, c("total_min_prolific")])
   vars   n mean   sd median trimmed  mad  min   max range skew kurtosis   se
X1    1 582 5.49 3.54   4.56    4.83 1.77 1.82 28.25 26.43 3.18    13.15 0.15
hist(dat$total_min_prolific)

To describe conditions:

table(dat$framingCondition, dat$whichItemsFirst)
             
              bioinspired sustainable
  bioinspired         192           0
  neutral              94          99
  sustainable           0         197

4.2 Overall EFA

Promax rotation, factoring method minimum residual, if scale is a likert scale less or equal than 7 answering options the EFA or parallel analysis is computed over a polychoric correlation to account for non-normality of data (see in detail R-Code “helperFunctions”)

#### Overall EFA
regExOverall <- "^Bioinspiration|^EcologicalDimension"


psych::cor.plot(r = cor(dat[, str_detect(string = colnames(dat),
                                                   pattern = regExOverall)]
                        , use = "pairwise.complete.obs"),
                upper = FALSE, xlas = 2, main = "Overall")

#> parallel analysis
tmp_parallelAnalysis <- dimensionalityTest(label = "Overall",
                             regEx = regExOverall, dataset = dat)

Parallel analysis suggests that the number of factors =  4  and the number of components =  2 
Overall 
Number of components:  2 
#> EFA (# of factors=5)
tmp_EFA <- explorativeFactorAnalysis(label = "Overall",
                                 regEx = regExOverall,
                                 dataset = dat, nfac = 2)
tmp_EFA[[1]]
Factor Analysis using method =  minres
Call: fa(r = tmp_dat, nfactors = nfac, rotate = "promax", cor = "cor")
Standardized loadings (pattern matrix) based upon correlation matrix
                        MR1   MR2    h2   u2 com
EcologicalDimension-1 -0.13  0.87 0.740 0.26 1.0
EcologicalDimension-4  0.09  0.57 0.348 0.65 1.1
EcologicalDimension-2 -0.11  0.84 0.685 0.32 1.0
EcologicalDimension-3 -0.06  0.85 0.713 0.29 1.0
Bioinspiration-PN2r   -0.19  0.07 0.036 0.96 1.3
Bioinspiration-PN1     0.72  0.23 0.617 0.38 1.2
Bioinspiration-IPI4    0.84 -0.04 0.698 0.30 1.0
Bioinspiration-VRtN4r  0.67 -0.05 0.446 0.55 1.0
Bioinspiration-VRtN2   0.85 -0.03 0.722 0.28 1.0
Bioinspiration-IPI1    0.85 -0.13 0.704 0.30 1.0
Bioinspiration-VRtN1   0.76  0.09 0.601 0.40 1.0
Bioinspiration-IPI3    0.81 -0.03 0.653 0.35 1.0
Bioinspiration-VRtN3   0.76  0.07 0.597 0.40 1.0
Bioinspiration-PN3     0.48  0.35 0.404 0.60 1.8
Bioinspiration-IPI2r   0.45 -0.14 0.204 0.80 1.2
Bioinspiration-PN4     0.59  0.21 0.425 0.57 1.2

                       MR1  MR2
SS loadings           5.80 2.80
Proportion Var        0.36 0.17
Cumulative Var        0.36 0.54
Proportion Explained  0.67 0.33
Cumulative Proportion 0.67 1.00

 With factor correlations of 
     MR1  MR2
MR1 1.00 0.16
MR2 0.16 1.00

Mean item complexity =  1.1
Test of the hypothesis that 2 factors are sufficient.

df null model =  120  with the objective function =  9.41 with Chi Square =  5411.06
df of  the model are 89  and the objective function was  0.81 

The root mean square of the residuals (RMSR) is  0.04 
The df corrected root mean square of the residuals is  0.05 

The harmonic n.obs is  582 with the empirical chi square  223.85  with prob <  1.3e-13 
The total n.obs was  582  with Likelihood Chi Square =  462.95  with prob <  6.6e-52 

Tucker Lewis Index of factoring reliability =  0.904
RMSEA index =  0.085  and the 90 % confidence intervals are  0.077 0.093
BIC =  -103.67
Fit based upon off diagonal values = 0.99
Measures of factor score adequacy             
                                                   MR1  MR2
Correlation of (regression) scores with factors   0.97 0.95
Multiple R square of scores with factors          0.94 0.90
Minimum correlation of possible factor scores     0.88 0.79

two factor structure, within bioinspiried dimensions no strong differences in overall answering patterns; 1 items is dysfunctional (negative correlated)

4.2.1 for “Bioinspiration Items”

#### Overall EFA
regExOverall <- "^Bioinspiration"


psych::cor.plot(r = cor(dat[, str_detect(string = colnames(dat),
                                                   pattern = regExOverall)]
                        , use = "pairwise.complete.obs"),
                upper = FALSE, xlas = 2, main = "Overall")

#> parallel analysis
tmp_parallelAnalysis <- dimensionalityTest(label = "Overall",
                             regEx = regExOverall, dataset = dat)

Parallel analysis suggests that the number of factors =  4  and the number of components =  1 
Overall 
Number of components:  1 
#> EFA (# of factors=5)
tmp_EFA <- explorativeFactorAnalysis(label = "Overall",
                                 regEx = regExOverall,
                                 dataset = dat, nfac = 2)
Warning in fa.stats(r = r, f = f, phi = phi, n.obs = n.obs, np.obs = np.obs, :
The estimated weights for the factor scores are probably incorrect.  Try a
different factor score estimation method.
tmp_EFA[[1]]
Factor Analysis using method =  minres
Call: fa(r = tmp_dat, nfactors = nfac, rotate = "promax", cor = "cor")
Standardized loadings (pattern matrix) based upon correlation matrix
                        MR1   MR2   h2   u2 com
Bioinspiration-PN2r   -0.11 -0.08 0.03 0.97 1.8
Bioinspiration-PN1     0.03  0.82 0.71 0.29 1.0
Bioinspiration-IPI4    0.81  0.08 0.75 0.25 1.0
Bioinspiration-VRtN4r  0.53  0.18 0.45 0.55 1.2
Bioinspiration-VRtN2   0.58  0.32 0.71 0.29 1.6
Bioinspiration-IPI1    0.85  0.02 0.75 0.25 1.0
Bioinspiration-VRtN1   0.27  0.57 0.62 0.38 1.4
Bioinspiration-IPI3    0.76  0.10 0.69 0.31 1.0
Bioinspiration-VRtN3   0.37  0.46 0.60 0.40 1.9
Bioinspiration-PN3    -0.20  0.82 0.47 0.53 1.1
Bioinspiration-IPI2r   0.65 -0.20 0.27 0.73 1.2
Bioinspiration-PN4    -0.01  0.71 0.49 0.51 1.0

                       MR1  MR2
SS loadings           3.60 2.94
Proportion Var        0.30 0.24
Cumulative Var        0.30 0.55
Proportion Explained  0.55 0.45
Cumulative Proportion 0.55 1.00

 With factor correlations of 
     MR1  MR2
MR1 1.00 0.73
MR2 0.73 1.00

Mean item complexity =  1.3
Test of the hypothesis that 2 factors are sufficient.

df null model =  66  with the objective function =  7.03 with Chi Square =  4051.16
df of  the model are 43  and the objective function was  0.35 

The root mean square of the residuals (RMSR) is  0.04 
The df corrected root mean square of the residuals is  0.04 

The harmonic n.obs is  582 with the empirical chi square  97.5  with prob <  4.1e-06 
The total n.obs was  582  with Likelihood Chi Square =  200.33  with prob <  3.7e-22 

Tucker Lewis Index of factoring reliability =  0.939
RMSEA index =  0.079  and the 90 % confidence intervals are  0.068 0.091
BIC =  -73.43
Fit based upon off diagonal values = 0.99
Measures of factor score adequacy             
                                                   MR1  MR2
Correlation of (regression) scores with factors   0.96 0.94
Multiple R square of scores with factors          0.92 0.88
Minimum correlation of possible factor scores     0.84 0.77

4.3 Descriptives, correlation plot, EFA, CFA for “Ecological Items”

Applied a self-written function for example to check the reliability and amount of explained variance for the first factor:

regEx <- "^EcologicalDimension"
nameVariable <- "Ecology"


sum(str_detect(string = colnames(dat), pattern = regEx))
[1] 4
tmp_dat <- na.omit(dat[,str_detect(string = colnames(dat), pattern = regEx)])


tmp <- CFAstats(dataset = tmp_dat, regularExp = regEx, labelLatent = str_remove(string = nameVariable, pattern = "mean_"), 
                showPlots = TRUE, 
                computeEFA = TRUE, 
                computeCFA = TRUE, 
                computeCFAMplus = FALSE)



descriptive statistics: 
                      Mean   SD Median CoeffofVariation Minimum Maximun
EcologicalDimension-1 5.58 1.20      6             0.21       2       7
EcologicalDimension-4 4.99 1.40      5             0.28       1       7
EcologicalDimension-2 5.53 1.23      6             0.22       1       7
EcologicalDimension-3 5.51 1.20      6             0.22       1       7
                      Lower Quantile Upper Quantile Skewness Kurtosis(-3)
EcologicalDimension-1              2              7    -0.61        -0.25
EcologicalDimension-4              1              7    -0.52        -0.03
EcologicalDimension-2              1              7    -0.66        -0.08
EcologicalDimension-3              1              7    -0.54        -0.19
                      KS-Test
EcologicalDimension-1       0
EcologicalDimension-4       0
EcologicalDimension-2       0
EcologicalDimension-3       0


variables under investigation:  EcologicalDimension1 EcologicalDimension4 EcologicalDimension2 EcologicalDimension3 

Cronbachs Alpha: 0.86 

Parallel analysis suggests that the number of factors =  1  and the number of components =  1 
Ecology 
Number of components:  1 



EFA factor loadings (1 factor solution): 

Loadings:
                     MR1  
EcologicalDimension1 0.903
EcologicalDimension4 0.612
EcologicalDimension2 0.870
EcologicalDimension3 0.894

                 MR1
SS loadings    2.745
Proportion Var 0.686
CFA summary and fit statistics: 
lavaan 0.6-19 ended normally after 18 iterations

  Estimator                                         ML
  Optimization method                           NLMINB
  Number of model parameters                         8

  Number of observations                           582

Model Test User Model:
                                              Standard      Scaled
  Test Statistic                                 3.235       1.928
  Degrees of freedom                                 2           2
  P-value (Chi-square)                           0.198       0.381
  Scaling correction factor                                  1.678
    Yuan-Bentler correction (Mplus variant)                       

Model Test Baseline Model:

  Test statistic                              1205.851     551.303
  Degrees of freedom                                 6           6
  P-value                                        0.000       0.000
  Scaling correction factor                                  2.187

User Model versus Baseline Model:

  Comparative Fit Index (CFI)                    0.999       1.000
  Tucker-Lewis Index (TLI)                       0.997       1.000
                                                                  
  Robust Comparative Fit Index (CFI)                         1.000
  Robust Tucker-Lewis Index (TLI)                            1.000

Loglikelihood and Information Criteria:

  Loglikelihood user model (H0)              -3226.769   -3226.769
  Scaling correction factor                                  1.687
      for the MLR correction                                      
  Loglikelihood unrestricted model (H1)      -3225.152   -3225.152
  Scaling correction factor                                  1.685
      for the MLR correction                                      
                                                                  
  Akaike (AIC)                                6469.538    6469.538
  Bayesian (BIC)                              6504.470    6504.470
  Sample-size adjusted Bayesian (SABIC)       6479.073    6479.073

Root Mean Square Error of Approximation:

  RMSEA                                          0.033       0.000
  90 Percent confidence interval - lower         0.000       0.000
  90 Percent confidence interval - upper         0.095       0.066
  P-value H_0: RMSEA <= 0.050                    0.584       0.848
  P-value H_0: RMSEA >= 0.080                    0.122       0.014
                                                                  
  Robust RMSEA                                               0.000
  90 Percent confidence interval - lower                     0.000
  90 Percent confidence interval - upper                     0.105
  P-value H_0: Robust RMSEA <= 0.050                         0.636
  P-value H_0: Robust RMSEA >= 0.080                         0.151

Standardized Root Mean Square Residual:

  SRMR                                           0.010       0.010

Parameter Estimates:

  Standard errors                             Sandwich
  Information bread                           Observed
  Observed information based on                Hessian

Latent Variables:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
  Ecology =~                                                            
    EcologclDmnsn1    1.000                               1.053    0.880
    EcologclDmnsn4    0.726    0.054   13.390    0.000    0.765    0.547
    EcologclDmnsn2    0.968    0.045   21.539    0.000    1.019    0.828
    EcologclDmnsn3    0.981    0.040   24.325    0.000    1.032    0.863

Variances:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
   .EcologclDmnsn1    0.325    0.047    6.922    0.000    0.325    0.226
   .EcologclDmnsn4    1.369    0.135   10.144    0.000    1.369    0.701
   .EcologclDmnsn2    0.475    0.050    9.587    0.000    0.475    0.314
   .EcologclDmnsn3    0.366    0.060    6.152    0.000    0.366    0.256
    Ecology           1.109    0.089   12.500    0.000    1.000    1.000



CFA first 6 Modification Indices: 
                    lhs op                  rhs    mi    epc sepc.lv sepc.all
15 EcologicalDimension2 ~~ EcologicalDimension3 2.985 -0.088  -0.088   -0.211
10 EcologicalDimension1 ~~ EcologicalDimension4 2.985 -0.067  -0.067   -0.101
13 EcologicalDimension4 ~~ EcologicalDimension2 1.463  0.050   0.050    0.062
12 EcologicalDimension1 ~~ EcologicalDimension3 1.463  0.069   0.069    0.201
11 EcologicalDimension1 ~~ EcologicalDimension2 0.398  0.034   0.034    0.085
14 EcologicalDimension4 ~~ EcologicalDimension3 0.398  0.025   0.025    0.035
   sepc.nox
15   -0.211
10   -0.101
13    0.062
12    0.201
11    0.085
14    0.035

4.4 Descriptives, correlation plot, EFA, CFA for “Bioinspiration Items”

4.4.1 overall

regEx <- "^Bioinspiration"
nameVariable <- "Bioinspiration"


sum(str_detect(string = colnames(dat), pattern = regEx))
[1] 12
tmp_dat <- na.omit(dat[,str_detect(string = colnames(dat), pattern = regEx)])


tmp <- CFAstats(dataset = tmp_dat, regularExp = regEx, labelLatent = str_remove(string = nameVariable, pattern = "mean_"), 
                showPlots = TRUE, 
                computeEFA = TRUE, 
                computeCFA = TRUE, 
                computeCFAMplus = FALSE)



descriptive statistics: 
                      Mean   SD Median CoeffofVariation Minimum Maximun
Bioinspiration-PN2r   3.09 1.08      3             0.35       1       5
Bioinspiration-PN1    3.55 0.97      4             0.27       1       5
Bioinspiration-IPI4   3.78 0.97      4             0.26       1       5
Bioinspiration-VRtN4r 3.25 1.11      3             0.34       1       5
Bioinspiration-VRtN2  3.48 1.10      4             0.32       1       5
Bioinspiration-IPI1   3.79 0.99      4             0.26       1       5
Bioinspiration-VRtN1  3.44 1.04      4             0.30       1       5
Bioinspiration-IPI3   3.93 0.94      4             0.24       1       5
Bioinspiration-VRtN3  3.45 0.98      4             0.28       1       5
Bioinspiration-PN3    3.55 0.92      4             0.26       1       5
Bioinspiration-IPI2r  3.40 1.06      4             0.31       1       5
Bioinspiration-PN4    3.15 1.07      3             0.34       1       5
                      Lower Quantile Upper Quantile Skewness Kurtosis(-3)
Bioinspiration-PN2r                1              5     0.03        -0.87
Bioinspiration-PN1                 1              5    -0.61        -0.08
Bioinspiration-IPI4                1              5    -0.72         0.10
Bioinspiration-VRtN4r              1              5    -0.26        -0.86
Bioinspiration-VRtN2               1              5    -0.63        -0.40
Bioinspiration-IPI1                1              5    -0.73         0.04
Bioinspiration-VRtN1               1              5    -0.57        -0.34
Bioinspiration-IPI3                1              5    -0.84         0.36
Bioinspiration-VRtN3               1              5    -0.47        -0.36
Bioinspiration-PN3                 1              5    -0.39        -0.29
Bioinspiration-IPI2r               1              5    -0.33        -0.73
Bioinspiration-PN4                 1              5    -0.24        -0.88
                      KS-Test
Bioinspiration-PN2r         0
Bioinspiration-PN1          0
Bioinspiration-IPI4         0
Bioinspiration-VRtN4r       0
Bioinspiration-VRtN2        0
Bioinspiration-IPI1         0
Bioinspiration-VRtN1        0
Bioinspiration-IPI3         0
Bioinspiration-VRtN3        0
Bioinspiration-PN3          0
Bioinspiration-IPI2r        0
Bioinspiration-PN4          0


variables under investigation:  BioinspirationPN2r BioinspirationPN1 BioinspirationIPI4 BioinspirationVRtN4r BioinspirationVRtN2 BioinspirationIPI1 BioinspirationVRtN1 BioinspirationIPI3 BioinspirationVRtN3 BioinspirationPN3 BioinspirationIPI2r BioinspirationPN4 
Some items ( Bioinspiration-PN2r ) were negatively correlated with the first principal component and 
probably should be reversed.  
To do this, run the function again with the 'check.keys=TRUE' optionCronbachs Alpha: 0.89 

Parallel analysis suggests that the number of factors =  4  and the number of components =  1 
Bioinspiration 
Number of components:  1 


EFA factor loadings (1 factor solution): 

Loadings:
                     MR1   
BioinspirationPN2r   -0.164
BioinspirationPN1     0.792
BioinspirationIPI4    0.866
BioinspirationVRtN4r  0.693
BioinspirationVRtN2   0.882
BioinspirationIPI1    0.842
BioinspirationVRtN1   0.815
BioinspirationIPI3    0.840
BioinspirationVRtN3   0.815
BioinspirationPN3     0.576
BioinspirationIPI2r   0.459
BioinspirationPN4     0.665

                 MR1
SS loadings    6.390
Proportion Var 0.533
CFA summary and fit statistics: 
lavaan 0.6-19 ended normally after 57 iterations

  Estimator                                         ML
  Optimization method                           NLMINB
  Number of model parameters                        24

  Number of observations                           582

Model Test User Model:
                                              Standard      Scaled
  Test Statistic                               503.816     395.086
  Degrees of freedom                                54          54
  P-value (Chi-square)                           0.000       0.000
  Scaling correction factor                                  1.275
    Yuan-Bentler correction (Mplus variant)                       

Model Test Baseline Model:

  Test statistic                              4092.174    3059.934
  Degrees of freedom                                66          66
  P-value                                        0.000       0.000
  Scaling correction factor                                  1.337

User Model versus Baseline Model:

  Comparative Fit Index (CFI)                    0.888       0.886
  Tucker-Lewis Index (TLI)                       0.863       0.861
                                                                  
  Robust Comparative Fit Index (CFI)                         0.891
  Robust Tucker-Lewis Index (TLI)                            0.867

Loglikelihood and Information Criteria:

  Loglikelihood user model (H0)              -8228.204   -8228.204
  Scaling correction factor                                  1.219
      for the MLR correction                                      
  Loglikelihood unrestricted model (H1)      -7976.296   -7976.296
  Scaling correction factor                                  1.258
      for the MLR correction                                      
                                                                  
  Akaike (AIC)                               16504.408   16504.408
  Bayesian (BIC)                             16609.203   16609.203
  Sample-size adjusted Bayesian (SABIC)      16533.012   16533.012

Root Mean Square Error of Approximation:

  RMSEA                                          0.120       0.104
  90 Percent confidence interval - lower         0.110       0.096
  90 Percent confidence interval - upper         0.129       0.113
  P-value H_0: RMSEA <= 0.050                    0.000       0.000
  P-value H_0: RMSEA >= 0.080                    1.000       1.000
                                                                  
  Robust RMSEA                                               0.118
  90 Percent confidence interval - lower                     0.107
  90 Percent confidence interval - upper                     0.129
  P-value H_0: Robust RMSEA <= 0.050                         0.000
  P-value H_0: Robust RMSEA >= 0.080                         1.000

Standardized Root Mean Square Residual:

  SRMR                                           0.059       0.059

Parameter Estimates:

  Standard errors                             Sandwich
  Information bread                           Observed
  Observed information based on                Hessian

Latent Variables:
                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
  Bioinspiration =~                                                      
    BioinsprtnPN2r     1.000                               0.195    0.180
    BioinspirtnPN1    -3.678    0.989   -3.721    0.000   -0.716   -0.738
    BioinsprtnIPI4    -4.210    1.139   -3.695    0.000   -0.819   -0.847
    BinsprtnVRtN4r    -3.758    1.060   -3.546    0.000   -0.732   -0.661
    BionsprtnVRtN2    -4.760    1.280   -3.720    0.000   -0.927   -0.844
    BioinsprtnIPI1    -4.250    1.135   -3.744    0.000   -0.827   -0.838
    BionsprtnVRtN1    -4.066    1.091   -3.727    0.000   -0.791   -0.763
    BioinsprtnIPI3    -3.952    1.068   -3.701    0.000   -0.769   -0.818
    BionsprtnVRtN3    -3.846    1.041   -3.696    0.000   -0.749   -0.762
    BioinspirtnPN3    -2.465    0.708   -3.483    0.000   -0.480   -0.522
    BionsprtnIPI2r    -2.374    0.703   -3.380    0.001   -0.462   -0.435
    BioinspirtnPN4    -3.366    0.906   -3.714    0.000   -0.655   -0.615

Variances:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
   .BioinsprtnPN2r    1.127    0.054   20.847    0.000    1.127    0.967
   .BioinspirtnPN1    0.429    0.038   11.386    0.000    0.429    0.456
   .BioinsprtnIPI4    0.264    0.027    9.922    0.000    0.264    0.283
   .BinsprtnVRtN4r    0.691    0.064   10.748    0.000    0.691    0.564
   .BionsprtnVRtN2    0.346    0.033   10.538    0.000    0.346    0.287
   .BioinsprtnIPI1    0.291    0.029   10.170    0.000    0.291    0.298
   .BionsprtnVRtN1    0.448    0.039   11.504    0.000    0.448    0.417
   .BioinsprtnIPI3    0.293    0.026   11.225    0.000    0.293    0.331
   .BionsprtnVRtN3    0.405    0.033   12.379    0.000    0.405    0.420
   .BioinspirtnPN3    0.615    0.038   16.319    0.000    0.615    0.728
   .BionsprtnIPI2r    0.913    0.057   15.896    0.000    0.913    0.810
   .BioinspirtnPN4    0.707    0.044   15.955    0.000    0.707    0.622
    Bioinspiration    0.038    0.021    1.824    0.068    1.000    1.000



CFA first 6 Modification Indices: 
                  lhs op                rhs     mi    epc sepc.lv sepc.all
49 BioinspirationIPI4 ~~ BioinspirationIPI1 80.772  0.130   0.130    0.471
44  BioinspirationPN1 ~~  BioinspirationPN3 65.910  0.183   0.183    0.356
46  BioinspirationPN1 ~~  BioinspirationPN4 63.622  0.195   0.195    0.353
72 BioinspirationIPI1 ~~ BioinspirationIPI3 50.599  0.105   0.105    0.360
51 BioinspirationIPI4 ~~ BioinspirationIPI3 42.366  0.093   0.093    0.333
74 BioinspirationIPI1 ~~  BioinspirationPN3 35.191 -0.115  -0.115   -0.273
   sepc.nox
49    0.471
44    0.356
46    0.353
72    0.360
51    0.333
74   -0.273

4.4.2 overall

regEx <- "^Bioinspiration"
nameVariable <- "Bioinspiration"


sum(str_detect(string = colnames(dat), pattern = regEx))
[1] 12
tmp_dat <- na.omit(dat[,str_detect(string = colnames(dat), pattern = regEx)])


tmp <- CFAstats(dataset = tmp_dat, regularExp = regEx, labelLatent = str_remove(string = nameVariable, pattern = "mean_"), 
                showPlots = TRUE, 
                computeEFA = TRUE, 
                computeCFA = TRUE, 
                computeCFAMplus = FALSE)



descriptive statistics: 
                      Mean   SD Median CoeffofVariation Minimum Maximun
Bioinspiration-PN2r   3.09 1.08      3             0.35       1       5
Bioinspiration-PN1    3.55 0.97      4             0.27       1       5
Bioinspiration-IPI4   3.78 0.97      4             0.26       1       5
Bioinspiration-VRtN4r 3.25 1.11      3             0.34       1       5
Bioinspiration-VRtN2  3.48 1.10      4             0.32       1       5
Bioinspiration-IPI1   3.79 0.99      4             0.26       1       5
Bioinspiration-VRtN1  3.44 1.04      4             0.30       1       5
Bioinspiration-IPI3   3.93 0.94      4             0.24       1       5
Bioinspiration-VRtN3  3.45 0.98      4             0.28       1       5
Bioinspiration-PN3    3.55 0.92      4             0.26       1       5
Bioinspiration-IPI2r  3.40 1.06      4             0.31       1       5
Bioinspiration-PN4    3.15 1.07      3             0.34       1       5
                      Lower Quantile Upper Quantile Skewness Kurtosis(-3)
Bioinspiration-PN2r                1              5     0.03        -0.87
Bioinspiration-PN1                 1              5    -0.61        -0.08
Bioinspiration-IPI4                1              5    -0.72         0.10
Bioinspiration-VRtN4r              1              5    -0.26        -0.86
Bioinspiration-VRtN2               1              5    -0.63        -0.40
Bioinspiration-IPI1                1              5    -0.73         0.04
Bioinspiration-VRtN1               1              5    -0.57        -0.34
Bioinspiration-IPI3                1              5    -0.84         0.36
Bioinspiration-VRtN3               1              5    -0.47        -0.36
Bioinspiration-PN3                 1              5    -0.39        -0.29
Bioinspiration-IPI2r               1              5    -0.33        -0.73
Bioinspiration-PN4                 1              5    -0.24        -0.88
                      KS-Test
Bioinspiration-PN2r         0
Bioinspiration-PN1          0
Bioinspiration-IPI4         0
Bioinspiration-VRtN4r       0
Bioinspiration-VRtN2        0
Bioinspiration-IPI1         0
Bioinspiration-VRtN1        0
Bioinspiration-IPI3         0
Bioinspiration-VRtN3        0
Bioinspiration-PN3          0
Bioinspiration-IPI2r        0
Bioinspiration-PN4          0


variables under investigation:  BioinspirationPN2r BioinspirationPN1 BioinspirationIPI4 BioinspirationVRtN4r BioinspirationVRtN2 BioinspirationIPI1 BioinspirationVRtN1 BioinspirationIPI3 BioinspirationVRtN3 BioinspirationPN3 BioinspirationIPI2r BioinspirationPN4 
Some items ( Bioinspiration-PN2r ) were negatively correlated with the first principal component and 
probably should be reversed.  
To do this, run the function again with the 'check.keys=TRUE' optionCronbachs Alpha: 0.89 

Parallel analysis suggests that the number of factors =  4  and the number of components =  1 
Bioinspiration 
Number of components:  1 


EFA factor loadings (1 factor solution): 

Loadings:
                     MR1   
BioinspirationPN2r   -0.164
BioinspirationPN1     0.792
BioinspirationIPI4    0.866
BioinspirationVRtN4r  0.693
BioinspirationVRtN2   0.882
BioinspirationIPI1    0.842
BioinspirationVRtN1   0.815
BioinspirationIPI3    0.840
BioinspirationVRtN3   0.815
BioinspirationPN3     0.576
BioinspirationIPI2r   0.459
BioinspirationPN4     0.665

                 MR1
SS loadings    6.390
Proportion Var 0.533
CFA summary and fit statistics: 
lavaan 0.6-19 ended normally after 57 iterations

  Estimator                                         ML
  Optimization method                           NLMINB
  Number of model parameters                        24

  Number of observations                           582

Model Test User Model:
                                              Standard      Scaled
  Test Statistic                               503.816     395.086
  Degrees of freedom                                54          54
  P-value (Chi-square)                           0.000       0.000
  Scaling correction factor                                  1.275
    Yuan-Bentler correction (Mplus variant)                       

Model Test Baseline Model:

  Test statistic                              4092.174    3059.934
  Degrees of freedom                                66          66
  P-value                                        0.000       0.000
  Scaling correction factor                                  1.337

User Model versus Baseline Model:

  Comparative Fit Index (CFI)                    0.888       0.886
  Tucker-Lewis Index (TLI)                       0.863       0.861
                                                                  
  Robust Comparative Fit Index (CFI)                         0.891
  Robust Tucker-Lewis Index (TLI)                            0.867

Loglikelihood and Information Criteria:

  Loglikelihood user model (H0)              -8228.204   -8228.204
  Scaling correction factor                                  1.219
      for the MLR correction                                      
  Loglikelihood unrestricted model (H1)      -7976.296   -7976.296
  Scaling correction factor                                  1.258
      for the MLR correction                                      
                                                                  
  Akaike (AIC)                               16504.408   16504.408
  Bayesian (BIC)                             16609.203   16609.203
  Sample-size adjusted Bayesian (SABIC)      16533.012   16533.012

Root Mean Square Error of Approximation:

  RMSEA                                          0.120       0.104
  90 Percent confidence interval - lower         0.110       0.096
  90 Percent confidence interval - upper         0.129       0.113
  P-value H_0: RMSEA <= 0.050                    0.000       0.000
  P-value H_0: RMSEA >= 0.080                    1.000       1.000
                                                                  
  Robust RMSEA                                               0.118
  90 Percent confidence interval - lower                     0.107
  90 Percent confidence interval - upper                     0.129
  P-value H_0: Robust RMSEA <= 0.050                         0.000
  P-value H_0: Robust RMSEA >= 0.080                         1.000

Standardized Root Mean Square Residual:

  SRMR                                           0.059       0.059

Parameter Estimates:

  Standard errors                             Sandwich
  Information bread                           Observed
  Observed information based on                Hessian

Latent Variables:
                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
  Bioinspiration =~                                                      
    BioinsprtnPN2r     1.000                               0.195    0.180
    BioinspirtnPN1    -3.678    0.989   -3.721    0.000   -0.716   -0.738
    BioinsprtnIPI4    -4.210    1.139   -3.695    0.000   -0.819   -0.847
    BinsprtnVRtN4r    -3.758    1.060   -3.546    0.000   -0.732   -0.661
    BionsprtnVRtN2    -4.760    1.280   -3.720    0.000   -0.927   -0.844
    BioinsprtnIPI1    -4.250    1.135   -3.744    0.000   -0.827   -0.838
    BionsprtnVRtN1    -4.066    1.091   -3.727    0.000   -0.791   -0.763
    BioinsprtnIPI3    -3.952    1.068   -3.701    0.000   -0.769   -0.818
    BionsprtnVRtN3    -3.846    1.041   -3.696    0.000   -0.749   -0.762
    BioinspirtnPN3    -2.465    0.708   -3.483    0.000   -0.480   -0.522
    BionsprtnIPI2r    -2.374    0.703   -3.380    0.001   -0.462   -0.435
    BioinspirtnPN4    -3.366    0.906   -3.714    0.000   -0.655   -0.615

Variances:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
   .BioinsprtnPN2r    1.127    0.054   20.847    0.000    1.127    0.967
   .BioinspirtnPN1    0.429    0.038   11.386    0.000    0.429    0.456
   .BioinsprtnIPI4    0.264    0.027    9.922    0.000    0.264    0.283
   .BinsprtnVRtN4r    0.691    0.064   10.748    0.000    0.691    0.564
   .BionsprtnVRtN2    0.346    0.033   10.538    0.000    0.346    0.287
   .BioinsprtnIPI1    0.291    0.029   10.170    0.000    0.291    0.298
   .BionsprtnVRtN1    0.448    0.039   11.504    0.000    0.448    0.417
   .BioinsprtnIPI3    0.293    0.026   11.225    0.000    0.293    0.331
   .BionsprtnVRtN3    0.405    0.033   12.379    0.000    0.405    0.420
   .BioinspirtnPN3    0.615    0.038   16.319    0.000    0.615    0.728
   .BionsprtnIPI2r    0.913    0.057   15.896    0.000    0.913    0.810
   .BioinspirtnPN4    0.707    0.044   15.955    0.000    0.707    0.622
    Bioinspiration    0.038    0.021    1.824    0.068    1.000    1.000



CFA first 6 Modification Indices: 
                  lhs op                rhs     mi    epc sepc.lv sepc.all
49 BioinspirationIPI4 ~~ BioinspirationIPI1 80.772  0.130   0.130    0.471
44  BioinspirationPN1 ~~  BioinspirationPN3 65.910  0.183   0.183    0.356
46  BioinspirationPN1 ~~  BioinspirationPN4 63.622  0.195   0.195    0.353
72 BioinspirationIPI1 ~~ BioinspirationIPI3 50.599  0.105   0.105    0.360
51 BioinspirationIPI4 ~~ BioinspirationIPI3 42.366  0.093   0.093    0.333
74 BioinspirationIPI1 ~~  BioinspirationPN3 35.191 -0.115  -0.115   -0.273
   sepc.nox
49    0.471
44    0.356
46    0.353
72    0.360
51    0.333
74   -0.273

4.4.3 Visual Resemblance to Nature

regEx <- "^Bioinspiration-VRtN"
nameVariable <- "VRtN"


sum(str_detect(string = colnames(dat), pattern = regEx))
[1] 4
tmp_dat <- na.omit(dat[,str_detect(string = colnames(dat), pattern = regEx)])


tmp <- CFAstats(dataset = tmp_dat, regularExp = regEx, labelLatent = str_remove(string = nameVariable, pattern = "mean_"), 
                showPlots = TRUE, 
                computeEFA = TRUE, 
                computeCFA = TRUE, 
                computeCFAMplus = FALSE)



descriptive statistics: 
                      Mean   SD Median CoeffofVariation Minimum Maximun
Bioinspiration-VRtN4r 3.25 1.11      3             0.34       1       5
Bioinspiration-VRtN2  3.48 1.10      4             0.32       1       5
Bioinspiration-VRtN1  3.44 1.04      4             0.30       1       5
Bioinspiration-VRtN3  3.45 0.98      4             0.28       1       5
                      Lower Quantile Upper Quantile Skewness Kurtosis(-3)
Bioinspiration-VRtN4r              1              5    -0.26        -0.86
Bioinspiration-VRtN2               1              5    -0.63        -0.40
Bioinspiration-VRtN1               1              5    -0.57        -0.34
Bioinspiration-VRtN3               1              5    -0.47        -0.36
                      KS-Test
Bioinspiration-VRtN4r       0
Bioinspiration-VRtN2        0
Bioinspiration-VRtN1        0
Bioinspiration-VRtN3        0


variables under investigation:  BioinspirationVRtN4r BioinspirationVRtN2 BioinspirationVRtN1 BioinspirationVRtN3 

Cronbachs Alpha: 0.86 

Parallel analysis suggests that the number of factors =  1  and the number of components =  1 
VRtN 
Number of components:  1 



EFA factor loadings (1 factor solution): 

Loadings:
                     MR1  
BioinspirationVRtN4r 0.691
BioinspirationVRtN2  0.910
BioinspirationVRtN1  0.845
BioinspirationVRtN3  0.830

                 MR1
SS loadings    2.709
Proportion Var 0.677
CFA summary and fit statistics: 
lavaan 0.6-19 ended normally after 20 iterations

  Estimator                                         ML
  Optimization method                           NLMINB
  Number of model parameters                         8

  Number of observations                           582

Model Test User Model:
                                              Standard      Scaled
  Test Statistic                                 1.448       1.082
  Degrees of freedom                                 2           2
  P-value (Chi-square)                           0.485       0.582
  Scaling correction factor                                  1.338
    Yuan-Bentler correction (Mplus variant)                       

Model Test Baseline Model:

  Test statistic                              1106.379     722.737
  Degrees of freedom                                 6           6
  P-value                                        0.000       0.000
  Scaling correction factor                                  1.531

User Model versus Baseline Model:

  Comparative Fit Index (CFI)                    1.000       1.000
  Tucker-Lewis Index (TLI)                       1.002       1.004
                                                                  
  Robust Comparative Fit Index (CFI)                         1.000
  Robust Tucker-Lewis Index (TLI)                            1.003

Loglikelihood and Information Criteria:

  Loglikelihood user model (H0)              -2875.394   -2875.394
  Scaling correction factor                                  1.191
      for the MLR correction                                      
  Loglikelihood unrestricted model (H1)      -2874.670   -2874.670
  Scaling correction factor                                  1.220
      for the MLR correction                                      
                                                                  
  Akaike (AIC)                                5766.788    5766.788
  Bayesian (BIC)                              5801.719    5801.719
  Sample-size adjusted Bayesian (SABIC)       5776.322    5776.322

Root Mean Square Error of Approximation:

  RMSEA                                          0.000       0.000
  90 Percent confidence interval - lower         0.000       0.000
  90 Percent confidence interval - upper         0.075       0.059
  P-value H_0: RMSEA <= 0.050                    0.814       0.913
  P-value H_0: RMSEA >= 0.080                    0.035       0.008
                                                                  
  Robust RMSEA                                               0.000
  90 Percent confidence interval - lower                     0.000
  90 Percent confidence interval - upper                     0.079
  P-value H_0: Robust RMSEA <= 0.050                         0.818
  P-value H_0: Robust RMSEA >= 0.080                         0.048

Standardized Root Mean Square Residual:

  SRMR                                           0.007       0.007

Parameter Estimates:

  Standard errors                             Sandwich
  Information bread                           Observed
  Observed information based on                Hessian

Latent Variables:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
  VRtN =~                                                               
    BinsprtnVRtN4r    1.000                               0.736    0.665
    BionsprtnVRtN2    1.308    0.082   15.917    0.000    0.962    0.877
    BionsprtnVRtN1    1.143    0.075   15.239    0.000    0.841    0.811
    BionsprtnVRtN3    1.037    0.065   15.936    0.000    0.763    0.777

Variances:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
   .BinsprtnVRtN4r    0.685    0.064   10.694    0.000    0.685    0.558
   .BionsprtnVRtN2    0.279    0.034    8.313    0.000    0.279    0.231
   .BionsprtnVRtN1    0.367    0.035   10.412    0.000    0.367    0.342
   .BionsprtnVRtN3    0.383    0.034   11.150    0.000    0.383    0.397
    VRtN              0.542    0.064    8.449    0.000    1.000    1.000



CFA first 6 Modification Indices: 
                    lhs op                 rhs    mi    epc sepc.lv sepc.all
11 BioinspirationVRtN4r ~~ BioinspirationVRtN1 1.130 -0.031  -0.031   -0.061
14  BioinspirationVRtN2 ~~ BioinspirationVRtN3 1.130 -0.036  -0.036   -0.112
12 BioinspirationVRtN4r ~~ BioinspirationVRtN3 0.933  0.026   0.026    0.052
13  BioinspirationVRtN2 ~~ BioinspirationVRtN1 0.933  0.038   0.038    0.119
10 BioinspirationVRtN4r ~~ BioinspirationVRtN2 0.017  0.004   0.004    0.010
15  BioinspirationVRtN1 ~~ BioinspirationVRtN3 0.017  0.004   0.004    0.010
   sepc.nox
11   -0.061
14   -0.112
12    0.052
13    0.119
10    0.010
15    0.010

4.4.4 Intentionality & Perceived Inspiration

regEx <- "^Bioinspiration-IPI"
nameVariable <- "IPI"


sum(str_detect(string = colnames(dat), pattern = regEx))
[1] 4
tmp_dat <- na.omit(dat[,str_detect(string = colnames(dat), pattern = regEx)])


tmp <- CFAstats(dataset = tmp_dat, regularExp = regEx, labelLatent = str_remove(string = nameVariable, pattern = "mean_"), 
                showPlots = TRUE, 
                computeEFA = TRUE, 
                computeCFA = TRUE, 
                computeCFAMplus = FALSE)



descriptive statistics: 
                     Mean   SD Median CoeffofVariation Minimum Maximun
Bioinspiration-IPI4  3.78 0.97      4             0.26       1       5
Bioinspiration-IPI1  3.79 0.99      4             0.26       1       5
Bioinspiration-IPI3  3.93 0.94      4             0.24       1       5
Bioinspiration-IPI2r 3.40 1.06      4             0.31       1       5
                     Lower Quantile Upper Quantile Skewness Kurtosis(-3)
Bioinspiration-IPI4               1              5    -0.72         0.10
Bioinspiration-IPI1               1              5    -0.73         0.04
Bioinspiration-IPI3               1              5    -0.84         0.36
Bioinspiration-IPI2r              1              5    -0.33        -0.73
                     KS-Test
Bioinspiration-IPI4        0
Bioinspiration-IPI1        0
Bioinspiration-IPI3        0
Bioinspiration-IPI2r       0


variables under investigation:  BioinspirationIPI4 BioinspirationIPI1 BioinspirationIPI3 BioinspirationIPI2r 

Cronbachs Alpha: 0.85 

Parallel analysis suggests that the number of factors =  1  and the number of components =  1 
IPI 
Number of components:  1 



EFA factor loadings (1 factor solution): 

Loadings:
                    MR1  
BioinspirationIPI4  0.926
BioinspirationIPI1  0.920
BioinspirationIPI3  0.897
BioinspirationIPI2r 0.502

                MR1
SS loadings    2.76
Proportion Var 0.69
CFA summary and fit statistics: 
lavaan 0.6-19 ended normally after 20 iterations

  Estimator                                         ML
  Optimization method                           NLMINB
  Number of model parameters                         8

  Number of observations                           582

Model Test User Model:
                                              Standard      Scaled
  Test Statistic                                 1.547       1.298
  Degrees of freedom                                 2           2
  P-value (Chi-square)                           0.461       0.523
  Scaling correction factor                                  1.192
    Yuan-Bentler correction (Mplus variant)                       

Model Test Baseline Model:

  Test statistic                              1302.450     758.860
  Degrees of freedom                                 6           6
  P-value                                        0.000       0.000
  Scaling correction factor                                  1.716

User Model versus Baseline Model:

  Comparative Fit Index (CFI)                    1.000       1.000
  Tucker-Lewis Index (TLI)                       1.001       1.003
                                                                  
  Robust Comparative Fit Index (CFI)                         1.000
  Robust Tucker-Lewis Index (TLI)                            1.002

Loglikelihood and Information Criteria:

  Loglikelihood user model (H0)              -2625.619   -2625.619
  Scaling correction factor                                  1.475
      for the MLR correction                                      
  Loglikelihood unrestricted model (H1)      -2624.845   -2624.845
  Scaling correction factor                                  1.418
      for the MLR correction                                      
                                                                  
  Akaike (AIC)                                5267.238    5267.238
  Bayesian (BIC)                              5302.170    5302.170
  Sample-size adjusted Bayesian (SABIC)       5276.773    5276.773

Root Mean Square Error of Approximation:

  RMSEA                                          0.000       0.000
  90 Percent confidence interval - lower         0.000       0.000
  90 Percent confidence interval - upper         0.076       0.066
  P-value H_0: RMSEA <= 0.050                    0.801       0.868
  P-value H_0: RMSEA >= 0.080                    0.039       0.018
                                                                  
  Robust RMSEA                                               0.000
  90 Percent confidence interval - lower                     0.000
  90 Percent confidence interval - upper                     0.079
  P-value H_0: Robust RMSEA <= 0.050                         0.803
  P-value H_0: Robust RMSEA >= 0.080                         0.047

Standardized Root Mean Square Residual:

  SRMR                                           0.007       0.007

Parameter Estimates:

  Standard errors                             Sandwich
  Information bread                           Observed
  Observed information based on                Hessian

Latent Variables:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
  IPI =~                                                                
    BioinsprtnIPI4    1.000                               0.863    0.892
    BioinsprtnIPI1    1.018    0.035   28.821    0.000    0.879    0.890
    BioinsprtnIPI3    0.931    0.040   23.176    0.000    0.804    0.854
    BionsprtnIPI2r    0.551    0.051   10.738    0.000    0.476    0.448

Variances:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
   .BioinsprtnIPI4    0.191    0.026    7.243    0.000    0.191    0.204
   .BioinsprtnIPI1    0.203    0.029    7.093    0.000    0.203    0.208
   .BioinsprtnIPI3    0.240    0.029    8.381    0.000    0.240    0.271
   .BionsprtnIPI2r    0.900    0.059   15.219    0.000    0.900    0.799
    IPI               0.745    0.060   12.386    0.000    1.000    1.000



CFA first 6 Modification Indices: 
                  lhs op                 rhs    mi    epc sepc.lv sepc.all
11 BioinspirationIPI4 ~~  BioinspirationIPI3 1.450 -0.046  -0.046   -0.217
14 BioinspirationIPI1 ~~ BioinspirationIPI2r 1.450 -0.028  -0.028   -0.065
15 BioinspirationIPI3 ~~ BioinspirationIPI2r 0.640  0.018   0.018    0.040
10 BioinspirationIPI4 ~~  BioinspirationIPI1 0.640  0.037   0.037    0.186
13 BioinspirationIPI1 ~~  BioinspirationIPI3 0.216  0.018   0.018    0.082
12 BioinspirationIPI4 ~~ BioinspirationIPI2r 0.216  0.011   0.011    0.025
   sepc.nox
11   -0.217
14   -0.065
15    0.040
10    0.186
13    0.082
12    0.025

4.4.5 Perceived Naturalness

regEx <- "^Bioinspiration-PN"
nameVariable <- "PN"


sum(str_detect(string = colnames(dat), pattern = regEx))
[1] 4
tmp_dat <- na.omit(dat[,str_detect(string = colnames(dat), pattern = regEx)])


tmp <- CFAstats(dataset = tmp_dat, regularExp = regEx, labelLatent = str_remove(string = nameVariable, pattern = "mean_"), 
                showPlots = TRUE, 
                computeEFA = TRUE, 
                computeCFA = TRUE, 
                computeCFAMplus = FALSE)



descriptive statistics: 
                    Mean   SD Median CoeffofVariation Minimum Maximun
Bioinspiration-PN2r 3.09 1.08      3             0.35       1       5
Bioinspiration-PN1  3.55 0.97      4             0.27       1       5
Bioinspiration-PN3  3.55 0.92      4             0.26       1       5
Bioinspiration-PN4  3.15 1.07      3             0.34       1       5
                    Lower Quantile Upper Quantile Skewness Kurtosis(-3) KS-Test
Bioinspiration-PN2r              1              5     0.03        -0.87       0
Bioinspiration-PN1               1              5    -0.61        -0.08       0
Bioinspiration-PN3               1              5    -0.39        -0.29       0
Bioinspiration-PN4               1              5    -0.24        -0.88       0


variables under investigation:  BioinspirationPN2r BioinspirationPN1 BioinspirationPN3 BioinspirationPN4 
Some items ( Bioinspiration-PN2r ) were negatively correlated with the first principal component and 
probably should be reversed.  
To do this, run the function again with the 'check.keys=TRUE' optionCronbachs Alpha: 0.54 

Parallel analysis suggests that the number of factors =  2  and the number of components =  1 
PN 
Number of components:  1 

KMO criteria is to low (< .6) for: 
 BioinspirationPN2r 
 mean KMO: 0.68 


EFA factor loadings (1 factor solution): 

Loadings:
                   MR1   
BioinspirationPN2r -0.120
BioinspirationPN1   0.904
BioinspirationPN3   0.690
BioinspirationPN4   0.768

                 MR1
SS loadings    1.896
Proportion Var 0.474
CFA summary and fit statistics: 
lavaan 0.6-19 ended normally after 44 iterations

  Estimator                                         ML
  Optimization method                           NLMINB
  Number of model parameters                         8

  Number of observations                           582

Model Test User Model:
                                              Standard      Scaled
  Test Statistic                                21.009      16.546
  Degrees of freedom                                 2           2
  P-value (Chi-square)                           0.000       0.000
  Scaling correction factor                                  1.270
    Yuan-Bentler correction (Mplus variant)                       

Model Test Baseline Model:

  Test statistic                               557.717     416.170
  Degrees of freedom                                 6           6
  P-value                                        0.000       0.000
  Scaling correction factor                                  1.340

User Model versus Baseline Model:

  Comparative Fit Index (CFI)                    0.966       0.965
  Tucker-Lewis Index (TLI)                       0.897       0.894
                                                                  
  Robust Comparative Fit Index (CFI)                         0.966
  Robust Tucker-Lewis Index (TLI)                            0.899

Loglikelihood and Information Criteria:

  Loglikelihood user model (H0)              -3050.099   -3050.099
  Scaling correction factor                                  1.055
      for the MLR correction                                      
  Loglikelihood unrestricted model (H1)      -3039.595   -3039.595
  Scaling correction factor                                  1.098
      for the MLR correction                                      
                                                                  
  Akaike (AIC)                                6116.198    6116.198
  Bayesian (BIC)                              6151.130    6151.130
  Sample-size adjusted Bayesian (SABIC)       6125.733    6125.733

Root Mean Square Error of Approximation:

  RMSEA                                          0.128       0.112
  90 Percent confidence interval - lower         0.082       0.071
  90 Percent confidence interval - upper         0.180       0.158
  P-value H_0: RMSEA <= 0.050                    0.003       0.008
  P-value H_0: RMSEA >= 0.080                    0.957       0.904
                                                                  
  Robust RMSEA                                               0.126
  90 Percent confidence interval - lower                     0.075
  90 Percent confidence interval - upper                     0.185
  P-value H_0: Robust RMSEA <= 0.050                         0.009
  P-value H_0: Robust RMSEA >= 0.080                         0.931

Standardized Root Mean Square Residual:

  SRMR                                           0.043       0.043

Parameter Estimates:

  Standard errors                             Sandwich
  Information bread                           Observed
  Observed information based on                Hessian

Latent Variables:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
  PN =~                                                                 
    BioinsprtnPN2r    1.000                               0.149    0.138
    BioinspirtnPN1   -5.625    2.157   -2.608    0.009   -0.837   -0.862
    BioinspirtnPN3   -4.042    1.611   -2.509    0.012   -0.601   -0.654
    BioinspirtnPN4   -5.168    1.953   -2.646    0.008   -0.769   -0.721

Variances:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
   .BioinsprtnPN2r    1.142    0.053   21.384    0.000    1.142    0.981
   .BioinspirtnPN1    0.242    0.049    4.955    0.000    0.242    0.257
   .BioinspirtnPN3    0.484    0.039   12.523    0.000    0.484    0.573
   .BioinspirtnPN4    0.546    0.052   10.436    0.000    0.546    0.480
    PN                0.022    0.017    1.290    0.197    1.000    1.000



CFA first 6 Modification Indices: 
                  lhs op               rhs     mi    epc sepc.lv sepc.all
11 BioinspirationPN2r ~~ BioinspirationPN3 14.576  0.129   0.129    0.174
14  BioinspirationPN1 ~~ BioinspirationPN4 14.576 -0.928  -0.928   -2.555
13  BioinspirationPN1 ~~ BioinspirationPN3 11.082  0.551   0.551    1.612
12 BioinspirationPN2r ~~ BioinspirationPN4 11.082 -0.125  -0.125   -0.159
15  BioinspirationPN3 ~~ BioinspirationPN4  0.000  0.000   0.000   -0.001
10 BioinspirationPN2r ~~ BioinspirationPN1  0.000  0.000   0.000    0.000
   sepc.nox
11    0.174
14   -2.555
13    1.612
12   -0.159
15   -0.001
10    0.000

4.5 Delete Items

dat$`Bioinspiration-PN2r` <- NULL

4.6 Item Response Theory (polytomous) for “Bioinspiration Items”

Factor Loadings (F1) indicate how strongly each item is associated with the latent trait, rule of thumb:

  • 0.70 = strong
  • 0.40–0.69 = moderate
  • < 0.40 = weak

Communality (h²) is the proportion of variance in each item explained by the factor, rule of thumb: + h² > 0.40 → item is well represented + h² < 0.30 → potentially problematic item

# Choose dataset and regular expression
regEx <- "^Bioinspiration"

# Filter variables matching the pattern
irt_items <- dat[, str_detect(colnames(dat), pattern = regEx)]

# Drop rows with missing data (mirt requires complete cases)
irt_items <- na.omit(irt_items)

# Ensure all items are treated as ordered factors
irt_items[] <- lapply(irt_items, function(x) as.numeric(as.character(x)))
# Fit Graded Response Model (1-factor)
mod_grm <- mirt(data = irt_items, model = 1, itemtype = "graded", verbose = FALSE)

# Summarize model
summary(mod_grm)
                         F1    h2
Bioinspiration-PN1    0.796 0.633
Bioinspiration-IPI4   0.907 0.823
Bioinspiration-VRtN4r 0.747 0.558
Bioinspiration-VRtN2  0.894 0.799
Bioinspiration-IPI1   0.892 0.796
Bioinspiration-VRtN1  0.817 0.668
Bioinspiration-IPI3   0.882 0.778
Bioinspiration-VRtN3  0.822 0.676
Bioinspiration-PN3    0.582 0.339
Bioinspiration-IPI2r  0.513 0.263
Bioinspiration-PN4    0.676 0.457

SS loadings:  6.789 
Proportion Var:  0.617 

Factor correlations: 

   F1
F1  1
# Plot Item Characteristic Curves (ICCs) for all items
plot(mod_grm, type = "trace", facet_items = TRUE, main = "Item Characteristic Curves")

# Plot Test Information Curve
plot(mod_grm, type = "info", main = "Test Information Curve: Bioinspiration")

### compare results to:
cor.plot(r = cor(irt_items))

Compare 1-Factor vs. 2-Factor Models:

mod_1f <- mirt(data = irt_items, model = 1, itemtype = "graded", verbose = FALSE)
mod_2f <- mirt(data = irt_items, model = 2, itemtype = "graded", verbose = FALSE)
mod_3f <- mirt(data = irt_items, model = 3, itemtype = "graded", verbose = FALSE)
anova(mod_1f, mod_2f, mod_3f)
            AIC    SABIC       HQ      BIC    logLik      X2 df p
mod_1f 13957.75 14023.30 14051.36 14197.91 -6923.875             
mod_2f 13663.46 13740.93 13774.10 13947.28 -6766.732 314.286 10 0
mod_3f 13609.56 13697.75 13735.51 13932.67 -6730.778  71.908  9 0

significant p-value (e.g., < .05) supports the 2-factor model.

summary(mod_2f)

Rotation:  oblimin 

Rotated factor loadings: 

                           F1      F2    h2
Bioinspiration-PN1     0.8129  0.0979 0.781
Bioinspiration-IPI4    0.0572  0.8948 0.875
Bioinspiration-VRtN4r  0.2784  0.5211 0.551
Bioinspiration-VRtN2   0.3973  0.5630 0.786
Bioinspiration-IPI1   -0.0342  0.9606 0.878
Bioinspiration-VRtN1   0.6229  0.2850 0.716
Bioinspiration-IPI3    0.0545  0.8671 0.821
Bioinspiration-VRtN3   0.5515  0.3518 0.698
Bioinspiration-PN3     0.8694 -0.1745 0.575
Bioinspiration-IPI2r  -0.1741  0.6899 0.339
Bioinspiration-PN4     0.6963  0.0746 0.563

Rotated SS loadings:  2.867 3.791 

Factor correlations: 

      F1 F2
F1 1.000   
F2 0.697  1
summary(mod_3f)

Rotation:  oblimin 

Rotated factor loadings: 

                           F1      F2        F3    h2
Bioinspiration-PN1     0.5283  0.1986  0.337649 0.799
Bioinspiration-IPI4    0.0418  0.8822  0.046490 0.876
Bioinspiration-VRtN4r -0.0875  0.1636  0.658111 0.577
Bioinspiration-VRtN2  -0.0569  0.1298  0.832451 0.838
Bioinspiration-IPI1   -0.0111  0.9433 -0.000221 0.883
Bioinspiration-VRtN1   0.1128 -0.0901  0.876318 0.755
Bioinspiration-IPI3    0.0445  0.8682  0.029496 0.825
Bioinspiration-VRtN3   0.0942  0.0425  0.754684 0.711
Bioinspiration-PN3     0.5240 -0.0583  0.365132 0.557
Bioinspiration-IPI2r  -0.3250  0.3327  0.380271 0.371
Bioinspiration-PN4     0.5906  0.3439  0.017494 0.620

Rotated SS loadings:  1.044 2.747 2.859 

Factor correlations: 

      F1   F2 F3
F1 1.000        
F2 0.324 1.00   
F3 0.525 0.83  1

4.7 test for measurment invariance

to check if items betweens different framing conditions were answered in a similar fashion (related to differential item functioning)

4.8 ant colony algorithm

  • Ant Colony / Genetic Algorithm
  • if necessary add to CFAs regularized SEM (regSEM)

5 Compute mean scores

dat$mean_Bioinspiration <- rowMeans(x = dat[,str_subset(colnames(dat), pattern = "^Bioinspiration")])
dat$mean_Bioinspiration_PN <- rowMeans(x = dat[,str_subset(colnames(dat), pattern = "^Bioinspiration-PN")])
dat$mean_Bioinspiration_IPI <- rowMeans(x = dat[,str_subset(colnames(dat), pattern = "^Bioinspiration-IPI")])
dat$mean_Bioinspiration_VRtN <- rowMeans(x = dat[,str_subset(colnames(dat), pattern = "^Bioinspiration-VRtN")])

dat$mean_Ecological <- rowMeans(x = dat[,str_subset(colnames(dat), pattern = "^EcologicalDimension")])

manifest correlations:

psych::cor.plot(r = cor(dat[, str_detect(string = colnames(dat),
                                                   pattern = "^mean_")]
                        , use = "pairwise.complete.obs"),
                upper = FALSE, xlas = 2, main = "Overall")

6 Test Hypotheses

6.1 Descriptive

# Summaries of participant-level scores by framing condition
eco_summary <- data_summary(dat, "mean_Ecological", "framingCondition")
Loading required package: plyr
------------------------------------------------------------------------------
You have loaded plyr after dplyr - this is likely to cause problems.
If you need functions from both plyr and dplyr, please load plyr first, then dplyr:
library(plyr); library(dplyr)
------------------------------------------------------------------------------

Attaching package: 'plyr'
The following objects are masked from 'package:dplyr':

    arrange, count, desc, failwith, id, mutate, rename, summarise,
    summarize
The following object is masked from 'package:purrr':

    compact
bio_summary <- data_summary(dat, "mean_Bioinspiration", "framingCondition")

# View results
print(eco_summary)
  framingCondition mean_Ecological         se
1      bioinspired        4.835938 0.07644978
2          neutral        5.468912 0.06919817
3      sustainable        5.883249 0.05971585
print(bio_summary)
  framingCondition mean_Bioinspiration         se
1      bioinspired            3.919981 0.03713850
2          neutral            3.480923 0.05081479
3      sustainable            3.184587 0.05806461
# Plots the mean scores on the Bioinspiration & Ecological Dimension by Framing Condition
ggplot(dat, aes(x = framingCondition, y = mean_Ecological)) +
  geom_boxplot(fill = "lightgreen") +
  labs(title = "Ecological Dimension by Framing", y = "Mean Score") +
  theme_minimal()

ggplot(dat, aes(x = framingCondition, y = mean_Bioinspiration)) +
  geom_boxplot(fill = "skyblue") +
  labs(title = "Bioinspiration by Framing", y = "Mean Score") +
  theme_minimal()

6.2 ANOVAs

!!! to discuss

tmp_removeIDs <- names(table(dat$PROLIFIC_PID))[table(dat$PROLIFIC_PID) >= 2]

dim(dat)
[1] 582  51
dat <- dat[!dat$PROLIFIC_PID %in% tmp_removeIDs,]
dim(dat)
[1] 582  51

ANOVAs + post hoc tests:

# --- ANOVA for Bioinspiration ---
aov_bio <- aov_ez(
  id = "PROLIFIC_PID",  # replace with your participant ID column name
  dv = "mean_Bioinspiration",
  data = dat,
  between = "framingCondition"
)
print(aov_bio)
Anova Table (Type 3 tests)

Response: mean_Bioinspiration
            Effect     df  MSE         F  ges p.value
1 framingCondition 2, 579 0.48 55.67 *** .161   <.001
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '+' 0.1 ' ' 1
# Post hoc (Tukey) for Bioinspiration
em_bio <- emmeans(aov_bio, "framingCondition")
bio_posthoc <- pairs(em_bio, adjust = "tukey")
print(bio_posthoc)
 contrast                  estimate     SE  df t.ratio p.value
 bioinspired - neutral        0.439 0.0704 579   6.234  <.0001
 bioinspired - sustainable    0.735 0.0701 579  10.495  <.0001
 neutral - sustainable        0.296 0.0700 579   4.234  0.0001

P value adjustment: tukey method for comparing a family of 3 estimates 
# --- ANOVA for Ecological Dimension ---
aov_eco <- aov_ez(
  id = "PROLIFIC_PID",  # replace with your participant ID column name
  dv = "mean_Ecological",
  data = dat,
  between = "framingCondition"
)
print(aov_eco)
Anova Table (Type 3 tests)

Response: mean_Ecological
            Effect     df  MSE         F  ges p.value
1 framingCondition 2, 579 0.91 59.06 *** .169   <.001
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '+' 0.1 ' ' 1
# Post hoc (Tukey) for Ecological
em_eco <- emmeans(aov_eco, "framingCondition")
eco_posthoc <- pairs(em_eco, adjust = "tukey")
print(eco_posthoc)
 contrast                  estimate     SE  df t.ratio p.value
 bioinspired - neutral       -0.633 0.0975 579  -6.494  <.0001
 bioinspired - sustainable   -1.047 0.0970 579 -10.800  <.0001
 neutral - sustainable       -0.414 0.0968 579  -4.278  0.0001

P value adjustment: tukey method for comparing a family of 3 estimates 

plots in APA7 style:

# Summarize means and SE for plotting
bio_plot_data <- data_summary(dat, "mean_Bioinspiration", "framingCondition")
eco_plot_data <- data_summary(dat, "mean_Ecological", "framingCondition")

# --- Bioinspiration Plot ---
ggplot(bio_plot_data, aes(x = framingCondition, y = mean_Bioinspiration)) +
  geom_col(fill = "grey80", color = "black", width = 0.6) +
  geom_errorbar(aes(ymin = mean_Bioinspiration - se, ymax = mean_Bioinspiration + se), width = 0.15) +
  labs(x = "Framing Condition", y = "Mean Bioinspiration Score") +
  theme_apa() +
  theme(
    axis.title = element_text(face = "bold"),
    legend.position = "none"
  )

# --- Ecological Dimension Plot ---
ggplot(eco_plot_data, aes(x = framingCondition, y = mean_Ecological)) +
  geom_col(fill = "grey60", color = "black", width = 0.6) +
  geom_errorbar(aes(ymin = mean_Ecological - se, ymax = mean_Ecological + se), width = 0.15) +
  labs(x = "Framing Condition", y = "Mean Ecological Score") +
  theme_apa() +
  theme(
    axis.title = element_text(face = "bold"),
    legend.position = "none"
  )

6.3 Spillover

We are comparing the effect size or magnitude of:

  • How much “bioinspired” framing boosts sustainability ratings.
  • How much “sustainable” framing boosts bioinspiration ratings.
# Subset only relevant cases and variables
dat_subset <- dat %>%
  filter(framingCondition %in% c("bioinspired", "sustainable")) %>%
  select(PROLIFIC_PID, framingCondition, mean_Bioinspiration, mean_Ecological)


# Standardize the two scales
dat_subset <- dat_subset %>%
  mutate(
    z_Bioinspiration = scale(mean_Bioinspiration)[, 1],
    z_Sustainability = scale(mean_Ecological)[, 1]
  )


# Convert to long format
dat_long_scaled <- dat_subset %>%
  pivot_longer(cols = c(z_Bioinspiration, z_Sustainability),
               names_to = "ratingType",
               values_to = "ratingScore") %>%
  mutate(
    ratingType = recode(ratingType,
                        "z_Bioinspiration" = "Bioinspiration",
                        "z_Sustainability" = "Sustainability"),
    framingCondition = factor(framingCondition),
    ratingType = factor(ratingType)
  )

The interaction term now reflects difference in effect sizes in standard deviation units (comparable spillover strength):

# Run interaction model
model_scaled <- lm(ratingScore ~ framingCondition * ratingType, data = dat_long_scaled)
summary(model_scaled)

Call:
lm(formula = ratingScore ~ framingCondition * ratingType, data = dat_long_scaled)

Residuals:
    Min      1Q  Median      3Q     Max 
-3.5716 -0.5824  0.1032  0.5826  2.3409 

Coefficients:
                                                     Estimate Std. Error
(Intercept)                                           0.48023    0.06345
framingConditionsustainable                          -0.94828    0.08917
ratingTypeSustainability                             -0.96805    0.08974
framingConditionsustainable:ratingTypeSustainability  1.91153    0.12610
                                                     t value Pr(>|t|)    
(Intercept)                                            7.568 1.08e-13 ***
framingConditionsustainable                          -10.635  < 2e-16 ***
ratingTypeSustainability                             -10.788  < 2e-16 ***
framingConditionsustainable:ratingTypeSustainability  15.159  < 2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.8792 on 774 degrees of freedom
Multiple R-squared:  0.2289,    Adjusted R-squared:  0.2259 
F-statistic:  76.6 on 3 and 774 DF,  p-value: < 2.2e-16
dat_long_scaled %>%
  group_by(framingCondition, ratingType) %>%
  dplyr::summarise(
    N = n(),
    mean_DV = mean(ratingScore, na.rm = TRUE)
  )
`summarise()` has grouped output by 'framingCondition'. You can override using
the `.groups` argument.
# A tibble: 4 × 4
# Groups:   framingCondition [2]
  framingCondition ratingType         N mean_DV
  <fct>            <chr>          <int>   <dbl>
1 bioinspired      Bioinspiration   192   0.480
2 bioinspired      Sustainability   192  -0.488
3 sustainable      Bioinspiration   197  -0.468
4 sustainable      Sustainability   197   0.475
ggplot(dat_long_scaled, aes(x = framingCondition, y = ratingScore, fill = ratingType)) +
  stat_summary(fun = mean, geom = "bar", position = position_dodge(0.7), width = 0.6, color = "black") +
  stat_summary(fun.data = mean_se, geom = "errorbar", 
               position = position_dodge(0.7), width = 0.15) +
  labs(x = "Framing Condition", y = "Rating Score", fill = "Rating Type") +
  theme_minimal()

# Reshape from wide to long format
dat_long <- dat_subset %>%
  pivot_longer(cols = c(mean_Bioinspiration, mean_Ecological),
               names_to = "ratingType",
               values_to = "ratingScore") %>%
  mutate(
    ratingType = recode(ratingType,
                        "mean_Bioinspiration" = "Bioinspiration",
                        "mean_Ecological" = "Sustainability"),
    framingCondition = as.factor(framingCondition),
    ratingType = as.factor(ratingType)
  )


ggplot(dat_long, aes(x = framingCondition, y = ratingScore, fill = ratingType)) +
  stat_summary(
    fun = mean, geom = "col", position = position_dodge(0.75), 
    width = 0.6, color = "black"
  ) +
  stat_summary(
    fun.data = mean_se, geom = "errorbar", 
    position = position_dodge(0.75), width = 0.2, size = 0.8
  ) +
  scale_fill_manual(
    values = c("Bioinspiration" = "#4C72B0", "Sustainability" = "#55A868")
  ) +
  labs(
    x = "Framing Condition",
    y = "Mean Rating Score",
    fill = "Rating Type",
    title = "Effect of Framing on Bioinspiration and Sustainability Ratings"
  ) +
  theme_minimal(base_size = 14) +
  theme(
    axis.title = element_text(face = "bold"),
    axis.text = element_text(color = "black"),
    legend.position = "top",
    legend.title = element_text(face = "bold"),
    panel.grid.major.x = element_blank(),
    panel.grid.minor = element_blank()
  )
Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
ℹ Please use `linewidth` instead.

6.3.1 Coefficients and Interpretation

Term Estimate Interpretation
(Intercept) 0.48 Average standardized Bioinspiration rating under bioinspired framing (baseline condition).
framingConditionsustainable -0.95 Switching to sustainable framing decreases standardized Bioinspiration ratings by 0.95 SD.
ratingTypeSustainability -0.97 Under bioinspired framing, standardized Sustainability ratings are 0.97 SD lower than bioinspiration ratings.
framingConditionsustainable:ratingTypeSustainability 1.91 The key interaction: under sustainable framing, the difference between Sustainability and Bioinspiration ratings increases by 1.91 SD.

6.3.2 Interpretation of Spillover Effects

  • Bioinspired framing leads to higher bioinspiration ratings but lower sustainability ratings (relative to bioinspiration).
  • Sustainable framing leads to higher sustainability ratings relative to bioinspiration ratings.
  • The significant and large interaction effect (1.91 SD) indicates that the influence of framing on ratings differs markedly by rating type.
  • This confirms asymmetrical spillover effects:
    • Sustainable framing boosts sustainability ratings more strongly than it boosts bioinspiration.
    • Conversely, bioinspired framing boosts bioinspiration ratings more than sustainability.

6.3.3 include neutral condition

table(dat$framingCondition, dat$whichItemsFirst)
             
              bioinspired sustainable
  bioinspired         192           0
  neutral              94          99
  sustainable           0         197
dat <- dat %>%
  mutate(framingCondition_neutral = case_when(
    framingCondition == "bioinspired" & whichItemsFirst == "bioinspired" ~ "bioinspired",
    framingCondition == "sustainable" & whichItemsFirst == "sustainable" ~ "sustainable",
    framingCondition == "neutral" & whichItemsFirst == "sustainable" ~ "neut_sustainable",
    framingCondition == "neutral" & whichItemsFirst == "bioinspired" ~ "neut_bioinspired"
  ))

table(dat$framingCondition_neutral)

     bioinspired neut_bioinspired neut_sustainable      sustainable 
             192               94               99              197 
ggplot(dat, aes(x = framingCondition_neutral, y = mean_Bioinspiration)) +
  geom_boxplot(fill = "skyblue") +
  labs(title = "Bioinspiration by Framing", y = "Mean Score") +
  theme_minimal()

ggplot(dat, aes(x = framingCondition_neutral, y = mean_Ecological)) +
  geom_boxplot(fill = "skyblue") +
  labs(title = "Ecological Dimension by Framing", y = "Mean Score") +
  theme_minimal()

7 Appendix

7.1 latent class analysis for “Bioinspiration Items”

to come

7.2 latent class analysis for “Ecological Items”

to come