This vignette shows how to reproduce the analysis described by Childs, Bach, Franken et
al. (2019): Non-parametric analysis of thermal proteome profiles reveals
novel drug-binding proteins using the NPARC
package.
Load necessary packages.
First, we load data from a staurosporine TPP experiment (Savitski et al. 2014). The necessary ETL (extract, transform, load) steps have already been conducted, including download from the supplements of the respective publication and conversion into tidy format.
Before applying any further transformations and filters we create a copy of the imported data.
Let’s perform a first check of the imported data:
df %>%
mutate(compoundConcentration = factor(compoundConcentration),
replicate = factor(replicate),
dataset = factor(dataset)) %>%
summary()
## dataset uniqueID relAbundance temperature
## Staurosporine:307080 Length:307080 Min. : 0.00 Min. :40.0
## Class :character 1st Qu.: 0.17 1st Qu.:46.0
## Mode :character Median : 0.57 Median :53.5
## Mean : 0.58 Mean :53.5
## 3rd Qu.: 0.95 3rd Qu.:61.0
## Max. :394.98 Max. :67.0
## NA's :70990
## compoundConcentration replicate uniquePeptideMatches
## 0 :153540 1:153540 Min. : 0.00
## 20:153540 2:153540 1st Qu.: 2.00
## Median : 6.00
## Mean : 10.36
## 3rd Qu.: 13.00
## Max. :351.00
## NA's :63400
The displayed data contains the following columns:
dataset
: The dataset containing the measurements of
several TMT-10 experiments. In each experiment, cells were treated with
a vehicle or with the compound in one or two concentrations, and
measured at ten different temperatures.uniqueID
: The unique identifier for each protein. In
the given dataset, it contains the gene symbol concatenated by IPI id.
Example: 15 KDA PROTEIN._IPI00879051, 16 KDA PROTEIN._IPI00903282, 17
KDA PROTEIN._IPI00878120, 17 KDA PROTEIN._IPI00736161, 176 KDA
PROTEIN._IPI00894060, 18 KDA PROTEIN._IPI00644570 .relAbundance
: The relative signal intensity of the
protein in each experiment, scaled to the intensity at the lowest
temperature.temperature
: The temperatures corresponding to each of
the ten measurements in a TMT experiment.compoundConcentration
The concentration of the
administered compound in μM.replicate
: The replicate number in each experimental
group. Each pair of vehicle and treatment experiments was conducted in
two replicates.uniquePeptideMatches
: The number of unique peptides
with which a protein was identified.The imported data contains 307080 rows with entries for 7677 proteins.
First, we remove all abundances that were not found with at least one unique peptide, or for which a missing value was recorded.
Next, we ensure that the dataset only contains proteins reproducibly observed with full melting curves in both replicates and treatment groups per dataset. A full melting curve is defined by the presence of measurements at all 10 temperatures for the given experimental group.
# Count full curves per protein
df %<>%
group_by(dataset, uniqueID) %>%
mutate(n = n()) %>%
group_by(dataset) %>%
mutate(max_n = max(n)) %>%
ungroup
table(distinct(df, uniqueID, n)$n)
##
## 10 20 30 40
## 992 809 993 4505
We see that the majority of proteins contain 40 measurements. This corresponds to two full replicate curves per experimental group. We will focus on these in the current analysis.
The final data contains 180200 rows with entries for 4505 proteins. This number coincides with the value reported in Table 1 of the corresponding publication (Childs et al. 2019).
We first illustrate the principles of nonparametric analysis of response curves (NPARC) on an example protein (STK4) from the staurosporine dataset. The same protein is shown in Figures 1 and 2 of the paper.
We first select all entries belonging to the desired protein and dataset:
The table stk4
has 40 rows with measurements of four
experimental groups. They consist of two treatment groups (vehicle:
0 μM staurosporine,
treatment: 20 μM
staurosporine) with two replicates each. Let us look at the treatment
group of replicate 1 for an example:
stk4 %>% filter(compoundConcentration == 20, replicate == 1) %>%
dplyr::select(-dataset) %>% kable(digits = 2)
uniqueID | relAbundance | temperature | compoundConcentration | replicate | uniquePeptideMatches |
---|---|---|---|---|---|
STK4_IPI00011488 | 1.00 | 40 | 20 | 1 | 8 |
STK4_IPI00011488 | 1.03 | 43 | 20 | 1 | 8 |
STK4_IPI00011488 | 1.06 | 46 | 20 | 1 | 8 |
STK4_IPI00011488 | 1.03 | 49 | 20 | 1 | 8 |
STK4_IPI00011488 | 0.92 | 52 | 20 | 1 | 8 |
STK4_IPI00011488 | 0.93 | 55 | 20 | 1 | 8 |
STK4_IPI00011488 | 0.78 | 58 | 20 | 1 | 8 |
STK4_IPI00011488 | 0.44 | 61 | 20 | 1 | 8 |
STK4_IPI00011488 | 0.21 | 64 | 20 | 1 | 8 |
STK4_IPI00011488 | 0.12 | 67 | 20 | 1 | 8 |
To obtain a first impression of the measurements in each experimental group, we generate a plot of the measurements:
stk4_plot_orig <- ggplot(stk4, aes(x = temperature, y = relAbundance)) +
geom_point(aes(shape = factor(replicate), color = factor(compoundConcentration)), size = 2) +
theme_bw() +
ggtitle("STK4") +
scale_color_manual("staurosporine (mu M)", values = c("#808080", "#da7f2d")) +
scale_shape_manual("replicate", values = c(19, 17))
print(stk4_plot_orig)
We will show how to add the fitted curves to this plot in the following steps.
To assess whether there is a significant difference between both treatment groups, we will fit a null model and an alternative models to the data. The null model fits a sigmoid melting curve through all data points irrespective of experimental condition. The alternative model fits separate melting curves per experimental group .
We use the NPARC
package function
fitSingleSigmoid
to fit the null model:
The function returns an object of class nls
:
##
## Formula: y ~ (1 - Pl)/(1 + exp((b - a/x))) + Pl
##
## Parameters:
## Estimate Std. Error t value Pr(>|t|)
## Pl 0.0000 0.1795 0.000 1.00000
## a 692.6739 226.9107 3.053 0.00419 **
## b 12.5048 4.4989 2.780 0.00851 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.1814 on 37 degrees of freedom
##
## Algorithm "port", convergence message: relative convergence (4)
The function augment
from the broom
package
provides a convenient way to obtain the predictions and residuals at
each temperature in tabular format. By appending the returned
predictions and residuals to our measurements, we ensure that relevant
data is collected in the same table and can be added to the plot for
visualization. The residuals will be needed later for construction of
the test statistic:
Let us look at the values returned by augment
at two
consecutive temperatures. Note that, while the predictions will be the
same for each experiment at a given temperature, the residuals will
differ because they were computed by comparing the predictions to the
actual measurements:
x | y | .fitted | .resid |
---|---|---|---|
46 | 1.0591140 | 0.9278000 | 0.1313139 |
49 | 1.0333794 | 0.8363683 | 0.1970111 |
46 | 0.9449568 | 0.9278000 | 0.0171568 |
49 | 0.9187253 | 0.8363683 | 0.0823571 |
46 | 0.8661451 | 0.9278000 | -0.0616550 |
49 | 0.7139894 | 0.8363683 | -0.1223788 |
46 | 0.8717407 | 0.9278000 | -0.0560594 |
49 | 0.7068211 | 0.8363683 | -0.1295471 |
Now we can append these values to our data frame and show the predicted curve in the plot:
Next we fit the alternative model. Again, we compute the predicted
values and the corresponding residuals by the
broom::augment()
function. To take the compound
concentration as a factor into account, we iterate over both
concentrations and fit separate models to each subset. We implement this
by first grouping the data using the function
dplyr::group_by()
, and starting the model fitting by
dplyr::do()
.
alternativePredictions <- stk4 %>%
# Fit separate curves per treatment group:
group_by(compoundConcentration) %>%
do({
fit = NPARC:::fitSingleSigmoid(x = .$temperature, y = .$relAbundance, start=c(Pl = 0, a = 550, b = 10))
broom::augment(fit)
}) %>%
ungroup %>%
# Rename columns for merge to data frame:
dplyr::rename(alternativePrediction = .fitted,
alternativeResiduals = .resid,
temperature = x,
relAbundance = y)
Add the predicted values and corresponding residuals to our data frame:
stk4 <- stk4 %>%
left_join(alternativePredictions,
by = c("relAbundance", "temperature",
"compoundConcentration")) %>%
distinct()
## Warning in left_join(., alternativePredictions, by = c("relAbundance", "temperature", : Detected an unexpected many-to-many relationship between `x` and `y`.
## ℹ Row 1 of `x` matches multiple rows in `y`.
## ℹ Row 21 of `y` matches multiple rows in `x`.
## ℹ If a many-to-many relationship is expected, set `relationship =
## "many-to-many"` to silence this warning.
Add the curves predicted by the alternative model to the plot. Conceptually, it corresponds to the plot shown in Figures 2 (A)/(B) of the paper.
stk4_plot <- stk4_plot +
geom_line(data = distinct(stk4, temperature, compoundConcentration, alternativePrediction),
aes(y = alternativePrediction, color = factor(compoundConcentration)))
print(stk4_plot)
This plot summarizes Figures 2(A) and 2(B) in the corresponding publication (Childs et al. 2019).
In order to quantify the improvement in goodness-of-fit of the alternative model relative to the null model, we compute the sum of squared residuals (RSS):
rssPerModel <- stk4 %>%
summarise(rssNull = sum(nullResiduals^2),
rssAlternative = sum(alternativeResiduals^2))
kable(rssPerModel, digits = 4)
rssNull | rssAlternative |
---|---|
1.2181 | 0.0831 |
These values will be used to construct the F-statistic according to
To compute this statistic and to derive a p-value, we need the degrees of freedom d1 and d2. As described in the paper, they cannot be analytically derived due to the correlated nature of the measurements. The paper describes how to estimate these values from the RSS-values of all proteins in the dataset. In the following Section, we illustrate how to repeat the model fitting for all proteins of a dataset and how to perform hypothesis testing on these models.
This section describes the different steps of the NPARC workflow for
model fitting and hyothesis testing. Note that the package also provides
a function runNPARC()
that performs all of the following
steps with one single function call.
In order to analyze all datasets as described in the paper, we fit
null and alternative models to all proteins using the package function
NPARCfit
:
fits <- NPARCfit(x = df$temperature,
y = df$relAbundance,
id = df$uniqueID,
groupsNull = NULL,
groupsAlt = df$compoundConcentration,
BPPARAM = BPPARAM,
returnModels = FALSE)
## Starting model fitting...
## ... complete
## Elapsed time: 16.72 secs
## Flagging successful model fits...
## ... complete.
## Evaluating model fits...
## Evaluating models ...
## ... complete.
## Computing model predictions and residuals ...
## ... complete.
## Starting model fitting...
## ... complete
## Elapsed time: 40.77 secs
## Flagging successful model fits...
## ... complete.
## Evaluating model fits...
## Evaluating models ...
## ... complete.
## Computing model predictions and residuals ...
## ... complete.
## List of 2
## $ predictions: tibble [360,095 × 7] (S3: tbl_df/tbl/data.frame)
## $ metrics : tibble [13,515 × 15] (S3: tbl_df/tbl/data.frame)
The returned object fits
contains two tables. The table
metrics
contains the fitted parameters and goodness-of-fit
measures for the null and alternative models per protein and group. The
table predictions
contains the corresponding predicted
values and residuals per model.
fits$metrics %>%
mutate(modelType = factor(modelType), nCoeffs = factor(nCoeffs), nFitted = factor(nFitted), group = factor((group))) %>%
summary
## modelType id tm a
## alternative:9010 Length:13515 Min. : 43.56 Min. : 0.0
## null :4505 Class :character 1st Qu.: 50.21 1st Qu.: 837.2
## Mode :character Median : 52.85 Median : 1103.1
## Mean : 54.09 Mean : 1432.8
## 3rd Qu.: 56.29 3rd Qu.: 1489.3
## Max. :298.79 Max. :15000.0
## NA's :788 NA's :15
## b pl aumc resid_sd
## Min. : 0.00001 Min. :0.00000 Min. : 4.87 Min. :0.007522
## 1st Qu.: 16.12284 1st Qu.:0.05278 1st Qu.:11.56 1st Qu.:0.035041
## Median : 21.44876 Median :0.07971 Median :14.46 Median :0.049796
## Mean : 27.02964 Mean :0.14072 Mean :15.03 Mean :0.064139
## 3rd Qu.: 28.40480 3rd Qu.:0.14426 3rd Qu.:18.06 3rd Qu.:0.074662
## Max. :250.00000 Max. :1.50000 Max. :37.42 Max. :1.896479
## NA's :15 NA's :15 NA's :15 NA's :15
## rss loglik tm_sd nCoeffs
## Min. : 0.00113 Min. :-70.47 Min. :0.000e+00 3 :13500
## 1st Qu.: 0.02921 1st Qu.: 27.32 1st Qu.:0.000e+00 NA's: 15
## Median : 0.06361 Median : 37.21 Median :0.000e+00
## Mean : 0.19872 Mean : 40.00 Mean :1.373e+12
## 3rd Qu.: 0.15090 3rd Qu.: 49.53 3rd Qu.:1.000e+00
## Max. :79.39804 Max. :123.31 Max. :9.409e+15
## NA's :15 NA's :15 NA's :788
## nFitted conv group
## 20 :8996 Mode :logical 0 :4505
## 40 :4504 FALSE:15 20 :4505
## NA's: 15 TRUE :13500 NA's:4505
##
##
##
##
## modelType id x y
## alternative:179934 Length:360095 Min. :40.0 Min. :0.0000
## null :180161 Class :character 1st Qu.:46.0 1st Qu.:0.1563
## Mode :character Median :53.5 Median :0.5783
## Mean :53.5 Mean :0.5644
## 3rd Qu.:61.0 3rd Qu.:0.9570
## Max. :67.0 Max. :8.2379
## NA's :15 NA's :15
## .fitted .resid group
## Min. :0.01099 Min. :-1.156741 0 : 89929
## 1st Qu.:0.15960 1st Qu.:-0.025276 20 : 90005
## Median :0.58445 Median : 0.000310 NA's:180161
## Mean :0.56001 Mean : 0.004339
## 3rd Qu.:0.96271 3rd Qu.: 0.028110
## Max. :1.50000 Max. : 7.240277
## NA's :15 NA's :15
The results of the STK4 example from earlier can be selected from this object as follows.
First, we check the RSS values of the null and alterantive models:
stk4Metrics <- filter(fits$metrics, id == "STK4_IPI00011488")
rssNull <- filter(stk4Metrics, modelType == "null")$rss
rssAlt <- sum(filter(stk4Metrics, modelType == "alternative")$rss) # Summarize over both experimental groups
rssNull
## [1] 1.218132
## [1] 0.08314745
Next, we plot the predicted curves per model and experimental group:
stk4Predictions <- filter(fits$predictions, modelType == "alternative", id == "STK4_IPI00011488")
stk4_plot_orig +
geom_line(data = filter(stk4Predictions, modelType == "alternative"),
aes(x = x, y = .fitted, color = factor(group))) +
geom_line(data = filter(stk4Predictions, modelType == "null"),
aes(x = x, y = .fitted))
In order to compute F-statistics per protein and dataset according to Equation (), we need to know the degrees of freedom of the corresponding null distribution. If we could assume independent and identically distributed (iid) residuals, we could compute them from the number of fitted values and model parameters. In the following, we will show why this simple equation is not appropriate for the curve data we are working with.
First, we compute the test statistics and p-values with theoretical degrees of freedom. These would be true for the case of iid residuals:
Let us take a look at the computed degrees of freedom:
fStats %>%
filter(!is.na(pAdj)) %>%
distinct(nFittedNull, nFittedAlt, nCoeffsNull, nCoeffsAlt, df1, df2) %>%
kable()
nFittedNull | nFittedAlt | nCoeffsNull | nCoeffsAlt | df1 | df2 |
---|---|---|---|---|---|
40 | 40 | 3 | 6 | 3 | 34 |
We plot the F-statistics against the theoretical F-distribution to check how well the null distribution is approximated now:
ggplot(filter(fStats, !is.na(pAdj))) +
geom_density(aes(x = fStat), fill = "steelblue", alpha = 0.5) +
geom_line(aes(x = fStat, y = df(fStat, df1 = df1, df2 = df2)), color = "darkred", size = 1.5) +
theme_bw() +
# Zoom in to small values to increase resolution for the proteins under H0:
xlim(c(0, 10))
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## Warning: Removed 180 rows containing non-finite outside the scale range
## (`stat_density()`).
## Warning: Removed 180 rows containing missing values or values outside the scale range
## (`geom_line()`).
The densities of the theoretical F-distribution (red) do not fit the observed values (blue) very well. While the theoretical distribution tends to overestimate the number of proteins with test statistics smaller than 2.5, it appears to underestimate the amount of proteins with larger values. This would imply that even for highly specific drugs, we observe many more significant differences than we would expect by chance. This hints at an anti-conservative behaviour of our test with the calculated degree of freedom parameters. This is reflected in the p-value distributions. If the distribution assumptions were met, we would expect the null cases to follow a uniform distribution, with a peak on the left for the non-null cases. Instead, we observe a tendency to obtain fewer values than expected in the middle range (around 0.5), but distinct peaks to the left.
ggplot(filter(fStats, !is.na(pAdj))) +
geom_histogram(aes(x = pVal, y = ..density..), fill = "steelblue", alpha = 0.5, boundary = 0, bins = 30) +
geom_line(aes(x = pVal, y = dunif(pVal)), color = "darkred", size = 1.5) +
theme_bw()
## Warning: The dot-dot notation (`..density..`) was deprecated in ggplot2 3.4.0.
## ℹ Please use `after_stat(density)` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
In the paper, we describe an alternative way to estimate the degrees of freedom by fitting χ2 distributions to the numerator and denominator across all proteins in a dataset. To enable fitting of the distributions, we first need to re-scale the variables by a scaling factor. Because the scaling factors are characteristic for each dataset (it depends on the variances of the residuals in the respective dataset), we estimate them from the data according to:
where V is the variance of the distribution, and M is the mean of the distribution.
The following functin estimates V and M from the empirical distributions of the RSS differences (RSS1 − RSS0). To increase robustness, it estimate M and V by their D-estimates Marazzi (2002) (median and median absolute deviation). It then scales the numerator and denominator of the F-statistic by these scaling factors and estimate the degree of freedom parameters by fitting unscaled χ2 distributions. Finally, it fits the degrees of freedom parameters numerically, computes the test statistics according to Equation () and derives p-values.
We plot the F-statistics against the theoretical F-distribution to check how well the null distribution is approximated now:
ggplot(filter(fStats, !is.na(pAdj))) +
geom_density(aes(x = fStat), fill = "steelblue", alpha = 0.5) +
geom_line(aes(x = fStat, y = df(fStat, df1 = df1, df2 = df2)), color = "darkred", size = 1.5) +
theme_bw() +
# Zoom in to small values to increase resolution for the proteins under H0:
xlim(c(0, 10))
## Warning: Removed 113 rows containing non-finite outside the scale range
## (`stat_density()`).
## Warning: Removed 113 rows containing missing values or values outside the scale range
## (`geom_line()`).
Also check the p-value histograms. We expect the null cases to follow a uniform distribution, with a peak on the left for the non-null cases:
ggplot(filter(fStats, !is.na(pAdj))) +
geom_histogram(aes(x = pVal, y = ..density..), fill = "steelblue", alpha = 0.5, boundary = 0, bins = 30) +
geom_line(aes(x = pVal, y = dunif(pVal)), color = "darkred", size = 1.5) +
theme_bw()
The F-statistics and p-values approximate the expected distributions substantially closer when based on the estimated degrees of freedom than when based on the theoretical degrees of freedom.
Finally, we can select proteins that are significantly shifted by putting a threshold on the Benjamini-Hochberg corrected p-values.
topHits <- fStats %>%
filter(pAdj <= 0.01) %>%
dplyr::select(id, fStat, pVal, pAdj) %>%
arrange(-fStat)
The table topHits
contains 80 proteins
with Benjamini-Hochberg corrected p-values ≤ 0.01.
Let us look at the targets detected in each dataset. The same proteins are shown in Fig. S3, S4, S6, and S7 of the paper.
id | fStat | pVal | pAdj |
---|---|---|---|
CDK5_IPI00023530 | 368.90490 | 0.0000000 | 0.0000000 |
MAP2K2_IPI00003783 | 148.16050 | 0.0000000 | 0.0000000 |
CSK_IPI00013212 | 138.36196 | 0.0000000 | 0.0000000 |
PMPCA_IPI00166749 | 136.85896 | 0.0000000 | 0.0000000 |
AURKA_IPI00298940 | 130.87225 | 0.0000000 | 0.0000000 |
FECH_IPI00554589 | 128.37049 | 0.0000000 | 0.0000000 |
IRAK4_IPI00007641 | 121.98859 | 0.0000000 | 0.0000000 |
CAMKK2_IPI00290239 | 116.43217 | 0.0000000 | 0.0000000 |
PAK4_IPI00014068 | 113.09839 | 0.0000000 | 0.0000000 |
STK4_IPI00011488 | 102.17159 | 0.0000000 | 0.0000000 |
STK38_IPI00027251 | 99.47761 | 0.0000000 | 0.0000000 |
PDPK1_IPI00002538 | 96.70414 | 0.0000000 | 0.0000000 |
GSK3B_IPI00216190 | 92.83412 | 0.0000000 | 0.0000001 |
ADRBK1_IPI00012497 | 82.25045 | 0.0000000 | 0.0000002 |
BMP2K_IPI00337426 | 74.48672 | 0.0000000 | 0.0000003 |
FER_IPI00029263 | 70.24927 | 0.0000000 | 0.0000005 |
MAP2K1_IPI00219604 | 62.11716 | 0.0000000 | 0.0000012 |
MAP2K7_IPI00302112 | 59.63573 | 0.0000000 | 0.0000015 |
MAP4K2_IPI00149094 | 57.26133 | 0.0000000 | 0.0000020 |
MAPK12_IPI00296283 | 55.64599 | 0.0000000 | 0.0000024 |
PRKCE_IPI00024539 | 54.43918 | 0.0000000 | 0.0000026 |
ADK_IPI00290279 | 54.37816 | 0.0000000 | 0.0000026 |
STK3_IPI00411984 | 53.19172 | 0.0000000 | 0.0000029 |
MAPK8_IPI00220306 | 50.02240 | 0.0000000 | 0.0000042 |
MAPKAPK5_IPI00160672 | 50.00238 | 0.0000000 | 0.0000042 |
PKN1_IPI00412672 | 49.90382 | 0.0000000 | 0.0000042 |
PTK2_IPI00413961 | 49.22734 | 0.0000000 | 0.0000044 |
AAK1_IPI00916402 | 49.21741 | 0.0000000 | 0.0000044 |
CHEK2_IPI00423156 | 46.43632 | 0.0000000 | 0.0000065 |
CDK2_IPI00031681 | 45.18283 | 0.0000001 | 0.0000078 |
MAP2K4_IPI00024674 | 44.18143 | 0.0000001 | 0.0000087 |
CPOX_IPI00093057 | 44.13759 | 0.0000001 | 0.0000087 |
PHKG2_IPI00012891 | 42.92063 | 0.0000001 | 0.0000104 |
TNIK_IPI00514275 | 42.34779 | 0.0000001 | 0.0000112 |
VRK1_IPI00019640 | 41.27324 | 0.0000001 | 0.0000132 |
MAPKAPK2_IPI00026054 | 37.91852 | 0.0000002 | 0.0000240 |
MARK2_IPI00555838 | 37.70452 | 0.0000002 | 0.0000243 |
CAMK2G_IPI00908444 | 36.09428 | 0.0000003 | 0.0000326 |
GSK3A_IPI00292228 | 35.95591 | 0.0000003 | 0.0000326 |
PRKAR2B_IPI00554752 | 35.72190 | 0.0000003 | 0.0000334 |
RIOK2_IPI00306406 | 35.19723 | 0.0000003 | 0.0000362 |
PRKACA_IPI00396630 | 33.81101 | 0.0000004 | 0.0000466 |
RPS6KA3_IPI00020898 | 33.77290 | 0.0000004 | 0.0000466 |
MAPK3_IPI00018195 | 33.20265 | 0.0000005 | 0.0000514 |
STK24_IPI00872754 | 32.13511 | 0.0000006 | 0.0000635 |
MARK3_IPI00183118 | 29.98227 | 0.0000010 | 0.0001016 |
TTK_IPI00151170 | 29.39818 | 0.0000012 | 0.0001141 |
MKNK1_IPI00304048 | 25.96383 | 0.0000028 | 0.0002638 |
PDCD10_IPI00298558 | 25.74587 | 0.0000030 | 0.0002737 |
OSBPL3_IPI00023555 | 25.47390 | 0.0000032 | 0.0002884 |
HEBP1_IPI00148063 | 25.06290 | 0.0000036 | 0.0003156 |
RPS6KA1_IPI00477982 | 24.28837 | 0.0000044 | 0.0003825 |
PIK3CD_IPI00384817 | 24.01730 | 0.0000048 | 0.0004046 |
MAP3K2_IPI00513803 | 23.79807 | 0.0000051 | 0.0004222 |
SGK3_IPI00655852 | 23.28695 | 0.0000059 | 0.0004791 |
PRKCB_IPI00219628 | 22.95409 | 0.0000065 | 0.0005177 |
IRAK1_IPI00293652 | 22.86898 | 0.0000066 | 0.0005213 |
CAMK1D_IPI00170508 | 22.04917 | 0.0000084 | 0.0006515 |
POLR2K_IPI00023975 | 21.38386 | 0.0000103 | 0.0007822 |
LYN_IPI00298625 | 20.60442 | 0.0000131 | 0.0009780 |
CDC42BPA_IPI00903296 | 20.09956 | 0.0000153 | 0.0011242 |
PRKCQ_IPI00029196 | 20.05861 | 0.0000155 | 0.0011242 |
ALDH6A1_IPI00024990 | 19.83687 | 0.0000167 | 0.0011877 |
NEDD4L_IPI00304945 | 19.70085 | 0.0000174 | 0.0012214 |
CCNB2_IPI00028266 | 19.42420 | 0.0000190 | 0.0013155 |
PRKCD_IPI00329236 | 17.78184 | 0.0000331 | 0.0022453 |
PRCP_IPI00399307 | 17.74524 | 0.0000335 | 0.0022453 |
XPOT_IPI00306290 | 17.42674 | 0.0000374 | 0.0024728 |
MAPK14_IPI00221141 | 17.28003 | 0.0000394 | 0.0025664 |
CYCS_IPI00465315 | 16.02614 | 0.0000622 | 0.0039882 |
STK10_IPI00304742 | 15.89491 | 0.0000653 | 0.0041261 |
FAM96A_IPI00030985 | 15.85985 | 0.0000662 | 0.0041261 |
DDX54_IPI00152510 | 14.04424 | 0.0001344 | 0.0082670 |
RPS6KB1_IPI00216132 | 13.99958 | 0.0001368 | 0.0083048 |
PCTK2_IPI00376955 | 13.90848 | 0.0001420 | 0.0085045 |
MAP4K5_IPI00294842 | 13.82531 | 0.0001469 | 0.0086835 |
LLGL1_IPI00105532 | 13.56142 | 0.0001639 | 0.0095576 |
NQO2_IPI00219129 | 13.52733 | 0.0001662 | 0.0095698 |
ROCK2_IPI00307155 | 13.40970 | 0.0001746 | 0.0098723 |
TLK2_IPI00385652 | 13.39217 | 0.0001759 | 0.0098723 |
## ─ Session info ───────────────────────────────────────────────────────────────
## setting value
## version R version 4.4.2 (2024-10-31)
## os Ubuntu 24.04.1 LTS
## system x86_64, linux-gnu
## ui X11
## language (EN)
## collate C
## ctype en_US.UTF-8
## tz Etc/UTC
## date 2024-11-22
## pandoc 3.2.1 @ /usr/local/bin/ (via rmarkdown)
##
## ─ Packages ───────────────────────────────────────────────────────────────────
## package * version date (UTC) lib source
## backports 1.5.0 2024-05-23 [2] RSPM (R 4.4.0)
## BiocManager 1.30.25 2024-08-28 [2] RSPM (R 4.4.0)
## BiocParallel 1.41.0 2024-10-30 [2] https://bioc.r-universe.dev (R 4.4.1)
## BiocStyle * 2.35.0 2024-11-19 [2] https://bioc.r-universe.dev (R 4.4.2)
## broom * 1.0.7 2024-09-26 [2] RSPM (R 4.4.0)
## bslib 0.8.0 2024-07-29 [2] RSPM (R 4.4.0)
## buildtools 1.0.0 2024-11-21 [3] local (/pkg)
## cachem 1.1.0 2024-05-16 [2] RSPM (R 4.4.0)
## cli 3.6.3 2024-06-21 [2] RSPM (R 4.4.0)
## codetools 0.2-20 2024-03-31 [2] RSPM (R 4.4.0)
## colorspace 2.1-1 2024-07-26 [2] RSPM (R 4.4.0)
## crayon 1.5.3 2024-06-20 [2] RSPM (R 4.4.0)
## devtools 2.4.5 2022-10-11 [2] RSPM (R 4.4.0)
## digest 0.6.37 2024-08-19 [2] RSPM (R 4.4.0)
## dplyr * 1.1.4 2023-11-17 [2] RSPM (R 4.4.0)
## ellipsis 0.3.2 2021-04-29 [2] RSPM (R 4.4.0)
## evaluate 1.0.1 2024-10-10 [2] RSPM (R 4.4.0)
## fansi 1.0.6 2023-12-08 [2] RSPM (R 4.4.0)
## farver 2.1.2 2024-05-13 [2] RSPM (R 4.4.0)
## fastmap 1.2.0 2024-05-15 [2] RSPM (R 4.4.0)
## fs 1.6.5 2024-10-30 [2] RSPM (R 4.4.0)
## generics 0.1.3 2022-07-05 [2] RSPM (R 4.4.0)
## ggplot2 * 3.5.1 2024-04-23 [2] RSPM (R 4.4.0)
## glue 1.8.0 2024-09-30 [2] RSPM (R 4.4.0)
## gtable 0.3.6 2024-10-25 [2] RSPM (R 4.4.0)
## htmltools 0.5.8.1 2024-04-04 [2] RSPM (R 4.4.0)
## htmlwidgets 1.6.4 2023-12-06 [2] RSPM (R 4.4.0)
## httpuv 1.6.15 2024-03-26 [2] RSPM (R 4.4.0)
## jquerylib 0.1.4 2021-04-26 [2] RSPM (R 4.4.0)
## jsonlite 1.8.9 2024-09-20 [2] RSPM (R 4.4.0)
## knitr * 1.49 2024-11-08 [2] RSPM (R 4.4.0)
## labeling 0.4.3 2023-08-29 [2] RSPM (R 4.4.0)
## later 1.3.2 2023-12-06 [2] RSPM (R 4.4.0)
## lifecycle 1.0.4 2023-11-07 [2] RSPM (R 4.4.0)
## magrittr * 2.0.3 2022-03-30 [2] RSPM (R 4.4.0)
## maketools 1.3.1 2024-10-04 [3] RSPM (R 4.4.0)
## MASS 7.3-61 2024-06-13 [2] RSPM (R 4.4.0)
## memoise 2.0.1 2021-11-26 [2] RSPM (R 4.4.0)
## mime 0.12 2021-09-28 [2] RSPM (R 4.4.0)
## miniUI 0.1.1.1 2018-05-18 [2] RSPM (R 4.4.0)
## munsell 0.5.1 2024-04-01 [2] RSPM (R 4.4.0)
## NPARC * 1.19.0 2024-11-22 [1] https://bioc.r-universe.dev (R 4.4.2)
## pillar 1.9.0 2023-03-22 [2] RSPM (R 4.4.0)
## pkgbuild 1.4.5 2024-10-28 [2] RSPM (R 4.4.0)
## pkgconfig 2.0.3 2019-09-22 [2] RSPM (R 4.4.0)
## pkgload 1.4.0 2024-06-28 [2] RSPM (R 4.4.0)
## profvis 0.4.0 2024-09-20 [2] RSPM (R 4.4.0)
## promises 1.3.0 2024-04-05 [2] RSPM (R 4.4.0)
## purrr 1.0.2 2023-08-10 [2] RSPM (R 4.4.0)
## R6 2.5.1 2021-08-19 [2] RSPM (R 4.4.0)
## Rcpp 1.0.13-1 2024-11-02 [2] RSPM (R 4.4.0)
## remotes 2.5.0 2024-03-17 [2] RSPM (R 4.4.0)
## rlang 1.1.4 2024-06-04 [2] RSPM (R 4.4.0)
## rmarkdown 2.29 2024-11-04 [2] RSPM (R 4.4.0)
## sass 0.4.9 2024-03-15 [2] RSPM (R 4.4.0)
## scales 1.3.0 2023-11-28 [2] RSPM (R 4.4.0)
## sessioninfo 1.2.2 2021-12-06 [2] RSPM (R 4.4.0)
## shiny 1.9.1 2024-08-01 [2] RSPM (R 4.4.0)
## sys 3.4.3 2024-10-04 [2] RSPM (R 4.4.0)
## tibble 3.2.1 2023-03-20 [2] RSPM (R 4.4.0)
## tidyr 1.3.1 2024-01-24 [2] RSPM (R 4.4.0)
## tidyselect 1.2.1 2024-03-11 [2] RSPM (R 4.4.0)
## urlchecker 1.0.1 2021-11-30 [2] RSPM (R 4.4.0)
## usethis 3.0.0 2024-07-29 [2] RSPM (R 4.4.0)
## utf8 1.2.4 2023-10-22 [2] RSPM (R 4.4.0)
## vctrs 0.6.5 2023-12-01 [2] RSPM (R 4.4.0)
## withr 3.0.2 2024-10-28 [2] RSPM (R 4.4.0)
## xfun 0.49 2024-10-31 [2] RSPM (R 4.4.0)
## xtable 1.8-4 2019-04-21 [2] RSPM (R 4.4.0)
## yaml 2.3.10 2024-07-26 [2] RSPM (R 4.4.0)
##
## [1] /tmp/Rtmp2yWKCb/Rinst153752bbbb35
## [2] /github/workspace/pkglib
## [3] /usr/local/lib/R/site-library
## [4] /usr/lib/R/site-library
## [5] /usr/lib/R/library
##
## ──────────────────────────────────────────────────────────────────────────────