Вопрос или проблема
Если я напишу это:
f <- function(lambda, a_0, n) {
a <- numeric(n)
a[1] <- a_0
for (i in 2:n) {
a[i] <- lambda * a[i-1] * (1 - a[i-1])
}
return(a)
}
f(4, 0.75, 100)
то создается список, который содержит только число 0.75. Это ожидаемо.
Однако, если я напишу:
lambda <- 4
n <- 100
a_0_values <- seq(0.05, 0.95, by = 0.05)
df <- data.frame(matrix(ncol = length(a_0_values), nrow = n))
for (i in 1:length(a_0_values)) {
df[, i] <- f(lambda, a_0_values[i], n)
}
df[,15]
то создается список, который первоначально содержит 0.75, но через некоторое время он начинает изменяться (см. таблицу, которую я предоставлю в конце).
Я попытался увеличить длину создаваемого списка, написав до f(4, 0.75, 1000000)
, и это все равно работало так, как ожидалось. Оно просто выдало 0.75, как и должно. Конечно, даже если оно изменилось после определенного момента, это все еще не объясняет, почему f(4, 0.75, 100)
и df[,15]
дают разные результаты.
Почему так?
df[,15]
[1] 7.500000e-01 7.500000e-01 7.500000e-01 7.500000e-01 7.500000e-01 7.500000e-01
[7] 7.500000e-01 7.500000e-01 7.500000e-01 7.500000e-01 7.500000e-01 7.500000e-01
[13] 7.500000e-01 7.500000e-01 7.500000e-01 7.500000e-01 7.500000e-01 7.500000e-01
[19] 7.500000e-01 7.500000e-01 7.500000e-01 7.500000e-01 7.500000e-01 7.500000e-01
[25] 7.500000e-01 7.500000e-01 7.500000e-01 7.500000e-01 7.500000e-01 7.499999e-01
[31] 7.500001e-01 7.499998e-01 7.500005e-01 7.499990e-01 7.500019e-01 7.499962e-01
[37] 7.500076e-01 7.499847e-01 7.500305e-01 7.499390e-01 7.501221e-01 7.497558e-01
[43] 7.504881e-01 7.490228e-01 7.519506e-01 7.460836e-01 7.577714e-01 7.342156e-01
[49] 7.805721e-01 6.851171e-01 8.629266e-01 4.731372e-01 9.971136e-01 1.151244e-02
[55] 4.551962e-02 1.737903e-01 5.743490e-01 9.778889e-01 8.648884e-02 3.160341e-01
[61] 8.646262e-01 4.681910e-01 9.959528e-01 1.612345e-02 6.345395e-02 2.377102e-01
[67] 7.248162e-01 7.978306e-01 6.451876e-01 9.156822e-01 3.088332e-01 8.538210e-01
[73] 4.992429e-01 9.999977e-01 9.170494e-06 3.668164e-05 1.467212e-04 5.867986e-04
[79] 2.345817e-03 9.361256e-03 3.709449e-02 1.428740e-01 4.898440e-01 9.995874e-01
[85] 1.649634e-03 6.587650e-03 2.617701e-02 1.019671e-01 3.662792e-01 9.284750e-01
[91] 2.656366e-01 7.802952e-01 6.857385e-01 8.620049e-01 4.758098e-01 9.976593e-01
[97] 9.340721e-03 3.701389e-02 1.425754e-01 4.889907e-01
Ответ или решение
Конструкция датафрейма в R и воздействие на значения списков – важная тема для обсуждения, особенно в контексте выполнения функций и работы с данными. Давайте разберем, почему возникают различия в результатах при вызове функции f
и при обращении к соответствующему столбцу датафрейма df
.
Основы функций и списков в R
-
Функция
f
:
Функцияf
принимает три аргумента:lambda
,a_0
иn
, гдеlambda
– это коэффициент обновления,a_0
– начальное значение (в данном случае 0.75), аn
– количество итераций. Код внутри функции создает векторa
, который заполняется в ходе вычислений на основе динамической системы, описанной в функции. В вашем примере, вызовf(4, 0.75, 100)
возвращает вектор, где первое значение 0.75 и оно остается постоянным, так как при таких условиях система быстро достигает состояния равновесия. -
Создание датафрейма
df
:
Когда вы создаете датафрейм, вы итеративно заполняете его столбцы значениями, получаемыми от функцииf
. Однако здесь стоит обратить внимание на то, что в процессе заполнения датафрейма происходит новое вычисление значений на основе той же самой функцииf
, но с различными значениямиa_0
, начиная с 0.05 и увеличиваясь до 0.95. Изменяя начальное значениеa_0
, вы также меняете поведение системы, которая генерирует значения в зависимости от начального условия.
Понимание различий
Изменение значений: Важно понимать, что в случае вызова функции f(4, 0.75, 100)
вы всегда получаете одно и то же значение (вектор, начинающийся с 0.75), поскольку функция выполняет одни и те же вычисления. Однако, когда вы заполняете столбцы в датафрейме, каждый столбец имеет свое начальное значение, и в результате получаете различный набор значений, отражающих динамику системы, основанную на разных начальных условиях.
В случае столбца df[, 15]
вы имеете дело с 15-й последовательностью значений, где начальное значение a_0
, вероятно, составляет 0.75. Однако далее в системе происходят изменения, и система начинает демонстрировать сложное поведение, которое зависит от предыдущих итераций, порождая эффекты, как упоминалось в вашем данных — колебания и изменение значений.
Итог
Конструкция датафрейма не изменяет значения исходного списка при вызове функции. Вместо этого результат, который вы видите в df[, 15]
, является производным новых значений, которые генерируются в зависимости от динамического поведения функции f
при разных начальных условиях. Поскольку в первом случае начальное значение фиксировано, результаты не меняются, в то время как в датафрейме ваше начальное значение меняется для каждого столбца, что и приводит к колебаниям значений.
Таким образом, когда вы работаете с динамическими системами и датафреймами в R, всегда учитывайте взаимосвязь начальных условий и последующих состояний системы, чтобы более точно интерпретировать результаты.