The hardware and bandwidth for this mirror is donated by dogado GmbH, the Webhosting and Full Service-Cloud Provider. Check out our Wordpress Tutorial.
If you wish to report a bug, or if you are interested in having us mirror your free-software or open-source project, please feel free to contact us at mirror[@]dogado.de.

Getting started with hetNSC

hetNSC implements six nearest shrunken centroid (NSC) classifiers for high-dimensional, low-sample-size data:

library(hetNSC)
hnsc_methods()[, c("label", "method", "variance")]
#>   label method variance
#> 1   STh   soft     homo
#> 2   HTh   hard     homo
#> 3   OTh  order     homo
#> 4  STh3   soft   hetero
#> 5  HTh3   hard   hetero
#> 6  OTh3  order   hetero

Data layout

As in pamr, expression matrices have genes in rows and samples in columns, and y has one label per column.

set.seed(8900)
dat <- simulate_hetero_data(ntr1 = 15, ntr2 = 20, nte1 = 50, nte2 = 50,
                            p = 1000, a = 14)
dim(dat$xtr)
#> [1] 1000   35
table(dat$ytr)
#> 
#>  A  B 
#> 15 20

simulate_hetero_data() generates the correlated-gene designs of the paper’s simulation study: 20 informative genes with class-B means a/10 * i, gene standard deviations cycling through 1, …, 20, and correlated informative genes in class B only (correlated = "B", the default, heteroscedastic) or in both classes (correlated = "both", homoscedastic). See ?simulate_hetero_data for the exact covariance matrix.

Fit and predict

hnsc() chooses the threshold by refined cross-validation and fits the classifier at that threshold. Choose the classifier with a paper label or with method and variance.

set.seed(1)
fit <- hnsc(dat$xtr, dat$ytr, method = "HTh3")
fit
#> Nearest shrunken centroid classifier: HTh3 (hard thresholding, class-specific variance)
#> Classes: A, B  | genes: 1000 
#> Selected threshold: 5.226  (genes used: 2, CV error: 0.0571)

pred <- predict(fit, dat$xte)
mean(pred != dat$yte)                      # test error
#> [1] 0.12
head(predict(fit, dat$xte, type = "posterior"))
#>              A            B
#> te1 0.99961637 0.0003836345
#> te2 0.03044574 0.9695542589
#> te3 0.99403579 0.0059642118
#> te4 0.99479673 0.0052032674
#> te5 0.10279039 0.8972096126
#> te6 0.59259413 0.4074058665
head(fit$selected.genes)                    # genes used by the classifier
#> [1] 17 19

The homoscedastic counterpart is fitted the same way:

set.seed(1)
fit0 <- hnsc(dat$xtr, dat$ytr, method = "hard", variance = "homo")
mean(predict(fit0, dat$xte) != dat$yte)
#> [1] 0.23

Step by step

hnsc_train() fits a grid of thresholds, hnsc_cv() cross-validates it, and hnsc_select() runs the full refined search used by hnsc().

tr <- hnsc_train(dat$xtr, dat$ytr, method = "OTh3")
set.seed(2)
cv <- hnsc_cv(tr, dat$xtr, dat$ytr)
head(data.frame(threshold = cv$threshold, genes = cv$size, cv.error = cv$error))
#>   threshold genes  cv.error
#> 1       500   250 0.1428571
#> 2       483   242 0.1428571
#> 3       466   233 0.1714286
#> 4       448   224 0.1714286
#> 5       431   216 0.1714286
#> 6       414   207 0.2000000

set.seed(2)
sel <- hnsc_select(dat$xtr, dat$ytr, method = "OTh3")
sel
#> Deep CV threshold search for OTh3 
#> Selected threshold: 13.14 | genes: 7 | CV error: 0.0857 (40 thresholds evaluated)

For order thresholding the threshold is the number of largest |d_ik| values kept; for soft and hard thresholding it is a cut-off on |d_ik|.

Repeated-run comparison

compare_nsc() runs the evaluation protocol of the paper (100 runs with different cross-validation folds in the paper; 2 here to keep the vignette fast) and reports test error, balanced accuracy and the number of genes.

res <- compare_nsc(dat$xtr, dat$ytr, dat$xte, dat$yte, n.runs = 2,
                   thresholding = c("hard", "order"), verbose = FALSE)
res
#> NSC comparison: 2 runs, 2 classes, 35 training samples
#>  method error error.sd balanced.accuracy genes
#>     HTh 0.200 0.042426             0.800   2.0
#>    HTh3 0.105 0.035355             0.895   5.5
#>     OTh 0.135 0.049497             0.865   6.5
#>    OTh3 0.125 0.007071             0.875   2.5
recall_table(res)
#>   class recall_HTh recall_HTh3 recall_OTh recall_OTh3
#> 1     A       0.62        0.86       0.82        0.78
#> 2     B       0.98        0.93       0.91        0.97

The script system.file("scripts", "simulation_correlated.R", package = "hetNSC") contains the full correlated-gene simulation studies.

These binaries (installable software) and packages are in development.
They may not be fully stable and should be used with caution. We make no claims about them.
Health stats visible at Monitor.