This function is intended for users and estimates a factor analysis model that has been
set up previously with a call to make_manifest and a call to
make_restrictions.
An object that inherits from manifest-class and is
typically produced by make_manifest.
restrictions
An object that inherits from restrictions-class and
is typically produced by make_restrictions.
scores
Type of factor scores to produce, if any. The default is "none".
Other valid choices (which can be partially matched) are "regression",
"Bartlett", "Thurstone", "Ledermann",
"Anderson-Rubin", "McDonald", "Krinjen",
"Takeuchi", and "Harman". See Beauducel (2007) for
formulae for these factor scores as well as proofs that all but
"regression" and "Harman" produce the same
correlation matrix.
seeds
A vector of length one or two to be used as the random
number generator seeds corresponding to the unif.seed and
int.seed arguments to genoud respectively.
If seeds is a single number, this seed is used for both
unif.seed and int.seed. These seeds override the defaults
for genoud and make it easier to replicate
an analysis exactly. If NULL, the default arguments for
unif.seed and int.seed as specified in genoud
are used. NULL should be used in simulations or else they will be
horribly wrong.
lower
A lower bound. In exploratory factor analysis, lower is the
minimum uniqueness and corresponds to the 'lower' element of the list
specified for control in factanal. Otherwise, lower
is the lower bound used for singular values when checking for positive-definiteness
and ranks of matrices. If the unlikely event that you get errors referencing
positive definiteness, try increasing the value of lower slightly.
analytic
A logical (default to TRUE) indicating whether analytic gradients
should be used as much as possible. If FALSE, then numeric gradients will be
calculated, which are slower and slightly less accurate but are necessary in some
situations and useful for debugging analytic gradients.
reject
Logical indicating whether to reject starting values that fail the
constraints required by the model; see create_start
NelderMead
Logical indicating whether to call optim with
method = "Nelder-Mead" when the genetic algorithm has finished to further
polish the solution. This option is not relevant or necessary for exploratory factor
analysis models.
impatient
Logical that defaults to FALSE. If restrictions is of
restrictions.factanal-class, setting it to TRUE will cause
factanal to be used for optimization instead of genoud.
In all other situations, setting it to TRUE will use factanal to
to generate initial communality estimates instead of the slower default mechanism.
...
Further arguments that are passed to genoud.
The following arguments to genoud are hard-coded and
cannot be changed because they are logically required by the factor analyis
estimator:
argument
value
why?
nvars
restrictions@nvars
max
FALSE
minimizing the objective
hessian
FALSE
we roll our own
lexical
TRUE (usually)
for restricted optimization
Domains
restrictions@Domains
data.type.int
FALSE
parameters are doubles
fn
wrapper around fitS4
BFGSfn
wrapper around bfgs_fitS4
BFGShelp
wrapper around bfgs_helpS4
gr
various
it is complicated
unif.seed
taken from seeds
replicability
int.seed
taken from seeds
replicability
The following arguments to genoud default to values
that differ from those documented at genoud but can
be overridden by specifying them explicitly in the ... :
argument
value
why?
boundary.enforcement
1 usually
2 can cause problems
MemoryMatrix
FALSE
runs faster
print.level
1
output is not that helpful for >= 2
P9mix
1
to always accept the BFGS result
BFGSburnin
-1
to delay the gradient check
max.generations
1000
big number is often necessary
project.path
contains "Factanal.txt"
starting.values
see the Details section
Other arguments to genoud will take the documented
default values unless explicitly specified. In particular, you may want to
change wait.generations and solution.tolerance. Also, if informative
bounds were placed on any of the parameters in the call to make_restrictions
it is usually preferable to specify that boundary.enforcement = 2 to use
constrained optimization in the internal calls to optim. However,
the "L-BFGS-B" optimizer is less robust than the default "BFGS" optimizer
and occasionally causes fatal errors, largly due to misfortune.
Details
The call to Factanal is somewhat of a formality in the sense that most of the
difficult decisions were already made in the call to make_restrictions
and the call to make_manifest. The most important remaining detail is
the specification of the values for the starting population in the genetic algorithm.
It is not necessary to provide starting values, since there are methods for this
purpose; see create_start. Also, if starting.values = NA, then
a population of starting values will be created using the typical mechanism in
genoud, namely random uniform draws from the domain of the
parameter.
Otherwise, if reject = TRUE, starting values that fail one or more constraints
are rejected and new vectors of starting values are generated until the population is
filled with admissable starting values. In some cases, the constraints are quite difficult
to satisfy by chance, and it may be more practical to specify reject = FALSE or to
supply starting values explicitly. If starting values are supplied, it is helpful if at
least one member of the genetic population satisfies all the constraints imposed on the
model. Note the rownames of restrictions@Domains, which indicate the proper order
of the free parameters.
A matrix (or vector) of starting values can be passed as starting.values.
(Also, it is possible to pass an object of FA-class to
starting.values, in which case the estimates from the previous call to
Factanal are used as the starting values.) If a matrix, it should have
columns equal to the number of rows in restrictions@Domains in the specified
order and one or more rows up to the number of genetic individuals in the population.
If starting.values is a vector, its length can be equal to the number of rows
in restrictions@Domains in which case it is treated as a one-row matrix, or its
length can be equal to the number of manifest variables, in which case it is passed
to the start argument of create_start as a vector of initial
communality estimes, thus avoiding the sometimes time-consuming process of generating
good initial communality estimates. This process can also be accelerated by specifying
impatient = TRUE.
Value
An object of that inherits from FA-class.
Note
The underlying genetic algorithm can print a variety of output as it progresses.
On Windows, you either have to move the scrollbar periodically to flush the output
to the screen or disable buffering by either going to the Misc menu or by clicking
Control+W. The output will, by default, look something like this
Generation
First
Second
...
Last
Discrepancy
number
constraint
constraint
constraint
function
0
-1.0
-1.0
...
-1.0
double
1
-1.0
-1.0
...
-1.0
double
...
...
...
...
...
...
42
-1.0
-1.0
...
-1.0
double
The integer on the far left indicates the generation number. If it appears to
skip one or more generations, that signifies that the best individual in the
“missing” generation was no better than the best individual in the
previous generation. The sequence of -1.0 indicates that various constraints
are being satisfied by the best individual in the generation. Some of these
constraints are hard-coded, some are added by the choices the user makes in the call
to make_restrictions. The curious are referred to the source code,
but for the most part users need not worry about them provided they are -1.0.
If any but the last are not -1.0 after the first few generations, there is a
major problem because no individual is satisfying all the constraints.
The last number is a double-precision number indicating the value of the discrepancy
function. This number will decrease, sometimes painfully slowly, sometimes intermittently,
over the generations since the discrepancy function is being minimized, subject to the
aforementioned constraints.
Author(s)
Ben Goodrich
References
Barthlomew, D. J. and Knott, M. (1990) Latent Variable Analysis
and Factor Analysis. Second Edition, Arnold.
Beauducel, A. (2007) In spite of indeterminancy, many common factor score
estimates yield an identical reproduced covariance matrix.
Psychometrika, 72, 437–441.
Smith, G. A. and Stanley G. (1983)
Clocking g: relating intelligence and measures of timed
performance. Intelligence, 7, 353–368.
Venables, W. N. and Ripley, B. D. (2002)
Modern Applied Statistics with S. Fourth edition. Springer.
See Also
make_manifest, make_restrictions, and
Rotate
Examples
## Example from Venables and Ripley (2002, p. 323)
## Previously from Bartholomew and Knott (1999, p. 68--72)
## Originally from Smith and Stanley (1983)
## Replicated from example(ability.cov)
man <- make_manifest(covmat = ability.cov)
## Not run:
## Here is the easy way to set up a SEFA model, which uses pop-up menus
res <- make_restrictions(manifest = man, factors = 2, model = "SEFA")
## End(Not run)
## This is the hard way to set up a restrictions object without pop-up menus
beta <- matrix(NA_real_, nrow = nrow(cormat(man)), ncol = 2)
rownames(beta) <- rownames(cormat(man))
free <- is.na(beta)
beta <- new("parameter.coef.SEFA", x = beta, free = free, num_free = sum(free))
Phi <- diag(2)
free <- lower.tri(Phi)
Phi <- new("parameter.cormat", x = Phi, free = free, num_free = sum(free))
res <- make_restrictions(manifest = man, beta = beta, Phi = Phi)
# This is how to make starting values where Phi is the correlation matrix
# among factors, beta is the matrix of coefficients, and the scales are
# the logarithm of the sample standard deviations. It is also the MLE.
starts <- c( 4.46294498156615e-01, # Phi_{21}
4.67036349420035e-01, # beta_{11}
6.42220238211291e-01, # beta_{21}
8.88564379236454e-01, # beta_{31}
4.77779639176941e-01, # beta_{41}
-7.13405536379741e-02, # beta_{51}
-9.47782525342137e-08, # beta_{61}
4.04993872375487e-01, # beta_{12}
-1.04604290549591e-08, # beta_{22}
-9.44950629176182e-03, # beta_{32}
2.63078925240678e-04, # beta_{42}
9.38038168787216e-01, # beta_{52}
8.43618801925473e-01, # beta_{62}
log(man@sds)) # log manifest standard deviations
sefa <- Factanal(manifest = man, restrictions = res,
# NOTE: Do NOT specify any of the following tiny values in a
# real research situation; it is done here solely for speed
starting.values = starts, pop.size = 2, max.generations = 6,
wait.generations = 1)
nsim <- 101 # number of simulations, also too small for real work
show(sefa)
summary(sefa, nsim = nsim)
model_comparison(sefa, nsim = nsim)
stuff <- list() # output list for various methods
stuff$model.matrix <- model.matrix(sefa) # sample correlation matrix
stuff$fitted <- fitted(sefa, reduced = TRUE) # reduced covariance matrix
stuff$residuals <- residuals(sefa) # difference between model.matrix and fitted
stuff$rstandard <- rstandard(sefa) # normalized residual matrix
stuff$weights <- weights(sefa) # (scaled) approximate weights for residuals
stuff$influence <- influence(sefa) # weights * residuals
stuff$cormat <- cormat(sefa, matrix = "RF") # reference factor correlations
stuff$uniquenesses <- uniquenesses(sefa, standardized = FALSE) # uniquenesses
stuff$FC <- loadings(sefa, matrix = "FC") # factor contribution matrix
stuff$draws <- FA2draws(sefa, nsim = nsim) # draws from sampling distribution
if(require(nFactors)) screeplot(sefa) # Enhanced scree plot
profile(sefa) # profile plots of non-free parameters
pairs(sefa) # Thurstone-style plot
if(require(Rgraphviz)) plot(sefa) # DAG
Results
R version 3.3.1 (2016-06-21) -- "Bug in Your Hair"
Copyright (C) 2016 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu (64-bit)
R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.
R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.
Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.
> library(FAiR)
Loading required package: rgenoud
## rgenoud (Version 5.7-12.4, Build Date: 2015-07-19)
## See http://sekhon.berkeley.edu/rgenoud for additional documentation.
## Please cite software as:
## Walter Mebane, Jr. and Jasjeet S. Sekhon. 2011.
## ``Genetic Optimization Using Derivatives: The rgenoud package for R.''
## Journal of Statistical Software, 42(11): 1-26.
##
Loading required package: gWidgetsRGtk2
Loading required package: RGtk2
Loading required package: gWidgets
Loading required package: cairoDevice
Loading required package: stats4
Loading required package: rrcov
Loading required package: robustbase
Scalable Robust Estimators with High Breakdown Point (version 1.3-11)
Loading required package: Matrix
## FAiR Version 0.4-15 Build Date: 2014-02-08
## See http://wiki.r-project.org/rwiki/doku.php?id=packages:cran:fair for more info
FAiR Copyright (C) 2008 -- 2012 Benjamin King Goodrich
This program comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it
under certain conditions, namely those specified in the LICENSE file
in the root directory of the source code.
> png(filename="/home/ddbj/snapshot/RGM3/R_CC/result/FAiR/03Factanal.Rd_%03d_medium.png", width=480, height=480)
> ### Name: Factanal
> ### Title: Estimate Factor Analysis Models
> ### Aliases: Factanal
> ### Keywords: multivariate models
>
> ### ** Examples
>
> ## Example from Venables and Ripley (2002, p. 323)
> ## Previously from Bartholomew and Knott (1999, p. 68--72)
> ## Originally from Smith and Stanley (1983)
> ## Replicated from example(ability.cov)
>
> man <- make_manifest(covmat = ability.cov)
Warning message:
In FAiR_make_manifest_list(covmat, shrink) :
it is strongly preferable to pass the raw data to make_manifest()
>
> ## Not run:
> ##D ## Here is the easy way to set up a SEFA model, which uses pop-up menus
> ##D res <- make_restrictions(manifest = man, factors = 2, model = "SEFA")
> ## End(Not run)
>
> ## This is the hard way to set up a restrictions object without pop-up menus
> beta <- matrix(NA_real_, nrow = nrow(cormat(man)), ncol = 2)
> rownames(beta) <- rownames(cormat(man))
> free <- is.na(beta)
> beta <- new("parameter.coef.SEFA", x = beta, free = free, num_free = sum(free))
>
> Phi <- diag(2)
> free <- lower.tri(Phi)
> Phi <- new("parameter.cormat", x = Phi, free = free, num_free = sum(free))
> res <- make_restrictions(manifest = man, beta = beta, Phi = Phi)
>
> # This is how to make starting values where Phi is the correlation matrix
> # among factors, beta is the matrix of coefficients, and the scales are
> # the logarithm of the sample standard deviations. It is also the MLE.
> starts <- c( 4.46294498156615e-01, # Phi_{21}
+ 4.67036349420035e-01, # beta_{11}
+ 6.42220238211291e-01, # beta_{21}
+ 8.88564379236454e-01, # beta_{31}
+ 4.77779639176941e-01, # beta_{41}
+ -7.13405536379741e-02, # beta_{51}
+ -9.47782525342137e-08, # beta_{61}
+ 4.04993872375487e-01, # beta_{12}
+ -1.04604290549591e-08, # beta_{22}
+ -9.44950629176182e-03, # beta_{32}
+ 2.63078925240678e-04, # beta_{42}
+ 9.38038168787216e-01, # beta_{52}
+ 8.43618801925473e-01, # beta_{62}
+ log(man@sds)) # log manifest standard deviations
>
> sefa <- Factanal(manifest = man, restrictions = res,
+ # NOTE: Do NOT specify any of the following tiny values in a
+ # real research situation; it is done here solely for speed
+ starting.values = starts, pop.size = 2, max.generations = 6,
+ wait.generations = 1)
Mon Jul 4 17:53:27 2016
Domains:
-1.000000e+00 <= X1 <= 1.000000e+00
-1.500000e+00 <= X2 <= 1.500000e+00
-1.500000e+00 <= X3 <= 1.500000e+00
-1.500000e+00 <= X4 <= 1.500000e+00
-1.500000e+00 <= X5 <= 1.500000e+00
-1.500000e+00 <= X6 <= 1.500000e+00
-1.500000e+00 <= X7 <= 1.500000e+00
-1.500000e+00 <= X8 <= 1.500000e+00
-1.500000e+00 <= X9 <= 1.500000e+00
-1.500000e+00 <= X10 <= 1.500000e+00
-1.500000e+00 <= X11 <= 1.500000e+00
-1.500000e+00 <= X12 <= 1.500000e+00
-1.500000e+00 <= X13 <= 1.500000e+00
-1.800000e+01 <= X14 <= 2.295353e+00
-1.800000e+01 <= X15 <= 1.644201e+00
-1.800000e+01 <= X16 <= 3.197901e+00
-1.800000e+01 <= X17 <= 1.964381e+00
-1.800000e+01 <= X18 <= 2.674543e+00
-1.800000e+01 <= X19 <= 3.146865e+00
Data Type: Floating Point
Operators (code number, name, population)
(1) Cloning........................... 1
(2) Uniform Mutation.................. 0
(3) Boundary Mutation................. 0
(4) Non-Uniform Mutation.............. 0
(5) Polytope Crossover................ 0
(6) Simple Crossover.................. 0
(7) Whole Non-Uniform Mutation........ 0
(8) Heuristic Crossover............... 0
(9) Local-Minimum Crossover........... 0
HARD Maximum Number of Generations: 6
Maximum Nonchanging Generations: 1
Population size : 2
Convergence Tolerance: 1.000000e-03
Using the BFGS Derivative Based Optimizer on the Best Individual Each Generation.
Checking Gradients before Stopping.
Not Using Out of Bounds Individuals But Allowing Trespassing.
Minimization Problem.
Generation# Solution Values (lexical)
0 -1.000000e+00 -1.000000e+00 -1.000000e+00 -1.000000e+00 6.356664e-02
'wait.generations' limit reached.
No significant improvement in 1 generations.
Solution Lexical Fitness Value:
-1.000000e+00 -1.000000e+00 -1.000000e+00 -1.000000e+00 6.356664e-02
Parameters at the Solution (parameter, gradient):
X[ 1] : 4.462945e-01 G[ 1] : -1.506061e-05
X[ 2] : 4.670363e-01 G[ 2] : -2.910233e-05
X[ 3] : 6.422202e-01 G[ 3] : -2.225256e-05
X[ 4] : 8.885644e-01 G[ 4] : -5.605264e-05
X[ 5] : 4.777796e-01 G[ 5] : -6.675071e-06
X[ 6] : -7.134055e-02 G[ 6] : -0.000000e+00
X[ 7] : -9.477825e-08 G[ 7] : -0.000000e+00
X[ 8] : 4.049939e-01 G[ 8] : -1.463011e-05
X[ 9] : -1.046043e-08 G[ 9] : -0.000000e+00
X[10] : -9.449506e-03 G[10] : -2.643417e-05
X[11] : 2.630789e-04 G[11] : 0.000000e+00
X[12] : 9.380382e-01 G[12] : 4.832929e-06
X[13] : 8.436188e-01 G[13] : -7.343759e-06
X[14] : 1.602206e+00 G[14] : 1.174018e-05
X[15] : 9.510538e-01 G[15] : 9.504571e-06
X[16] : 2.504754e+00 G[16] : 2.032664e-05
X[17] : 1.271234e+00 G[17] : 3.728702e-06
X[18] : 1.981396e+00 G[18] : 1.588892e-06
X[19] : 2.453718e+00 G[19] : 1.738531e-06
Solution Found Generation 1
Number of Generations Run 2
Mon Jul 4 17:53:27 2016
Total run time : 0 hours 0 minutes and 0 seconds
Nelder-Mead resulted in no improvement; convergence presumably achieved
> nsim <- 101 # number of simulations, also too small for real work
> show(sefa)
Call:
Factanal(manifest = man, restrictions = res, starting.values = starts,
pop.size = 2, max.generations = 6, wait.generations = 1)
Number of observations: 112
Discrepancy: 7.055898
Semi-exploratory factor analysis with 2 factors
All free factor intercorrelations are on the [-1,1] interval
All coefficients on the [ -1.5 , 1.5 ] interval
Zeros per factor
A B
zeros 2 2
Mapping rule: default
Discrepancy function: MLE
6 degrees of freedom
> summary(sefa, nsim = nsim)
[1] "100 simulations remaining"
[1] "0 simulations remaining"
Call:
Factanal(manifest = man, restrictions = res, starting.values = starts,
pop.size = 2, max.generations = 6, wait.generations = 1)
Point estimates (blanks, if any, are exact zeros):
F1 F2 Uniqueness
general 0.467 0.405 0.449
picture 0.642 0.588
blocks 0.889 -0.009 0.218
maze 0.478 0.772
reading 0.938 0.120
vocab 0.844 0.288
F1 1.000 0.446
F2 0.446 1.000
Upper confidence bounds (blanks, if any, are restricted)
F1 F2 Uniqueness
general 0.612 0.614 0.550
picture 0.818 0.760
blocks 1.030 0.335 0.459
maze 0.650 0.896
reading 0.991 0.264
vocab 0.936 0.409
F1 1.000 0.627
F2 0.627 1.000
Lower confidence bounds (blanks, if any, are restricted)
F1 F2 Uniqueness
general 0.329 0.257 0.311
picture 0.489 0.331
blocks 0.631 -0.223 0.085
maze 0.322 0.578
reading 0.858 0.018
vocab 0.769 0.124
F1 1.000 0.192
F2 0.192 1.000
> model_comparison(sefa, nsim = nsim)
$restrictions
Semi-exploratory factor analysis with 2 factors
All free factor intercorrelations are on the [-1,1] interval
All coefficients on the [ -1.5 , 1.5 ] interval
Zeros per factor
A B
zeros 2 2
Mapping rule: default
Discrepancy function: MLE
6 degrees of freedom
$exact_fit
$exact_fit$T_ML
Test of Exact Fit
data:
T ( Swain correction ) = 17.505, df = 6, p-value = 0.007597
alternative hypothesis: true discrepancy is greater than 0
$infocriteria
$infocriteria$BIC
[1] 2869.069
$infocriteria$BIC_saturated
[1] 2879.394
$infocriteria$BIC_null
[1] 3126.466
$infocriteria$SIC
[1] 1440.894
$infocriteria$SIC_saturated
[1] 1508.444
$infocriteria$SIC_null
[1] 1569.592
$close_fit
$close_fit$RMSEA
Test of Close Fit
data:
T ( Swain correction ) = 17.505, df = 6, p-value = 0.03022
alternative hypothesis: true discrepancy is greater than 0.05
90 percent confidence interval:
0.06224984 0.20515226
sample estimates:
RMSEA
0.1314315
$close_fit$gamma
Gamma Fit Index (Steiger)
data:
90 percent confidence interval:
0.9223604 0.9923095
sample estimates:
Gamma_1
0.9666053
$fit_indices
$fit_indices$GFI
[1] 0.9453479
$fit_indices$AGFI
[1] 0.8087177
$fit_indices$McDonald
Centrality Index (McDonald)
data:
sample estimates:
Index
0.9499366
$fit_indices$SRMR
[1] 0.05592103
$fit_indices$TLI
T ( Swain correction )
0.8863219
$fit_indices$CFI
[1] 0.9545287
$fit_indices$NFI
T ( Swain correction )
0.9346864
$fit_indices$NNFI
T ( Swain correction )
0.8863219
>
> stuff <- list() # output list for various methods
> stuff$model.matrix <- model.matrix(sefa) # sample correlation matrix
> stuff$fitted <- fitted(sefa, reduced = TRUE) # reduced covariance matrix
> stuff$residuals <- residuals(sefa) # difference between model.matrix and fitted
> stuff$rstandard <- rstandard(sefa) # normalized residual matrix
> stuff$weights <- weights(sefa) # (scaled) approximate weights for residuals
> stuff$influence <- influence(sefa) # weights * residuals
> stuff$cormat <- cormat(sefa, matrix = "RF") # reference factor correlations
> stuff$uniquenesses <- uniquenesses(sefa, standardized = FALSE) # uniquenesses
> stuff$FC <- loadings(sefa, matrix = "FC") # factor contribution matrix
> stuff$draws <- FA2draws(sefa, nsim = nsim) # draws from sampling distribution
[1] "100 simulations remaining"
[1] "0 simulations remaining"
>
> if(require(nFactors)) screeplot(sefa) # Enhanced scree plot
Loading required package: nFactors
Loading required package: MASS
Loading required package: psych
Attaching package: 'psych'
The following object is masked from 'package:robustbase':
cushny
Loading required package: boot
Attaching package: 'boot'
The following object is masked from 'package:psych':
logit
The following object is masked from 'package:robustbase':
salinity
Loading required package: lattice
Attaching package: 'lattice'
The following object is masked from 'package:boot':
melanoma
Attaching package: 'nFactors'
The following object is masked from 'package:lattice':
parallel
> profile(sefa) # profile plots of non-free parameters
Factors may arbitrarily be plotted in a different order than they appear in summary()
> pairs(sefa) # Thurstone-style plot
> if(require(Rgraphviz)) plot(sefa) # DAG
Loading required package: Rgraphviz
Loading required package: graph
Loading required package: BiocGenerics
Loading required package: parallel
Attaching package: 'BiocGenerics'
The following objects are masked from 'package:parallel':
clusterApply, clusterApplyLB, clusterCall, clusterEvalQ,
clusterExport, clusterMap, parApply, parCapply, parLapply,
parLapplyLB, parRapply, parSapply, parSapplyLB
The following objects are masked from 'package:stats':
IQR, mad, xtabs
The following objects are masked from 'package:base':
Filter, Find, Map, Position, Reduce, anyDuplicated, append,
as.data.frame, cbind, colnames, do.call, duplicated, eval, evalq,
get, grep, grepl, intersect, is.unsorted, lapply, lengths, mapply,
match, mget, order, paste, pmax, pmax.int, pmin, pmin.int, rank,
rbind, rownames, sapply, setdiff, sort, table, tapply, union,
unique, unsplit
Loading required package: grid
>
>
>
>
>
> dev.off()
null device
1
>