Использование цикла for() или применения() к средствам начальной загрузки в матрице

У меня есть следующая матрица (назовем ее df), для которой я хотел бы создать загрузочные средние значения и 95% доверительные интервалы для каждого столбца из-за сильно взвешенного распределения 0. Я хотел бы, чтобы среднее значение и CI были добавлены в нижнюю часть матрицы в виде новых строк. Это небольшое подмножество данных, истинные данные содержат> 600 строк, что сделает загрузку намного более эффективной.

row.names   V183    V184    V185    V186    V187    V188    V189    V190    V191    V192    V193    V194    V195    V196    V197    V198    V199    V200    V201    V202    V203    V204    V205
1   0.07142857  0.07142857  0.07142857  0.07142857  0.07142857  0.07142857  0.07142857  0.07142857  0.07692308  0.07692308  0.07692308  0.07692308  0.07692308  0.07692308  0.07692308  0.07692308  0.07692308  0.07692308  0.07692308  0.07692308  0.07692308  NA  NA
2   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
3   0.022   0.022   0.022   0.022   0.022   0.022   0.022   0.022   0.022   0.022   0.022   0.022   0.022   0.022   0.022   0.022   0   NA  NA  NA  NA  NA  NA
4   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0.07692308  0.07692308  0.07692308  0.07692308  0.07692308  0.07692308  0.07692308  0.07692308
5   0   0   0   0   0.066   0.066   0.066   0.066   0.066   0.066   0.066   0.066   0.066   0.066   0   0   0   0   0   0   0   0   0
6   0.077   0.077   0.077   0.077   0.077   0.077   0.077   0.077   0.077   0.077   0.077   0.077   0.077   0.077   0.077   0.077   0.077   0.077   0.077   0   0   0   0
7   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
8   0.07142857  0.07142857  0.07142857  0.07142857  0.07142857  0.07142857  0.07142857  0.07142857  0.07142857  0.07142857  0.07142857  0   0   0   0   0   0   0   0   0   0   0   0
9   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   NA  NA  NA  NA  NA  NA
10  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
11  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  0.03225806  0.03225806  0.03225806  0.03225806  0.03225806  0.03225806  0.03225806  0.03225806  0.03225806  0.03225806  0.03225806
12  0   0   0   0   0   0   0   0   0   0   0   0   0   NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
13  0   0   0   0   0   0   0   0   0   NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
14  0   0   0.033   0.033   0.033   0.033   0.033   0.033   0.033   0.033   0.033   0.033   0.033   0.033   0.033   0.033   0.033   0   0   0   0   0   0

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

Ниже приведен мой код для одной строки.

dfsub<-df[,1]
mean.boot <- function(dfsub, d) {
E=dfsub[d,]
return(mean(E, na.rm=T))}
b = boot(dfsub, mean.boot, R=1000)
b

Есть предположения? Будет ли цикл for или применить fn лучше?

Кроме того, вывод для загруженных значений дает исходное значение и смещение, но где фактическое среднее значение начальной загрузки?


person ctlamb    schedule 07.07.2014    source источник
comment
в общем apply/sapply и т. д. намного быстрее, чем for циклы в r   -  person phonixor    schedule 07.07.2014
comment
В чем проблема с этими решениями для вашего предыдущего вопроса? Это существенно отличается?   -  person MrFlick    schedule 07.07.2014
comment
Было бы полезно, если бы вы включили код R, который будет воспроизводить df (хотя бы приблизительно), а затем вставить только первые несколько строк указанного фрейма данных (и избавиться от текущего df-выход у вас есть сейчас).   -  person Steve S    schedule 07.07.2014


Ответы (1)


Это несколько запутанный вопрос, так как я не уверен, выполняете ли вы загрузку по строкам или по столбцам, плюс часть кода не работает, в частности E=dfsubd,]. Но если вы хотите получить загрузочные средства для каждого столбца, простой apply должен работать нормально, например:

> myMeanFun <- function(d, i) {
    d2 <- d[i]
    return(mean(d2, na.rm=T))
}

> myBootFun <- function(d) {
    boot(d, myMeanFun, R = 1000)
}

> lapply(df[,-1], function(x) myBootFun(x) )

$V183

ORDINARY NONPARAMETRIC BOOTSTRAP


Call:
boot(data = d, statistic = myMeanFun, R = 1000)


Bootstrap Statistics :
     original       bias    std. error
t1* 0.0186044 0.0004565272 0.008418108

$V184

ORDINARY NONPARAMETRIC BOOTSTRAP


Call:
boot(data = d, statistic = myMeanFun, R = 1000)


Bootstrap Statistics :
     original       bias    std. error
t1* 0.0186044 3.504457e-05 0.008293219

И вы можете использовать что-то вроде этого для доступа к определенной статистике (здесь означает загрузку):

> sapply(df[,-1], function(x) myBootFun(x)$t0 )

      V183       V184       V185       V186       V187       V188       V189 
0.01860440 0.01860440 0.02114286 0.02114286 0.02621978 0.02621978 0.02621978 
      V190       V191       V192       V193       V194       V195       V196 
0.02621978 0.02664243 0.02886264 0.02886264 0.02291026 0.02362932 0.02559843 
      V197       V198       V199       V200       V201       V202       V203 
0.02009843 0.02650869 0.02467535 0.02631042 0.02631042 0.01861042 0.01861042 
      V204       V205 
0.01213124 0.01213124 

Также см. функцию boot.ci для доверительных интервалов, плюс это руководство может быть вам полезно:

http://www.ats.ucla.edu/stat/r/faq/boot.htm

person jogall    schedule 07.07.2014
comment
моя ошибка, я ищу загрузочные средства для каждого столбца. Извините, это была опечатка, наряду с другой опечаткой в ​​коде. В следующий раз я буду намного осторожнее. Я обновил свой вопрос. - person ctlamb; 08.07.2014
comment
Спасибо, Jogal, предоставленный скрипт хорошо работает для создания загрузочных средств. Когда я использую вторую предоставленную вами команду (sapply....), я получаю это сообщение об ошибке. Ошибка в сводке (myBootFun (x)) $ original: оператор $ недействителен для атомарных векторов. Кроме того, есть ли способ, которым я мог бы выбрать только определенная группа строк, скажем, строки 1:13? В моем большом наборе данных у меня есть некоторые другие сводные статистические данные в нижней части листа, и формула также включает их в средства начальной загрузки. - person ctlamb; 08.07.2014
comment
Моя ошибка, это должно быть что-то вроде: sapply(df[,-1], function(x) myBootFun(x)$t0 ) -- я соответствующим образом отредактировал ответ. Кроме того, вы можете использовать скобочное индексирование в первом члене функции применения для выбора определенных частей данных, например. выбрать только строки 1:13 и столбцы 2:5: sapply(df[,2:5][1:13,], function(x) myBootFun(x)$t0 ) - person jogall; 08.07.2014
comment
Фантастика, спасибо Джогал. Выбор строки и столбца работал отлично. У меня возникает эта ошибка, когда я запускаю функцию sapply для заполнения загрузочных значений в моей таблице In mean.default(d2, na.rm = T): аргумент не является числовым или логическим: возвращается NA - person ctlamb; 10.07.2014
comment
Похоже, у вас есть нечисловые данные в вашей матрице: функции применения вводят матрицу, и, поскольку матрица должна быть одного типа, наличие любых символов в вашей матрице приведет к преобразованию всех числовых значений в символы. Вы можете либо исключить строки или столбцы, содержащие символы, используя скобочное индексирование, либо попробовать использовать другую функцию, подобную применению, которая вводит data.frame, например colwise() или numcolwise() в библиотеке plyr. - person jogall; 10.07.2014