вторник, 27 августа 2013 г.

Минус Фунт: Формула Тьюки для типичного веса недели

Получилось так, что некоторые мои сообщения по ряду причин с форума http://forum.s-body.com/index.php?board=34.0 удаляются. Но я их храню в своих архивах и восстанавливаю на этом ресурсе в виде записей в блоге. Вот моё самое первое сообщение на том форуме:

------------ (начало удаленного сообщения)
Здравствуйте, фунтики! Принимайте в свою компанию! Это мое дебютное сообщение на этом Форуме.

Пока только в основном читаю вас и подбираюсь к МФ, неспешно проводя разгон. Но на днях подумал, что пора бы и свой посильный вклад начать вносить в копилку сообщества. Собственно, поэтому и пишу.

Для расчетов ТВН (типичный вес недели) и СКН (средняя калорийность недели) в ручном режиме я использую программу Excel. И думаю, что я не одинок в этом. Но, возможно, не все знают о существовании встроенных в эту программу функциях, особенно полезных фунтику в его расчетах.

В первую очередь, это функция МЕДИАНА, удобная при расчете ТВН. Если ввести в ячейки с A1 по G1 семь значений веса с "понедельника" по "воскресенье", то в ячейке I1 можно записать формулу для расчета ТВН по медиане:

=МЕДИАНА(A1:G1)

А теперь - внимание! Далее будет представлена формула для расчета ТВН "по-взрослому" - через трехсреднее значение Тьюки, дающая те же результаты, что и калькулятор МФ (теория здесь: http://www.minusfunt.ru/su.pdf ).

Для этой формулы потребуется еще одно (восьмое) значение - вес в "понедельник" новой недели (насколько я могу судить, калькулятор считает именно по восьми значениям и эта причина того, что в него вводятся 15, а не 14 значений веса за две последние недели). Запишем восьмое значение в ячейку H1, которую мы предусмотрительно перед этим пропустили (собственно, и медиану выше можно считать не по 7, а по 8 значениям). Формула для ячейки J1 будет выглядеть так:

=(КВАРТИЛЬ(A1:H1;1)+2*КВАРТИЛЬ(A1:H1;2)+КВАРТИЛЬ(A1:H1;3))/4

или - с округлением до двух знаков после запятой - так:

=ОКРУГЛ((КВАРТИЛЬ(A1:H1;1)+2*КВАРТИЛЬ(A1:H1;2)+КВАРТИЛЬ(A1:H1;3))/4;2)

Формулы выше приведены для русской версии Excel, разделитель списка - точка с запятой. При необходимости адаптации к версиям Excel других стран следует уточнить локализованные имена соответствующих функций. Так, в английской версии МЕДИАНА - это MEDIAN, КВАРТИЛЬ - QUARTILE, ОКРУГЛ - ROUND. Разделитель списка в английской версии - запятая. Последняя формула в английской версии будет выглядеть так:

=ROUND((QUARTILE(A1:H1,1)+2*QUARTILE(A1:H1,2)+QUARTILE(A1:H1,3))/4,2)

Всем успехов в расчетах!
------------ (конец удаленного сообщения)

В ходе обсуждения http://forum.s-body.com/index.php?topic=1181.60 мне было указано (сейчас также удалено оттуда), что формула с квартилями не всегда совпадает с расчетами калькулятора МФ:  http://www.minusfunt.ru/cabinet/calc . Это дало толчок дальнейшим изысканиям и окончательный ключик к секрету калькулятора МФ был подобран.

По этому поводу готовилось еще одно сообщение, но опубликовать его тогда не получилось. Теперь же вот и оно:

------------ (начало неопубликованного сообщения)
Обещанная коррекция ранее представленной формулы ТрёхСреднего Тьюки (ТСТ) с квартилями. На этот раз с явными цитатами (а не просто ссылками), чтобы не сложилось впечатление, что миру незаконно предъявляется какая-то секретная информация ДСП.

"Сколько существует способов нормализации избыточной массы тела?" ( http://www.minusfunt.ru/su.pdf )

При возможности перехода к автоматизированным подсчетам целесообразно вместо медианы использовать т.н. "трехсреднее значение Тьюки", равное взвешенному среднему первого, второго и третьего квартилей ряда значений МТ. Трехсреднее значение Тьюки ряда значений МТ равно:

ТСТ = (q1 + 2q2 + q3) / 4 ,

где q1, q2, q3 – соответственно 1, 2, 3 квартили ряда значений.

И в другом источнике существует важное замечание о том, какой именно ряд значений следует использовать:

Кромер В.В. (Русско-немецкий университет, г. Новосибирск) "Автоматическое регулирование при диетотерапии" ( http://kromer.newmail.ru/kvv_c_52.htm )

Скоростью изменения МТ считается разница типичных МТ по двум соседним неделям. Типичной МТ недели предлагается считать медиану ряда из 14 значений, при этом в образуемый ряд значения МТ в первый день прошедшей недели и первый день наступающей недели входят по одному разу, а значения МТ со второго по седьмой дни прошедшей недели – по два раза. Этот метод определения типичной МТ недели более валиден, чем при определении МТ по медиане 7 значений, поскольку соответствует МТ, ожидаемой в середине недельного периода.

Ранее представленная 13.06.2013 формула использовала 8 последовательных значений веса из диапазона A1:H1 - с понедельника по новый понедельник. Следуя указаниям второй цитаты, теперь для формирования ряда из 14 значений МТ вес по понедельникам в ячейках A1 и H1 надо использовать по одному разу и вес в остальные дни недели в ячейках B1:G1 - по два раза. Таким образом, ссылку A1:H1 в формуле можно заменить на (A1;B1:G1;B1:G1;H1) :
=ОКРУГЛ((КВАРТИЛЬ(A1:H1;1)+2*КВАРТИЛЬ(A1:H1;2)+КВАРТИЛЬ(A1:H1;3))/4;2)

=ОКРУГЛ((КВАРТИЛЬ((A1;B1:G1;B1:G1;H1);1)+2*КВАРТИЛЬ((A1;B1:G1;B1:G1;H1);2)+КВАРТИЛЬ((A1;B1:G1;B1:G1;H1);3))/4;2)

С использованием массивов констант формуле можно придать более компактный окончательный вид:
=ОКРУГЛ(СУММ(КВАРТИЛЬ((A1;B1:G1;B1:G1;H1);{1;2;2;3}))/4;2)

Эта формула и вычисляет ТСТ так, как нам хотелось бы.
------------ (конец неопубликованного сообщения)

Итак, мы имеем формулу в Excel для расчета типичного веса недели как трехсреднего значения Тьюки для ряда ежедневных в течение недели значений массы тела. Как видно, формула содержит функцию КВАРТИЛЬ, которая скрывает в себе всю громоздкую элементарную арифметику. Создав эту формулу, вычисляющую ТВН так же, как и калькулятор МФ на сайте (по крайней мере, в его текущей реализации по состоянию на август 2013), мы невольно стали заложниками Excel. Само по себе это не так уж и плохо, но всё-таки возможно ли вычислить трехсреднее Тьюки при помощи обычного калькулятора, умеющего выполнять всего лишь четыре основных арифметических действия?

Оказывается, возможно. Будет несколько сложнее, чем нахождение медианы для ряда из 7 значений. К слову сказать, медиана-то находится вообще без расчетов - просто берется 4-е значение из отсортированного по возрастанию (или убыванию) ряда. Для ручного же расчета трехсреднего Тьюки на обычном (бухгалтерском) калькуляторе придется умножать (не более 6 раз), складывать (не более 5 раз) и делить (и не более 1 раза).

Но перед тем как выполнять арифметические действия, подготовим ряд из 14 значений массы тела за 8 дней. По одному разу в этот ряд включаются веса в "понедельник" (1) и в "понедельник новой недели" (1нов или 8 ), для остальных дней - со "вторника" (2) по "воскресенье" (7) - веса включаются по два раза. В итоге получается такой ряд из 14 значений веса по дням недели:
1, 2,2, 3,3, 4,4, 5,5, 6,6, 7,7, 1нов

Эти 14 весов сортируются по возрастанию и получаем такой ряд значений:
1зн,2зн,3зн,4зн,5зн,6зн,7зн,8зн,9зн,10зн,11зн,12зн,13зн,14зн

Точная, совпадающая с калькулятором МФ на 100%, формула для трехсреднего значения Тьюки после преобразований квартилей через элементы списка из 14 значений будет выглядеть так:
ТСТ = ( 0,75*4зн + 0,25*5зн + 7зн + 8зн + 0,25*10зн + 0,75*11зн ) / 4

Т.е. для расчета нам, таким образом, требуются всего 6 значений из 14 из возрастающего списка: 4зн,5зн,7зн,8зн,10зн,11зн. Желающие могут самостоятельно поразбираться с тем, как работает функция КВАРТИЛЬ в Excel.

Переходя к целым числам, умножив дробные коэффициенты и общий знаменатель на 4, получаем более компактный вид формулы с точки зрения количества требуемых операций и вообще нажатий клавиш на бухгалтерском калькуляторе:
ТСТ = [ 3*(4зн + 11зн) + 5зн + 10зн + 4*(7зн + 8зн) ] / 16
Из последней формулы для ручного расчета вытекает альтернативная формула для Excel. С чего начали - к тому же и вернулись, но уже без функции КВАРТИЛЬ:
=ОКРУГЛ(СУММ(НАИМЕНЬШИЙ((A1;B1:G1;B1:G1;H1);{4;5;7;8;10;11})*{3;1;4;4;1;3})/16;2)

В этой новой формуле с функцией НАИМЕНЬШИЙ хорошо просматриваются участвующие члены ряда значений, а также их целочисленные коэффициенты.

Но всё же использование формулы с функцией КВАРТИЛЬ предпочтительнее, поскольку формула с КВАРТИЛЬ начинает выдавать результат даже при неполной неделе, как только введено хотя бы одно значение. По мере заполнения недели это значение изменяется и после ввода восьмого значения (понедельник новой недели) становится окончательным.

Формуле же с НАИМЕНЬШИЙ требуется полностью заполненная неделя и следующий понедельник. Формально формула что-то засчитает как только сможет определить 11 значений ряда, что произойдет при 6 заполненных днях недели, но результат такой неполной недели будет лишен всякого смысла. При меньшем количестве заполненных дней формула с НАИМЕНЬШИЙ будет возвращать ошибку #ЧИСЛО!.

Все рассмотренные варианты формул для ТВН по Тьюки можно найти в прилагаемом файле Excel:
https://docs.google.com/file/d/0B12BTJG-Ola4MzBDb3pMal9najg/edit?usp=sharing

В этот файл как в "единый флакон" добавлены также формулы генерации скрипта для загрузки данных в калькулятор МФ из предыдущего сообщения от 13.08.2013. Таким образом, файл текущего сообщения можно рассматривать как предварительный шаблон "Дневника худеющего по системе МФ" (отсюда название файла - mfDiary). При желании из таблицы можно удалить неинтересующие столбцы или добавить свои, например, для дополнительных расчетов или комментариев.

ВНИМАНИЕ! Иногда при клике на ссылке, ведущей к файлу, появляется сообщение об ошибке. Бояться не надо, просто подтвердите его. Далее в пункте меню Файл на открывшейся странице (не путать с верхним Файл самого браузера) следует воспользоваться пунктом Скачать - и файл в вашем распоряжении.

вторник, 13 августа 2013 г.

Минус Фунт: Калькулятор можно заполнить несложным скриптом


Текст ниже первоначально предполагался к опубликованию на одном похудательном форуме по адресу: http://forum.s-body.com/index.php?topic=1181.75 . Название предполагалось такое "Удобная загрузка данных в калькулятор".

И сообщение было там размещено, но через 5 минут удалено модератором по просьбе лидера форума. Я успел сохранить на память его сообщение, которое также было удалено вслед за моим:
#87 : 12.08.2013 14:33
Предыдущий пост просьба немедленно удалить. Без объяснений по поводу. При необходимости автор волен разместить на любом другом сайте, в т.ч. и на дионе. Похожие мастырки там регулярно размещает некий <имярек>. Бог им всем в помощь.

Таким образом, автору (мне) дали волю на другой ресурс и автор этим воспользовался. В том числе и потому, что получил многочисленные просьбы в личных сообщениях от заинтересованных форумчан. Вот это "убитое" сообщение:

Всем привет!

Ранее в этой теме я написал следующее (в сообщении #76 : 28.06.2013 01:39):

Мои чисто пользовательские интерфейсные претензии к калькулятору МФ на сайте:

* неудобна необходимость вбивания данных за одну неделю дважды - сначала в качестве последней недели, а через неделю - в качестве предпоследней. Как было бы здорово, если бы последняя неделя автоматически перекидывалась в предпоследнюю при следующем сеансе расчета.

* вообще неудобна необходимость вбивания туда каких-либо цифр по отдельности - я хотел бы, чтобы несколько подряд идущих полей можно было заполнять при помощий операций копирования и вставки. Подряд идущие значения для вставки я при этом, разумеется, копировал бы из своего любимого Excel'я.

* калькулятор не позволяет ввести значения веса более 199.9 кг и калорийности более 3999 ккал. И, если вес меня в данном случае не сильно волнует (но как быть людям за 200?), то моя равновесная калорийность только по формуле получается порядка 3700 и при разгоне я ее наверняка превзойду и дойду до значений свыше 4000, которые мне ввести не удастся.

* нельзя перемещаться по полям весов и калорийности при помощи стрелок: я хочу ввести сначала столбик значений веса, а потом столбик значений калорийности, но приходится вводить данные парами "вес-калорийность", продвигаясь вправо и вниз при помощи клавиши Tab.
Сегодня я рад сообщить сообществу, что снимаю с повестки дня эти "претензии" и всем желающим предлагаю вполне удобный, без утомительного вбивания цифр, способ загрузки данных в поля он-лайн калькулятора МФ из таблицы Excel при помощи короткой программы (скрипта).

ВНИМАНИЕ! Предлагаемый метод не ущемляет ничьих интересов, не раскрывает и не обсуждает никакие секретные алгоритмы калькулятора, и ничего ни у кого "не ворует", скорее, наоборот - "мечет на стол" удобство, экономя драгоценное время пользователя. Деньги за расчет на калькуляторе по-прежнему придется платить, но теперь не придется сосредоточенно пыхтеть при скрупулезном вводе 29 значений вручную.

Бояться "сложности" метода не надо, самому ничего не придется программировать - я уже обо всём позаботился за вас. Нужно будет просто скопировать некий текст в одном месте, вставить его в другое и нажать Enter.

Первое место ("источник") - это ячейка Y4 в прилагаемом к этому сообщению файле Excel (файл виден и доступен только для зарегистрированных пользователей форума). Просто встаете на нее и выполняете обычную операцию копирования. Ячейка содержит формулу, при копировании же вы забираете в буфер обмена результат расчета по этой формуле.

Второе место ("назначение") - это адресная строка вашего интернет-браузера (IE или Firefox или любого другого вашего конкретного). В эту адресную строку и нужно будет вставить текст из ячейки, скопированной в Excel, вместо текущего содержимого адресной строки.

ВАЖНО! Перед тем как делать вставку в адресную строку браузера, убедитесь, что на странице отображается форма калькулятора с полями для ввода весов и калорийностей. Адрес при этом будет такой: http://www.minusfunt.ru/cabinet/calc (или .../calcstart - если используется калькулятор разгона). И, наверное, уже понятно, что запуск скрипта на другой произвольной web-странице не будет иметь никакого смысла.

После того, как текст из ячейки Excel окажется в адресной строке браузера, пользователь нажимает Enter. При этом система молниеносно заполняет поля калькулятора и выдает сообщение "Загружено!".

На самой странице калькулятора скрипт не сделает ничего сверх того, для чего он предназначен - он только заполнит поля весов и калорийностей. Указание режима (от -400 до +400), нажатия на кнопки "Стереть все" или "Рассчитать" - всё это действия, которые пользователь калькулятора должен будет по-прежнему проделать вручную. Поэтому после подтверждения сообщения "Загружено" следует произвести желаемые дальнейшие операции.

Приведу также сам текст скрипта, который в прилагаемом файле-примере формируется в ячейке Y4 (в основном для читателей-гостей, не имеющих доступа к файлу):

javascript: var v=[['142.4','142.1','142.2','142.2','142.4','142.0','142.1'],['141.4','141.4','141.3','141.2','141.0','140.7','140.6']]; var k=[[3300,3300,3300,3300,3306,3295,3299],[3387,3260,3254,3800,3227,3163,3008]]; for(i=1;i<3;i++) for(j=1;j<8;j++) { $('[name=v'+i+j+']').val(v[i-1][j-1]); $('[name=k'+i+j+']').val(k[i-1][j-1]); }; $('[name=v31]').val('140.4'); alert('Загружено!');

Даже не открывая файл Excel, уже можно потренироваться в использовании скрипта. Для этого надо выделить здесь этот красный текст, скопировать его и, открыв форму калькулятора, вставить в адресную строку браузера и нажать Enter (существует небольшая оговорка - см. P.S. в конце сообщения).

Как видно, значения весов (мои 141-142 кг) и калорийностей (мои примерно 3300 ккал) в коде хорошо просматриваются. При желании или необходимости подобная скриптовая строка может быть создана (отредактирована) самостоятельно и в обычном текстовом редакторе (без Excel).

Но все же в Excel формировать ее при помощи настроенных формул гораздо удобнее. Понятно, что для последующих недель отвечающие за скрипт формулы в столбцах W,X,Y могут быть легко скопированы (протянуты)  ниже по таблице. Через неделю вышележащая последняя строка автоматически становится предпоследней, автоматически же реализуя мою "хотелку" о вводе информации о весах и калорийности для каждой недели только один раз. Очевидно, что через неделю после использования значения ячейки Y4 нужно будет использовать значение ячейки Y5, потом Y6 и т.д.

Ну, и на сладкое - бонус за то, что вы осилили весь мой текст выше: при помощи представленного скрипта в калькулятор удается ввести значения свыше 199 кг и свыше 3999 ккал. Проверить можно самостоятельно.

P.S. ВАЖНО! Замечание из серии "Когда верстался номер".

Этот скрипт я отлаживал дома, используя браузер Microsoft Internet Explorer 8.0 (IE8). Всё замечательно получалось. Придя на работу и попробовав запустить его из браузера IE9, я обнаружил, что при вставке текста скрипта в адресную строку как-то само собой "съелось" начало текста, а именно слово "javascript:". Я не сразу это заметил, а лишь после того, как нажал Enter и получил на экране калькулятора совсем не то, что ожидал. Разбираясь в проблеме, я как раз и обнаружил это "съедание".

Погуглив по строке "в адресную строку не копируется слово javascript", я понял, что проблема существует не только у меня одного, а, грубо говоря, во всем мире. Самым простым её решением может быть самостоятельное дописывание слова с двоеточием "javascript:" в начало адресной строки после вставки. Если лень набирать всё слово, то можно копировать и вставлять строку скрипта без одного начального символа "j". В этом случае после вставки начало "avascript:" из строки не пропадает, и пользователю остается вручную добавить лишь один символ "j".

В общем, если у кого-нибудь возникнет подобная проблема, то, как говорится, извините за мелкое неудобство!

(конец "убитого" сообщения)

А вот и файл Excel с необходимыми формулами: https://docs.google.com/file/d/0B12BTJG-Ola4ZHBPbWo2aG1aT1E/edit?usp=sharing

ВНИМАНИЕ! Иногда при клике на этой ссылке выскакивает сообщение об ошибке. Бояться не надо, просто подтвердите его. Далее в пункте меню Файл на открывшейся странице (не путать с верхним Файл самого браузера) следует воспользоваться пунктом Скачать - и файл в вашем распоряжении.

Реанимация блога

Спустя всего лишь каких-то 6 лет я решил воспользоваться своим заброшенным блогом. Сразу хочу предупредить, что новых материалов по DAX здесь больше не будет, так как я уже более двух лет совсем не занимаюсь Аксаптой.

В течение ближайшего времени я хочу опубликовать в этом блоге несколько сообщений, связанных с расчетами, используемыми при следовании системе нормализации веса Минус Фунт (МФ).