nlme() не запускается при использовании в пользовательской функции в R
Я пытаюсь создать пользовательскую функцию, используя nlme(), и я не могу понять, почему моя функция не запускается... Я предполагаю, что nlme не может получить доступ к объектам в локальной среде моей функции.
Чтобы дать вам некоторое представление, я хочу создать функцию, которая: 1. принимает в качестве аргумента фрейм данных с необработанными данными (в данном примере фрейм данных называется "data_normal_vision"); 2. изменяет этот фрейм данных (новый df называется temp_df); 3. запускает модель nlme для модифицированных данных temp_df.
Сначала я создал код вне функции, где он работает правильно следующим образом:
# load the library that contains data
library(mnreadR)
# run some modifications on the dataframe 'data_normal_vision'
temp_df <- as.data.frame(
data_normal_vision %>%
mutate (grp_var = subject ) %>%
filter (err != "NA" & rt > 0) %>%
mutate (rs = (10 - replace (err, err > 10, 10)) / rt * 60) %>%
filter (rs != "NA", rs != "-Inf") %>%
mutate (log_rs = log10(rs)) %>%
filter (log_rs != "NA", log_rs != "-Inf") %>%
mutate (correct_ps = ps + round(log10(40/vd), 2)) %>%
filter (correct_ps != "NA", correct_ps != "-Inf") )
# inspect the dataframe structure
head(temp_df)
# generate starting values for nlme by running nlsList
my.list <- nlsList (model = log_rs ~ SSasympOff (correct_ps, asym, lrc, x_intercept) | grp_var ,
data = temp_df )
# set the control parameters for nlme
contr <- nlmeControl(maxIter = 100, pnlsTol = 0.3)
# run my nlme model
my.model <- nlme (model = my.list,
random = asym + lrc + x_intercept ~ 1,
control = contr)
# return the model
my.model
Затем я попытался реализовать тот же код в функции, где он не запускается....
nlmeParam <- function(data, print_size, viewing_distance, reading_time, errors, grouping_var) {
# run some lines that are not relevant for this question
print_size <- enquo(print_size)
viewing_distance <- enquo(viewing_distance)
reading_time <- enquo(reading_time)
errors <- enquo(errors)
grouping_var <- enquo(grouping_var)
grp_var <- NULL
rs <- NULL
log_rs <- NULL
correct_ps <- NULL
# modify the raw dataframe as needed (again, not relevant for this question)
temp_df2 <- as.data.frame(
data %>%
mutate (grp_var = (!!grouping_var) ) %>%
filter ((!!errors) != "NA" & (!!reading_time) > 0) %>%
mutate (rs = (10 - replace ((!!errors), (!!errors) > 10, 10)) / (!!reading_time) * 60) %>%
filter (rs != "NA", rs != "-Inf") %>%
mutate (log_rs = log10(rs)) %>%
filter (log_rs != "NA", log_rs != "-Inf") %>%
mutate (correct_ps = (!!print_size) + round(log10(40/(!!viewing_distance)), 2)) %>%
filter (correct_ps != "NA", correct_ps != "-Inf"))
# inspect the dataframe structure
head(temp_df2)
# generate starting values for nlme by running nlsList
my.list <- nlsList (model = log_rs ~ SSasympOff (correct_ps, asym, lrc, x_intercept) | grp_var ,
data = temp_df2 )
# set the control parameters for nlme
contr <- nlmeControl(maxIter = 100, pnlsTol = 0.3)
# run my nlme model
my.model <- nlme (model = my.list,
random = asym + lrc + x_intercept ~ 1,
control = contr)
# return the model
return(my.model)
}
# call the function
nlmeParam(data_normal_vision, ps, vd, rt, err, subject)
При внедрении в функцию nlme () больше не работает. Я отлаживал код до тех пор, пока он не остановится:
# run my nlme model
my.model <- nlme (model = my.list,
random = asym + lrc + x_intercept ~ 1,
control = contr)
Сначала я получил сообщение об ошибке, в котором говорится, что датафрейм temp_df не найден:
Error in eval(mData) : object 'temp_df' not found
Поэтому я создал фрейм данных temp_df в глобальной среде (т. Е. Вне функции) и попытался снова запустить функцию. Сообщение об ошибке изменилось на:
Error in (function (model, data = sys.frame(sys.parent()), fixed, random, :
object 'contr' not found
Я подозреваю, что nlme не может получить доступ к различным объектам в локальной среде моей функции... Но я не знаю, как решить проблему.
Любые предположения или помощь будет высоко ценится! Спасибо!