Метод R точка-точка для вычисления x по y
Я использую коммерческий набор для ELISA, который содержит четыре стандарта. Эти стандарты используются для создания стандартной кривой с оптическими плотностями считывающего устройства ELISA по оси y и концентрациями в международных единицах на миллиметр по оси x.
Теперь мне нужно использовать эту стандартную кривую, чтобы получить концентрации для образцов, в которых у меня есть только показания оптической плотности. В инструкциях к набору ELISA специально указано: «Использовать построение« точка-точка »для расчета стандартной кривой с помощью компьютера».
Я предполагаю, что они имеют в виду получить значение x, наблюдая, где y попадает на линию между точками на стандартной кривой и опускается оттуда к оси x. Проблема в том, что я понятия не имею, как это сделать в r (это то, что я использую для своего полного аналитического конвейера). Я тщетно искал какие-либо пакеты, функции или код, которые соответствуют «точка-точка», но ничего не нашел. Все пакеты R, которые имеют дело с данными ELISA и / или стандартными кривыми (например,
drc
а также
ELISAtools
Кажется, они делают что-то гораздо более сложное, т. е. подходят к логарифмической модели и учитывают различия между пластинами и т. д., что мне не нужно.
Обратите внимание, что мне не нужно визуализировать стандартную кривую - мне просто нужен метод для получения концентраций из данных стандартной кривой на основе двухточечной линии.
Вот несколько примеров данных:
# Data for standard curve:
scdt <- data.table(id = c("Cal1", "Cal2", "Cal3", "Cal4"),
conc = c(200, 100, 25, 5),
od = c(1.783, 1.395, 0.594, 0.164))
> scdt
id conc od
1: Cal1 200 1.783
2: Cal2 100 1.395
3: Cal3 25 0.594
4: Cal4 5 0.164
# Some example OD values for which I would like to derive concentration:
unknowns <- c(0.015, 0.634, 0.891, 1.510, 2.345, 3.105)
В примеры значений, которые я хочу найти для x, я также включил некоторые, которые выходят за пределы диапазона, охватываемого стандартами, поскольку это время от времени также происходит в моих реальных данных. Производитель набора не рекомендует сообщать МЕ / мл для чего-либо с OD, превышающим самый высокий стандарт (Cal1), что является разумным.
Как я могу выполнить R-эквивалент нахождения x с помощью линейки и миллиметровой бумаги по стандартной кривой и как это формально называется? (Я думаю, что одна из причин, по которой я мог ничего не найти, заключается в том, что «точка-точка» - это не математический термин, но для этого должен быть один - это интерполяция?).
1 ответ
Похоже, вам нужна простая линейная интерполяция. Это достигается в R с помощью функции
approx
. Вы скармливаете ему свои известные значения x, ваши известные значения y и новые значения x, для которых вы хотите получить соответствующие значения y. (Обратите внимание, что не имеет значения, какую переменную вы называете x, а какую - y, если вы последовательны).
Чтобы получить результат, с которым легче работать, мы можем преобразовать ответ во фрейм данных с соответствующими именами столбцов:
new_data <- approx(scdt$od, scdt$conc, xout = unknowns) |>
setNames(c("od", "conc")) |>
as.data.frame()
new_data
#> od conc
#> 1 0.015 NA
#> 2 0.634 28.74532
#> 3 0.891 52.80899
#> 4 1.510 129.63918
#> 5 2.345 NA
#> 6 3.105 NA
Обратите внимание, что (как рекомендует производитель), оптическая плотность, выходящая за пределы крайних диапазонов ваших точек калибровки, даст
NA
значения для концентрации. Чтобы получить их, вам нужно будет экстраполировать, а не интерполировать
Просто чтобы убедиться, что это именно то, что вы ищете, давайте нарисуем результаты этой интерполяции красным цветом на кривой, сформированной из исходных данных:
plot(scdt$od, scdt$conc, type = "l", lty = 2)
points(scdt$od, scdt$conc)
points(new_data$od, new_data$conc, col = "red")
Мы видим, что расчетные концентрации при каждой новой оптической плотности лежат на линиях, соединяющих точки калибровки.