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 не может получить доступ к различным объектам в локальной среде моей функции... Но я не знаю, как решить проблему.

Любые предположения или помощь будет высоко ценится! Спасибо!

0 ответов

Другие вопросы по тегам