Выполните расчет деления в R в цикле, используя переменный знаменатель

Я использую начальную загрузку, чтобы получить 95% CI для средних расчетов для нескольких единиц оценки (EU). Расчет без бутстрапа

Распространенность ЕС = сумма (распространенность кластера)/количество кластеров

Теперь пример проблемы заключается в том, что в некоторых ЕС есть 25 кластеров, а в некоторых - 30. Пожалуйста, помогите мне добавить код в цикл, чтобы автоматически использовать правильное количество кластеров в расчетах на основе кода ЕС и связи. в другую таблицу — см. строку 10 (я все время думаю о ВПР в Excel).

Таблица «набор данных» сгруппирована по EU&Cluster и содержит значения распространенности на уровне кластера. Вот пример того, как это будет выглядеть:

eu    cluster    cluster_prev
640   1          0.23
640   2          0.78
...
640   25         0.78
678   1          0.97
...
678   27         1.2
681   1          0
...
681   31         0.78

Затем есть таблица под названием «cluster_count», которая сгруппирована по ЕС и имеет 2 столбца: EU и cluster_ct (количество кластеров в ЕС)... это та часть, которую я не могу понять, как включить. Вот пример того, как будет выглядеть cluster_count:

EU    cluster_ct
640   25
678   27
681   31

Вот код:

#Load, transform data
dataset <- read.csv("ttprev_cluster.csv") 
str(dataset)
dataset$eu <- as.factor(dataset$EU)
dataset$cluster <- as.factor(dataset$CLUSTER)
dataset$cluster_prev <- dataset$adj_tt

#Boot statistic function 
clustermean <- function(df, i) {

    #this is the number that I want to replace with code
    num_clusters <- 25 

    r <- round(runif(num_clusters, 1, nrow(df)))

    df2 <- numeric()
    for (i in 1:num_clusters) 
        df2[i] <- df[r[i],]$cluster_prev

    return(mean(df2))  
}

#create empty data frame for results
bootResult <- data.frame(eu=character(), bootmean=numeric(), se=numeric(), ci95_low=numeric(), ci95_high=numeric(), stringsAsFactors=FALSE)

#Bootstrap function, looped over each EU
library(boot)
num_reps <- 10000 
for (i in 1:nlevels(dataset$eu)) {
    data2 <- subset(dataset, eu==levels(eu)[i])
    b <- boot(data2, clustermean, num_reps)
    m <- mean(b$t)
    se <- sd(b$t)

    #calculate 2.5/97.5 percentiles as Confidence Interval
    q <- quantile(b$t, c(0.025, 0.975))
    ci_lower <- q[1]
    ci_upper <- q[2]
}

person beck777    schedule 13.02.2015    source источник
comment
Какая ошибка с кодом, который у вас есть до сих пор?   -  person dg99    schedule 13.02.2015
comment
извините, я перепробовал так много способов сделать это, что не знал, какой ошибочный метод поставить. Приведенный выше код работает... проблема в том, что мне приходится каждый раз вручную менять это число (25).   -  person beck777    schedule 13.02.2015


Ответы (2)


Предпочтительным методом является использование аргумента ... функции boot(). как в:

#Boot statistic function
clustermean <- function(df, 
                        i,
                        num_clusters # num_clusters is now an artument to clustermean
                        ) {
    # blah blah blah
}


# blah blah blah

for (i in blahBlahBlah) {

    #calculate num_clusters here
    num_clusters <- cluster_count[cluster_count$EU == levels(eu)[i],
                                  'cluster_ct']

    b <- boot(data2, 
              clustermean, 
              num_reps,

              # additional arguments supplied to `boot()` that
              # don't match the formal arguments to boot 
              # are passed on to the 'statistic' function:

              # (note that you have to name this argument so 
              # it isn't matched positionally)

              num_clusters=num_clusters) # 


    # blah blah blah 

}
person Jthorpe    schedule 14.02.2015
comment
Большое спасибо за это. Я еще не смог заставить его работать, но у меня есть коллега, который взглянет на него, чтобы помочь мне увидеть, что мне не хватает. Сообщу всем, если получится! - person beck777; 17.02.2015

другой коллега помог мне немного объяснить синтаксис в аргументе clustermean, и в итоге я пришел к следующему (и это работает !!):

num_clusters <- nrow(df)
person beck777    schedule 18.02.2015