以下是示例数据:
set.seed(123)
covar1 <- matrix(sample(c(NA, 1:3), 10, replace = TRUE), 10,1)
covar2 <- matrix(sample(c(NA, 1:3), 10, replace = TRUE), 10,1)
covar3 <- matrix(sample(c(NA, 1:3), 10, replace = TRUE), 10,1)
covar4 <- matrix(sample(c(NA, 1:3), 10, replace = TRUE), 10,1)
covar5 <- matrix(sample(c(NA, 1:3), 10, replace = TRUE), 10,1)
df <- as.data.frame(cbind(covar1,covar2,covar3,covar4,covar5))
names(df) <- c("covar1","covar2","covar3","covar4","covar5")
这些是我的3个模型,其参数各自与协变量相对应,如df
model0 <- data.frame(covar1=4,covar5=7)
model1 <- data.frame(covar1=2,covar3=5,covar4=3)
model2 <- data.frame(covar1=2,covar2=5,covar3=3,covar5=7)
现在,我想选择model0-2和预乘与df
的相应行。不符合匹配条件的df行将给出NA
。
意图是始终使用3个中最长的模型。因此,如果行匹配4协变量模型= model2,那么df
行应该与model2预乘,如果没有匹配则应该尝试model1或model0短路。
期望的输出:
covar1 covar2 covar3 covar4 covar5 Output Model
1 NA 2 3 NA NA NA
2 1 NA 2 2 2 18 m1 # (1*2)+(2*5)+(2*3)=18
3 3 1 2 1 1 21 m2 # (1*3)+(1*5)+(3*2)+(7*1)=21
4 NA 1 NA 3 2 NA # (1*2)+(2*5)+(2*3)=18
..
..
现在,我不打算写下我尝试的内容,因为这会包含更多信息,这些信息通常都是SO用户不喜欢的。对于像这样的东西,甚至可能有包装。非常感谢任何提示或帮助。
答案 0 :(得分:2)
首先,在制作data.frame时,请勿使用此as.data.frame
/ cbind
组合。只需使用
df <- data.frame(covar1,covar2,covar3,covar4,covar5)
这也将适当地设置名称。我不确定人们选择cbind
方法的地方,但这不是一个好习惯。
无论如何,要解决你的实际问题。最好将模型存储在列表中(最长到最短)。这将使处理更容易
models <- list(m2=model2, m1=model1, m0=model0)
现在,我们可以通过数据框查看哪个模型与非缺失协变量值重叠最多。首先,我计算重叠,然后为每一行选择最佳模型
mmatch <- sapply(models, function(m) rowSums(!is.na(df[,names(m)]))/ncol(m))
wmodel <- apply(mmatch,1,which.max)
现在我知道每个组的最佳模型(好吧,特别是它在模型列表中的索引)我将基于最佳匹配拆分data.frame,进行乘法,然后重新加入数据
out<-unsplit(Map(function(m,d,n)
{cbind(d, Output=rowSums(d[,names(m)]*m[1,,drop=T], na.rm=T),
Model=n, stringsAsFactors=F)
},
models,
split(df, wmodel),
names(models)),
wmodel)
这将返回
covar1 covar2 covar3 covar4 covar5 Output Model
1 1 3 3 3 NA 26 m1
2 3 1 2 3 1 24 m2
3 1 2 2 2 1 25 m2
4 3 2 3 3 1 32 m2
5 3 NA 2 NA NA NA m1
6 NA 3 2 1 NA NA m1
7 2 NA 2 3 NA 23 m1
8 3 NA 2 NA 1 19 m0
9 2 1 1 1 1 19 m2
10 1 3 NA NA 3 25 m0
我不确定您显示的所需输出是否实际使用了您指定的种子,因为我有不同的值。