[Решено] Шкалы со сложным алгоритмом
#1
Отправлено 06 Ноябрь 2013 - 16:21
*Лирическое вступление*
Меня зовут Дмитрий, я работаю в научно-исследовательском институте, занимающимся, в частности, психологическими исследованиями. У нас есть комплекс авторских методик, которые уже давно и не особо успешно мы пытаемся автоматизировать (перенести в электронный формат), но проблема заключается в последующей обработке данных - для исследований мы используем сложный статистический анализ, а для разовых тестирований нужен удобный вывод индивидуальных результатов. Идеальный вариант - это конструктор тестов с экспортом первичных данных в Excel (что доступно в последней версии системы Indigo), поиском которого я в данный момент и занимаюсь. По совокупности достоинств ваша система однозначно оставила самое приятное впечатление, это отличный продукт, готовый к использованию практически любым пользователем. Но, к сожалению, как и почти во всех других подобных системах, чувствуется изначальная заточенность под тесты знаний, а возможность конструирования психологических тестов - это, по большей части, бонус. Несложные методики, где отдельные вопросы соответствуют отдельным шкалам перенести в Indigo не составило труда, но вот с одной из сложных методик возникла проблема.
Перехожу непосредственно к проблеме.
Методика оценивает поведенческие установки человека. Испытуемый отвечает на 16 вопросов, каждый из которых - некая жизненная ситуация, в которую он попадает. В каждом из 16 вопросов имеется 4 варианта ответов - действий в данной ситуации. Задача испытуемого - один из 4 вариантов ответа (одно из действий) выбрать как предпочтительное (ответить "Да"), а другой вариант (из оставшихся 3) выбрать как отвергаемый (ответить "Нет"). Частично это решается дублированием вопросов с заменой задания (сперва просим испытуемого выбрать наиболее предпочтительный вариант, затем - наименее предпочтительный), но вариант ответа, выбранный как "Да", затем можно выбрать и как "Нет", что может разрушить алгоритм обработки.
Но настоящая проблема кроется в ином: методика имеет 4 шкалы, соответственно, каждый вариант ответа в каждом вопросе соответствует той или иной шкале. Подсчет баллов в шкале производится на основе выбора того или иного варианта ответа. Допустим, Вопрос 4 -> Ответ 2 -> балл начисляется в Шкалу 3; если в том же вопросе мы выбираем Ответ 3, то балл начисляется другой шкале. Очевидно, что для подобной обработки нужны условия отбора вопросов и вариантов ответа. В Excel это реализовано через функцию СЧЁТЕСЛИ(), где в скобках мы задаем нужную ячейку и значение для отбора, например, идентификатор варианта ответа (допустим, "a", "b", "c", "d"). Задать индивидуальные идентификаторы вариантов ответа в Indigo, как я понимаю, не представляется возможным. Можно попробовать использовать функцию "за каждый вариант ответа свой балл", и эти баллы взять как индивидуальные идентификаторы. У нас есть 1, 2, 3 и 4. Теперь наша задача прописать в шкале учет вопроса только при определенном значении. Насколько я понимаю, в системе Indigo это делается следующим образом:
(Балл(группа_вопросов->вопрос 1)=1)+(Балл(группа_вопросов->вопрос 4)=1)
Если моя логика верна, то таким образом в шкалу будут отбираться вопросы 1 и 4 только при ответе 1.
Появляется другая проблема - поскольку в роли идентификаторов у нас выступают значения, то и результаты шкал между собой будут значительно отличаться - в 1 шкале у нас будут суммирроваться значения 1, во 2 шкале - значения 2 и т.д. По логике, это легко решить последующим делением на то значение, что использовалось в данной шкале в качестве идентификатора, например:
(Балл(группа_вопросов->вопрос 1)=2)+(Балл(группа_вопросов->вопрос 4)=2)/2
Получается, что мы возвращаем количество ответов, т.е. подсчет ведется так, будто учтенное значение = 1.
Увы, но проделанные манипуляции, почему-то, не работают. При завершении тестирования открывается пустой белый экран "Результаты", а на сервере все тестирования все еще продолжают быть активными. Прикладываю изображения ниже.
#2
Отправлено 06 Ноябрь 2013 - 21:19
Вы почти все сделали верно Это очень радует, что есть пользователи, которые самостоятельно способны решать (ну или почти решать) подобные задачи. Вы правильно догадались ввести идентификаторы 1, 2, 3, 4, но ошиблись в техническом нюансе. Вы использовали знак равенства =, а надо было использовать знак двойного равенства ==. Это что-то вроде стандарта, который встречается во многих языках программирования (C/C++/C#/PHP и д.р.). Знак равенства = в будущем предполагается использовать для других целей. Все нюансы изложены в документации https://indigotech.ru/manual раздел 2.2.2 Вычисление результатов, подраздел "Условный оператор". Хоть Вы и не использовали непосредственно сам условный оператор "условие ? если-истина : если-ложь", но использовали сами условия. Вот возможные условия:
== – равно; < – меньше; > – больше; <= – меньше либо равно; >= – больше либо равно; != или <> – не равно; and – логическое И; or – логическое ИЛИ. Например: 2>1 ? 7 : 8, вернет 7. 10<5 ? 1 : 0, вернет 0. (4<>3 and 5>=3) ? (4+6) : (1+2), вернет 10. Условные операторы могут вкладываться друг в друга: 1+2==3 ? (2<1 ? 10 : (2+2==4 ? 11 : 12)) : 13, вернет 11.
Каждое из условий возвращает булев результат Истина или Ложь (1 или 0). Если булев результат будет участвовать в арифметических операциях, то он автоматически будет конвертирован в числа 1 или 0. У Вас самый простой случай условного оператора, запись вида (Балл(Вопрос 1) == 1 ? 1 : 0) эквивалентна (Балл(Вопрос 1) == 1). Таким образом, условия можно складывать, как Вы это и сделали. При этом не нужно производить деление, здесь Вы ошиблись. Складываться будут не идентификаторы, а 1 и 0, поэтому делить не нужно.
Таким образом, примерно то, что Вам нужно будет выглядеть следующим образом:
Шкала 1: (Балл(Вопрос 1) == 1) + (Балл(Вопрос 2) == 1) + (Балл(Вопрос 3) == 1) + ... + (Балл(Вопрос N) == 1) Шкала 2: (Балл(Вопрос 1) == 2) + (Балл(Вопрос 2) == 2) + (Балл(Вопрос 3) == 2) + ... + (Балл(Вопрос N) == 2) Шкала 3: (Балл(Вопрос 1) == 3) + (Балл(Вопрос 2) == 3) + (Балл(Вопрос 3) == 3) + ... + (Балл(Вопрос N) == 3) Шкала 4: (Балл(Вопрос 1) == 4) + (Балл(Вопрос 2) == 4) + (Балл(Вопрос 3) == 4) + ... + (Балл(Вопрос N) == 4)
Действительно, система была заточена для контроля знаний, но очень многие психологические тесты можно автоматизировать, если знать как ухитриться. Мы не стали вводить отдельный тип теста "Психологический", т.к. он по логике ничем не отличался бы от "Контроля знаний", был бы тот же самый механизм шкал, который в будущем будет улучшен, возможно, подобные действия можно будет выполнять в более короткой записи.
#3
Отправлено 08 Ноябрь 2013 - 12:41
1) Использование условий (например, "==" или ">=") без выражения "? x : y" также формирует оператор "истина-ложь", т.е. результат выражения принимают значение 1/0, вне зависимости от стоимости ответа по конкретному вопросу;
2) При наличии вопросов, которые относятся сразу к нескольким шкалам, подсчет ведется при помощи разных баллов за ответы и последующем условии "==";
3) Формат записи с операциями: должны ли между условиями и значениями быть пробелы, или они пишутся слитно ("1+1" или "1 + 1"), или же это вообще не имеет значения (в разных темах на форуме вы предлагали разные варианты).
Еще один момент - как я уже сказал, из-за тестирования неправильно созданного теста в результатах висит несколько незавершенных копий со статусом "тестирование", которые не представляется возможным правильно пройти или же удалить. Как с ними можно поступить? Видел, что вы советовали поставить обновление клиента, либо же, я так понимаю, поможет удаление и повторная установка?
UPD:
Появился новый вопрос. Возможно ли создание дополнительной шкалы, в условии которой мы будем опираться на результаты остальных шкал? Т.е. в качестве условий мы берем не (Балл(Вопрос 1) == 1), а (Балл)(Шкала 1)==1) и т.д.?
Сообщение отредактировал SDR: 08 Ноябрь 2013 - 13:00
#4
Отправлено 08 Ноябрь 2013 - 19:35
SDR (08 Ноябрь 2013 - 12:41) писал:
2) При наличии вопросов, которые относятся сразу к нескольким шкалам, подсчет ведется при помощи разных баллов за ответы и последующем условии "==";
- Согласен, требуется разъяснение и пример.
SDR (08 Ноябрь 2013 - 12:41) писал:
- Тоже введем уточнение. Сразу отвечу, что пробелы и переносы строк ни на что не влияют.
SDR (08 Ноябрь 2013 - 12:41) писал:
- Скачайте и запустите следующую программу https://indigotech.ru...e=untesting.exe. Она сбросит статусы Тестирования в Прервано.
SDR (08 Ноябрь 2013 - 12:41) писал:
- Сейчас, к сожалению, нет. Но эта функция уже имеется в плане на реализацию.
#5
Отправлено 12 Ноябрь 2013 - 08:37
SDR (08 Ноябрь 2013 - 12:41) писал:
Появился новый вопрос. Возможно ли создание дополнительной шкалы, в условии которой мы будем опираться на результаты остальных шкал? Т.е. в качестве условий мы берем не (Балл(Вопрос 1) == 1), а (Балл)(Шкала 1)==1) и т.д.?
вот это я поддерживаю!
#6
Отправлено 12 Ноябрь 2013 - 11:09
#7 Гость_Гость_*
Отправлено 04 Август 2014 - 01:12
Посмотрел, понравилось. Но есть замечания.
1. Хочется в демонстрационном режиме увидеть работу в группе.
2. Интерфейс радует, Однако кнопки там можно было бы прокомментировать подробнее. Встретив неясность, приходится смотреть инструкции, а это затягивает время. Места ведь там хватает.
3. Проводится ли системой оценивание самого материала теста? Ведь на этот счет существует довольно большая теория и вполне конкретные требования. Или проблемы качества тестовых материалов отдаются на откуп автору?
4. Появились и вопросы по поводу вычисления итоговой оценки. Как бы узнать поподробнее?
С уважением,
Морев Игорь Авенирович
Дальневосточный федеральный университет
morev.ia@dvfu.ru
#8
Отправлено 04 Август 2014 - 12:31
Цитата
- Не совсем ясно о чем именно идет речь. В ознакомительной версии есть только одно ограничение в одно подключение, т.е. можно одновременно тестировать только одного человека. Больше никаких ограничений нет. Что именно Вы имели в виду?
Цитата
- Как именно прокомментировать? В интерфейсе пользователя вроде все достаточно просто. Из кнопок там Завершить, Назад, Далее - вроде все и так понятно. Никаких особых жалоб на сложности интерфейса никогда не поступало, наоборот пользователи хвалят простоту интерфейса (отзывы https://indigotech.ru/reviews). Вот, например, Центр мониторинга в образовании провел опрос-исследование среди 70 преподавателей насчет INDIGO:
Вот исходный файл с подписью министра образования Астраханской области:
https://indigotech.ru...php?file=AO.ppt
Цитата
- Это очень сложно, тесты бывают всякие разные для разных задач и целей. Это задача автора. Программа не искусственный интеллект и анализ качества тестов провести не может. Если анализ качества теста должен производиться на основе статистических данных по результатам тестирования, то можно сгенерировать статистику по тесту и выгрузить её в Excel для дальнейшего анализа.
Цитата
- Там можно задавать шкалы и для каждой шкалы указывать формулу расчета баллов и деления шкалы (градацию оценок). Подробнее тут: https://indigotech.ru/manual "2.2.2. Вычисление результатов".
#10
Отправлено 09 Сентябрь 2021 - 12:27
Тест разбит на 67 групп, в каждой группе по два спаренных вопроса, которые выводятся в виде списка, каждый четный вопрос – это по сути опросник. Нужно произвести действия отдельно над всеми нечетными вопросами (каждый первый вопрос в каждой группы, собственно тесты знаний) и отдельно над всеми четными вопросами (каждый второй вопрос в каждой группы, т.е. опросник).
В частности для подсчета количества вопросов, на которые ответы даны (пользователь имеет возможность пропускать вопросы), мы используем такую формулу:
(abs(Балл(Группа1->Вопрос2))>0?1:0)+
(abs(Балл(Группа2->Вопрос2))>0?1:0)+
(abs(Балл(Группа3->Вопрос2))>0?1:0)+…+
(abs(Балл(Группа67->Вопрос2))>0?1:0)
А для подсчета полученных баллов (вопросы могут иметь разный вес, в том числе отрицательный) задействована уже вот такая формула:
(Балл(Группа1->Вопрос2)>0?Балл(Группа1->Вопрос2):0)+
(Балл(Группа2->Вопрос2)>0?Балл(Группа2->Вопрос2):0)+
(Балл(Группа3->Вопрос2)>0?Балл(Группа3->Вопрос2):0)+…+
(Балл(Группа67->Вопрос2)>0?Балл(Группа67->Вопрос2):0)
Формулы работают даже в более сложной структурной организации (внутри групп есть другие группы с различными названиями), замечаний нет.
В принципе смиряемся и с тем, что в журнале все вопросы считаются в общей куче: и проверка знания, и опросник.
Сложность в том, что при создании по такой же схеме следующего теста приходится работать вручную: или с нуля создаются вопросы под существующие шкалы с танцами с бубном по логической последовательности, или переписывать полностью довольно-таки громоздкие формулы в шкалах (формулы-то не копируются), при этом подвисает даже нормальный ноут.
Вопрос: как оптимизировать подобные расчеты? В Indigo это можно!
Прикрепленные файлы
#11
Отправлено 09 Сентябрь 2021 - 21:16
cep 3epo (09 Сентябрь 2021 - 12:27) писал:
Вопрос: как оптимизировать подобные расчеты? В Indigo это можно!
Здравствуйте! Это слишком сложная задача для обычной тех. поддержки, т.к. связана именно с разработкой и отладкой новых алгоритмов, но хочется Вам помочь и показать всем возможности программы, поэтому решили заморочиться и сделать. В других программах и системах тестирования ничего подобного и близко невозможно сделать в рамках универсальных функциональных возможностей. Прикладываю файл itest с решением задачи:
Прикрепленные файлы
#12
Отправлено 16 Сентябрь 2021 - 14:56
Цитата
Должен согласиться: мне неизвестны другие тестовые программы, сопоставимые с Indigo по функционалу и возможностям шкал (и не только). По сути нам удалось объединить тест знания и тест-опросник, что позволило проверить как уровень знаний, так и реальный уровень уверенности испытуемых и их завышенные самооценки (считается процент скрытых ошибок). И это что-то невероятное!
Да, с вопросами в формате эссе не все просто. Скажите: формулы работают во всем тесте или их можно модифицировать, привязав только к отдельной группе вопросов, и, таким образом, обойти стороной эссе? Подчеркиваю: это только вопрос (хотя и не совсем праздный), а не предписание к переписыванию формулы.
Спасибо за оказанную помощь.
#13
Отправлено 20 Сентябрь 2021 - 20:03
cep 3epo (16 Сентябрь 2021 - 14:56) писал:
- Алгоритм в цикле проходит по всем объектам теста последовательно и проверяет остаток от отделения на 2 позиционного индекса (0, 1, 2, 3...). Если остаток от деления равен 0, то четный вопрос, иначе нечетный.
if(($index+1)%2) - проверка нечетных:
(0+1)%2=1=истина
(1+1)%2=0=ложь
(2+1)%2=1=истина
(3+1)%2=0=ложь
и т.д.
if(!(($index+1)%2)) - проверка четных:
отрицание((0+1)%2)=отрицание(1)=отрицание(истина)=ложь
отрицание((1+1)%2)=отрицание(0)=отрицание(ложь)=истина
отрицание((2+1)%2)=отрицание(1)=отрицание(истина)=ложь
отрицание((3+1)%2)=отрицание(0)=отрицание(ложь)=истина
Поскольку в исходном тесте были только вопросы, то такое решение самое простое. Если же там будет более сложная структура, в том числе с сообщениями, то все усложняется, поскольку на позиционный индекс уже опираться нельзя и нужно заводить отдельный счетчик (проверять тип очередного объекта и если это вопрос, а не сообщение, то счетчик увеличивать на 1, и далее смотреть уже на остаток от деления этого счетчика).
cep 3epo (16 Сентябрь 2021 - 14:56) писал:
- Сделать можно что угодно, вопрос в сложности и времени, которое нужно потратить на такой алгоритм. Самое просто решение это дополнить условие внутри цикла, чтобы учитывать позиции только с такого-то по такой-то объект:
if($index >= 5 && $index <= 10 && ($index+1)%2) - Учитывать объекты только с 6-го по 11-ый объект (в коде прописывается на 1 меньше, т.к. счетчик $index начинается с 0).
Для четных соответственно условие будет иметь следующий вид:
if($index >= 5 && $index <= 10 && !(($index+1)%2))
Это не самое удобное решение, т.к. нужно будет правильно проставлять эти числа, и при изменениях в структуре теста их корректировать, зато это самое простое решение в плане алгоритма.
Ответить
Количество пользователей, читающих эту тему: 1
0 пользователей, 1 гостей, 0 анонимных