我应使用哪种ML算法确定鱼的成熟年龄?

时间:2020-10-14 14:33:48

标签: r machine-learning cox-regression

鱼的成熟年龄是增长率的斜率发生变化的地方。 Here is an example of a simulated individual fish and its two growth rates.

我想创建一种算法,该算法将根据与我附带的图片类似的年龄和长度数据确定成熟年龄。对于哪种算法有用以及如何将其应用于样本数据集,我几乎一无所知:

> head(data)
  age     length
1   0 0.01479779
2   1 0.05439856
3   2 0.18308919
4   3 0.24380771
5   4 0.37759992
6   5 0.44871502

有人建议我尝试使用Cox比例危害模型。为此,我将成熟期视为事件发生的时间(成熟度是事件,年龄是达到成熟度的时间)。我尝试拟合该模型,但出现此错误:

> cox.model <- coxph(Surv(age ~ length), data = data)
Error in Surv(age ~ length) : Time variable is not numeric

我尝试使用as. numeric()将两个变量都设为数字,但这没有帮助。

请告诉我我是否错误地使用了该模型,或者是否应该使用其他模型。

2 个答案:

答案 0 :(得分:0)

据我所知,到达事件的时间数据应包含一个事件指示器,即二进制变量。如果成熟度是事件,那么它应该已经作为二进制变量包含在数据集中,您应该运行它 cox.model <- coxph(Surv(age, maturity) ~ length, data = data)

请查看手册以获取更多详细信息

  1. Survival package
  2. Cox model

顺便说一句,这个数字是由分段回归和ggplot之类的东西创建的,我想您可能想使用这样的技术。这是example

答案 1 :(得分:0)

我同意@ C.C.,1)生存模型不适用于此提供的数据集,2)我认为简单的分段线性回归方法更合适。

请参见下面的建议R代码以及示例输出图:sample output graph

library(segmented)

# create dummy data set, extended from provided one, with noise
df <- data.frame(
  age = seq(from = 0, to = 20, by = 1),
  length = c(
    seq(from = 0, to = 0.45, length.out = 5) + rnorm(5, mean = 1e-3, sd = 1e-2),
    seq(from = 0.48, to = 0.6, length.out = 16) + rnorm(16, mean = 1e-3, sd = 1e-2)
    )
)

# fit normal linear regression and segmented regression
lm1 <- lm(length ~ age, data = df)
seg_lm <- segmented(lm1, ~ age)

# determine age break point
age_break_point <- seg_lm$psi.history$all.selected.psi[[1]]

# plot raw data points, segmented fit and age break point
plot(seg_lm, res = TRUE, main=paste0('Growth rate change @ ', round(age_break_point, 1), ' years old'), xlab='Age', ylab='Length')
abline(v = age_break_point, col='red')