Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
RCoreTeam2014.docx
Скачиваний:
48
Добавлен:
08.10.2015
Размер:
539 Кб
Скачать
    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)

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