鱼的成熟年龄是增长率的斜率发生变化的地方。 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()
将两个变量都设为数字,但这没有帮助。
请告诉我我是否错误地使用了该模型,或者是否应该使用其他模型。
答案 0 :(得分:0)
据我所知,到达事件的时间数据应包含一个事件指示器,即二进制变量。如果成熟度是事件,那么它应该已经作为二进制变量包含在数据集中,您应该运行它
cox.model <- coxph(Surv(age, maturity) ~ length, data = data)
请查看手册以获取更多详细信息
顺便说一句,这个数字是由分段回归和ggplot之类的东西创建的,我想您可能想使用这样的技术。这是example。
答案 1 :(得分:0)
我同意@ C.C.,1)生存模型不适用于此提供的数据集,2)我认为简单的分段线性回归方法更合适。
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')