Применение строковых значений из списка к функции drc по умолчанию

Я использую несколько моделей и функций с моделями. Мне нужно применить значения из списка к функции R по умолчанию, например, modelFit () Моя идея состоит в том, чтобы запустить одну и ту же функцию для нескольких моделей и затем скомпилировать результаты.

Я пытаюсь использовать циклы и семейство функций «применить» в R, но безуспешно.

#package drc is necessary
library(drc)
#my data
rates <- c(.1,.1,.1,1,1,1,10,10,10,100,100,100,1000,1000,1000,.1,.1,.1,1,1,1,10,10,10,100,100,100,1000,1000,1000)
prod <- c("A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B")
resp <- c(.295,.32,.301,.155,.1501,.148,.05,.03,.044,.002,.001,.0015,.001,.0005,.0003,.312,.337,.299,.265,.2501,.248,.102,.103,.114,.02,.01,.015,.003,.0002,.0007)
data.test <- data.frame(rates,prod,resp) #my data frame

#my models
m1 <- drm(resp~rates, fct=LL.4(), data=data.test[data.test$prod=="A",])
m2 <- drm(resp~rates, fct=LL.4(), data=data.test[data.test$prod=="B",])

#lack of fit test
modelFit(m1)
modelFit(m2)

#I can get the modelFit p-values this way:
modelFit(m1)$"p value"[2]
modelFit(m2)$"p value"[2]


#I have several models. I want to create a loop to give me only the p value for each model fit. I want to use that for other information given by the summaries and function

#list of models
modelsList <- c("m1","m2")

#I can print the strings with the loop
for(i in modelsList){
  print(i)
  }

Моя идея заключалась в том, чтобы использовать строки для добавления информации для функции по умолчанию «drc» modelFit (). Результатом будет список со всеми значениями p из всех результатов цикла, но я получаю сообщение об ошибке:

Ошибка: оператор $ недействителен для атомарных векторов

#Not working
for(i in modelsList){
  modelFit(i)$"p value"[2]
  }

#Error
# Error: $ operator is invalid for atomic vectors

#Trying to use lapply
#Following this logic
lapply(modelsList, function(x) print(x))
#I could not get the results
lapply(modelsList, function(x) modelFit(x)$"p value"[2])

С результатами я бы продолжил и создал data.frame со всеми моделями и соответствующими значениями p.


person Danilo    schedule 01.08.2019    source источник


Ответы (2)


рад тебя видеть, данило

Я думаю, вы пропустили drm функцию.


modelsList <- c("m1","m2")
prod = c("A","B")
type = data.frame(modelsList,
                  prod)
#I can print the strings with the loop
for(i in modelsList){
  print(i)
}


for(i in modelsList){
  model_Prod = type[modelsList == i,]$prod
  drm_result<-drm(resp~rates, fct=LL.4(), data=data.test[data.test$prod==model_Prod,])
  print(modelFit(drm_result)$"p value"[2])
}

# lapply
lapply(modelsList, function(x) {
  model_Prod = type[modelsList == x,]$prod
  x<-drm(resp~rates, fct=LL.4(), data=data.test[data.test$prod==model_Prod,])
  modelFit(x)$"p value"[2]
}

)
person Steve Lee    schedule 02.08.2019
comment
Стив, спасибо. Он действительно делает то, что я хотел. Я подумал, что это будет проще, так как у меня уже были вызванные / сохраненные модели в коде. Теперь я попытаюсь скомпилировать все результаты цикла в data.frame. Надеюсь, я не перейду к другому вопросу ... - person Danilo; 02.08.2019

Продолжая, после ввода Стива Ли я мог сгенерировать data.frame со всеми результатами, которые я получил из цикла:

#source of information:
#https://stackoverflow.com/questions/25285570/invalid-factor-level-with-rbind-to-data-frame
#df.results will be a data.frane with headers = "Model" and "ModelFit_pvalue""
df.results <- NULL
#Loop to print only specif information requested from function and add it to a data frame
for(i in modelsList){
  model_Prod = type[modelsList == i,]$prod
  drm_result<-drm(resp~rates, fct=LL.4(), data=data.test[data.test$prod==model_Prod,])
  #print(i)
  #print(modelFit(drm_result)$"p value"[2])
  modelpvalue <- modelFit(drm_result)$"p value"[2] #store p values in a variable
  de <- data.frame("Model"=i,"ModelFit_pvalue"= modelpvalue)
  df.results = rbind(df.results,de)
}
df.results

#df.results output:
  Model ModelFit_pvalue
1    m1       0.2346460
2    m2       0.5757368
person Danilo    schedule 03.08.2019