适当的审查和截断以进行客户生存分析
Appropriate censoring and truncation for customer survival analysis
我正在处理一个常规的客户生存分析问题。在这里,我分析了在 2008-1-1 和 2018-1-1 之间注册的客户。客户可在此期间随时注册,并可在2018-1-1截止日期期间或之后随时退出。
示例数据如下所示。第一列是标识符,第二列是截至 2018 年 1 月 1 日的状态:“1 表示已取消,0 表示未取消”。第三列是他们注册日期与 2008-1-1 之间的周数。最后一列是取消日期和 2008-1-1 之间的周数(如果在 2018-1-1 之前取消)或 2008-1-1 和 2018-1-1 之间的周数(如果没有取消或之后取消) 2018-1-1)。
dput() 生成上述数据集
structure(list(PrimaryConstituentSKey = c(1370591L, 1225587L,
1264156L, 1266355L, 3080025L), Cancelled = c(1, 1, 1, 1, 0),
startTime = c(0, 0, 0, 1, 101), stopTime = c(10, 34, 5, 9,
123)), row.names = c(NA, -5L), class = "data.frame")
我将使用此数据创建一个 'Survival object',稍后将其用作我的生存模型的响应变量。
理论题
whcih 我在交叉验证中询问但还没有得到回应 (https://stats.stackexchange.com/questions/423802/appropriate-censoring-and-truncation-for-customer-survival-analysis):
我想知道这种方法是否有意义?我特别想知道在这种情况下适合什么样的审查/截断?我相信它是左截断的(因为人们可以在 2008-1-1 之后的任何时间加入)和右审查(他们中的一些人会在之后的某个时间离开2018-1-1 也)。
编码问题:
如果我的假设是正确的(数据被左截断右截尾),下面的代码是否正确生成生存对象?
S <- Surv(time = df$startTime, time2 = df$stopTime, event = df$Cancelled)
model <- survfit(S ~ predictor1 + predictor2+.., data = df)
问题2:
我尝试绘制按供应商分组的生存曲线,以了解每个供应商的表现。令人惊讶的是,一些供应商的开始时间接近持续时间的中期,正如我所期望的那样,他们都是从零开始的。当我检查数据时,这些供应商相对较新,并且仅在过去几年才出现在图片中。为了正确比较它们,它们都应该有相同的起点,这让我怀疑我的生存对象是错误的。如果有人也可以帮助我,我将不胜感激。
model <- survfit(S ~ Vendor, data = df)
ggsurvplot(fit = model, data = df, linetype = "strata")+xlab('duration in
months')+ylab('retention rate')
很抱歉提出冗长的问题。
谢谢
经过一些额外的研究并咨询了专家,我可以解决这个问题。
我的数据确实被左截断(因为客户可以在 10 年时间段内的任何时间注册)和右截断(一些客户在 2018-1-1 仍然活跃并在之后的任何时间取消)。以下更正帮助我解决了这个问题。
- 我需要计算 'stopTime' 作为注册日期和取消日期(如果在 2018-1-1 之前取消)或 2018-1-1(如果没有取消或在 2018 年之后取消)之间的差异-1-1).
- 已取消状态应为截至 2018-1-1 的状态。
创建生存对象的代码应修改如下
S <- Surv(time = df$stopTime, event = df$Cancelled, type = "right")
作为最佳实践,建议在定义模型的同时创建生存对象,如下所示
model <- survfit(Surv(stopTime, Cancelled) ~ Vendor, df)
这为我绘制了所有曲线都具有“0”原点的图表。
我正在处理一个常规的客户生存分析问题。在这里,我分析了在 2008-1-1 和 2018-1-1 之间注册的客户。客户可在此期间随时注册,并可在2018-1-1截止日期期间或之后随时退出。
示例数据如下所示。第一列是标识符,第二列是截至 2018 年 1 月 1 日的状态:“1 表示已取消,0 表示未取消”。第三列是他们注册日期与 2008-1-1 之间的周数。最后一列是取消日期和 2008-1-1 之间的周数(如果在 2018-1-1 之前取消)或 2008-1-1 和 2018-1-1 之间的周数(如果没有取消或之后取消) 2018-1-1)。
dput() 生成上述数据集
structure(list(PrimaryConstituentSKey = c(1370591L, 1225587L,
1264156L, 1266355L, 3080025L), Cancelled = c(1, 1, 1, 1, 0),
startTime = c(0, 0, 0, 1, 101), stopTime = c(10, 34, 5, 9,
123)), row.names = c(NA, -5L), class = "data.frame")
我将使用此数据创建一个 'Survival object',稍后将其用作我的生存模型的响应变量。
理论题
whcih 我在交叉验证中询问但还没有得到回应 (https://stats.stackexchange.com/questions/423802/appropriate-censoring-and-truncation-for-customer-survival-analysis): 我想知道这种方法是否有意义?我特别想知道在这种情况下适合什么样的审查/截断?我相信它是左截断的(因为人们可以在 2008-1-1 之后的任何时间加入)和右审查(他们中的一些人会在之后的某个时间离开2018-1-1 也)。
编码问题:
如果我的假设是正确的(数据被左截断右截尾),下面的代码是否正确生成生存对象?
S <- Surv(time = df$startTime, time2 = df$stopTime, event = df$Cancelled)
model <- survfit(S ~ predictor1 + predictor2+.., data = df)
问题2: 我尝试绘制按供应商分组的生存曲线,以了解每个供应商的表现。令人惊讶的是,一些供应商的开始时间接近持续时间的中期,正如我所期望的那样,他们都是从零开始的。当我检查数据时,这些供应商相对较新,并且仅在过去几年才出现在图片中。为了正确比较它们,它们都应该有相同的起点,这让我怀疑我的生存对象是错误的。如果有人也可以帮助我,我将不胜感激。
model <- survfit(S ~ Vendor, data = df)
ggsurvplot(fit = model, data = df, linetype = "strata")+xlab('duration in
months')+ylab('retention rate')
很抱歉提出冗长的问题。 谢谢
经过一些额外的研究并咨询了专家,我可以解决这个问题。
我的数据确实被左截断(因为客户可以在 10 年时间段内的任何时间注册)和右截断(一些客户在 2018-1-1 仍然活跃并在之后的任何时间取消)。以下更正帮助我解决了这个问题。
- 我需要计算 'stopTime' 作为注册日期和取消日期(如果在 2018-1-1 之前取消)或 2018-1-1(如果没有取消或在 2018 年之后取消)之间的差异-1-1).
- 已取消状态应为截至 2018-1-1 的状态。
创建生存对象的代码应修改如下
S <- Surv(time = df$stopTime, event = df$Cancelled, type = "right")
作为最佳实践,建议在定义模型的同时创建生存对象,如下所示
model <- survfit(Surv(stopTime, Cancelled) ~ Vendor, df)
这为我绘制了所有曲线都具有“0”原点的图表。