Метод 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")

Мы видим, что расчетные концентрации при каждой новой оптической плотности лежат на линиях, соединяющих точки калибровки.

Другие вопросы по тегам