\documentclass[a4paper,11pt]{scrartcl} %\usepackage[warn]{mathtext} \usepackage[T2A]{fontenc} \usepackage[koi8-r]{inputenc} %\usepackage[utf8]{inputenc} \usepackage[english,russian]{babel} \usepackage{indentfirst}%first paragraph indent \usepackage{cmap} \usepackage[unicode=true]{hyperref} \usepackage{graphicx} \usepackage{amssymb} \usepackage{amsmath} \usepackage{srcltx} \usepackage{textcomp} \usepackage{floatflt} \usepackage{wrapfig} \usepackage{afterpage} \usepackage{ccaption} \captiondelim{. } \usepackage{xspace} %научные символы и смайлики \smiley \frownie \usepackage{wasysym} \usepackage[noae]{Sweave} \usepackage{underscore} %переопределение примечания для KOMA-script % [отступ до метки]{отступ}{отступ абзаца} \deffootnote[2.5em]{1.5em}{1em}{\textsuperscript{\thefootnotemark}} \setkomafont{sectioning}{\bfseries} \setkomafont{descriptionlabel}{\bfseries} %backslash \newcommand{\bs}{\symbol{'134}} %degree \newcommand{\grad}{\ensuremath{{}^{\circ}}\xspace} %R-акроним \newcommand{\R}{{\sffamily\bfseries R}\xspace} \title{Статистическая обработка данных в \R} \author{\textcopyright{} А.Б.\,Шипунов\thanks{e-mail: dactylorhiza@gmail.com}, Е.М.\,Балдин\thanks{e-mail: E.M.Baldin@inp.nsk.su}} \begin{document} \maketitle %\tableofcontents \section{Приёмы элементарного анализа данных} \label{sec:basicanalyze} Зарплаты сотрудников виртуальной компании: <>= salary <- c(21, 19, 27, 11, 102, 25, 21) names(salary) <- c("Коля", "Женя", "Петя", "Саша", "Катя", "Вася", "Жора") salary @ Посмотрим чему равен центр: <>= mean(salary) median(salary) @ Получение среднего на примере встроенных данных trees: <>= attach(trees) mean(Girth) mean(Height) mean(Volume/Height) detach(trees) with(trees, mean(Volume/Height)) lapply(trees, mean) @ Стандартное отклонение, варанса (его квадрат) и межквартильный размах: <>= sd(salary) var(salary) IQR(salary) attach(trees) mean(Height) median(Height) sd(Height) IQR(Height) detach(trees) @ \newpage <<Ящик-с-усами>>, или боксплот: <>= new.1000 <- sample((median(salary)-IQR(salary)):(median(salary)+IQR(salary)), 1000, replace=TRUE) salary2 <- c(salary, new.1000) boxplot(salary2) boxplot(trees) @ \newpage Гистограммы: <>= hist(salary2, breaks=20) @ \newpage Текстовое представление гистограммы: <>= table(cut(salary2, 20)) stem(salary, scale=2) @ \newpage Сглаженная гистограмма: <>= plot(density(salary2, adjust=2)) rug(salary2) @ Самая главная функция для описания базовой статистики: <>= summary(trees) lapply(list(salary, salary2), summary) summary(attenu) methods(summary) @ \newpage \section{Одномерные статистические тесты} \label{sec:onedimtest} Тест Стьюдента: <>= t.test(salary, mu=32) @ Ранговый тест Уилкоксона (Wil\-cox\-on signed-rank test): <>= wilcox.test(salary2, mu=median(salary2), conf.int=TRUE) @ Тест Шапиро"=Уилкса (Shapiro-Wilk test): <>= shapiro.test(salary) shapiro.test(salary2) set.seed(1638) shapiro.test(rnorm(100)) @ Графическая проверка выборки на нормальность: <>= qqnorm(salary2); qqline(salary2, col=2) @ \newpage \section{Как создавать свои функции} \label{sec:usertestfunction} Пример пользовательской функции, векторизующей тест Шапиро"=Уилкса: <>= normality <- function(data.f) { result <- data.frame(var=names(data.f), p.value=rep(0, ncol(data.f)), normality=is.numeric(names(data.f))) for (i in 1:ncol(data.f)) { data.sh <- shapiro.test(data.f[, i])$p.value result[i, 2] <- round(data.sh, 5) result[i, 3] <- (data.sh > .05) } return(result) } normality(trees) @ Ещё один пример: <>= normality2 <- function(data.f, p=.05) { nn <- ncol(data.f) result <- data.frame(var=names(data.f),p.value=numeric(nn), normality=logical(nn)) for (i in 1:nn) { data.sh <- shapiro.test(data.f[, i])$p.value result[i, 2:3] <- list(round(data.sh, 5), data.sh > p) } return(result) } normality2(trees) normality2(trees, 0.1) @ Способ избежать циклы: <>= lapply(trees, shapiro.test) lapply(trees, function(.x) ifelse(shapiro.test(.x)$p.value > .05,"NORMAL", "NOT NORMAL")) normality3 <- function(df, p=.05) { lapply(df, function(.x) ifelse(shapiro.test(.x)$p.value > p, "NORMAL","NOT NORMAL")) } normality3(list(salary, salary2)) @ \subsection*{Ответ на вопрос} <>= str(shapiro.test(rnorm(100))) @ \end{document}