Question

I have made a graph with four growth curves using ggplot2.

Hopefully the code below should produce the graph if anyone wants to try.

I want to find a value for the maximum slopes on each of the lines, taken over say 4 time points.

Can anyone give any ideas how to go about this?

library(ggplot2)
dat <- structure(list(TIME = c(0L, 2L, 4L, 6L, 8L, 10L, 12L, 14L, 16L, 
                           18L, 20L, 22L, 24L, 26L, 28L, 30L, 0L, 2L, 4L, 6L, 8L, 10L, 12L, 
                           14L, 16L, 18L, 20L, 22L, 24L, 26L, 28L, 30L, 0L, 2L, 4L, 6L, 
                           8L, 10L, 12L, 14L, 16L, 18L, 20L, 22L, 24L, 26L, 28L, 30L, 0L, 
                           2L, 4L, 6L, 8L, 10L, 12L, 14L, 16L, 18L, 20L, 22L, 24L, 26L, 
                           28L, 30L), OD600 = c(0.2202, 0.2177, 0.2199, 0.2471, 0.2834, 
                                                0.357, 0.4734, 0.647, 0.898, 1.1959, 1.3765, 1.3978, 1.3948, 
                                                1.3928, 1.3961, 1.4018, 0.24, 0.2317, 0.2328, 0.2522, 0.2748, 
                                                0.3257, 0.4098, 0.5455, 0.7387, 0.9904, 1.2516, 1.3711, 1.3713, 
                                                1.3703, 1.3686, 1.3761, 0.2266, 0.2219, 0.2245, 0.2401, 0.2506, 
                                                0.2645, 0.3018, 0.3484, 0.4216, 0.5197, 0.666, 0.872, 1.1181, 
                                                1.2744, 1.3079, 1.2949, 0.2389, 0.2242, 0.2315, 0.2364, 0.2372, 
                                                0.2373, 0.2306, 0.2385, 0.236, 0.2331, 0.2379, 0.2334, 0.2336, 
                                                0.2339, 0.2389, 0.2349), MMS = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
                                                                                 0, 0, 0, 0, 0, 0, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 
                                                                                 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 
                                                                                 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 
                                                                                 0.01, 0.01, 0.01, 0.01, 0.01, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 
                                                                                 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02)), .Names = c("TIME", 
                                                                                                                                                          "OD600", "MMS"), class = "data.frame", row.names = c(NA, -64L
                                                                                                                                                                                                               ))
graph = ggplot(data=dat, aes(x=TIME, y=OD600))
graph + geom_line(aes(colour=factor(MMS)), alpha=1) +
opts(title="Log growth curves: change in cell density with increasing concentrations of MMS")+
scale_y_log10()

Many thanks

Était-ce utile?

La solution

Something like this?

cbind(
  MMS = unique(dat$MMS),
  do.call(
    rbind,
    lapply(
      unique(dat$MMS),
      function(x) {
        tdat <- dat[dat$MMS == x, ]
        response <- tdat$OD600
        timepoints <- tdat$TIME
        rise <- (response[4:length(response)] - response[1:(length(response) - 3)])
        run <- (timepoints[4:length(timepoints)] - timepoints[1:(length(timepoints) - 3)])
        slopes <- c(rep(NA, 3), rise/run)
        return(
          list(
            max_slope = max(slopes, na.rm = T), 
            time = timepoints[which(slopes == max(slopes, na.rm = T)) - 3]
          )
        )
      }
    )
  )
)

Gives:

     MMS   max_slope   time
[1,] 0     0.1215833   14  
[2,] 0.005 0.1176833   14  
[3,] 0.01  0.1014      20  
[4,] 0.02  0.002166667 2   

Autres conseils

If you do not need interpolation, @lockedoff 's solution is fine, but are you sure you want 14 for both initial concentrations?

To get better values, you should find the time of inclination, i.e. where the second derivative is zero. This can be tricky with real data, and you should plot the derivatives first to see if this is possible.

You will note that concentration 0.02 is hopeless, and if this were my experiment, I would go back to the lab to check if this really was 0.02 or rather 0.2. If not, you have a VERY unusual substance, be careful, the reviewer will send it back without a good explanation.

Use predict.smooth.spline to compute the derivatives, and uniroot to find the point where the slope ==0.

library(plyr)
smoothingDf = 8 # Adujst this. Larger values-> Smoother curves
# Check smoothing of second derivatives
deriv2 = ddply(dat,.(MMS),function(x){
  data.frame(predict(smooth.spline(x$TIME,x$OD600,df=smoothingDf),0:max(x$TIME),2))
})
ggplot(data=deriv2, aes(x=x, y=y))+ geom_line(aes(colour=factor(MMS)))
# No chance to get a good value for 0.02, remove it
dat1 = dat[dat$MMS != 0.02,]

ld50 = ddply(dat1,.(MMS),function(x){
  sp = smooth.spline(x$TIME, x$OD600, df=smoothingDf)
  # Try to find a good initial range
  app = predict(sp,min(x$TIME):max(x$TIME),2)
  lower = app$x[which.max(app$y)]
  upper = app$x[which.min(app$y)]
  uniroot(function(t)  predict(sp,t,2)$y ,lower=lower,upper=upper )$root
})

Result look ok, but without 0.02

    MMS       V1
1 0.000 16.23093
2 0.005 17.43714
3 0.010 22.29317

Second derivatives. Note that 0.02 is not useful

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top