L oop поверх строк информационного кадра и записи функций с неизвестными параметрами - PullRequest
0 голосов
/ 13 марта 2020

У меня есть фрейм данных, похожий на приведенный ниже.

Index_1 Index_2 Constant Outcome
   1      3        5        1
   2      3        6        0
   1      4        7        1

Мне нужно написать уравнение для каждой строки во фрейме данных. Эти уравнения в конечном итоге будут умножены вместе для определения функции правдоподобия. Я хочу создать что-то похожее на это:

Index_1 Index_2 Constant Outcome Equation
   1      3        5        1      m_1 - m_3 + 5 + e_1
   2      3        6        0      m_2 - m_3 + 6 + e_2
   1      4        7        1      m_1 - m_4 + 7 + e_3

Я могу заставить R распечатать уравнения, которые мне нужны, используя этот код:

for (row in 1:nrow(data)) {
  mu_a <- (paste("m_",data$Index_1[row],sep=""))
  mu_b <- (paste("m_",data$Index_2[row],sep=""))
  e_it <- (paste("e_", row,sep=""))
  print(paste(mu_a, paste("-",paste(mu_b,paste("+",paste(tradeoffs$d_lnxy[row], paste("+", e_it), sep = " "), sep = " "), sep = " "), sep = " "), sep = " "))
}

Однако, это громоздко, и я хочу каждый m_j и e_t должны быть объектом, потому что это параметры, которые будет оценивать максимальная вероятность. Я думаю, что мне нужно использовать apply, но я изо всех сил пытаюсь написать нужную мне функцию.

Ответы [ 2 ]

2 голосов
/ 13 марта 2020

Как насчет первого добавления индекса, подобного этому:

data$Index <- row.names(data)

Затем просто создайте вставленное уравнение, подобное этому:

data$Equation <- with(data,paste0("m_", Index_1, " - m_", Index_2, " + ", Constant, " + e_", Index))

Ваш результат:

 Index_1 Index_2 Constant Outcome Index Equation           
    <dbl>   <dbl>    <dbl>   <dbl> <chr> <chr>              
1       1       3        5       1 1     m_1 - m_3 + 5 + e_1
2       2       3        6       0 2     m_2 - m_3 + 6 + e_2
3       1       4        7       1 3     m_1 - m_4 + 7 + e_3

Если вам нужно ссылаться на каждый термин в уравнении отдельно, вы можете создать любое количество дополнительных столбцов, используя функцию paste0 () выше. Т.е. вы можете создать столбец с именем «mu_a», а затем выполнить paste0 («m_», data $ Index1). Затем вы можете выполнять векторизованные операции, используя этот столбец вместе с другими вашими столбцами (каждый из которых представляет термин в вашем уравнении).

1 голос
/ 13 марта 2020

Нет необходимости в oop. Вы можете просто вставить переменные вместе, то есть

paste0('m_', df1$Index_1, ' - m_', df1$Index_2, ' + ', df1$Constant, ' + e_', seq(nrow(df1)))
#[1] "m_1 - m_3 + 5 + e_1" "m_2 - m_3 + 6 + e_2" "m_1 - m_4 + 7 + e_3"
...