Ошибка, возможно, от использования которого внутри функции, или не указание переменных в функции - PullRequest
0 голосов
/ 29 февраля 2020

Я получаю сообщение об ошибке, когда пытаюсь запустить свою функцию, и я думаю, что это может быть связано либо с тем фактом, что я включаю кавычки вокруг слов в функцию после ее разработки, либо с тем, что я выполняю подмножество таким способом, который не подходит для R. В нижней части кода я запускаю две строки, которые дают мне то, что я хочу, но не полагаясь на функцию. Использование функции определенно сэкономит много времени, поэтому любые предложения по обработке ошибок здесь будут очень полезны. Моя функция в идеале даст результаты нескольких t-тестов.

Пример кода ниже


# Develop dataframe
example <- data.frame(
  c(rep(25, 25), rep(50,25), rep(75,25), rep(100,25)),
  c(rep(c("vaccine1", "vaccine2", "vaccine3", "vaccine4"), 25)),
  c(rep(rnorm(5), 20))
)
colnames(example) <- c("day", "treatment", "allout")

# Generate function
myfunction <- function(dataset, outcome, treatvar, treat1, treat2){
  cutdataset <- with(dataset, dataset[ (treatment==treat1 | treatment==treat2), ])
  ttests <- c(
    round(as.numeric(t.test(outcome~treatvar, data = cutdataset[which(cutdataset$day==25),], var.equal = TRUE)[1]),3),
    round(as.numeric(t.test(outcome~treatvar, data = cutdataset[which(cutdataset$day==50),], var.equal = TRUE)[1]),3),
    round(as.numeric(t.test(outcome~treatvar, data = cutdataset[which(cutdataset$day==75),], var.equal = TRUE)[1]),3),
    round(as.numeric(t.test(outcome~treatvar, data = cutdataset[which(cutdataset$day==99),], var.equal = TRUE)[1]),3),
    round(as.numeric(t.test(outcome~treatvar, data = cutdataset[which(cutdataset$day==100),], var.equal = TRUE)[1]),3),
    round(as.numeric(t.test(outcome~treatvar, data = cutdataset[which(cutdataset$day==125),], var.equal = TRUE)[1]),3),
    round(as.numeric(t.test(outcome~treatvar, data = cutdataset[which(cutdataset$day==150),], var.equal = TRUE)[1]),3)
  )
  print(ttests)
}

# Run function
myfunction("example", "allout", "treatment", "vaccine1", "vaccine3")

# Isolated cases
cutdataset <- with(example, example[ (treatment=="vaccine1" | treatment=="vaccine3"), ])
round(as.numeric(t.test(allout~treatment, data = cutdataset[which(cutdataset$day==25),], var.equal = TRUE)[1]),3)

РЕДАКТИРОВАТЬ: Я действительно понял, что (а) более гибкая версия myfunction будет иметь cutdataset сможет принимать treatvar вместо treatment, последний из которых на самом деле является переменной в наборе данных, когда я думаю, что было бы идеально указать через treatvar. Так что я добавил это в cutdataset, но я не думаю, что это работает хорошо. У меня также (б) возникли проблемы с включением другого l oop, который, как я думал, не будет проблематичным c (и поэтому я не включал его ранее, просто хочу сосредоточиться на t-тестах), но оказался вопрос, и снова я думаю, что это связано со строками и тому подобное. Т.е. я просто получаю столбец нулей для столбца n1. Буду признателен за любую помощь, и любые советы о том, почему это происходит, действительно помогут мне избежать этого в будущем. Я включил информацию, предоставленную Беном.

# Develop dataframe
example <- data.frame(
  c(rep(25, 25), rep(50,25), rep(75,25), rep(100,25)),
  c(rep(c("vaccine1", "vaccine2", "vaccine3", "vaccine4"), 25)),
  c(rep(rnorm(5), 20))
)
colnames(example) <- c("day", "treatment", "allout")

# Generate function
myfunction <- function(dataset, outcome, treatvar, treat1, treat2){
  n1 <- c(
    nrow(dataset[dataset$day == 25 & dataset$treatvar == treat1,]),
    nrow(dataset[dataset$day == 50 & dataset$treatvar == treat1,]),
    nrow(dataset[dataset$day == 75 & dataset$treatvar == treat1,]),
    nrow(dataset[dataset$day == 100 & dataset$treatvar == treat1,])
  )
  cutdataset <- with(dataset, dataset[ (treatvar==treat1 | treatvar==treat2), ])
  frmla <- reformulate(termlabels = treatvar, response = outcome)
  ttests <- sapply(c(25,50,75,100), function(x) 
    round(as.numeric(t.test(frmla, data = cutdataset[which(cutdataset$day==x),], var.equal = TRUE)[1]),3))
  print(cbind(n1, ttests))
}

# Run function
myfunction(example, "allout", "treatment", "vaccine1", "vaccine3")

# Isolated cases
cutdataset <- with(example, example[ (treatment=="vaccine1" | treatment=="vaccine3"), ])
round(as.numeric(t.test(allout~treatment, data = cutdataset[which(cutdataset$day==25),], var.equal = TRUE)[1]),3)
nrow(example[example$day == 25 & example$treatment == "vaccine1",])

1 Ответ

2 голосов
/ 29 февраля 2020

Я думаю, вам нужно использовать либо as.formula, либо reformulate, чтобы построить формулу из строк. Затем вы можете подключить свою формулу в t.test напрямую.

Вы хотите удалить кавычки из example (имя вашего фрейма данных). Похоже, вы намеревались передать фактический фрейм данных при создании из него cutdataset.

Кроме того, вы могли бы использовать sapply или другой метод вместо повторения ваших очень похожих операторов для t.test. Но в любом случае результаты должны быть одинаковыми.

# Generate function
myfunction <- function(dataset, outcome, treatvar, treat1, treat2){
  cutdataset <- with(dataset, dataset[ (treatment==treat1 | treatment==treat2), ])
  frmla <- reformulate(termlabels = treatvar, response = outcome)
  # ttests <- c(
  #   round(as.numeric(t.test(frmla, data = cutdataset[which(cutdataset$day==25),], var.equal = TRUE)[1]),3),
  #   round(as.numeric(t.test(frmla, data = cutdataset[which(cutdataset$day==50),], var.equal = TRUE)[1]),3),
  #   round(as.numeric(t.test(frmla, data = cutdataset[which(cutdataset$day==75),], var.equal = TRUE)[1]),3),
  #   round(as.numeric(t.test(frmla, data = cutdataset[which(cutdataset$day==100),], var.equal = TRUE)[1]),3)
  # )
  ttests <- sapply(c(25,50,75,100), function(x) 
    round(as.numeric(t.test(frmla, data = cutdataset[which(cutdataset$day==x),], var.equal = TRUE)[1]),3))
  print(ttests)
}

# Run function
myfunction(example, "allout", "treatment", "vaccine1", "vaccine3")

Вывод

[1] -0.065  0.366  0.065 -0.366

Редактировать (29.02.20) :

Вы все равно можете передать имя строки переменной обработки и извлечь данные столбца из набора данных. Вероятно, это предпочтительнее, чем пытаться передать набор данных и столбец отдельно от одного набора данных. Чтобы извлечь данные столбца treatment, вы можете сделать dataset[[treatvar]].

. Кроме того, вы также можете рассчитать строки данных для n1 в пределах вашего sapply для упрощения. Посмотрите, работает ли это для вас:

# Generate function
myfunction <- function(dataset, outcome, treatvar, treat1, treat2){
  cutdataset <- dataset[dataset[[treatvar]]==treat1 | dataset[[treatvar]]==treat2, ]
  frmla <- reformulate(termlabels = treatvar, response = outcome)
  ttests <- sapply(c(25,50,75,100), function(x) {
    c(n1 = nrow(dataset[dataset$day==x & dataset[[treatvar]] == treat1,]),
      ttest = round(as.numeric(t.test(frmla, data = cutdataset[which(cutdataset$day==x),], var.equal = TRUE)[1]),3))
  })
  print(t(ttests))
}

# Run function
myfunction(example, "allout", "treatment", "vaccine1", "vaccine3")
...