summerrband
plays for you gel-shift data from “tapes” recorded on
Cytiva’s ImageQuant TL. Wherever the data comes from, once it’s in a
table (data.frame
), this package gives you also a handle on fitting
dissociation constants in various ways.
Since this package is not part of CRAN, you must install and update the development version from GitHub with:
# install.packages("devtools")
devtools::install_github("benjbuch/summerrband")
library(summerrband)
#> Loading required package: summerr
#>
#> Verbose logging: `options(summerr.log = TRUE)`
#>
#> Attaching package: ‘summerr’
#> The following object is masked from ‘package:base’:
#>
#> normalizePath
This is how a raw IQTL file looks like (truncated):
#> V1 V2 V3 V4 V5 V6 V7
#> 1: Lane 1 Lane 2
#> 2: Band No Volume Vol+BkGnd Calib Vol(ug) MW (kd) Rf Band No
#> 3: 1 1836717.76 10316698.58 - - 0.318 1
#> 4: 2 708701.15 11036571.63 - - 0.711 2
#> V8 V9 V10 V11 V12 V13 V14
#> 1: Lane 3
#> 2: Volume Vol+BkGnd Calib Vol(ug) MW (kd) Rf Band No Volume
#> 3: 1952433.94 10790313.74 - - 0.305 1 1579557.00
#> 4: 1058242.09 13741043.81 - - 0.688 2 1212406.97
This is how the same file will look like after tidy importing. As an
extra benefit of calling iqtl_view
instead of iqtl_read
, we’ll play
a preview alongside:
iqtl_view(my_file)
#> lane_id band_id vol vol_frac vol+bkg CAL MW Rf
#> 1: lane_1 band_0 708701.2 0.27842221 11036572 NA NA 0.711
#> 2: lane_1 band_1 1836717.8 0.72157779 10316699 NA NA 0.318
#> 3: lane_2 band_0 1058242.1 0.35149650 13741044 NA NA 0.688
#> 4: lane_2 band_1 1952433.9 0.64850350 10790314 NA NA 0.305
#> 5: lane_3 band_0 1212407.0 0.43424879 12996290 NA NA 0.685
#> 6: lane_3 band_1 1579557.0 0.56575121 9462001 NA NA 0.282
#> 7: lane_4 band_0 1836166.1 0.58849169 17137079 NA NA 0.672
#> 8: lane_4 band_1 1283956.3 0.41150831 8149479 NA NA 0.266
#> 9: lane_5 band_0 1790299.8 0.67452721 15580045 NA NA 0.646
#> 10: lane_5 band_1 863855.2 0.32547279 7848150 NA NA 0.273
#> 11: lane_6 band_0 2555067.5 0.77664741 14939456 NA NA 0.649
#> 12: lane_6 band_1 734800.5 0.22335259 7719780 NA NA 0.299
#> 13: lane_7 band_0 2921065.4 0.85142851 15641146 NA NA 0.630
#> 14: lane_7 band_1 509716.4 0.14857149 7455754 NA NA 0.289
#> 15: lane_8 band_0 2971834.7 0.84904462 15490070 NA NA 0.627
#> 16: lane_8 band_1 528375.6 0.15095538 6659347 NA NA 0.305
#> 17: lane_9 band_0 3165996.8 0.91124556 16399084 NA NA 0.614
#> 18: lane_9 band_1 308365.0 0.08875444 7112698 NA NA 0.269
#> 19: lane_10 band_0 3193473.6 0.93275097 15649350 NA NA 0.633
#> 20: lane_10 band_1 230241.5 0.06724903 7311010 NA NA 0.273
#> 21: lane_11 band_0 3199637.7 0.95902255 15825951 NA NA 0.627
#> 22: lane_11 band_1 136715.2 0.04097745 7497813 NA NA 0.263
#> 23: lane_12 band_0 3382234.8 0.94492546 16349369 NA NA 0.656
#> 24: lane_12 band_1 197132.0 0.05507454 8754550 NA NA 0.292
#> lane_id band_id vol vol_frac vol+bkg CAL MW Rf
#> file
#> 1: /Library/Frameworks/R.framework/Versions/4.0/Resources/library/summerrband/extdata/gel_01.txt
#> 2: /Library/Frameworks/R.framework/Versions/4.0/Resources/library/summerrband/extdata/gel_01.txt
#> 3: /Library/Frameworks/R.framework/Versions/4.0/Resources/library/summerrband/extdata/gel_01.txt
#> 4: /Library/Frameworks/R.framework/Versions/4.0/Resources/library/summerrband/extdata/gel_01.txt
#> 5: /Library/Frameworks/R.framework/Versions/4.0/Resources/library/summerrband/extdata/gel_01.txt
#> 6: /Library/Frameworks/R.framework/Versions/4.0/Resources/library/summerrband/extdata/gel_01.txt
#> 7: /Library/Frameworks/R.framework/Versions/4.0/Resources/library/summerrband/extdata/gel_01.txt
#> 8: /Library/Frameworks/R.framework/Versions/4.0/Resources/library/summerrband/extdata/gel_01.txt
#> 9: /Library/Frameworks/R.framework/Versions/4.0/Resources/library/summerrband/extdata/gel_01.txt
#> 10: /Library/Frameworks/R.framework/Versions/4.0/Resources/library/summerrband/extdata/gel_01.txt
#> 11: /Library/Frameworks/R.framework/Versions/4.0/Resources/library/summerrband/extdata/gel_01.txt
#> 12: /Library/Frameworks/R.framework/Versions/4.0/Resources/library/summerrband/extdata/gel_01.txt
#> 13: /Library/Frameworks/R.framework/Versions/4.0/Resources/library/summerrband/extdata/gel_01.txt
#> 14: /Library/Frameworks/R.framework/Versions/4.0/Resources/library/summerrband/extdata/gel_01.txt
#> 15: /Library/Frameworks/R.framework/Versions/4.0/Resources/library/summerrband/extdata/gel_01.txt
#> 16: /Library/Frameworks/R.framework/Versions/4.0/Resources/library/summerrband/extdata/gel_01.txt
#> 17: /Library/Frameworks/R.framework/Versions/4.0/Resources/library/summerrband/extdata/gel_01.txt
#> 18: /Library/Frameworks/R.framework/Versions/4.0/Resources/library/summerrband/extdata/gel_01.txt
#> 19: /Library/Frameworks/R.framework/Versions/4.0/Resources/library/summerrband/extdata/gel_01.txt
#> 20: /Library/Frameworks/R.framework/Versions/4.0/Resources/library/summerrband/extdata/gel_01.txt
#> 21: /Library/Frameworks/R.framework/Versions/4.0/Resources/library/summerrband/extdata/gel_01.txt
#> 22: /Library/Frameworks/R.framework/Versions/4.0/Resources/library/summerrband/extdata/gel_01.txt
#> 23: /Library/Frameworks/R.framework/Versions/4.0/Resources/library/summerrband/extdata/gel_01.txt
#> 24: /Library/Frameworks/R.framework/Versions/4.0/Resources/library/summerrband/extdata/gel_01.txt
#> file
#> gel_id
#> 1: gel_01
#> 2: gel_01
#> 3: gel_01
#> 4: gel_01
#> 5: gel_01
#> 6: gel_01
#> 7: gel_01
#> 8: gel_01
#> 9: gel_01
#> 10: gel_01
#> 11: gel_01
#> 12: gel_01
#> 13: gel_01
#> 14: gel_01
#> 15: gel_01
#> 16: gel_01
#> 17: gel_01
#> 18: gel_01
#> 19: gel_01
#> 20: gel_01
#> 21: gel_01
#> 22: gel_01
#> 23: gel_01
#> 24: gel_01
#> gel_id
Let’s assign some metadata along with the tunes:
my_data <- iqtl_meta(my_file, meta_data = list(conc = c(2^seq(10, 0), 1),
protein = "protA",
ligand = "DNA1"))
head(my_data)
#> lane_id band_id vol vol_frac vol+bkg CAL MW Rf
#> 1: lane_1 band_0 708701.2 0.2784222 11036572 NA NA 0.711
#> 2: lane_1 band_1 1836717.8 0.7215778 10316699 NA NA 0.318
#> 3: lane_2 band_0 1058242.1 0.3514965 13741044 NA NA 0.688
#> 4: lane_2 band_1 1952433.9 0.6485035 10790314 NA NA 0.305
#> 5: lane_3 band_0 1212407.0 0.4342488 12996290 NA NA 0.685
#> 6: lane_3 band_1 1579557.0 0.5657512 9462001 NA NA 0.282
#> file
#> 1: /Library/Frameworks/R.framework/Versions/4.0/Resources/library/summerrband/extdata/gel_01.txt
#> 2: /Library/Frameworks/R.framework/Versions/4.0/Resources/library/summerrband/extdata/gel_01.txt
#> 3: /Library/Frameworks/R.framework/Versions/4.0/Resources/library/summerrband/extdata/gel_01.txt
#> 4: /Library/Frameworks/R.framework/Versions/4.0/Resources/library/summerrband/extdata/gel_01.txt
#> 5: /Library/Frameworks/R.framework/Versions/4.0/Resources/library/summerrband/extdata/gel_01.txt
#> 6: /Library/Frameworks/R.framework/Versions/4.0/Resources/library/summerrband/extdata/gel_01.txt
#> gel_id conc protein ligand
#> 1: gel_01 1024 protA DNA1
#> 2: gel_01 1024 protA DNA1
#> 3: gel_01 512 protA DNA1
#> 4: gel_01 512 protA DNA1
#> 5: gel_01 256 protA DNA1
#> 6: gel_01 256 protA DNA1
Of course, there is a batch function (iqtl_import_all
) too.
Four lines to sing:
library(magrittr) # for the pipe operator
my_data %>%
dplyr::filter(band_id == "band_1") %>%
dplyr::group_by(protein, ligand) %>%
model_cleanly_groupwise(fit_Kd, formula = vol_frac ~ conc,
newdata = data.frame(conc = 10^seq(0, 3, length.out = 100))) %>%
model_display(color = ligand) + ggplot2::facet_wrap(ggplot2::vars(protein))
my_data %>%
dplyr::filter(band_id == "band_1") %>%
dplyr::group_by(protein, ligand) %>%
model_cleanly_groupwise(fit_Kd, formula = vol_frac ~ conc) %>%
dplyr::select(tidy) %>% tidyr::unnest(tidy)
#> Adding missing grouping variables: `protein`, `ligand`
#> # A tibble: 3 × 7
#> # Groups: protein, ligand [1]
#> protein ligand term estimate std.error statistic p.value
#> <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl>
#> 1 protA DNA1 lower 0.0614 0.00983 6.25 1.50e- 4
#> 2 protA DNA1 upper 0.790 0.0244 32.3 1.27e-10
#> 3 protA DNA1 K_d 119. 14.4 8.25 1.73e- 5
We can also employ a model that doesn’t assume excess of the
non-titrated species R. So, when we provide its intial (total)
concentration R0
before the equilibrium is reached:
my_data %>%
dplyr::filter(band_id == "band_1") %>%
dplyr::group_by(protein, ligand) %>%
model_cleanly_groupwise(fit_Kd, formula = vol_frac ~ conc, R0 = 2.0) %>%
dplyr::select(tidy) %>% tidyr::unnest(tidy)
#> Adding missing grouping variables: `protein`, `ligand`
#> # A tibble: 3 × 7
#> # Groups: protein, ligand [1]
#> protein ligand term estimate std.error statistic p.value
#> <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl>
#> 1 protA DNA1 lower 0.0617 0.00985 6.26 1.48e- 4
#> 2 protA DNA1 upper 0.789 0.0245 32.2 1.33e-10
#> 3 protA DNA1 K_d 118. 14.4 8.15 1.91e- 5
It is further possible to include a Hill slope if need be and to switch between differen fitting algorithms in R.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.