Как найти время удвоения ячеек с диаграммой рассеяния в R? - PullRequest
0 голосов
/ 02 февраля 2020

Я пытаюсь рассчитать время удвоения клеток, используя диаграмму рассеяния. Это мой фрейм данных

df = data.frame("x" = 1:5, "y" = c(246, 667, 1715, 4867, 11694))

, и я построил этот фрейм данных, используя этот код

plot(df$x, df$y, xlab = "days", ylab = "cells mL -1")

Кто-нибудь знает, как рассчитать время удвоения этих ячеек, используя график? уравнение для удвоения времени равно (ln(2)/rate constant)

Ответы [ 3 ]

2 голосов
/ 02 февраля 2020

График log2(y) против x, подавляющий ось Y, чтобы мы могли построить более хорошую. Мы также немного улучшили метку оси Y. Затем используйте axis, чтобы построить симпатичную ось и рассчитать время удвоения. Обратите внимание, что формула для удвоения времени в вопросе работает, если константа скорости является наклоном линии регрессии log (y) ~ x, но если мы используем регрессию log2 (y) ~ x, т.е. log2 вместо log, то правильная формула просто 1 / наклон. Мы показываем оба ниже.

plot(df$x, log2(df$y), xlab = "days", ylab = "cells/mL", yaxt = "n")
s <- 1:round(log2(max(df$y)))
axis(2, s, parse(text = sprintf("2^%d", s)))

fm <- lm(log2(y) ~ x, df)
abline(fm)

doubling.time <- 1/coef(fm)[[2]]
doubling.time
## [1] 0.7138163

log(2)/coef(lm(log(y) ~ x, df))[[2]] # same
## [1] 0.7138163

legend("topleft", paste("doubling time:", round(doubling.time, 3), "days"), bty = "n")

screenshot

0 голосов
/ 02 февраля 2020

Вы можете визуализировать постоянную скорость изменения с помощью ggplot2, соответственно масштабируя ось Y:

library(dplyr)
library(ggplot2)
library(broom)
library(scales)

df = data.frame("x" = 1:5, "y" = c(246, 667, 1715, 4867, 11694))

fit <- lm(data = df, log2(y) ~ x)
tidy_fit <- tidy(fit) %>% 
  mutate(x = 3, y = 2048)

ggplot(df, aes(x = x, y = y)) +
  geom_point() +
  scale_y_continuous(name = "log2(y)", 
                     trans = 'log2', 
                     breaks = trans_breaks("log2", function(x) 2^x),
                     labels = trans_format("log2", math_format(2^.x))) +
  geom_smooth(method = "lm", se = FALSE) +
  geom_text(tidy_fit,
            mapping = aes(
              x = x,
              y = y,
              label = paste0("log2(y) = ", round(estimate[1], 2), " + ", round(estimate[2], 2), "x",
                             "\n", "Doubling Time: ", round(1 / tidy_fit$estimate[2], 2), " Days")
            ),
            nudge_x = -1,
            nudge_y = 0.5,
            hjust = 0)

Создано в 2020-02- 03 представителем пакета (v0.3.0)

0 голосов
/ 02 февраля 2020

Вы можете построить точки, чтобы показать экспоненциальный рост, а затем линеаризовать функцию, применив log2 к значениям y. С этим вы можете построить и выполнить линейную подгонку:

 df = data.frame("x" = 1:5, "y" = c(246, 667, 1715, 4867, 11694))
 plot(df)  # plot not displayed
 plot(df$x, log2(df$y))
 abline(lm(log2(y)~x,df))

enter image description here

 lm(log2(y)~x,df)
#-------------------
Call:
lm(formula = log2(y) ~ x, data = df)

Coefficients:
(Intercept)            x  
      6.563        1.401    #the x-coefficient is the slope of the line
#---------------------

log(2)/1.4

#[1] 0.4951051

Проверка с оригиналом (не отображается график, который выглядит как разумная оценка удвоения времени. Обязательно процитируйте эту публикацию, если это окажется проблемой с домашней работой.

Если бы мне было поручено использовать исходный график, сначала нарисуйте экспоненциальную кривую вручную. Нарисуйте две горизонтальные линии при y = 2000 и y = 4000, а затем отбросьте перпендикулярные линии от их пересечений с кривой и считайте разницу в значениях x на горизонтальной оси. Это то, что я имел в виду в своем комментарии выше, что я «проверил» значение log2 / x-coef для чувствительности.

...