如何使用 survival::survreg 回归潜在区间(区间回归带删失数据)?
How to regress latent intervals with survival::survreg (interval regression w/ censored data)?
我正在尝试在 R 中使用截尾数据进行区间回归,其中包含依赖值作为数字 y 或区间 [0, z] 包含 y。
搜索后,我找到了几个来源,其中包含推荐 survival::survreg
(即 here)的示例,尽管它们处理的问题并不完全相同。但是,我无法让它与我的数据一起使用,我假设我遇到了一些特殊情况。
我给你一个MWE。首先,我创建了一些数据和潜在间隔:
# data
set.seed(417699)
df <- data.frame(ind = rbinom(10, 1, .75))
df <- transform(df,
value = ifelse(df$ind == 1, sample(1:1000), NA),
value1 = ifelse(df$ind == 0, sample(10:100) * 10, 0),
cv1 = rbinom(10, 2, .7) # 1st independent var.
cv2 = rbinom(10, 2, .25) # 2nd indep. var.
)
# intervals depending if 'ind' equals 0
df$liv <- with(df, ifelse(ind == 1, value, 0))
df$uiv <- with(df, ifelse(ind == 0, value1, value))
df
## ind value value1 cv1 liv uiv cv2
## 1 1 616 1 2 616 616 0
## 2 0 NA 450 2 0 450 0
## 3 1 236 1 2 236 236 0
## 4 1 130 1 1 130 130 1
## 5 0 NA 350 1 0 350 1
## 6 0 NA 250 2 0 250 0
## 7 1 241 1 1 241 241 0
## 8 1 950 1 2 950 950 1
## 9 1 557 1 2 557 557 1
## 10 1 453 1 2 453 453 1
可以看出,现在有间隔或点取决于 ind = 1 或 0。详细地说,如果 ind = 0,该值位于区间内的某处。
现在,使用 survival::Surv()
并假设它被删除,我正在创建 "survival object" 如下。
library(survival)
(Y <- with(df, Surv(liv, uiv, event = rep(2, nrow(df)), type = "interval")))
## [1] [837, 837] [ 0, 340] [694, 694] [ 74, 74] [ 0, 280] [ 0, 640] [177, 177]
## [8] [650, 650] [368, 368] [179, 179]
summary(Y)
## time1 time2 status
## Min. : 0.0 Min. : 74.0 Min. :3
## 1st Qu.: 18.5 1st Qu.:204.2 1st Qu.:3
## Median :178.0 Median :354.0 Median :3
## Mean :297.9 Mean :423.9 Mean :3
## 3rd Qu.:579.5 3rd Qu.:647.5 3rd Qu.:3
## Max. :837.0 Max. :837.0 Max. :3
一切正常,但最后 survreg()
失败并出现错误:
survreg(Y ~ cv1 + cv2, data = df, dist = "gaussian")
## Error in coxph.wtest(t(x) %*% (wt * x), c((wt * eta + weights * deriv$dg) %*% :
## NA/NaN/Inf in foreign function call (arg 3)
在 Surv()
中,我为选项 event=
和 type=
尝试了几个值,其中大部分都不起作用,我很困惑如何指定正确的设置(即不知道是我说错了还是功能错了,看下面的注释)。
注: survreg()
前几个版本好像有a bug,现在应该解决了(具体我也不清楚).
有谁知道这是怎么回事以及如何解决这个问题?此外,目前我想这似乎是在 R 中计算这种区间回归的唯一有希望的方法,但也许有更好的选择。谢谢。
一个tiny comment on this question终于给我带来了解决方案。诀窍是设置 type = "interval2"
并且我们可以删除 mode=
选项。
(Y <- with(df, Surv(liv, uiv, type = "interval2")))
## [1] 616 [ 0, 450] 236 130 [ 0, 350] [ 0, 250] 241
## [8] 950 557 453
summary(Y)
## time1 time2 status
## Min. : 0.0 Min. : 1.0 Min. :1.0
## 1st Qu.: 32.5 1st Qu.: 1.0 1st Qu.:1.0
## Median :238.5 Median : 1.0 Median :1.0
## Mean :318.3 Mean :105.7 Mean :1.6
## 3rd Qu.:531.0 3rd Qu.:187.8 3rd Qu.:2.5
## Max. :950.0 Max. :450.0 Max. :3.0
coef(intreg <- survreg(Y ~ cv1 + cv2, data = df, dist = "gaussian"))
## (Intercept) cv1 cv2
## -282.0126 326.4428 216.9370
与普通 OLS 相比,回归结果似乎是准确的:
coef(reg <- lm(value ~ cv1 + cv2, data = df))
## (Intercept) cv1 cv2
## -242.5294 364.1176 127.8235
我正在尝试在 R 中使用截尾数据进行区间回归,其中包含依赖值作为数字 y 或区间 [0, z] 包含 y。
搜索后,我找到了几个来源,其中包含推荐 survival::survreg
(即 here)的示例,尽管它们处理的问题并不完全相同。但是,我无法让它与我的数据一起使用,我假设我遇到了一些特殊情况。
我给你一个MWE。首先,我创建了一些数据和潜在间隔:
# data
set.seed(417699)
df <- data.frame(ind = rbinom(10, 1, .75))
df <- transform(df,
value = ifelse(df$ind == 1, sample(1:1000), NA),
value1 = ifelse(df$ind == 0, sample(10:100) * 10, 0),
cv1 = rbinom(10, 2, .7) # 1st independent var.
cv2 = rbinom(10, 2, .25) # 2nd indep. var.
)
# intervals depending if 'ind' equals 0
df$liv <- with(df, ifelse(ind == 1, value, 0))
df$uiv <- with(df, ifelse(ind == 0, value1, value))
df
## ind value value1 cv1 liv uiv cv2
## 1 1 616 1 2 616 616 0
## 2 0 NA 450 2 0 450 0
## 3 1 236 1 2 236 236 0
## 4 1 130 1 1 130 130 1
## 5 0 NA 350 1 0 350 1
## 6 0 NA 250 2 0 250 0
## 7 1 241 1 1 241 241 0
## 8 1 950 1 2 950 950 1
## 9 1 557 1 2 557 557 1
## 10 1 453 1 2 453 453 1
可以看出,现在有间隔或点取决于 ind = 1 或 0。详细地说,如果 ind = 0,该值位于区间内的某处。
现在,使用 survival::Surv()
并假设它被删除,我正在创建 "survival object" 如下。
library(survival)
(Y <- with(df, Surv(liv, uiv, event = rep(2, nrow(df)), type = "interval")))
## [1] [837, 837] [ 0, 340] [694, 694] [ 74, 74] [ 0, 280] [ 0, 640] [177, 177]
## [8] [650, 650] [368, 368] [179, 179]
summary(Y)
## time1 time2 status
## Min. : 0.0 Min. : 74.0 Min. :3
## 1st Qu.: 18.5 1st Qu.:204.2 1st Qu.:3
## Median :178.0 Median :354.0 Median :3
## Mean :297.9 Mean :423.9 Mean :3
## 3rd Qu.:579.5 3rd Qu.:647.5 3rd Qu.:3
## Max. :837.0 Max. :837.0 Max. :3
一切正常,但最后 survreg()
失败并出现错误:
survreg(Y ~ cv1 + cv2, data = df, dist = "gaussian")
## Error in coxph.wtest(t(x) %*% (wt * x), c((wt * eta + weights * deriv$dg) %*% :
## NA/NaN/Inf in foreign function call (arg 3)
在 Surv()
中,我为选项 event=
和 type=
尝试了几个值,其中大部分都不起作用,我很困惑如何指定正确的设置(即不知道是我说错了还是功能错了,看下面的注释)。
注: survreg()
前几个版本好像有a bug,现在应该解决了(具体我也不清楚).
有谁知道这是怎么回事以及如何解决这个问题?此外,目前我想这似乎是在 R 中计算这种区间回归的唯一有希望的方法,但也许有更好的选择。谢谢。
一个tiny comment on this question终于给我带来了解决方案。诀窍是设置 type = "interval2"
并且我们可以删除 mode=
选项。
(Y <- with(df, Surv(liv, uiv, type = "interval2")))
## [1] 616 [ 0, 450] 236 130 [ 0, 350] [ 0, 250] 241
## [8] 950 557 453
summary(Y)
## time1 time2 status
## Min. : 0.0 Min. : 1.0 Min. :1.0
## 1st Qu.: 32.5 1st Qu.: 1.0 1st Qu.:1.0
## Median :238.5 Median : 1.0 Median :1.0
## Mean :318.3 Mean :105.7 Mean :1.6
## 3rd Qu.:531.0 3rd Qu.:187.8 3rd Qu.:2.5
## Max. :950.0 Max. :450.0 Max. :3.0
coef(intreg <- survreg(Y ~ cv1 + cv2, data = df, dist = "gaussian"))
## (Intercept) cv1 cv2
## -282.0126 326.4428 216.9370
与普通 OLS 相比,回归结果似乎是准确的:
coef(reg <- lm(value ~ cv1 + cv2, data = df))
## (Intercept) cv1 cv2
## -242.5294 364.1176 127.8235