class KaplanMeier::Survival

Public Class Methods

new() click to toggle source
# File lib/kaplan_meier/survival.rb, line 6
def initialize
  @data = {}
end

Public Instance Methods

add(time, event_count = 1, censored_count = 0) click to toggle source
# File lib/kaplan_meier/survival.rb, line 10
def add(time, event_count = 1, censored_count = 0)
  leaf = @data[time]
  if leaf.nil?
    @data[time] = KaplanMeierCoord.new(time, event_count, censored_count)
  else
    leaf.add_count(event_count: event_count, censored_count: censored_count)
  end
end
initial_at_risk_count() click to toggle source
# File lib/kaplan_meier/survival.rb, line 19
def initial_at_risk_count
  self.to_a.length
end
median() click to toggle source
# File lib/kaplan_meier/survival.rb, line 73
def median
  probabilities = self.probabilities
  result = nil
  probabilities.each do |prob|
    if prob[:probability] < 0.5
      result = prob[:time]
      break
    end
  end
  result
end
probabilities(as_percent: false) click to toggle source
# File lib/kaplan_meier/survival.rb, line 38
def probabilities(as_percent: false)
  return [] if @data.keys.length < 1
  result = [{time: 0, probability: (as_percent ? 100.0 : 1.0)}]
  time_points = self.to_a
  n = time_points.length
  percent = 1.0
  (0...n).each do |i|
    percent = (1.0 - (time_points[i][:event].to_f / (n - i))) * percent.to_f
    result << {time: time_points[i][:time_point], probability: as_percent ? (percent * 100.0).round(2) : percent}
  end
  result
end
range(start_time: 0, end_time: nil) click to toggle source
# File lib/kaplan_meier/survival.rb, line 51
def range(start_time: 0, end_time: nil)
  (start_time..(end_time || time_periods[-1])).to_a
end
raw_probabilities(as_percent: false) click to toggle source
# File lib/kaplan_meier/survival.rb, line 33
def raw_probabilities(as_percent: false)
  return [] if @data.keys.length < 1
  self.probabilities.map {|i| as_percent ? (i[:probability] * 100.0).round(2) : i[:probability]}
end
time_periods() click to toggle source
# File lib/kaplan_meier/survival.rb, line 23
def time_periods
  @data.keys.sort
end
to_a() click to toggle source
# File lib/kaplan_meier/survival.rb, line 27
def to_a
  @data.keys.sort.map do |k|
    @data[k].to_a
  end.flatten
end
values_for_range(start_time: 0, end_time: nil, as_percent: false) click to toggle source
# File lib/kaplan_meier/survival.rb, line 55
def values_for_range(start_time: 0, end_time: nil, as_percent: false)
  return [] if @data.keys.length < 1
  result = []
  range_array = range(start_time: start_time, end_time: end_time)
  periods = probabilities(as_percent: as_percent)
  current_period = periods.shift
  range_value = range_array.shift
  until range_value.nil?
    if periods[0] && range_value >= periods[0][:time]
      current_period = periods.shift
      next
    end
    result << current_period[:probability]
    range_value = range_array.shift
  end
  result
end