我想计算行的总和,包括对丢失数据的调整。
行和是";MERSQI";真实分数(对研究质量进行评分,每行1项研究(。每个col都是一个关于质量的问题,可以实现特定的最大点数。然而,在某些情况下,问题不适用于导致";缺少值";。行和应调整为标准分母18作为最大分数/行和,即:(最大可实现分数=适用问题的最大可实现得分之和/列(
MERSQI总分=行和/可达到的最大分数*18
例如:
questions <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) #number of question or col number
max_quest <- c(3, 1.5, 1.5, 3, 1, 1, 1, 1, 3) #maximum of every single question
study1 <- c(1.5, 0.5, 1.5, 3, 0, 0, 0, 1, 3) #points for every single questions for study1
study2 <- c(1, 0.5, 0.5, 3, NA, NA, NA, 1, 1, 3) # for study2
study3 <- c(2, 1.5, NA, 3, NA, 1, NA, 1, 1, 3) #for study3
df <- rbind (questions, max_quest, study1, study2, study3)
对于研究1,我们将得到10.5的行和结果分数,因为没有遗漏的值。对于研究2,我们有一个10的行和。我们有三个NA,研究2的最大可达到分数为15(=18个最大分数-NA问题的3*1分(,调整后的MERSQI分数为12.85(=10*18/15(。对于研究3:行总和=12.5,可达到的最大分数=15.5(=18-(1.5+1+1((,调整后的MERSQI分数=15.53
你知道如何通过调整缺失值来计算行和吗?也许通过遍历每一行,使用for
循环和if
与is.na
?
谢谢!
附言:MERSQI评分的链接/解释:https://www.aliem.com/article-review-how-do-you-assess/和https://pubmed.ncbi.nlm.nih.gov/26107881/
向量的长度有问题。我编辑了数据集,使它们的长度都是9,但这应该有效:
apply(mat[, 3:5],
2,
FUN = function (x) {
tot = sum(x, na.rm = TRUE)
nas = which(is.na(x))
total_max = sum(max_quest)
if (!length(nas))
return(tot)
else
return(tot * total_max / (total_max - sum(max_quest[nas])))
})
数据:
questions <- c(1, 2, 3, 4, 5, 6, 7, 8, 9) #number of question or col number
max_quest <- c(3, 1.5, 1.5, 3, 1, 1, 1, 1, 3) #maximum of every single question
study1 <- c(1.5, 0.5, 1.5, 3, 0, 0, 0, 1, 3) #points for every single questions for study1
study2 <- c(1, 0.5, 0.5, 3, NA, NA, NA, 1, 1) # for study2
study3 <- c(2, 1.5, NA, 3, NA, 1, NA, 1, 1) #for study3
## rename mat because cbind(...) of vectors returns matrix.
mat <- cbind (questions, max_quest, study1, study2, study3)
对于每个study
列,计算其sum
乘以max_quest
的和,再除以max_quest
-NA
的值。
library(dplyr)
val <- sum(df$max_quest)
df %>%
summarise(across(starts_with('study'),
~sum(., na.rm = TRUE)* val/(val - sum(max_quest[is.na(.)]))))
数据
由于长度不兼容,共享的数据不完整。此外,如果这些值是按列而不是按行的,这也是有意义的。
questions <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
max_quest <- c(3, 1.5, 1.5, 3, 1, 1, 1, 1, 3, 3)
study1 <- c(1.5, 0.5, 1.5, 3, 0, 0, 0, 1, 3, 0)
study2 <- c(1, 0.5, 0.5, 3, NA, NA, NA, 1, 1, 3)
study3 <- c(2, 1.5, NA, 3, NA, 1, NA, 1, 1, 3)
df <- data.frame(questions, max_quest, study1, study2, study3)
这可以通过矢量化来完成。
首先应用行和并查找NA的数量:
row_sums <- apply(df, 1, function(x) sum(x, na.rm=T))
row_NAs <- apply(df,1, function(x) sum(is.na(x)))
然后拉出研究和最大点:
studies <- row_sums[3:length(row_sums)]
max <- row_sums[2]
根据NA:,根据调整后的最大值计算MERSQI
adjusted_max <- rep(max, length(studies)) - row_NAs[3:length(row_NAs)]
MERSQI <- studies * max / adjusted_max