\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}

Зарплаты сотрудников виртуальной компании:

<<echo=TRUE,print=TRUE>>=
salary <- c(21, 19, 27, 11, 102, 25, 21)
names(salary) <- c("Коля", "Женя", "Петя", "Саша", "Катя", "Вася", "Жора")
salary
@ 

Посмотрим чему равен центр:
<<echo=TRUE,print=TRUE>>=
mean(salary)
median(salary)
@ 

Получение среднего на примере встроенных данных trees: 
<<echo=TRUE,print=TRUE>>=
attach(trees)
mean(Girth)
mean(Height)
mean(Volume/Height)
detach(trees)
with(trees, mean(Volume/Height))
lapply(trees, mean)
@ 


Стандартное отклонение, варанса (его квадрат) и межквартильный размах:
<<echo=TRUE,print=TRUE>>=
sd(salary)
var(salary)
IQR(salary)
attach(trees)
mean(Height)
median(Height)
sd(Height)
IQR(Height)
detach(trees)
@ 

\newpage
<<Ящик-с-усами>>, или
боксплот:
<<echo=TRUE,fig=TRUE>>=
new.1000 <- sample((median(salary)-IQR(salary)):(median(salary)+IQR(salary)), 1000, replace=TRUE)
salary2 <- c(salary, new.1000)
boxplot(salary2)
boxplot(trees)
@ 

\newpage
Гистограммы:
<<echo=TRUE,fig=TRUE>>=
hist(salary2, breaks=20)
@ 
\newpage
Текстовое представление гистограммы:
<<echo=TRUE,print=TRUE>>=
table(cut(salary2, 20))
stem(salary, scale=2)
@ 
\newpage
Сглаженная гистограмма:
<<echo=TRUE,fig=TRUE>>=
plot(density(salary2, adjust=2))
rug(salary2)
@ 

Самая главная функция для описания базовой статистики:
<<echo=TRUE,print=TRUE>>=
summary(trees)
lapply(list(salary, salary2), summary)
summary(attenu)
methods(summary)
@ 


\newpage
\section{Одномерные статистические тесты}
\label{sec:onedimtest}

Тест Стьюдента:
<<echo=TRUE,print=TRUE>>=
t.test(salary, mu=32)
@ 
Ранговый тест Уилкоксона (Wil\-cox\-on signed-rank test):
<<echo=TRUE,print=TRUE>>=
wilcox.test(salary2, mu=median(salary2), conf.int=TRUE)
@ 
Тест Шапиро"=Уилкса (Shapiro-Wilk test):
<<echo=TRUE,print=TRUE>>=
shapiro.test(salary)
shapiro.test(salary2)
set.seed(1638)
shapiro.test(rnorm(100))
@ 

Графическая проверка выборки на нормальность:
<<echo=TRUE,fig=TRUE>>=
qqnorm(salary2); qqline(salary2, col=2)
@ 

\newpage
\section{Как создавать свои функции}
\label{sec:usertestfunction}

Пример пользовательской функции, векторизующей тест Шапиро"=Уилкса:
<<echo=TRUE,print=TRUE>>=
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)
@ 

Ещё один пример:
<<echo=TRUE,print=TRUE>>=
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)
@ 

Способ избежать циклы:
<<echo=TRUE,print=TRUE>>=
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*{Ответ на вопрос}

<<echo=TRUE,print=TRUE>>=
str(shapiro.test(rnorm(100)))
@ 

\end{document}
