Использование цикла для создания таблицы с результатами ICC в r

Я создал цикл для расчета icc между двумя оценщиками. Для каждого оценщика (R1, R2) у меня есть набор данных из 75 переменных в столбцах и 125 наблюдений.

library(irr)
for (i in 1:75) {
 icc <- icc(cbind.data.frame(R1[,i],R2[,i]), model="twoway", type="agreement",
     unit="single")
 print(icc)
}

icc возвращает список результатов icc для каждой переменной. Я попытался интегрировать в цикл функцию, которая будет генерировать фрейм данных для интересующих меня объектов icc (значение, нижняя и верхняя граница 95% доверительного интервала), но возвращает по-разному отдельные таблицы:

С этой первой попытки он возвращает 75 фреймов данных только по одной строке в каждом, даже если я использовал команду rbind

for (i in 1:75) {
  icc <- icc(cbind.data.frame(R1[,i],R2[,i]), model="twoway", type="agreement",
      unit="single")

  print(rbind.data.frame(cbind.data.frame(icc$value,icc$lbound,icc$ubound)))
  }

во втором случае он возвращает 75 различных фреймов данных, заполненных каждым из объектов icc одной переменной.

for (i in 1:75) {
  icc <- icc(cbind.data.frame(R1[,i],R2[,i]), model="twoway", type="agreement",
      unit="single")

name_lines_are_variables <- names(L1)
name_columns <- c("ICC","Low CI 95%","Up CI 95%)
tab <- matrix(c(icc$value,icc$conf.level),nrow=38,ncol=2)
dimnames(tab) <- list(name_lines_are_variables,name_columns)
print(tab)

я ценю вашу помощь


person Miricy    schedule 17.05.2020    source источник


Ответы (2)


Если я правильно понял ваш пост, то проблема с вашим кодом заключается в том, что результаты функции icc() не накопляются.

Вы можете решить эту проблему, объявив пустой data.frame перед for loop, а затем используя rbind() для добавления последних результатов к существующим результатам в этом data.frame.

Пожалуйста, обратитесь к приведенному ниже коду для реализации (обратитесь к комментариям для пояснений):

rm(list = ls())

#Packages
library(irr)

#Dummy data
R1 <- data.frame(matrix(sample(1:100, 75*125, replace = TRUE), nrow = 75, ncol = 125))
R2 <- data.frame(matrix(sample(1:100, 75*125, replace = TRUE), nrow = 75, ncol = 125))


#Data frame that will accumulate the ICC results
#Initialized with zero rows (but has named columns)
my_icc <- data.frame(R1_col = character(), R2_col = character(), 
                     icc_val = double(), icc_lb = double(), 
                     icc_ub = double(), icc_conflvl = double(), 
                     icc_pval = double(), 
                     stringsAsFactors = FALSE)


#For loop
#Iterates through each COLUMN in R1 and R2
#And calculates ICC values with these as inputs
#Each R1[, i]-R2[, j] combination's results are stored
#as a row each in the my_icc data frame initialized above
for (i in 1:ncol(R1)){
  for (j in 1:ncol(R2)){

    #tmpdat is just a temporary variable to hold the current calculation's data
    tmpdat <- irr::icc(cbind.data.frame(R1[, i], R2[, j]), model = "twoway", type = "agreement", unit = "single")

    #Results from current cauculation being appended to the my_icc data frame
    my_icc <- rbind(my_icc, 
                    data.frame(R1_col = colnames(R1)[i], R2_col = colnames(R2)[j], 
                               icc_val = tmpdat$value, icc_lb = tmpdat$lbound, 
                               icc_ub = tmpdat$ubound, icc_conflvl = tmpdat$conf.level, 
                               icc_pval = tmpdat$p.value, 
                               stringsAsFactors = FALSE))


  } 
}

head(my_icc)
#   R1_col R2_col     icc_val      icc_lb    icc_ub icc_conflvl  icc_pval
# 1     X1     X1  0.14109954 -0.09028373 0.3570681        0.95 0.1147396
# 2     X1     X2  0.07171398 -0.15100798 0.2893685        0.95 0.2646890
# 3     X1     X3 -0.02357068 -0.25117399 0.2052619        0.95 0.5791774
# 4     X1     X4  0.07881817 -0.15179084 0.3004977        0.95 0.2511141
# 5     X1     X5 -0.12332146 -0.34387645 0.1083129        0.95 0.8521741
# 6     X1     X6 -0.17319598 -0.38833452 0.0578834        0.95 0.9297514
person Dunois    schedule 17.05.2020
comment
Большое спасибо за вашу помощь. Я просто должен был чан - person Miricy; 18.05.2020
comment
Вам даже не нужно было менять это, если вам не нужно было экономить время вычислений. Вы можете просто подмножить окончательный data.frame вот так my_icc[my_icc$R1_col == my_icc$R2_col, ]. Я счастлив, что смог помочь! - person Dunois; 18.05.2020

Большое спасибо за вашу помощь @Dunois. Мне просто нужно было сохранить одну и ту же переменную в цикле for(), потому что я должен сравнивать столбцы одних и тех же переменных для каждого оценщика, поэтому окончательный код:

library(irr)

R1 <- data.frame(matrix(sample(1:100, 75*125, replace = TRUE), nrow = 75, ncol = 125))
R2 <- data.frame(matrix(sample(1:100, 75*125, replace = TRUE), nrow = 75, ncol = 125))

my_icc <- data.frame(R1_col = character(), R2_col = character(), 
                     icc_val = double(), icc_lb = double(), 
                     icc_ub = double(), icc_conflvl = double(), 
                     icc_pval = double(), 
                     stringsAsFactors = FALSE)

for (i in 1:ncol(R1)){

    tmpdat <- irr::icc(cbind.data.frame(R1[, i], R2[, i]), model = "twoway", type = "agreement", unit = "single")

    my_icc <- rbind(my_icc, 
                    data.frame(R1_col = colnames(R1)[i], R2_col = colnames(R2)[i], 
                               icc_val = tmpdat$value, icc_lb = tmpdat$lbound, 
                               icc_ub = tmpdat$ubound, icc_conflvl = tmpdat$conf.level, 
                               icc_pval = tmpdat$p.value, 
                               stringsAsFactors = FALSE))

}

head(my_icc)
#R1_col R2_col      icc_val     icc_lb     icc_ub icc_conflvl  icc_pval
#1     X1     X1  0.116928667 -0.1147526 0.33551788        0.95 0.1601141
#2     X2     X2  0.006627921 -0.2200660 0.23238172        0.95 0.4773967
#3     X3     X3 -0.184898902 -0.3980084 0.04542289        0.95 0.9427605
#4     X4     X4  0.066504226 -0.1646006 0.28963006        0.95 0.2862440
#5     X5     X5 -0.035662755 -0.2603757 0.19227801        0.95 0.6196883
#6     X6     X6 -0.055329309 -0.2808315 0.17466685        0.95 0.6805675

person Miricy    schedule 18.05.2020