Skip to content

Commit 65e2a1c

Browse files
luca-scrcran-robot
authored andcommittedApr 30, 2024
version 6.1.1
1 parent 74421f0 commit 65e2a1c

40 files changed

+3964
-273
lines changed
 

‎DESCRIPTION

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
Package: mclust
2-
Version: 6.1
3-
Date: 2024-02-23
2+
Version: 6.1.1
3+
Date: 2024-04-29
44
Title: Gaussian Mixture Modelling for Model-Based Clustering,
55
Classification, and Density Estimation
66
Description: Gaussian finite mixture models fitted via EM algorithm for
@@ -29,11 +29,11 @@ ByteCompile: true
2929
NeedsCompilation: yes
3030
LazyData: yes
3131
Encoding: UTF-8
32-
Packaged: 2024-02-23 06:38:52 UTC; luca
32+
Packaged: 2024-04-29 14:15:14 UTC; luca
3333
Author: Chris Fraley [aut],
3434
Adrian E. Raftery [aut] (<https://orcid.org/0000-0002-6589-301X>),
3535
Luca Scrucca [aut, cre] (<https://orcid.org/0000-0003-3826-0484>),
3636
Thomas Brendan Murphy [ctb] (<https://orcid.org/0000-0002-5668-7046>),
3737
Michael Fop [ctb] (<https://orcid.org/0000-0003-3936-2757>)
3838
Maintainer: Luca Scrucca <luca.scrucca@unipg.it>
39-
Date/Publication: 2024-02-23 09:50:10 UTC
39+
Date/Publication: 2024-04-29 16:40:02 UTC

‎MD5

+28-27
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,47 @@
1-
8c879d797d00dc983b8a9b6d5e2009e1 *DESCRIPTION
1+
084b8ac931de14c43d650a417d1487d0 *DESCRIPTION
22
db9bd7a02767682301f598eabbb30e1e *NAMESPACE
3-
c1ceebd6ae29406f24bad9852112f301 *NEWS.md
4-
b5e8f28718bef06db3430ab083245b1d *R/bootstrap.R
3+
30a2881bbdd38f0dca3b354d146a6e58 *NEWS.md
4+
31da166f7c3c37ff24c0e067193163ba *R/bootstrap.R
55
eeb0e042ca8bcc1eb2d32da9ef594baf *R/clustCombi.R
6-
984b4e8797c2889ec9b6ae26cced021c *R/densityMclust.R
6+
4c2a6285b86fc3965713e193efcccb90 *R/densityMclust.R
77
3b11a9490c65c6e2f3d107a1d9abf3e2 *R/gmmhd.R
88
8d7160fbfb9198f922cef3ff0b40a942 *R/graphics.R
99
ba84097ee321529784cd9c6db5143e77 *R/icl.R
1010
4b9155a000a45bb1f37fd1507c15f172 *R/impute.R
1111
abf9c56a0394f45738ed9552d1e8ea6a *R/mbahc.R
12-
8d5ac084f8cbd567b43911100e576050 *R/mclust.R
13-
1c0ad0629bdef87f46a9811aa87011ea *R/mclust2.R
14-
68ca39850f76af230107213d6c3f27cb *R/mclustda.R
12+
8b7feeee697bd9721be26e880e8c7cc0 *R/mclust.R
13+
65a26937823ea2d73910409bff8aed65 *R/mclust2.R
14+
5e7cc0d355a5a30e2623dd38025bcf7f *R/mclustda.R
1515
3d1c8ca763b1001d47c79d6aa2498e01 *R/mclustdr.R
16-
eb1757466c22e62ccea630ced5640ff5 *R/mclustssc.R
16+
d353ecec2e836991dd0897e82a320d4f *R/mclustssc.R
1717
2c029b4f12b6c96982c034098d881bfe *R/options.R
1818
781ff8bea2efa10350791cd781eb4a2d *R/toremove.R
19-
a60259dbf0c4489f5ce4928426d197e5 *R/util.R
20-
c2d2e6d1a5f48682ba12b2ed193499e1 *R/weights.R
19+
2480f46a7a1377dc412bb6533f4eccc6 *R/util.R
20+
9f5135c4268c3dc5f0141b37140d1b7a *R/weights.R
2121
dce1aa8eed39b0a39cb74e3459ca5a87 *R/zzz.R
22-
1414e60a28738a82f5cac1a53884cd5c *build/vignette.rds
23-
ff80f82be46077eae7d43cfe15dca35a *data/Baudry_etal_2010_JCGS_examples.rda
24-
8e079456008a804822fa4095046107d1 *data/EuroUnemployment.rda
25-
1a3a8f86b3fbcc4c911a046925839c93 *data/GvHD.rda
26-
bfd8d4bd9782698c4c19cf98ca9caccd *data/acidity.rda
27-
dcf0404be80a56cd040ed8cb8da1b428 *data/banknote.txt.gz
28-
25d89a21766d3d44f0717c2d5ca5be11 *data/chevron.rda
29-
d5b951fe26d4b20f38a993c0b442c7a0 *data/cross.rda
30-
2abe941213eebbbd0c0a4c4034377210 *data/diabetes.rda
31-
501e93b5219540b1265c455fb41ad813 *data/thyroid.rda
32-
b2a529e265721bcd2cb632d42ec6cc11 *data/wdbc.txt.gz
33-
3dc67e8eb1c6dd510a2376236e585fa7 *data/wreath.rda
22+
f61db891eb928123aba4412ca322f508 *build/partial.rdb
23+
5832212aa0f96f3577a0a2e6f7025354 *build/vignette.rds
24+
967c58c222a548c523d3be618d1771f8 *data/Baudry_etal_2010_JCGS_examples.R
25+
1e86710645e28102665885b6a29c5b12 *data/EuroUnemployment.R
26+
8ef52720badae4a65f51039a6f9f0228 *data/GvHD.R
27+
c786f4c0231f4f261f0eb5360dd79086 *data/acidity.R
28+
0e22afc0696bed7e8f7878b3c3974174 *data/banknote.txt
29+
fb4ca040a6b23a3d76f6ed877da9fa64 *data/chevron.R
30+
456573f77137d6983d8cf646b4012eef *data/cross.R
31+
bc0a118fed63865418e8d153833d8c03 *data/diabetes.R
32+
b36eb33f5f8f682be8bb0bd3dc1c3b90 *data/thyroid.R
33+
2809331079e97b621f48fc7f14c20677 *data/wdbc.txt
34+
8d372db3ba3e437390b00e7dcb2c22c3 *data/wreath.R
3435
2cc43a299aa4f4cd0ffea3f0373bb678 *inst/CITATION
3536
e1dfcd76432de653be6954f26e6e9f8b *inst/doc/mclust.R
3637
4e6a81668ad2d1318ddbcf42d1871766 *inst/doc/mclust.Rmd
37-
2786efb2313662e76b90cb5dbe0a33d9 *inst/doc/mclust.html
38+
7fbd70090e15a92142246cd61b4e7e8d *inst/doc/mclust.html
3839
7799d6093880e94a3bed07e6900f7249 *man/Baudry_etal_2010_JCGS_examples.Rd
3940
226b01ed5c258d406de2af5cfade2ba1 *man/BrierScore.Rd
4041
49a3fb4baf46c0ce393d0141bd926bc0 *man/EuroUnemployment.Rd
4142
0e1b6313cb53d6e937acd55cdded818e *man/GvHD.Rd
4243
19e300bf60a607cdf1c5b2e74911b336 *man/Mclust.Rd
43-
ea3ad560361c7274e200e317aca08df1 *man/MclustBootstrap.Rd
44+
daba1507de8cf002410b7c612c2691aa *man/MclustBootstrap.Rd
4445
91388cf988ce8683cf21cac53d02fc2a *man/MclustDA.Rd
4546
a6a45328b7d5eaf35c375008599fe18f *man/MclustDR.Rd
4647
b2326163d0cd9784455a55a7c4044c8d *man/MclustDRsubsel.Rd
@@ -95,7 +96,7 @@ a91d9fd699250bc9a4e3757ae60b6247 *man/imputeData.Rd
9596
327ef4d86112a911b2648b7a47b2e60e *man/imputePairs.Rd
9697
cfb07fb48ca73468e3283687cdd54d97 *man/logLik.Mclust.Rd
9798
525b30e85bd1a3ea08b30745b3cdadd3 *man/logLik.MclustDA.Rd
98-
5e0534b5e1f98a4f77553f59913ddc2c *man/logsumexp.Rd
99+
810ec0236c8265842955847d69f7679f *man/logsumexp.Rd
99100
699915f3a4cf8bfd6718f71f2a754c48 *man/majorityVote.Rd
100101
7d8989594ce3a00a8633781ff84658f0 *man/map.Rd
101102
4e3901ea67e0c125d8e5ac4330df2e38 *man/mapClass.Rd
@@ -125,7 +126,7 @@ c3796dae5e43a2c26a9ee9b73fcf2276 *man/nMclustParams.Rd
125126
36355172607046a0c37f10dee1197ed5 *man/partconv.Rd
126127
b0354eb07d5c849fc6c0be463c30b31b *man/partuniq.Rd
127128
d84812bf9da9c9e76465ae24ae554882 *man/plot.Mclust.Rd
128-
25b5261ddbced669fefaba45a72e4f04 *man/plot.MclustBoostrap.Rd
129+
ff608bd6aad2b43b1c9736880be94e23 *man/plot.MclustBoostrap.Rd
129130
01f1cd87231cbb640308280faf53d535 *man/plot.MclustDA.Rd
130131
cfb781f6b9fe5bf1d2c8cdf49e1a8c04 *man/plot.MclustDR.Rd
131132
3fd0d79ca9549c14b822845673cad5c1 *man/plot.MclustSSC.Rd
@@ -145,7 +146,7 @@ d9477d3e3d801b783e42d10e37271e05 *man/randomOrthogonalMatrix.Rd
145146
e43a5fead9ef355e3d522ec94e224f66 *man/sigma2decomp.Rd
146147
1ed03f440760a36b9c66bf6c5259f1cb *man/sim.Rd
147148
77797cb68e57027ea316e1b068b9ed63 *man/simE.Rd
148-
98545994b31e60c1821770ec8dfe0d70 *man/softmax.Rd
149+
aa3148b7838fca1c7e4b4f6b0bb34ffe *man/softmax.Rd
149150
83eb12323099cbbf0f3e075d10f0be77 *man/summary.Mclust.Rd
150151
91268ae73944bd6d5845911c42142e58 *man/summary.MclustBootstrap.Rd
151152
4a8c675b46da86ca7075999c22e635f4 *man/summary.MclustDA.Rd

‎NEWS.md

+9-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,12 @@
1-
# mclust 6.1 (NOT ON CRAN)
1+
# mclust 6.1.1
2+
3+
- Corrected computation of df for MclustDA and EDDA classification
4+
models.
5+
- Bug fix on `sim()` when EVV, EVE, and VVE models for G = 1.
6+
- Bug fix on `summary.MclustBootstrap()` when computing confidence
7+
intervals for G = 1.
8+
9+
# mclust 6.1
210

311
- Added `logsumexp()` and `softmax()` functions as a wrapper to
412
efficiently implementations written in Fortran code.

‎R/bootstrap.R

+114-100
Original file line numberDiff line numberDiff line change
@@ -140,8 +140,10 @@ plot.mclustBootstrapLRT <- function(x, G = 1, hist.col = "grey", hist.border = "
140140
# Bootstrap inference (standard errors and percentile confidence intervals)
141141
#
142142

143-
MclustBootstrap <- function(object, nboot = 999, type = c("bs", "wlbs", "pb", "jk"),
144-
max.nonfit = 10*nboot, verbose = interactive(), ...)
143+
MclustBootstrap <- function(object, nboot = 999,
144+
type = c("bs", "wlbs", "pb", "jk"),
145+
alpha = 1, max.nonfit = 10*nboot,
146+
verbose = interactive(), ...)
145147
{
146148

147149
stopifnot("object must be of class 'Mclust' or 'densityMclust'" =
@@ -195,7 +197,8 @@ MclustBootstrap <- function(object, nboot = 999, type = c("bs", "wlbs", "pb", "j
195197
},
196198
"wlbs" =
197199
{
198-
w <- rexp(n)
200+
# w ~ Dirichlet(alpha, ..., alpha)
201+
w <- rgamma(n, shape = as.numeric(alpha), rate = 1)
199202
# w <- w/mean(w)
200203
w <- w/max(w)
201204
mod.boot <- try(do.call("me.weighted",
@@ -279,60 +282,64 @@ summary.MclustBootstrap <- function(object, what = c("se", "ci", "ave"), conf.le
279282
G <- dims[3]
280283

281284
switch(what,
282-
"se" = { out <- list(pro = apply(object$pro, 2, sd, na.rm=TRUE),
283-
mean = apply(object$mean, c(2,3), sd, na.rm=TRUE),
284-
variance = apply(object$variance, c(2,3,4), sd, na.rm=TRUE))
285-
if(object$type == "jk")
286-
out <- lapply(out, function(x)
287-
sqrt(x^2*(nboot-object$nonfit-1)^2/(nboot-object$nonfit)))
288-
},
289-
"ave" = { out <- list(pro = apply(object$pro, 2, mean, na.rm=TRUE),
290-
mean = apply(object$mean, c(2,3), mean, na.rm=TRUE),
291-
variance = apply(object$variance, c(2,3,4), mean, na.rm=TRUE))
292-
},
293-
"ci" = { levels <- c((1-conf.level)/2, (1 + conf.level)/2)
294-
if(object$type == "jk")
295-
{ # bias-corrected ci based on normal-approximation
296-
ave <- list(pro = apply(object$pro, 2, mean, na.rm=TRUE),
297-
mean = apply(object$mean, c(2,3), mean, na.rm=TRUE),
298-
variance = t(sapply(seq.int(d), function(j)
299-
apply(object$variance[,j,j,], 2, mean, na.rm=TRUE),
300-
simplify = "array")))
301-
se <- list(pro = apply(object$pro, 2, sd, na.rm=TRUE),
302-
mean = apply(object$mean, c(2,3), sd, na.rm=TRUE),
303-
variance = t(sapply(seq.int(d), function(j)
304-
apply(object$variance[,j,j,], 2, sd, na.rm=TRUE),
305-
simplify = "array")))
306-
se <- lapply(se, function(x)
307-
sqrt(x^2*(nboot-object$nonfit-1)^2/(nboot-object$nonfit)))
308-
zq <- qnorm(max(levels))
309-
lnames <- paste0(formatC(levels * 100, format = "fg", width = 1,
310-
digits = getOption("digits")), "%")
311-
# the code above mimic stats:::format_perc(levels) which can't be used
312-
# because format_perc is not exported from stats
313-
out <- list(pro = array(as.double(NA), c(2,G),
314-
dimnames = list(lnames, 1:G)),
315-
mean = array(as.double(NA), dim = c(2,d,G),
316-
dimnames = list(lnames, 1:d, 1:G)),
317-
variance = array(as.double(NA), dim = c(2,d,G),
318-
dimnames = list(lnames, 1:d, 1:G)))
319-
out$pro[1,] <- ave$pro - zq*se$pro
320-
out$pro[2,] <- ave$pro + zq*se$pro
321-
out$mean[1,,] <- ave$mean - zq*se$mean
322-
out$mean[2,,] <- ave$mean + zq*se$mean
323-
out$variance[1,,] <- ave$variance - zq*se$variance
324-
out$variance[2,,] <- ave$variance + zq*se$variance
325-
} else
326-
{ # percentile-based ci
327-
out <- list(pro = apply(object$pro, 2, quantile, probs = levels, na.rm=TRUE),
328-
mean = apply(object$mean, c(2,3), quantile, probs = levels, na.rm=TRUE))
329-
v <- array(as.double(NA), dim = c(2,d,G),
330-
dimnames = dimnames(out$mean))
331-
for(j in seq.int(d))
332-
v[,j,] <- apply(object$variance[,j,j,], 2, quantile, probs = levels, na.rm=TRUE)
333-
out$variance <- v
334-
}
335-
}
285+
"se" = {
286+
out <- list(pro = apply(object$pro, 2, sd, na.rm=TRUE),
287+
mean = apply(object$mean, c(2,3), sd, na.rm=TRUE),
288+
variance = apply(object$variance, c(2,3,4), sd, na.rm=TRUE))
289+
if(object$type == "jk")
290+
out <- lapply(out, function(x)
291+
sqrt(x^2*(nboot-object$nonfit-1)^2/(nboot-object$nonfit)))
292+
},
293+
"ave" = {
294+
out <- list(pro = apply(object$pro, 2, mean, na.rm=TRUE),
295+
mean = apply(object$mean, c(2,3), mean, na.rm=TRUE),
296+
variance = apply(object$variance, c(2,3,4), mean, na.rm=TRUE))
297+
},
298+
"ci" = {
299+
levels <- c((1-conf.level)/2, (1 + conf.level)/2)
300+
if(object$type == "jk")
301+
{ # bias-corrected ci based on normal-approximation
302+
ave <- list(pro = apply(object$pro, 2, mean, na.rm=TRUE),
303+
mean = apply(object$mean, c(2,3), mean, na.rm=TRUE),
304+
variance = t(sapply(seq.int(d), function(j)
305+
apply(object$variance[,j,j,], 2, mean, na.rm=TRUE),
306+
simplify = "array")))
307+
se <- list(pro = apply(object$pro, 2, sd, na.rm=TRUE),
308+
mean = apply(object$mean, c(2,3), sd, na.rm=TRUE),
309+
variance = t(sapply(seq.int(d), function(j)
310+
apply(object$variance[,j,j,], 2, sd, na.rm=TRUE),
311+
simplify = "array")))
312+
se <- lapply(se, function(x)
313+
sqrt(x^2*(nboot-object$nonfit-1)^2/(nboot-object$nonfit)))
314+
zq <- qnorm(max(levels))
315+
lnames <- paste0(formatC(levels * 100, format = "fg", width = 1,
316+
digits = getOption("digits")), "%")
317+
# the code above mimic stats:::format_perc(levels) which can't be used
318+
# because format_perc is not exported from stats
319+
out <- list(pro = array(as.double(NA), c(2,G),
320+
dimnames = list(lnames, 1:G)),
321+
mean = array(as.double(NA), dim = c(2,d,G),
322+
dimnames = list(lnames, 1:d, 1:G)),
323+
variance = array(as.double(NA), dim = c(2,d,G),
324+
dimnames = list(lnames, 1:d, 1:G)))
325+
out$pro[1,] <- ave$pro - zq*se$pro
326+
out$pro[2,] <- ave$pro + zq*se$pro
327+
out$mean[1,,] <- ave$mean - zq*se$mean
328+
out$mean[2,,] <- ave$mean + zq*se$mean
329+
out$variance[1,,] <- ave$variance - zq*se$variance
330+
out$variance[2,,] <- ave$variance + zq*se$variance
331+
} else
332+
{ # percentile-based ci
333+
out <- list(pro = apply(object$pro, 2, quantile, probs = levels, na.rm=TRUE),
334+
mean = apply(object$mean, c(2,3), quantile, probs = levels, na.rm=TRUE))
335+
v <- array(as.double(NA), dim = c(2,d,G),
336+
dimnames = dimnames(out$mean))
337+
for(j in seq.int(d))
338+
v[,j,] <- apply(object$variance[,j,j,,drop=FALSE], 4,
339+
quantile, probs = levels, na.rm=TRUE)
340+
out$variance <- v
341+
}
342+
}
336343
)
337344

338345
obj <- append(object[c("modelName", "G", "nboot", "type")],
@@ -399,17 +406,18 @@ print.summary.MclustBootstrap <- function(x, digits = getOption("digits"), ...)
399406
invisible(x)
400407
}
401408

402-
plot.MclustBootstrap <- function(x, what = c("pro", "mean", "var"), show.parest = TRUE, show.confint = TRUE, hist.col = "grey", hist.border = "lightgrey", breaks = "Sturges", col = "forestgreen", lwd = 2, lty = 3, xlab = NULL, xlim = NULL, ylim = NULL, ...)
409+
plot.MclustBootstrap <- function(x, what = c("pro", "mean", "var"), show.parest = TRUE, show.confint = TRUE, hist.col = "grey", hist.border = "lightgrey", breaks = NA, col = "forestgreen", lwd = 2, lty = 3, xlab = NULL, xlim = NULL, ylim = NULL, ...)
403410
{
404411
object <- x # Argh. Really want to use object anyway
405412
what <- match.arg(what, choices = eval(formals(plot.MclustBootstrap)$what))
406413
par <- object$parameters
407414
d <- dim(object$mean)[2]
408415
varnames <- rownames(par$mean)
409416
if(show.confint)
410-
{ ci <- summary(object, what = "ci", ...)
411-
ave <- summary(object, what = "ave", ...)
412-
}
417+
{
418+
ci <- summary(object, what = "ci", ...)
419+
ave <- summary(object, what = "ave", ...)
420+
}
413421

414422
histBoot <- function(boot, stat, ci, ave, breaks, xlim, ylim, xlab, ...)
415423
{
@@ -426,48 +434,54 @@ plot.MclustBootstrap <- function(x, what = c("pro", "mean", "var"), show.parest
426434
}
427435

428436
switch(what,
429-
"pro" = { xlim <- range(if(is.null(xlim)) pretty(object$pro) else xlim)
430-
for(k in 1:object$G)
431-
histBoot(object$pro[,k], breaks = breaks,
432-
stat = par$pro[k],
433-
ci = ci$pro[,k],
434-
ave = ave$pro[k],
435-
xlim = xlim, ylim = ylim,
436-
xlab = ifelse(is.null(xlab),
437-
paste("Mix. prop. for comp.",k),
438-
xlab))
437+
"pro" = {
438+
xlim <- range(if(is.null(xlim)) pretty(object$pro) else xlim)
439+
for(k in 1:object$G)
440+
histBoot(object$pro[,k],
441+
breaks = if(is.na(breaks)) nclass.numpy else breaks,
442+
stat = par$pro[k],
443+
ci = ci$pro[,k],
444+
ave = ave$pro[k],
445+
xlim = xlim, ylim = ylim,
446+
xlab = ifelse(is.null(xlab),
447+
paste("Mix. prop. for comp.",k),
448+
xlab))
439449
},
440-
"mean" = { isNull_xlim <- is.null(xlim)
441-
for(j in 1:d)
442-
{ xlim <- range(if(isNull_xlim) pretty(object$mean[,j,])
443-
else xlim)
444-
for(k in 1:object$G)
445-
histBoot(object$mean[,j,k], breaks = breaks,
446-
stat = par$mean[j,k],
447-
ci = ci$mean[,j,k],
448-
ave = ave$mean[j,k],
449-
xlim = xlim, ylim = ylim,
450-
xlab = ifelse(is.null(xlab),
451-
paste(varnames[j], "mean for comp.",k),
452-
xlab))
453-
}
450+
"mean" = {
451+
isNull_xlim <- is.null(xlim)
452+
for(j in 1:d)
453+
{
454+
xlim <- range(if(isNull_xlim) pretty(object$mean[,j,]) else xlim)
455+
for(k in 1:object$G)
456+
histBoot(object$mean[,j,k],
457+
breaks = if(is.na(breaks)) nclass.numpy else breaks,
458+
stat = par$mean[j,k],
459+
ci = ci$mean[,j,k],
460+
ave = ave$mean[j,k],
461+
xlim = xlim, ylim = ylim,
462+
xlab = ifelse(is.null(xlab),
463+
paste(varnames[j], "mean for comp.",k),
464+
xlab))
465+
}
454466
},
455-
"var" = { isNull_xlim <- is.null(xlim)
456-
for(j in 1:d)
457-
{ xlim <- range(if(isNull_xlim) pretty(object$variance[,j,j,])
458-
else xlim)
459-
for(k in 1:object$G)
460-
histBoot(object$variance[,j,j,k], breaks = breaks,
461-
stat = par$variance[j,j,k],
462-
ci = ci$variance[,j,k],
463-
ave = ave$variance[j,k],
464-
xlim = xlim, ylim = ylim,
465-
xlab = ifelse(is.null(xlab),
466-
paste(varnames[j], "var. for comp.",k),
467-
xlab))
468-
}
467+
"var" = {
468+
isNull_xlim <- is.null(xlim)
469+
for(j in 1:d)
470+
{
471+
xlim <- range(if(isNull_xlim) pretty(object$variance[,j,j,]) else xlim)
472+
for(k in 1:object$G)
473+
histBoot(object$variance[,j,j,k],
474+
breaks = if(is.na(breaks)) nclass.numpy else breaks,
475+
stat = par$variance[j,j,k],
476+
ci = ci$variance[,j,k],
477+
ave = ave$variance[j,j,k],
478+
xlim = xlim, ylim = ylim,
479+
xlab = ifelse(is.null(xlab),
480+
paste(varnames[j], "var. for comp.",k),
481+
xlab))
482+
}
469483
}
470-
)
484+
)
471485
invisible()
472486
}
473487

0 commit comments

Comments
 (0)
Please sign in to comment.