2015-05-21 14 views
15

Używam R do analizy farmakodynamicznej i jestem całkiem nowy w programowaniu.Jak zapisać podsumowanie (lm) do pliku?

Chodzi o to, że przeprowadzam analizę regresji liniowej, aw przyszłości będę wykonywał bardziej zaawansowane metody. Ponieważ wykonuję dużą liczbę analiz (i jestem zbyt leniwy, aby ręcznie kopiować wklej za każdym razem, gdy uruchamiam skrypt), chciałbym zapisać podsumowania analizy w pliku. Próbowałem różnych metod, ale nic nie działa.

Co szukam jest następujący jak (najlepiej) to plik tekstowy:

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 

Rozglądałem metod oszczędzania funkcji podsumowania w formacie .csv lub .txt, ale te pliki don nie reprezentują danych w sposób, w jaki mogę je zrozumieć.

Czego próbowałem:

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

ta zwraca:

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

Próba używając polecenia write.table dał:

> 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 

Użycie polecenia zapisu:

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

Potem było coraz bliżej, co następuje:

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

Ale ten plik nie mają tę samą informację czytelnej postaci drukowanej Podsumowując

Mam nadzieję, że ktoś może pomóc, bo to jest droga do zaawansowanego programowania dla mnie.

+1

Możesz wypróbować '? Capture.output' ie. 'capture.output (sum1, 'output.txt')' – akrun

+2

Proponuję użyć knitr. To bardzo proste, jeśli używasz RStudio. – Roland

+0

Możesz sprawdzić [** broom **] (http://cran.r-project.org/web/packages/broom/vignettes/broom.html), aby przekonwertować "niechlujny wynik wbudowanych funkcji w R, takie jak lm [...] i zamienia je w czyste ramki danych ". – Henrik

Odpowiedz

26

Myślę, że jedną z opcji może być sink(), która wyświetli wyniki w pliku tekstowym, a nie w konsoli. W przypadku braku zbioru danych Użyłem cars dla przykładu:

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

lm.txt teraz wygląda tak:

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 

sugestia @Roland „s knitr jest nieco bardziej zaangażowane, ale może Warto, ponieważ można z łatwością łączyć dane wyjściowe, wyniki tekstowe i liczby w jednym raporcie lub pliku HTML.

+0

Zawsze przyjemność. Powinieneś zajrzeć do 'knitr' i' broom', zgodnie z sugestiami poprzedniego komentatora: są nieco bardziej zaangażowani, ale bardziej wyrafinowani niż 'sink'. Powodzenia – Phil

+0

Cześć, to jest dokładnie to, co zrobiłem. Jednak apostrofowie wokół asterów znaczenia (***) są odszyfrowane w pliku txt. Czy istnieje sposób, aby to rozwiązać? – Rockbar

+0

@Rockbar Zaczynam nowe pytanie, łącząc się z tym. Postaraj się podać przykład tego, co masz na myśli; Nie wiem, co masz na myśli przez odszyfrowanie? – Phil

2

Jeżeli chcesz ponownie zaimportować dane do badań, ale nadal chcą mieć go w postaci pliku tekstowego, istnieje również dput np

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

To pozwala na ponowne import obiekt Podsumowanie poprzez

res=dget("summary_lm.txt") 

Sprawdźmy klasę res

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

sugestia powyżej w ork świetnie. W zależności od potrzeb można użyć funkcji tidy() dla współczynników i skrótu() dla tabeli.

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