Nucleic acid Melting Curve Analysis is a powerful method to investigate the interaction of double stranded nucleic acids. Many researchers rely on closed source software which is not ubiquitously available, and gives only little control over the computation and data presentation. R in contrast, is open source, highly adaptable and provides numerous utilities for data import, sophisticated statistical analysis and presentation in publication quality. This article covers methods, implemented in the MBmca package, for DNA Melting Curve Analysis on microbead surfaces. Particularly, the use of the second derivative melting peaks is suggested as an additional parameter to characterize the melting behavior of DNA duplexes. Examples of microbead surface Melting Curve Analysis on fragments of human genes are presented.
Nucleic acid Melting Curve Analysis (MCA) is a central step in nucleic
acid
The MCA is a real-time monitoring of a heat-induced double stranded
nucleic acid dissociation which can be monitored by the change of the
referenced mean/median fluorescence intensity (
By definition, the melting point (
To the best of our knowledge we are the first to suggest the peak
values, designated
In Rödiger et al. (2012) we reported the VideoScan platform which provides a
technology for various bioanalytical applications
In brief, different thermo-tolerant microbead populations, defined by varying ratios of two impregnated fluorophores, are included in the reaction. Each microbead population presents gene specific capture probes on their surfaces (Figure 2).
Particularly, short 3’ or 5’ quencher/fluorophore-labeled probes were
used
In biomedical research many scientists rely on closed source software which gives only little control over the computation and data presentation. Most importantly reproduction of data and calculations from other research is limited or impossible. Just recently this was discussed in the two journals Nature and Science (Ince, L. Hatton, and J. Graham-Cumming 2012; Morin, J. Urban, P. D. Adams, I. Foster, A. Sali, D. Baker, and P. Sliz 2012). Closed software tied to limited tasks, hinders the import of custom data and gives no control over or insight into the source code and therefore is not ideal for research. Basically any open computing language or tool can be used to overcome these issues. But R fulfills all requirements mentioned above. It is in an open system with numerous utilities for data import, processing, sophisticated statistical analysis and presentation. Many R packages are peer-reviewed and undergo an intensive testing. Most importantly R is open source and therefore methods or results can be reproduced independently.
One implementation for MCA with R is available from the excellent
qpcR package by Ritz and A.-N. Spiess (2008).
The meltcurve()
function provides a sophisticated method to process
melting curve data from qPCR experiments in solution. It uses automatic
optimization procedures to smooth and fit curves. This function is ideal
for the identification of multiple
There is an ongoing interest to understand the melting behavior of
nucleic acids on surfaces. Particularly the effects of the reaction
environment, e. g., the microbead surface change due to functional
groups or the density of bCP has not been investigated intensively for
multiplex microbead assays. During the development of the VideoScan
platform a simple and lightweight method for automatic screening,
quality control and automatic detection of a limited number of melting
peaks was needed. This article describes the
MBmca
The MBmca package includes the functions MFIerror()
,
mcaPeaks()
mcaPeaks()
is a function which can be used to estimate the
number and location of the approximate local minima and maxima of
melting curve data. This can be used to define a temperature range
for MCA, melting curve quality control or peak height threshold
definition (see Roediger (2013)).mcaSmoother()
for data inspection and
preprocessing and diffQ()
, diffQ2()
for MCA. The data sets
DualHyb
, DMP
and MultiMelt
are raw fluorescence data measured with
the VideoScan platform (Rödiger et al. 2012) on microbead surfaces. The
data are arranged as data.frame
s starting in the first column with the
temperature (°C) followed by the fluorescence values (refMFI). The
package has a dependency to
robustbase
(Rousseeuw, C. Croux, V. Todorov, A. Ruckstuhl, M. Salibian-Barrera, T. Verbeke, M. Koller, and M. Maechler 2013) and uses mainly standard R functions. Elementary steps,
e. g., data import, are similar to other R functions and thus used as
described elsewhere (Venables, D. M. Smith, and the R Core Team 2013).
One of the fundamental strengths of the MCA on microbead surfaces is the
achievable multiplex level. The MFIerror()
function was developed for
a fast multiple comparison of the temperature dependent variance of
MFIerror()
returns an object of the class data.frame
with
columns “Temperature”, “Location” (Mean, Median), “Deviation” (Standard
Deviation, Median Absolute Deviation) and “Coefficient of Variation”.
The argument errplot
(default) sets MFIerror()
to plot the
results. In the default setting (CV = FALSE
) the mean with the
standard deviations is plotted. Using the argument rob = TRUE
the
median and the median absolute deviation (MAD) are plotted instead
of the mean and standard deviation.
If CV
is true the coefficient of variation (CV) is plotted.
Setting the argument RSD = TRUE
shows the relative standard
deviation (RSD) in percent.
In an example the mean raw fluorescence from multiplex melting curves of
twelve microbead populations was evaluated for the probes HPRT1 and
MultiMelt
data set). The probe system used corresponds
to Figure 2A. Ideally the variance between the
twelve microbead populations is low. MFIerror()
takes the first column
of MultiMelt
as temperature value and columns 2 to 13 for the probes
HPRT1 and columns 14 to 25 for
# Load MultiMelt data set.
data(MultiMelt)
# MFIerror for the HRPT1 data (column 2 to 13).
# The default settings of MFIerror show the the mean fluorescence and the
# standard deviation at a defined temperature.
MFIerror(MultiMelt[, 1], MultiMelt[, 2:13])
# MFIerror on the MLC-2v data (column 14 to 25).
MFIerror(MultiMelt[, 1], MultiMelt[, 14:25])
The corresponding plots are shown in Figure 4. The curves indicate that the different microbead populations show similar melting curve shapes but differ in height. At higher temperatures the values vary.
MFIerror()
with the argument rob = FALSE
was used to compare the mean and the
standard deviationof the temperature dependent fluorescence on twelve
microbead populations for A) HPRT1 and B)
When MFIerror()
is used with the argument CV = TRUE
the coefficient
of variation is presented (Figure 5). In the example
all CV values are low (
MFIerror()
with argument CV = TRUE
was used to plot the absolute
coefficient of variation for twelve microbead populations with A)
HPRT1 or B) We questioned how a single microbead population differs from the average
of all microbead populations. The mean output of MFIerror()
, with the
argument errplot = FALSE
, was subtracted by the fluorescence of
HPRT1 or HPRT1.mean
and
MLC2v.mean
.
# Load MultiMelt data set.
data(MultiMelt)
# Use MFIerror to calculate the mean fluorescence for HRPT1 and MLC-2v over all
# twelve microbead populations.
HPRT1.mean <- MFIerror(MultiMelt[, 1], MultiMelt[, 2:13], errplot = FALSE)
MLC2v.mean <- MFIerror(MultiMelt[, 1], MultiMelt[, 14:25], errplot = FALSE)
# Draw figures on the graphics device in a 2x6 array
par(mfrow = c(2, 6))
# Calculate the difference between the fluorescence of a single microbead population
# and the average of all twelve microbead populations. Plot the results.
for (i in 1:12) {
tmp.HPRT1 <- MultiMelt[, i + 1] - HPRT1.mean[, 2]
tmp.MLC2v <- MultiMelt[, i + 13] - MLC2v.mean[, 2]
plot(MultiMelt[, 1], tmp.HPRT1, main = paste("Pop", i, sep = ": "),
pch = 19, ylim = c(-0.28, 0.28), xlab = "T", ylab = "delta")
abline(h = 0, col = "black")
abline(v = 65, col = "blue")
points(MultiMelt[, 1], tmp.MLC2v, pch = 15, col = 2)
}
Figure 6 shows low differences (delta) at temperatures below 65 °C due to near complete quenching. Above this temperature (start of the DNA probe strand dissociation) the differences to the mean fluorescence of all microbead populations grow. Apart from “Pop: 1” changes appear systematically which indicates that the bCP/DPs have a similar melting behavior on all microbead populations.
MFIerror()
, was subtracted from the fluorescence of single
population (“Pop:”). • The differentiation is the central step of the MCA. Accessible textbook
information confirms that differentiation may result in the
amplification of noise. To reduce the noise, R provides numerous
possibilities to fit smooth functions and use filter functions. Such
operations may alter the curve shape considerably and thus lead to
artificial results. Smooth functions available in R include the moving
average (filter()
,
stats), the LOWESS
smoother (lowess()
, stats) which applies locally-weighted polynomial
regression, fitting of a local polynomial regression (loess()
,
stats), Savitsky-Golay filter [sgolayfilt()
,
signal; The signal Developers (2013)], cubic
splines (smooth.spline()
, stats) or Friedman’s SuperSmoother
(supsmu()
, stats). Although smoothed data might provide the
impression of high quality data no guarantee for optimal results or that
no peaks were artificially introduced is given. A good practice is to
visualize the output combined with the original data. mcaSmoother()
uses smooth.spline()
and contains further helper function.
mcaSmoother()
should be used if the data may contain missing values,
high noise or if the temperature resolution of the melting curve data is
low (
Measurements from experimental systems may occasionally include
missing values (NA
). Function mcaSmoother()
uses approx()
approx()
(stats) further functions are available from
the zoo package
(Zeileis and G. Grothendieck 2005 e. g., na.approx()
, na.spline()
) and the
delftfews package
(Frasca 2012 na.fill()
, na.interpolate()
). approx()
was
integrated since further dependencies are omitted and a linear
interpolation is used.NA
s under the assumption that all measurements were
equidistant. The original data remain unchanged and only the NA
s
are substituted.
mcaSmoother()
calls smooth.spline()
to smooth the curve.
Different strengths can be set using the argument df.fact
(default 0.95). Internally it takes the degree of freedom value from
the spline and multiplies it with a factor between 0.6 and 1.1.
Values lower than 1 result in more strongly smoothed curves.
If the argument bgadj
is set TRUE
, bg
must be used to define a
temperature range for a linear background correctionlmrob()
. In case criteria for a robust linear regression are
violated lm()
is used automatically.
The argument Trange
can be used to define a temperature range of
the analysis.
To scale the fluorescence a Min-Max normalization
(Equation (6)) between 0 and 1 can be used by
setting the argument minmax
to TRUE
. This is useful if the
fluorescence values between samples vary considerably, for example
due to high background. An advantage of this normalization is the
preservation of the relationships between the values. However, on
surfaces normalization should be used with caution because it might
lead to the false impression that all microbeads carried equal
quantities of bCP.
The argument n
uses the spline()
function to increase the
temperature resolution of the melting curve data by mcaSmoother()
examples in
Roediger (2013)).
mcaSmoother()
returns an object of the class “data.frame
” with the
columns “x” (temperature) and “y” (fluorescence values). These can be
used to plot the preprocessed data. For example, three arbitrary chosen
strengths to smooth the curves (DMP
data set were used as follows:
# Load DMP data set.
data(DMP)
# Create plot with raw data.
plot(DMP[, 1], DMP[, 6], xlim = c(20, 95), xlab = "T [C]",
ylab = "refMFI", pch = 19, col = 8)
# Add minor tick marks to the abscissa.
require(Hmisc); minor.tick(nx = 20)
The function mcaSmoother()
is used in a loop to smooth the curve with
user defined strengths (lines()
it drawsminor.tick()
from the
Hmisc package
(Harrell Jr, C. Dupont, and et al 2013) to enhance the plot.
# Define three filter strengths (highest (0.6) to lowest (1.0)) and assign them
# to df.fact. Smooth the raw data and add the results as lines to the plot.
f <- c(0.6, 0.8, 1.0)
for (i in 1:3) {
lines(mcaSmoother(DMP[, 1], DMP[, 6], df.fact = f[i]), col = i, lwd = 2)
}
# Add a legend to the plot with the filter strengths.
legend(20, 1.5, paste("f", f, sep = ": "), cex = 1.2, col = 1:3,
bty = "n", lty = 1, lwd = 4)
mcaSmoother()
with different strengths (In the next example mcaSmoother()
was used with different arguments to
(i) smooth the data, (ii) remove the background and (iii) to perform a
Min-Max normalization. Data for HPRT1 (Figure 8A)
were taken from the MultiMelt
data set. The plot of
Figure 8B implies that it is sustainable to smooth the
curve. Not immediately obvious, the twelve microbead populations have
different final signal intensities. This is due to the different
quantities of surface bound bCPs (not shown). However, this is easily
visualized after a background correction (Figure 8C).
All curves appear similar in shape after the Min-Max normalization. This
indicates that there are no substantial differences between the
microbead populations which obfuscates further MCAs
(Figure 8D).
mcaSmoother()
. A) Raw fluorescence data of melting curves
from 12 microbead populations (“Pop:”). B) Smoothed curves with the
default settings (bg = c(41, 61)
, i.e., 41 °C to 61 °C) and linear trend
correction. D) Min-Max normalized
curves.The functions diffQ()
and diffQ2()
are used to calculate rsm
is avilable in both functions to double the
temperature resolution. This may also reduce noise.mcaSmoother()
as a starter function
to preprocess (e.g., moderate smoothing, missing value removal, type
check) the data automatically. First the approximate min()
and/or max()
from the
derivativesdiffQ()
there are further ways to
calculate the approximate derivative in R such as diff()
(base) or functions
from the fda package
(Ramsay, H. Wickham, S. Graves, and G. Hooker 2013).lm(Y ̃X I(X^2))
of the diffQ()
and diffQ2()
which try to catch cases where
an experiment went wrong. This includes a test if the data originate
from noise, a test which analyses the difference between the approximate
diffQ()
in Roediger (2013).diffQ()
is a major function it has
only a simple plot function. By setting the argument plot = TRUE
plots
for single melting curves can be investigated
(Figure 9). diffQ()
accepts further following
arguments:
fct
accepts min
or max
as argument and is used to define
whether to find a local minimum (“negative peak”) or local maximum
(“positive peak”).
fws
defines the number (
plot
defines if a single plot of the melting peak should be
created. If FALSE
(default) no plot is created.
negderiv
is used to change the sign of the derivatives. If TRUE
(default) then the first negative derivative is calculated. This
argument was implemented to compare different quencher / fluorophore
combinations (compare Figure 2).
Functions for a graphical output include peak
to show the peak
values and deriv
to show the first derivative with the color
assigned to col
. derivlimits
and derivlimitsline
show the
number of neighbors (vertiline
draws a vertical line at the
# Load MultiMelt data set.
data(MultiMelt)
# Draw figures on the graphics device in two columns.
par(mfrow = c(1, 2))
# Use mcaSmoother to check and smooth the raw data for HRPT1 (2) and MLC-2v (14)
# with the default setting.
# Plot the first derivative of the two samples.
for (i in c(2, 14)) {
tmp <- mcaSmoother(MultiMelt[, 1], MultiMelt[, i])
diffQ(tmp, plot = TRUE, vertiline = TRUE)
}
diffQ()
shows no melting peak plot. diffQ()
, with the argument
plot = TRUE
, can be used to show the melting peak (red dot) and fitted
region from the quadratic polynomial (line) of a single melting curve.
In this example HPRT1 (left) and MultiMelt
are used.For sophisticated analysis and plots it is recommended to use diffQ()
as part of the procedure. The arguments (e.g., peak
, deriv
) can be
used when a plot already exists. diffQ2()
calls instances of diffQ()
to calculate diffQ()
. Both diffQ()
and diffQ2()
return objects of the class
list
. Accessing components of lists is done as described elsewhere
(Roediger 2013; Venables, D. M. Smith, and the R Core Team 2013) either by name or by number.
diffQ()
and fitted region from the quadratic polynomial (orange line)
for A) HPRT1 and B) MultiMelt
.diffQ2()
was used to investigate effects of the surface capture probe
density which is represented by the maximal MultiMelt
.
In the following HPRT1 was used as example. The corresponding matrix
was called HPRT1
data.frame
need to be
adapted accordingly.
# Load MultiMelt data set.
data(MultiMelt)
# Create an empty matrix ("HRPT1") for the diffQ2 results (e.g., Tm).
HPRT1 <- matrix(NA, 12, 4, dimnames = list(colnames(MultiMelt[, 2:13]),
c("Fluo", "Tm", "Tm1D2", "Tm2D2")))
# Use mcaSmoother to check and smooth the raw data. Apply diffQ2 to the smoothed data,
# calculate the values for the extreme (minimum) and assign the results to "HRPT1".
for (i in 2:13) {
tmp <- mcaSmoother(MultiMelt[, 1], MultiMelt[, i])
tmpTM <- diffQ2(tmp, fct = min, verbose = TRUE)
HPRT1[i-1, 1] <- max(tmp[["y.sp"]])
HPRT1[i-1, 2] <- as.numeric(tmpTM[["TmD1"]][["Tm"]]) # Tm
HPRT1[i-1, 3] <- as.numeric(tmpTM[["xTm1.2.D2"]][1]) # Tm1D2
HPRT1[i-1, 4] <- as.numeric(tmpTM[["xTm1.2.D2"]][2]) # Tm2D2
}
The surface capture density was determined by max(tmp[["y.sp"]])
.
Subsequently the data from the matrices HPRT1
and MLC2v
were plotted
(Figure 11).
# Plot the Tm, Tm1D2 and Tm2D2 form the matrix "HRPT1" versus the surface capture
# probe density ("Fluo").
plot(HPRT1[, 1], HPRT1[, 2], xlab = "refMFI", ylab = "T [C]", main = "HPRT1",
xlim = c(2.1, 2.55), ylim = c(72, 82), pch = 19, col = 1:12, cex = 1.8)
# Add minor tick marks to the abscissa.
require(Hmisc); minor.tick(ny = 10)
points(HPRT1[, 1], HPRT1[, 3], pch = 15)
points(HPRT1[, 1], HPRT1[, 4], pch = 15)
# Add trend lines (lm()) for the peak values.
abline(lm(HPRT1[, 2] ~ HPRT1[, 1])) # Tm
abline(lm(HPRT1[, 3] ~ HPRT1[, 1])) # Tm1D2
abline(lm(HPRT1[, 4] ~ HPRT1[, 1])) # Tm2D2
The melting temperature of
DP | ||||
---|---|---|---|---|
76.08 | 73.99 | 78.51 | ||
HPRT1 | 77.85 | 75.39 | 80.31 |
The bCPs were hybridized with DPs (compare Figure 3)
in order to generate bimodal melting peak patternsDMP
data
set were arranged in the data frame data.tmp
and an empty plot was
created.
# Load DMP data set.
data(DMP)
# Use the temperature (column 1) and fluorescence (column 3, 5, 6), assign them to
# a temporary data frame and add the sample names.
data.tmp <- data.frame(DMP[, 1], DMP[, 3], DMP[, 5], DMP[, 6])
names(data.tmp) <- c("T [C]", "Poly(dA)20 & MLC-2v",
"Poly(dA)20 & aCS", "Poly(dA)20")
# Create a plot with the selected raw data.
plot(NA, NA, xlim = c(20, 95), ylim = c(-0.6, 0.6), xlab = "T [C]",
ylab = "-d(refMFI) / d(T)", main = "", pch = 19, col = 1:12, cex = 1.8)
# Add minor tick marks to the abscissa.
require(Hmisc); minor.tick(nx = 10)
Thereafter, the data were preprocessed with mcaSmoother()
in a loop.
The arguments bg = c(20, 35)
and bgadj
were used to adjust the
background signal. This causes mcaSmoother()
to use the subset of the
data between 20 °C and 35 °C for the linear regression and background
correction. To determine the diffQ()
was used with min
and max
for argument fct
, respectively. In the loop the corresponding RES
and the melting curve is drawn.
In addition to the lines the
# Create an empty matrix ("RES") for the results of the peak values (Tm) and peak
# heights (F).
RES <- matrix(NA, 3, 4, dimnames = list(colnames(data.tmp[, 2:4]),
c("F 1", "Tm 1", "F 2", "Tm 2")))
# Use mcaSmoother to preprocess the raw data.
# Use a background correction (20-35 degree Celsius).
# Apply the smoothed data to diffQ, calculate the peak values for the extremes
# (minimum and maximum) and assign the results to the matrix "RES".
# Plot the smoothed data with the peak values and peak heights.
for (i in c(1:3)) {
tmp <- mcaSmoother(data.tmp[, 1], data.tmp[, i + 1], bgadj = TRUE, bg = c(20, 35))
lines(data.frame(diffQ(tmp, verbose = TRUE)["xy"]), col = i)
RES[i, 1] <- round(diffQ(tmp, fct = max)[[2]], 2) #fluoTm
RES[i, 2] <- round(diffQ(tmp, fct = max)[[1]], 2) #Tm
RES[i, 3] <- round(diffQ(tmp, fct = min)[[2]], 2) #fluoTm
RES[i, 4] <- round(diffQ(tmp, fct = min)[[1]], 2) #Tm
}
legend(20, 0.6, names(data.tmp[, 2:4]), lty = 1, bty = "n", col = 1:3)
points(RES[, 2], RES[, 1], pch = 19, col = 4, cex = 2)
points(RES[, 4], RES[, 3], pch = 19, col = 1, cex = 2)
Figure 12 shows that RES
are shown in Table 2. The
0.59 | 49.6 | 74.7 | |||
0.02 | 91.7 | 49.7 | |||
0.20 | 47.9 | 73.9 |
SNPs are important diagnostic markers for example in cardiac diseases
(Villard, L. Duboscq-Bidot, P. Charron, A. Benaiche, V. Conraads, N. Sylvius, and M. Komajda 2005; Muthumala, F. Drenos, P. M. Elliott, and S. E. Humphries 2008). SNPs alter thermodynamic properties of
dsDNA and thus the
The temperature resolution was 0.5 °C per step. The DualHyb
data were
preprocessed with mcaSmoother()
in a loop. The RES
.
# Load DualHyb data set.
data(DualHyb)
# Create an empty matrix ("RES") for the results of the peak values (TmD1)
# and calculated peak heights (fluoTm).
RES <- matrix(NA, 4, 2, dimnames = list(colnames(DualHyb[, 2:5]),
c("fluoTm", "TmD1")))
# Use mcaSmoother to check and smooth the raw data.
# Apply diffQ to the smoothed data, calculate the peak values for the extreme
# (minimum) and assign the results to the matrix "RES".
for (i in c(1:4)) {
tmp <- mcaSmoother(DualHyb[, 1], DualHyb[, i + 1])
RES[i, 1] <- round(diffQ(tmp, fct = min)[[2]], 2) # fluoTm
RES[i, 2] <- round(diffQ(tmp, fct = min)[[1]], 2) # Tm
}
Calling RES
gives the following output:
# Call RES to show the peak values and peak heights.
RES
fluoTm TmD1
MLC2v -0.48 76.62
SERCA2 -0.04 62.87
VIM.w.Mutation -0.33 71.67
VIM.wo.Mutation -0.32 73.29
The algorithm calculated for the muted VIM a diffQ(..., verbose = TRUE)[["temperature"]]
.
Experimental hardware platforms often require the development of adapted software, in particular in cases where the hardware affects the signal (e. g., photo bleaching). R is an optimal tool for such scenarios. Within this article we proposed the MBmca package for MCA on microbead surfaces. The functions of the package were used for different detection-probe-systems, including direct hybridization of DNA dulexes or dual-hybridization probes for SNP detection. The capture-probe-systems produce unique melting profiles which allowed simple and rapid discrimination of different DNA sequences in one sample. The functions are useful to preprocess and inspect the data and to determine melting temperatures of immobilized DNA fragments. While used in this study for identification and quantification of biomolecules attached to microbeads it is applicable for MCA in solution too (not shown).
It was assumed that a quadratic polynomial at the approximate melting
peaks can be used to calculate an accurate
Part of this work was funded by the BMBF InnoProfile-Projekt 03 IP 611. Grateful thanks belong to the authors of the cited R packages, the R community and the RKWard developers.
qpcR, MBmca, robustbase, stats, signal, zoo, delftfews, Hmisc, base, fda
Bayesian, ClinicalTrials, Databases, Econometrics, Environmetrics, Finance, FunctionalData, MissingData, NumericalMathematics, ReproducibleResearch, Robust, TimeSeries
This article is converted from a Legacy LaTeX article using the texor package. The pdf version is the official version. To report a problem with the html, refer to CONTRIBUTE on the R Journal homepage.
mcaPeaks()
is a function which can be used to estimate the
number and location of the approximate local minima and maxima of
melting curve data. This can be used to define a temperature range
for MCA, melting curve quality control or peak height threshold
definition (see Roediger (2013)).[↩]approx()
(stats) further functions are available from
the zoo package
(Zeileis and G. Grothendieck 2005 e. g., na.approx()
, na.spline()
) and the
delftfews package
(Frasca 2012 na.fill()
, na.interpolate()
). approx()
was
integrated since further dependencies are omitted and a linear
interpolation is used.[↩]minor.tick()
from the
Hmisc package
(Harrell Jr, C. Dupont, and et al 2013) to enhance the plot.[↩]rsm
is avilable in both functions to double the
temperature resolution. This may also reduce noise.[↩]diffQ()
there are further ways to
calculate the approximate derivative in R such as diff()
(base) or functions
from the fda package
(Ramsay, H. Wickham, S. Graves, and G. Hooker 2013).[↩]diffQ()
in Roediger (2013).[↩]data.frame
need to be
adapted accordingly.[↩]Text and figures are licensed under Creative Commons Attribution CC BY 4.0. The figures that have been reused from other sources don't fall under this license and can be recognized by a note in their caption: "Figure from ...".
For attribution, please cite this work as
Stefan, et al., "Surface Melting Curve Analysis with R", The R Journal, 2013
BibTeX citation
@article{RJ-2013-024, author = {Stefan, and Alexander, and Schimke, Ingolf}, title = {Surface Melting Curve Analysis with R}, journal = {The R Journal}, year = {2013}, note = {https://rjournal.github.io/}, volume = {5}, issue = {2}, issn = {2073-4859}, pages = {37-52} }