- •1.Написание собственных функций 3
- •2.Статистические модели в r 18
- •3.Список використаної літератури 41
- •Написание собственных функций
- •Простые примеры
- •Определение новых бинарных операторов
- •Именованные параметры и умолчания
- •Параметр ‘...’
- •Присвоения в пределах функций
- •Более сложные примеры
- •Фактор эффективности при проектировании блоков
- •Отбрасывание всех имен при печатании массива
- •Рекурсивное числовое интегрирование
- •Область действия
- •Настройка окружения
- •Классы, универсальные функции и объектно-ориентированное программирование
- •Статистические модели в r
- •Определение статистических моделей; формулы
- •Примеры
- •Противопоставления
- •Линейные модели
- •Универсальные функции для извлечения информации о модели
- •Vcov(object)
- •Дисперсионный анализ и сравнение модели
- •Таблицы anova
- •Обновление подогнанных моделей
- •Обобщенные линейные модели
- •Семейства
- •Функция glm()
- •Гауссовское семейство
- •Нелинейные наименьшие квадраты и модели наибольшего правдоподобия
- •Наименьшие квадраты
- •Метод максимального правдоподобия
- •Некоторые нестандартные модели
- •Список використаної літератури
Более сложные примеры
Фактор эффективности при проектировании блоков
Более полный неинтересный пример функции, рассматривающий поиск эффективности при проектировании блоков. Некоторые аспекты этой проблемы были уже обсуждены в Разделе 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) }
В цифровой форме немного лучше работать с сингулярным разложением над этим случаем, а не подпрограммами собственного значения.
Результат функции - список, дающий не только эффективные факторы в качестве первого компонента, но также и канонические блочные и вариационные контрасты, так как иногда они дают дополнительную полезную качественную информацию.
Отбрасывание всех имен при печатании массива
Для целей печати больших матриц или массивов часто полезно напечатать их в форме плотного блока без имен массива или чисел. Удаление атрибута 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)
Это полезно для больших целочисленных массивов, в которых образец представляет реальный интерес, а не значение.
Рекурсивное числовое интегрирование
Функции могут быть рекурсивными, и могут самостоятельно определить функции в пределах себя. Заметим, однако, что такие функции, или действительно переменные, не наследованы вызванными функциями в более высоких фреймах оценки, как если они были бы на пути поиска.
Пример ниже показывает наивный способ выполнить одномерное числовое интегрирование. Подынтегральное выражение оценено в конечных точках диапазона и в середине. Если в целом правило трапеции дает ответ достаточно близкий для обеих частей, то последний возвращается в качестве значения. Иначе процесс рекурсивно применен к каждой части. Результат - адаптивный интеграционный процесс, который концентрирует функциональные оценки в областях, где подынтегральное выражение наиболее удалено от линейного. Есть, однако, тяжелые издержки, и функция способна конкурировать с другими алгоритмами, когда подынтегральное выражение является и гладким, и очень трудным для оценки.
Пример дан частично в качестве небольшой головоломки в 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)