Как сохранить резюме (lm) в файл?

Я использую R для фармакодинамического анализа, и я довольно новичок в программировании.

Дело в том, что я выполняю линейный регрессионный анализ, и в будущем я буду выполнять более сложные методы. Поскольку я выполняю большое количество анализов (и я слишком ленив, чтобы вручную копировать вставку каждый раз, когда я запускаю script), я хотел бы сохранить сводки анализа в файл. Я пробовал разные методы, но ничего не работает.

Я ищу следующее: (желательно) текстовый файл:

X_Y <- lm(X ~ Y)
sum1 <- summary(X_Y)

> sum1

Call:
lm(formula = AUC_cumulative ~ LVEF)

Residuals:
    Min      1Q  Median      3Q     Max 
-910.59 -434.11  -89.17  349.39 2836.81 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) 1496.4215   396.5186   3.774 0.000268 ***
LVEF           0.8243     7.3265   0.113 0.910640    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 619.9 on 104 degrees of freedom
  (32 observations deleted due to missingness)
Multiple R-squared:  0.0001217, Adjusted R-squared:  -0.009493 
F-statistic: 0.01266 on 1 and 104 DF,  p-value: 0.9106

Я искал методы для сохранения сводных функций в .csv или .txt, но эти файлы не представляют данные так, как я могу это понять.

Вещи, которые я пробовал:

fileConn <- file("output.txt")
writeLines(sum1, fileConn)
close(fileConn)

Это возвращает:

Error in writeLines(sum1, fileConn) : invalid 'text' argument

Попытка использования команды write.table дала:

> write.table(Sum1, 'output.csv', sep=",", row.names=FALSE, col.names=TRUE, quote=FALSE)
Error in as.data.frame.default(x[[i]], optional = TRUE, stringsAsFactors = stringsAsFactors) : cannot coerce class ""summary.lm"" to a data.frame

Используя команду записи:

> write(sum1, 'output.txt')
Error in cat(list(...), file, sep, fill, labels, append) : argument 1 (type 'list') cannot be handled by 'cat'

Затем я стал ближе к следующему:

> write.table(sum1, 'output.csv', sep=",", row.names=FALSE, col.names=TRUE, quote=FALSE)

Но этот файл не имел такой же читаемой информации, как распечатанная сводка

Я надеюсь, что кто-то может помочь, потому что это способ продвинутого программирования для меня.

Ответы

Ответ 1

Я думаю, что один параметр может быть sink(), который выводит результаты в текстовый файл, а не на консоль. В отсутствие вашего набора данных я использовал cars для примера:

sink("lm.txt")
print(summary(lm(cars$speed ~ cars$dist)))
sink()  # returns output to the console

lm.txt теперь выглядит следующим образом:

Call:
lm(formula = cars$speed ~ cars$dist)

Residuals:
    Min      1Q  Median      3Q     Max 
-7.5293 -2.1550  0.3615  2.4377  6.4179 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  8.28391    0.87438   9.474 1.44e-12 ***
cars$dist    0.16557    0.01749   9.464 1.49e-12 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 3.156 on 48 degrees of freedom
Multiple R-squared:  0.6511,    Adjusted R-squared:  0.6438 
F-statistic: 89.57 on 1 and 48 DF,  p-value: 1.49e-12

@Роландское предложение knitr немного более активно, но может стоить того, потому что вы можете легко вставлять ввод, вывод текста и цифры в один файл отчета или html.

Ответ 2

Если вы хотите повторно импортировать данные в R, но все же хотите иметь его в текстовом файле, есть также dput, например,

dput(summary(lm(cars$speed~cars$dist)),file="summary_lm.txt",control="all")

Это позволяет повторно импортировать итоговый объект с помощью

res=dget("summary_lm.txt")

Пусть проверяется класс res

class(res)
[1] "summary.lm"

Ответ 3

Предложение выше отлично работает. В зависимости от того, что вам нужно, вы можете использовать функцию tidy() для коэффициентов и glance() для таблицы.

library( broom )
a <- lm(cars$speed ~ cars$dist)
write.csv( tidy( a ) , "coefs.csv" )
write.csv( glance( a ) , "an.csv" )