![]() |
|
|
|
#31 |
|
Platinum Member
Регистрация: 22.07.2010
Адрес: Санкт-Петербург
Сообщений: 3,304
|
1. Трансформация данных
Возник вопрос: как преобразовать данные в R на манер сводных таблиц Excel. Вопрос был решен, но в процессе открыты для себя два полезных пакета, о которых хотелось бы рассказать. Пакет reshape2 - позволяет агрегировать данные на манер Excel. На сайте http://www.r-statistics.com/tag/aggregate/ есть неплохой разбор его возможностей. Основная идея должна быть понятна вот из этой схемы (кликабельна). ![]() Второй пакет -- sqldf. Позволяет писать прямо в коде SQL запросы к данным в синтаксисе SQLite. Привожу простой код, который решает одну и ту же задачу с использованием двух этих пакетов. Имеются данные по весу кошачьих сердец, кошачьих тушек и пола (Пакет MASS данные cats), Попробуем найти для каждого пола число измерений и средний вес тушки. Напишем тестовый пример, который бы в цикле 1000 раз пытался решить эту задачу и посчитаем затраченное время. Возможное решение. Код:
> library(MASS)
> library(sqldf)
> library(reshape2)
>
> head(cats)
Sex Bwt Hwt
1 F 2.0 7.0
2 F 2.0 7.4
3 F 2.0 9.5
4 F 2.1 7.2
5 F 2.1 7.3
6 F 2.1 7.6
>
> # Первый тест тест. Библиотека sqldf
> x<-Sys.time()
> for(i in 1:1000) z<-sqldf("select Sex,count(*) as cnt,avg(Bwt) as Avg_Bwt from cats group by Sex")
> y<-Sys.time()
> y-x
Time difference of 19.61596 secs
> z
Sex cnt Avg_Bwt
1 F 47 2.359574
2 M 97 2.900000
> # Второй тест. Библиотека reshape 2
> id<-1:nrow(cats)
> mcats<-melt(cbind(id,cats),id=c("id","Sex"))
> x<-Sys.time()
> for(i in 1:1000) {
+ df1<-dcast(subset(mcats,variable == "Bwt"),formula=Sex~variable,length)
+ df2<-dcast(subset(mcats,variable == "Bwt"),formula=Sex~variable,mean)
+ merge(df1,df2,intersect="Sex")
+ }
> y<-Sys.time()
> y-x
Time difference of 12.49125 secs
> z
Sex cnt Avg_Bwt
1 F 47 2.359574
2 M 97 2.900000
Во втором примере также показано объединение двух таблиц по ключевому полю с использованием команды merge, поскольку команда cast не позволяет агрегировать сразу по двум функциям (может и позволяет, но я не умею). Такие дела (с). 2. Графы в GNU R Рассматривая интересные библиотеки в R можно упомянуть о возможности строить графы с помощью библиотеки igraph. Простой пример кода. Пытаемся построить граф связей на портале аспирантов (фрагмент). Код:
library(graph)
# Заполнем фрейм парами данных
left<-rep("Hogfather",16)
right<-c("Alextiger","caty-zharr","Dukar","Ink","IvanSpbRu","Martusya","osmos","saovu","Seta","Uzanka","Vica3","Димитриадис","Дмитрий В.","Домохозяйка","море","Степан Капуста")
left1<-rep("Степан Капуста",2)
right1<-c("Hogfather","Ink")
left<-c(left,left1)
right<-c(right,right1)
left1<-rep("море",10)
right1<-c("agasfer","Alextiger","bugo","fazotron","Hogfather","Ink","IvanSpbRu","Maksimus","Martusya","osmos")
left<-c(left,left1)
right<-c(right,right1)
myData<-data.frame(left,right)
# Формируем и строим граф
g<-graph.data.frame(myData,directed=F)
plot(g,vertex.label.cex=0.8,vertex.label.dist=1,vertex.size=10)
Нужно или нет, решать вам, но если надо рисовать серьезные графы, то рекомендую сперва глянуть в сторону graphviz. Очень кошерная и мощная штука. |
|
|
|
| Реклама | |
|
| |
|
|
#32 |
|
Platinum Member
Регистрация: 22.07.2010
Адрес: Санкт-Петербург
Сообщений: 3,304
|
Вышла книга. Шитиков В.К., Розенберг Г.С. Рандомизация и бутстреп: статистический анализ в биологии и экологии с использованием R. - Тольятти: «Кассандра», 2013. - 289 с.
Ссылка ведет на Интернет-версию на сайте авторов. |
|
---------
DNF is not an option
|
|
|
|
|
|
|
#33 | |||||
|
Platinum Member
Регистрация: 22.07.2010
Адрес: Санкт-Петербург
Сообщений: 3,304
|
Цитата:
Цитата:
Код:
FileList<-dir("Data_R",pattern = "*.txt", full.names = TRUE, ignore.case = TRUE, include.dirs =TRUE)
MyResult<-data.frame()
for(FileName in FileList)
{
TempTable<-read.table(FileName,sep=" ")
TempTable$FileName<-FileName
MyResult<-rbind(MyResult,TempTable)
}
Цитата:
Добавлено через 36 минут С другой стороны, данных много, поэтому возможно удобнее будет загнать в базу данных SQLite (см. выше о работе в R) и использовать срезы оттуда. Модифицируем чуть-чуть вышеприведенный код Цитата:
Добавлено через 49 минут Цитата:
Код:
set.seed(666) age <- 1:10 y.low <- rnorm(length(age), 150, 25) + 10*age y.high <- rnorm(length(age), 250, 25) + 10*age plot(age,y.high,type = 'n', ylim = c(100, 400), ylab = 'Y Range', xlab = 'Age (years)') lines(age, y.low ) lines(age, y.high) polygon(c(age, rev(age)), c(y.high, rev(y.low)), col = "lightblue", border = NA) # Второй график, чтобы поржать y.low <- rnorm(length(age), 150, 25) + 10*age y.high <- rnorm(length(age), 250, 25) + 10*age lines(age, y.low, col = "green" ) lines(age, y.high, col = "green") polygon(c(age, rev(age)), c(y.high, rev(y.low)), col = "green", border = NA) Последний раз редактировалось Hogfather; 26.06.2013 в 15:05. |
|||||
|
---------
DNF is not an option
|
||||||
|
|
|
|
|
#34 |
|
Gold Member
Регистрация: 16.04.2012
Сообщений: 1,218
|
Hogfather,
а в R можно оценивать GARCH модели с разными распределениями ошибок? а оценивать Stochastic volatility models с разными распределениями? Или самим код надо писать? ЗЫ. А что-то типа фильтра Калмана там есть? |
|
|
|
|
|
#35 |
|
Platinum Member
Регистрация: 22.07.2010
Адрес: Санкт-Петербург
Сообщений: 3,304
|
Для примера потребуются две библиотеки fGarch и evir
Пример из книжки, упомянутой ниже Код:
library(fGarch)
data(bmw,package="evir")
bmw.garch_norm = garchFit(~arma(1,0)+garch(1,1),data=bmw,cond.dist="norm")
options(digits=3)
summary(bmw.garch_norm)
options(digits=10)
x = bmw.garch_norm@residuals / bmw.garch_norm@sigma.t
n=length(bmw)
grid = (1:n)/(n+1)
fitdistr(x,"t")
par(mfrow=c(1,2))
qqnorm(x,datax=T,ylab= "Standardized residual quantiles",
main="(a) normal plot",
xlab="normal quantiles")
qqline(x,datax=T)
qqplot(sort(x), qt(grid,df=4),
main="(b) t plot, df=4",xlab= "Standardized residual quantiles",
ylab="t-quantiles")
abline( lm( qt(c(.25,.75),df=4)~quantile(x,c(.25,.75)) ) )
bmw.garch_t = garchFit(~arma(1,1)+garch(1,1),cond.dist="std",data=bmw)
options(digits=4)
summary(bmw.garch_t)
Рекомендую почитать книжку Statistics and Data Analysis for Financial Engineering. Я купил и мои волосы теперь чистые и шелковистые. http://cran.r-project.org/web/packag...vol/index.html Пакет http://cran.r-project.org/web/packages/FKF/index.html Статья по теме http://www.jstatsoft.org/v39/i02/paper |
|
---------
DNF is not an option
|
|
|
|
|
|
|
#36 |
|
Gold Member
Регистрация: 16.04.2012
Сообщений: 1,218
|
Hogfather,
просто огромное спасибо!!!!!!! пошла изучать
|
|
|
|
|
|
#37 | |
|
Platinum Member
Регистрация: 22.07.2010
Адрес: Санкт-Петербург
Сообщений: 3,304
|
Приобрел неплохую книжку по Data Mining в GNU R, рекомендую.
![]() Пакет rattle предназначен для поиска закономерностях в данных (Data Mining) с помощью регрессионных деревьев, кластерного анализа и метода опорных векторов. В книжке разбирается порядок действий от загрузки данных до интерпретации результатов. Код:
library(rattle) rattle() К сожалению, работает не все. UPD: Появилось сообщение на форуме поддержки. На настоящий момент решение это проблемы выглядит вот так [1] . Вложение со старой функцией удалено, чтобы не смущало. Цитата:
Т.е. есть еще некоторые проблемки с продуктом,а так, в целом, здорово! Последний раз редактировалось Hogfather; 01.11.2013 в 08:48. |
|
|
---------
DNF is not an option
|
||
|
|
|
|
|
#38 |
|
Platinum Member
Регистрация: 22.07.2010
Адрес: Санкт-Петербург
Сообщений: 3,304
|
UPD: Под МакОс rattle категорически отказался работать. Проблемы с GTK+
|
|
---------
DNF is not an option
|
|
|
|
|
|
|
#39 | |
|
Platinum Member
Регистрация: 22.07.2010
Адрес: Санкт-Петербург
Сообщений: 3,304
|
Давненько не брал я в руки шашек. Вот тут задачку придумали, на самом деле весьма интересную с практической точки зрения.
Цитата:
Последний раз редактировалось Hogfather; 08.11.2013 в 08:59. |
|
|
---------
DNF is not an option
|
||
|
|
|
|
|
#40 | ||
|
Gold Member
Регистрация: 25.06.2005
Адрес: F000:FFF0
Сообщений: 1,830
|
Цитата:
Цитата:
Пусть T - дискретная случайная величина, равная количеству набранных баллов (0...90). Функция вероятности случайной величины T: f(t) = P(T=t) Функция распределения случайной величины T: F(t) = P(T<=t) Решение в математической среде Waterloo Maple 15.0.
Последний раз редактировалось Paul Kellerman; 08.11.2013 в 10:01. |
||
|
|
|