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