Проблемы с вызовом переменных в пакете 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")