Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
RCoreTeam2014.docx
Скачиваний:
46
Добавлен:
08.10.2015
Размер:
539.13 Кб
Скачать
    1. Более сложные примеры

      1. Фактор эффективности при проектировании блоков

Более полный неинтересный пример функции, рассматривающий поиск эффективности при проектировании блоков. Некоторые аспекты этой проблемы были уже обсуждены в Разделе 5.3 [Индексные матрицы].

Блочная конструкция определена двумя факторами, скажем блоки (bуровни) и варианты (vуровни). Если R иKявляютсяv-на-vиb-на-bрепликациями и матрицами размера блока, соответственно, иNявляетсяb-на-vинцидентной матрицей, то коэффициенты полезного действия определены как собственные значения матрицы:

E = Iv – R-1/2NTK-1NR-1/2 = Iv - AT A; где A=К-1/2NR-1/2. Один из путей написания функции дан ниже:

> bdeff <- function(blocks, varieties) {

blocks <- as.factor(blocks) b <- length(levels(blocks))

# minor safety move

varieties <- as.factor(varieties) v <- length(levels(varieties))

# minor safety move

K <- as.vector(table(blocks))

# remove dim attr

R <- as.vector(table(varieties))

# remove dim attr

N <- table(blocks, varieties)

A <- 1/sqrt(K) * N * rep(1/sqrt(R), rep(b, v)) sv <- svd(A)

list(eff=1 - sv$d^2, blockcv=sv$u, varietycv=sv$v) }

В цифровой форме немного лучше работать с сингулярным разложением над этим случаем, а не подпрограммами собственного значения.

Результат функции - список, дающий не только эффективные факторы в качестве первого компонента, но также и канонические блочные и вариационные контрасты, так как иногда они дают дополнительную полезную качественную информацию.

      1. Отбрасывание всех имен при печатании массива

Для целей печати больших матриц или массивов часто полезно напечатать их в форме плотного блока без имен массива или чисел. Удаление атрибута dimnamesне даст нужного эффекта, напротив массиву нужно дать атрибутdimnames, состоящий из пустых строк. Например, чтобы напечатать матрицуX:

> temp <- X

> dimnames(temp) <- list(rep("", nrow(X)), rep("", ncol(X)))

> temp; rm(temp)

что можно сделать более удобно, используя функцию no.dimnames(), показанную ниже, как "обертку" для достижения того же результата. Она также иллюстрирует, насколько короткими и полезными могут быть функции пользователя. no.dimnames <- function(a) {

## Remove all dimension names from an array for compact printing. d <- list() l <- 0 for(i in dim(a)) {

d[[l <- l + 1]] <- rep("", i)

}

dimnames(a) <- d

a }

С таким определением функции массив может быть напечатан в плотном формате путем использования:

> no.dimnames(X)

Это полезно для больших целочисленных массивов, в которых образец представляет реальный интерес, а не значение.

      1. Рекурсивное числовое интегрирование

Функции могут быть рекурсивными, и могут самостоятельно определить функции в пределах себя. Заметим, однако, что такие функции, или действительно переменные, не наследованы вызванными функциями в более высоких фреймах оценки, как если они были бы на пути поиска.

Пример ниже показывает наивный способ выполнить одномерное числовое интегрирование. Подынтегральное выражение оценено в конечных точках диапазона и в середине. Если в целом правило трапеции дает ответ достаточно близкий для обеих частей, то последний возвращается в качестве значения. Иначе процесс рекурсивно применен к каждой части. Результат - адаптивный интеграционный процесс, который концентрирует функциональные оценки в областях, где подынтегральное выражение наиболее удалено от линейного. Есть, однако, тяжелые издержки, и функция способна конкурировать с другими алгоритмами, когда подынтегральное выражение является и гладким, и очень трудным для оценки.

Пример дан частично в качестве небольшой головоломки в R программировании.area <- function(f, a, b, eps = 1.0e-06, lim = 10) { fun1 <- function(f, a, b, fa, fb, a0, eps, lim, fun) { ## function ‘fun1’ is only visible inside ‘area’ d <- (a + b)/2 h <- (b - a)/4 fd <- f(d) a1 <- h * (fa + fd) a2 <- h * (fd + fb)

if(abs(a0 - a1 - a2) < eps || lim == 0) return(a1 + a2)

else { return(fun(f, a, d, fa, fd, a1, eps, lim - 1, fun) + fun(f, d, b, fd, fb, a2, eps, lim - 1, fun)) }

} fa <- f(a) fb <- f(b)

a0 <- ((fa + fb) * (b - a))/2 fun1(f, a, b, fa, fb, a0, eps, lim, fun1)

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]