我正在分析一个长期的动物标记 - 重新捕获数据集,其中捕获的个体在每次捕获时被分配到5个大小等级中的一个。我需要创建一个矩阵,在已知值之间进行插值(即观察动物的年数),并且包括个体在每个尺寸等级中保留多长时间的约束。
以下是五个样本捕获历史记录(CH;个人=行),跨越20年(列)。有五种数字编码的可能大小类(1 =最小)。 NAs是动物未被捕获的年份(在此处理为缺失值)。
个人可以在任何大小的类别中首次被观察到(例如第1行对第3行),我们可以重新捕获跳过大小等级的个体(例如,第2行)。
CH <- rbind(c(NA,NA,1,2,rep(NA,7),3,rep(NA,8)),
c(1,rep(NA,9),3,NA,NA,3,rep(NA,6)),
c(rep(NA,10),4,NA,NA,5,rep(NA,6)),
c(3,rep(NA,17),5,NA),
c(rep(NA,7),2,rep(NA,8),4,rep(NA,3)))
CH
> CH
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18] [,19] [,20]
[1,] NA NA 1 2 NA NA NA NA NA NA NA 3 NA NA NA NA NA NA NA NA
[2,] 1 NA NA NA NA NA NA NA NA NA 3 NA NA 3 NA NA NA NA NA NA
[3,] NA NA NA NA NA NA NA NA NA NA 4 NA NA 5 NA NA NA NA NA NA
[4,] 3 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 5 NA
[5,] NA NA NA NA NA NA NA 2 NA NA NA NA NA NA NA NA 4 NA NA NA
我已经弄清楚如何使用imputeTS包中的na.interpolation()函数插入没有约束的值,如下所示:
#ImputeTS missing values (with NO constraints, not ideal)
library(imputeTS)
ms.init.z <- function(ms, notseen){
state <- ms # capture history called state
for(i in 1:dim(state)[1]){ #Do this for every row/individual
if(any(!is.na(state[i,1:dim(state)[2]-1]))){ #If any are not NA through the 2nd to last occs'n
state[i,dim(state)[2]] <- max(state[i,],na.rm=TRUE) #Apply max state value for that individual to final year
#populate last column as as.interpolation needs at least two values
state[i,] <- ceiling(na.interpolation(state[i,])) # interpolate
} #if
m <- min(which(!is.na(ms[i,]))) #identify the first occasion not NA
state[i,1:(m-1)] <- NA #Replace before and on first occasion with NA
} #i
return(state)
} #function
CH.X <- ms.init.z(CH,NA)
> CH.X
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18] [,19] [,20]
[1,] NA NA 1 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
[2,] NA 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3
[3,] NA NA NA NA NA NA NA NA NA NA 4 5 5 5 5 5 5 5 5 5
[4,] NA 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5
[5,] NA NA NA NA NA NA NA 2 3 3 3 3 4 4 4 4 4 4 4 4
但是,我想设定一个人可以在每个尺寸等级中保留多少年的约束。我很难找到一个允许我实现自定义约束的软件包。
我的理想&#34;输出如下所示。请注意,每条线的大多数(全部?)都有多个解决方案,只要每个尺寸类中的观察数不超过最大值(下面指定),就可以了。
#Desired constraints (maximum # of years in each size)
#Size class 1= 1 year max; 2= 7 yrs max; 3= 7 yrs max;
#4= 15 yrs max; 5= no limit
#Example Desired output
CH.cor <- rbind(c(NA,NA,1,rep(2,5),rep(3,6),rep(4,6)),
c(1,rep(2,6),rep(3,7),rep(4,6)),
c(rep(4,12),rep(5,8)),
c(rep(3,3),rep(4,15),5,5),
c(rep(NA,6),1,rep(2,7),rep(3,6)))
CH.cor
> CH.cor
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18] [,19] [,20]
[1,] NA NA 1 2 2 2 2 2 3 3 3 3 3 3 4 4 4 4 4 4
[2,] 1 2 2 2 2 2 2 3 3 3 3 3 3 3 4 4 4 4 4 4
[3,] 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5
[4,] 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5
[5,] NA NA NA NA NA NA 1 2 2 2 2 2 2 2 3 3 3 3 3 3
非常感谢任何建议或帮助。提前谢谢。
答案 0 :(得分:0)
你可能找不到一个软件包,它可以为你提供开箱即用的功能。
我有一个使用imputeTS包的小费:
如果您想在使用 na.interpolation 时在头开始维护NAs,可以使用以下选项:
library("imputeTS")
na.interpolation(x, yleft = NA)
在上面的示例中,这将为您节省6行代码。
但是对于你的问题,你可能不需要这个。在我看来,最好的选择就是编写自己的解决方案。由于您的要求非常具体。