Результаты лонгитюдного эксперимента
в режиме реального времени
Содержание:
Эксперимент
Эксперимент проводится для отработки схемы взаимодействия: 
Форма опроса онлайн
> Google.Документы > R & Dropbox > публикация результатов в WWW.
Одна из задач эксперимента
демонстрация возможностей организации и проведения психологических исследований в сети Интернет, анализа и представления полученных данных с минимальным количеством действий, осуществляемых вручную. Вы можете наблюдать за процессом сбора, анализа и представления данных текущего эксперимента. Эксперимент будет проводится минимум 1 месяц. Дата начала сбора данных: 19.11.2012.

Что измеряется?
  • Самочувствие, активность, настроение по 9-балльной шкале (от 1 до 9)
  • Температура тела (в подмышечной впадине) с помощью электронного термометра
Примечание: не следует серьезно относится к измерениям и данным эксперимента, они нужны только в иллюстративных целях, а также для отладки работы скриптов.

Как фиксируются данные?

В специальной форме, созданной в Google.Документы
. Демо-версию формы можно посмотреть по ссылке.
форма
Пример таблицы с данными в Google.Документы
После отправки формы, данные попадают в таблицу в Google.docs. R-скрипт загружает эти данные в виде csv-файла для последующей обработки.
dataframe
Так выглядят данные уже в среде R
data in R

Как обрабатываются данные?

Для обработки данных написан R-скрипт, который запускается автоматически по расписанию. Расписание установлено в файле crontab. R-скрипт загружает данные из Google.Документы, строит 3 графика, которые сохраняются в public-папке моего аккаунта в Dropbox. На каждом графике фиксируется дата первого и последнего наблюдения, а также дата его создания.

Пример работы R-скрипта




Как часто обновляются данные?

Запуск скрипта происходит в:
00:00, 02:00, 10:00, 12:00, 18:00, 22:00 часов. Стандартный часовой пояс: UTC/GMT +6 Екатеринбург (при условии, что мой компьютер работает в данный момент). Каждый раз после запуска R-скрипта происходит загрузка данных, обработка данных, построение графиков и их сохраниение в Dropbox. Для того, чтобы увидеть обновленные графики не обязательно очищать кэш браузера, так он делает это самостоятельно при обнаружении изменившего изображения в процессе генерации данной html-страницы.
Адрес данной страницы: http://tukachev.flogiston.ru/exp.html
E-mail:


Результаты работы скрипта:
В этом разделе представлены результаты работы скрипта. Все графики строятся в автоматическом режиме. Красная стрелка указывает на последнее наблюдение, а зеленая стрелка
на первое.
График 1:
Активность-температура
Прямая ссылка на график: https://dl.dropbox.com/u/33111025/exp/act%7Etemp.png

График 2:
Самочувствие-температура
Прямая ссылка на график: https://dl.dropbox.com/u/33111025/exp/sam%7Etemp.png

График 3:
Настроение-температура
Прямая ссылка на график: https://dl.dropbox.com/u/33111025/exp/sam%7Etemp.png

Группа графиков 4: Распределения переменных
4plots
Прямая ссылка на график: https://dl.dropbox.com/u/33111025/exp/4plots.png

График 5:
график температуры
Прямая ссылка на график: https://dl.dropbox.com/u/33111025/exp/templine.png

Средние значения температуры, самочувствия, активности и настроения по дням наблюдений
температура (среднее/день)
Самочувствие (среднее/день)
Активность (среднее/день)
Настроение (среднее/день)

Корреляция между переменными
corrplot
Еще один вариант представления
матрица
Технический отчет о работе скрипта
Пример R-скрипта
Последняя версия R-скрипта от 4 декабря 2012:
R-experiment script ver 0.27 04/12/2012 -- загрузить.

Версия от 26 ноября 2012:
#!/usr/bin/Rscript 
#
# R-experiment http://tukachev.flogiston.ru/exp.html
# Результаты лонгитюдного эксперимента в режиме реального времени
 
# Измерение времени выполнения скрипта
time1 <- Sys.time()
 
# Уведомление о запуске скрипта
system("DISPLAY=:0.0 notify-send -i /home/aelita/Rlogo.png R-stat \"Запуск скрипта. Обработка данных эксперимента\"")
 
# Загружаем библиотеки
require(RCurl)
library(ggplot2)
library(grid)
library(psych)
 
labels = c("Самочувствие","Активность","Настроение","Температура")
 
# Загружаем данные
myCsv <- getURL("здесть URL на доступ к таблице в Google.Docs &single=true&gid=0&output=csv")
data <- read.table(textConnection(myCsv), header = T, sep = ",", stringsAsFactors=FALSE)
 
# Задаем даты для генерации графиков
text1 <- "Первое наблюдение:"
text2 <- "Последнее наблюдение:"
text3 <- "Дата создания:"
data1 <- paste(data$dt[1])
data2 <- paste(data$dt[length(data$dt)])
data3 <- paste(format(Sys.time(), "%d.%m.%Y %H:%M:%S"))
ann1 <- paste(text1,data1)
ann2 <- paste(text2,data2)
ann3 <- paste(text3,data3)
l <- length(data$dt)
 
# Простая линейная регрессия
model1 <- lm(data$act~data$temp)
model2 <- lm(data$sam~data$temp)
model3 <- lm(data$nas~data$temp)
m1 <- summary.lm(model1)
m2 <- summary.lm(model2)
m3 <- summary.lm(model3)
r1 <-round((m1$r.squared),3)
r2 <-round((m2$r.squared),3)
r3 <-round((m3$r.squared),3)
rsq1 <- paste("R2=",r1) #Сохраняем коэффициент детерминации R2
rsq2 <- paste("R2=",r2) #Сохраняем коэффициент детерминации R2
rsq3 <- paste("R2=",r3) #Сохраняем коэффициент детерминации R2
 
# Устанавливаем каталог для сохранения графиков
setwd("/home/aelita/Dropbox/Public/exp")
 
# 1 график (активность~температура)
png('act~temp.png', width=600,height=450)
p <- qplot(temp,act,data=data,
xlab='Температура, С',
ylab='Активность,\nоценка по шкале от 1 до 9 баллов',
main='Уровень активности в зависимости \n от температуры тела')
p <- p + geom_point(colour = "black", size = 4)
p <- p + annotate("text", x = 35.7, y = 1.5, label = ann1, colour="green", size=4)
p <- p + annotate("text", x = 35.7, y = 1.2, label = ann2, colour="red", size=4)
p <- p + annotate("text", x = 35.7, y = 0.9, label = ann3, size=4)
p <- p + annotate("text", x = 35.7, y = 1.8, label = rsq1, size=4)
p <- p + geom_segment(aes(x = data$temp[l]+0.1, y = data$act[l]+0.5,
xend = data$temp[l], yend = data$act[l]), colour="red", arrow = arrow(length = unit(0.5, "cm")))
p <- p + geom_segment(aes(x = data$temp[1]+0.1, y = data$act[1]+0.5,
xend = data$temp[1], yend = data$act[1]), colour="green", arrow = arrow(length = unit(0.5, "cm")))
p <- p + theme_bw(base_size = 14, base_family="Georgia")
p + geom_smooth(aes(temp, act), method="lm", size = 1, se=TRUE)
dev.off()
 
# 2 график (самочувствие~температура)
png('sam~temp.png', width=600,height=450)
p <- qplot(temp,sam,data=data,
xlab='Температура, С',
ylab='Самочувствие,\nоценка по шкале от 1 до 9 баллов',
main='Уровень самочувствия в зависимости \n от температуры тела')
p <- p + geom_point(colour = "black", size = 4)
p <- p + annotate("text", x = 35.7, y = 1.5, label = ann1, colour="green", size=4)
p <- p + annotate("text", x = 35.7, y = 1.2, label = ann2, colour="red", size=4)
p <- p + annotate("text", x = 35.7, y = 0.9, label = ann3, size=4)
p <- p + annotate("text", x = 35.7, y = 1.8, label = rsq2, size=4)
p <- p + geom_segment(aes(x = data$temp[l]+0.1, y = data$sam[l]+0.5,
xend = data$temp[l], yend = data$sam[l]), colour="red", arrow = arrow(length = unit(0.5, "cm")))
p <- p + geom_segment(aes(x = data$temp[1]+0.1, y = data$sam[1]+0.5,
xend = data$temp[1], yend = data$sam[1]), colour="green", arrow = arrow(length = unit(0.5, "cm")))
p <- p + theme_bw(base_size = 14, base_family="Georgia")
p + geom_smooth(aes(temp, sam), method="lm", size = 1, se=TRUE)
dev.off()
 
# 3 график (настроение~температура)
png('nas~temp.png', width=600,height=450)
p <- qplot(temp,nas,data=data,
xlab='Температура, С',
ylab='Настроение,\nоценка по шкале от 1 до 9 баллов',
main='Уровень настроения в зависимости \n от температуры тела')
p <- p + geom_point(colour = "black", size = 4)
p <- p + annotate("text", x = 35.7, y = 1.9, label = ann1, colour="green", size=4)
p <- p + annotate("text", x = 35.7, y = 1.6, label = ann2, colour="red", size=4)
p <- p + annotate("text", x = 35.7, y = 1.3, label = ann3, size=4)
p <- p + annotate("text", x = 35.7, y = 2.2, label = rsq3, size=4)
p <- p + geom_segment(aes(x = data$temp[l]+0.1, y = data$nas[l]+0.5,
xend = data$temp[l], yend = data$nas[l]), colour="red", arrow = arrow(length = unit(0.5, "cm")))
p <- p + geom_segment(aes(x = data$temp[1]+0.1, y = data$nas[1]+0.5,
xend = data$temp[1], yend = data$nas[1]), colour="green", arrow = arrow(length = unit(0.5, "cm")))
p <- p + theme_bw(base_size = 14, base_family="Georgia")
p + geom_smooth(aes(temp, nas), method="lm", size = 1, se=TRUE)
dev.off()
 
# 4 графика распределений
 
png('4plots.png', width=458,height=500)
 
layout(matrix(c(1,2,3,4,5,6,7,8), 2, 2, byrow=TRUE))
 
hist(data$temp, breaks = 9, col="skyblue", border="blue",
main="Температура",
xlab="Градусы",
ylab="Частота")
 
hist(data$act, breaks = 8, col="skyblue", border="blue",
main="Активность",
xlab="Баллы",
ylab="Частота")
 
hist(data$sam, breaks = 8, col="skyblue", border="blue",
main="Самочувствие",
xlab="Баллы",
ylab="Частота")
 
hist(data$nas, breaks = 8, col="skyblue", border="blue",
main="Настроение",
xlab="Баллы",
ylab="Частота")
dev.off()
 
# Считаем корреляцию
r <-cor(data[-1])
colnames(r) = labels
row.names(r) = labels
 
png('corplot.png', width=458,height=500)
cor.plot(mat.sort(r),TRUE,zlim=c(-1,1), main="Матрица интеркорреляций")
dev.off()
 
# Фиксируем время завершения
time2 <- Sys.time()
runtime <- round((time2 - time1), 3)
t <- paste(runtime, "сек")
 
# Уведомление о завершении скрипта
system("DISPLAY=:0.0 notify-send -i /home/aelita/Rlogo.png R-stat \"Скрипт выполнен\"")

Created by Pretty R at inside-R.org

NB! Описываемые ниже примеры реализации работают в Ubuntu, а для Windows необходимо предварительно установить и настроить Cygwin.

Запуск скрипта по расписанию
(Ubuntu, Windows)
Для задач по расписанию есть в linux средство crontab. Cron — демон-планировщик задач, использующийся для периодического выполнения заданий в определённое время. Регулярные действия описываются инструкциями, помещенными в файлы crontab. Пример реализации в Ubuntu, в котором доступно излагается настройка. Запуск скрипта происходит по расписанию: 00:00, 02:00, 10:00, 12:00, 18:00, 22:00 часов (при условии, что мой компьютер работает в данный момент).

Смотрим запись в файле crontab:

aelita@aelita-laptop:~$ crontab -l
# m h  dom mon dow   command
00 0,2,10,12,18,22 * * * LANG=ru_RU.UTF-8 /home/aelita/experiment.R

LANG=ru_RU.UTF-8 перед командой добавлено для того, чтобы не было проблем с отображением кириллических текстов на графиках. Путь к файлу скрипта лучше прописывать полностью.

Раньше я запускал скрипт из bash-файла. Это не очень удобно. Оказывается, R-скрипты можно запускать на исполнение как bash-скрипты, но это возможно только в том случае, если в начало скрипта добавить строчку:
#!/usr/bin/Rscript

Уведомление о запуске и завершении выполнения скрипта (только Ubuntu)
Информационные сообщения из R-скрипта выводятся через стандартную систему уведомлений в Ubuntu (notify). Notify — всплывающие уведомления (прозрачные черные прямоугольники в верхнем правом углу экрана). Как известно, для уведомлений в Ubuntu применяется утилита notify-send. В последних версиях Ubuntu notify-send используется как основное средство уведомлений. Существует notify-send для Windows.

Вот как это выглядит:
Уведомление о выполнении скрипта

уведомление 2
Описание реализации вывода уведомлений см. запись в моем блоге.

СМС-уведомление о выполнении R-скрипта (Ubuntu, Windows)
Как это выглядит:
sms from R
По завершению выполнения R-скрипта происходит отправка смс-уведомления на мой телефон. Реализовано с помощью програмы sendEmail, вызов которой осуществляется из R-скрипта. В качестве адреса получателя введен: 7950XXXXXXX@sms.ycc.ru (используется EMAIL2SMS шлюз моего оператора сотовой связи). Сообщение отправляется следующего вида: "Скрипт выполнен 26.11.2012 20:00:06 за время 5.789 сек". Более подробное описание реализации см. запись в моем блоге.

Статистика времени выполнения скрипта (запланировано)


==============================================================
  Document made with KompoZer
Поддержите проект:

Besucherzahler senior people meet.com
счетчик посещений

Яндекс.Метрика