Создание таблицы с использованием предыдущих значений (итеративный процесс)

Я новичок в Visual FoxPro (9.0), и у меня возникли проблемы с созданием таблицы, которая использует предыдущие значения для создания новых значений. Под этим я подразумеваю, что у меня есть таблица с двумя столбцами: возраст и вероятность смерти. Используя это, мне нужно создать таблицу выживания, в которой есть столбцы Age, l(x), d(x), q(x), m(x), L(x), T(x) и q(x) Где:

  • l(x): функция выживания; Определяется как l(x+1) = l(x) * EXP(-m(x))
  • d(x): количество смертей; Определяется как l(x) - l(x+1)
  • q(x): вероятность смерти; Это мне уже дано
  • m(x): уровень смертности; Определяется как -LN(1-q(x))
  • L(x): общее количество человеко-лет когорт в интервале (x, x+1); Определяется как l(x+1) + (0,5 * d(x))
  • T(X): Общее количество человеко-лет всех когорт в интервале (x, N); Определяется как SUM(L(x)) [от x, N]
  • e(x): ожидаемая продолжительность оставшегося срока службы; Определяется как T(x)/l(x)

Теперь я не спрашиваю, как получить все эти значения, мне просто нужна помощь в начале работы и, возможно, указание в правильном направлении. Насколько я могу судить, в VFP нет способа указать на конкретную строку в таблице данных, поэтому я не могу делать то, что обычно делаю в R, и просто зацикливаться. т.е. Я не могу сделать что-то вроде:

for (i in 1:length(given_table$Age))
  {
  new_table$mort_rate[i] <- -LN(1-given_table$death_prop[i])
  }

Прошло немного времени, поэтому я все равно не уверен, что это на 100% правильно, но моя точка зрения заключается в том, что я привык создавать таблицу и изменять значения по отдельности, указывая на определенную строку и/или столбец с помощью цикл с простой переменной-счетчиком. Однако из того, что я читал, кажется, что в VFP нет способа сделать это, и я совершенно потерян.

Я пытался создать курсор, заполняя его фиктивными значениями и пытаясь обновить каждое значение последовательно, используя SCATTER NAME и SCAN/REPLACE, но я действительно не понимаю, что происходит или как точно настроить это для каждого расчета/ввода. что мне нужно. (Это сообщение, на которое я ссылался, когда пробовал это: Умножение и вычитание значений в предыдущей строке для новой строки в FoxPro.

Итак, как мне создать таблицу, основанную на итеративном процессе вычисления последующих значений в Visual FoxPro? Есть ли какие-нибудь хорошие ресурсы, которые объясняют Курсоры и Scatter/Scan, которые я пробовал (я не смог найти никаких ресурсов, которые объясняли бы это понятными мне терминами)?

Извините, если я плохо сформулировал вещи, я довольно новичок в программировании в целом. Спасибо.


person Confused Student    schedule 05.05.2021    source источник
comment
Я бы посоветовал, когда вы задаете вопрос, включать образцы данных и желаемые результаты.   -  person Gordon Linoff    schedule 05.05.2021
comment
У VFP, конечно, есть способ указать на конкретную строку в любое время. Также в VFP можно обрабатывать всю таблицу как массив и использовать указатели массива для данных разных строк. Также есть SQL и Scan...endscan. В вашем вопросе не хватает некоторых примеров данных и того, что вы действительно хотите.   -  person Cetin Basoz    schedule 10.05.2021


Ответы (2)


Вы абсолютно можете написать цикл через существующую таблицу в VFP. Используйте команду СКАНИРОВАНИЕ. Однако, если вы планируете добавлять записи в ту же таблицу по мере продвижения, вы столкнетесь с некоторыми проблемами. Это то, что вы имели в виду здесь? Если это так, я предлагаю поместить новые записи в курсор по мере их создания, а затем ПРИСОЕДИНИТЬ их к исходной таблице после того, как вы обработаете все записи, которые были там, когда вы начали.

Если вы помещаете записи в другую таблицу при циклическом просмотре оригинала, это просто:

* Assumes you've already created the table or cursor to hold the result
SELECT YourOriginalTable && substitute in the alias/name for the original table
SCAN
  * Do your calculations
  * Substitute appropriately for YourNewTable and the two lists
  INSERT INTO YourNewTable (<list of fields>) VALUES (<list of values>)
ENDSCAN

В команде INSERT, если вы ссылаетесь на какие-либо поля исходной таблицы, вам нужно дать им псевдоним, например: YourOriginalTable.YourField, снова заменив соответствующим образом.

person Tamar E. Granor    schedule 05.05.2021

Немного поздно, но, возможно, все еще помогает. Шаги для достижения того, что вы хотите: 0. закрыть таблицы - на всякий случай (см. ЗАКРЫТЬ БАЗУ ДАННЫХ)

  1. открыть таблицу Age (см. ЕГЭ в справке VFP)
  2. создайте структуру таблицы Survival (см. CREATE TABLE), для этого вам нужно знать тип поля для каждой из ваших функций l(x), d(x) и т. д. Допустим, вы назвали поля так же, как ваши функции (например, Lx,Dx , и т.д)
  3. выберите таблицу Age (см. SELECT)
  4. цикл по таблице возраста (см. СКАН)
  5. передавать каждую запись в переменные (см. SCATTER)
  6. выполнили свои расчеты, начиная с данных (переменных) таблицы возраста, используя формулы L(x),D(x) и т. д., и сохранили их в переменных с именем M. Поле таблицы вашего выживания, т. е. M.mx = -LOG(1-m.Age) && see LOG Примечание: в В этих расчетах можно использовать любое сочетание переменных таблицы Age и вновь созданных переменных.
  7. после того, как вы вычислили все поля из Survival, запишите их в таблицу (см. команды APPEND && GATHER)
  8. закрыть таблицы (см. ЗАКРЫТЬ БАЗУ ДАННЫХ)
person Titus    schedule 31.05.2021