Проблемы с вызовом переменных в пакете R Survival

Я пытаюсь провести анализ выживания нескольких генов с помощью функции. Пациенты группируются по "высокой" (2) или "низкой" (1) экспрессии генов.

У меня проблемы с тем, как R понимает мой код. Вот некоторые примеры данных:

df <- read.table(header=T, text="TGM5    TGM6    TGM7    TPI1    survival    vital.status
2   1   1   2   1.419178082 2
2   1   1   1   5   1
2   1   1   2   1.082191781 2
1   1   1   1   0.038356164 1
2   1   2   2   0.77260274  2
1   1   2   2   2.336986301 1
2   1   2   1   1.271232877 1")

следующий код работает нормально:

fit<- survfit(Surv(survival, vital.status)~TGM5), data =df)

Проблема, с которой я сталкиваюсь, заключается в том, что я хочу сделать это для многих генов. Я создал массив / список имен генов, которые меня интересуют:

> genes <- names(df[1:3])
> genes[1]
[1] "TGM5"

но если я позвоню

fit<- survfit(Surv(survival, vital.status)~genes[1]), data =df)

Я получаю ошибку

    Error in model.frame.default(formula = Surv(survival, vital.status) ~ (genes[1]),  : 
  variable lengths differ (found for 'genes[1]')

Я предполагаю, что есть разница в том, когда я вызываю TGM5 напрямую по сравнению с тем, когда он вызывается как элемент из списка генов, и решение очень простое. Я в растерянности относительно того, как подойти к этому. Я пытался использовать gsub(), но безуспешно.

Наконец, так как я хотел бы расширить этот код на многие гены, я бы хотел избежать создания цикла for, есть ли векторизованный способ, которым я мог бы пойти по этому поводу?

Большое спасибо.

2 ответа

Решение

Этот хак работает:

survfit(as.formula(paste0("Surv(survival, vital.status)~",genes[1])), data =df)

Call: survfit(formula = as.formula(paste0("Surv(survival, vital.status)~", 
    genes[1])), data = df)

       n events median 0.95LCL 0.95UCL
TGM5=1 2      0     NA      NA      NA
TGM5=2 5      3   1.42    1.08      NA

Я вставляю формулу вместе, а затем приводю ее в объект формулы. Есть более приятная функция под названием reformulate это часто будет работать для этого, но я не мог заставить его работать с

Surv(survival, vital.status)

в качестве уровня аргумента ответа.

данные

df <- read.table(header=T, text="TGM5    TGM6    TGM7    TPI1    survival    vital.status
2   1   1   2   1.419178082 2
2   1   1   1   5   1
2   1   1   2   1.082191781 2
1   1   1   1   0.038356164 1
2   1   2   2   0.77260274  2
1   1   2   2   2.336986301 1
2   1   2   1   1.271232877 1")

Вам необходимо удалить кавычки: noquote(genes[1])

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