11.6 Data z jichých statistických programů

Někdy jsou data distribuovaná v nativním formátu některého statistického softwaru. K jejich načtení je možné použít balíky haven a foregin. Balík haven slouží k načítání a ukládání souborů v nativních formátech programů SPSS, SAS a Stata. Balík foreign umí načítat některé další datové formáty (a do vybraných formátů i zapisovat). Pokud nějaký formát umí číst oba balíky, doporučuji použít balík haven, na který se zde zaměříme. Jak se používá balík foreign, najdete v jeho dokumentaci.

K načítání dat poskytuje balík haven následující funkce: funkce read_dta() a read_stata() čtou soubory Stata DTA, funkce read_por(), read_sav() a read_spss() čtou soubory SPSS POR a SAV a funkce read_xpt() a read_sas() čtou soubory SAS. Všechny tyto funkce vracejí načtená data jako tabulku třídy tibble. Funkce write_dta, write_sas, write_sav a write_xpt() zapisují odpovídající formáty. Před jejich použitím je potřeba balík haven načíst; užitečné je zároveň načíst i balík labelled:

library(haven)
library(labelled)

Data pak načteme očekávávaným způsobem, kdy jméno souboru je prvním parametrem funkce read_xxx():

dt <- read_spss("nama_10_gdp.sav")

Přitom mohou nastat dva problémy. První spočívá v tom, že velké množství dat uložených v těchto formátech zřejmě nebylo vytvořených přímo v programech Stata, SPSS nebo SAS, nýbrž je vytvořily nějaké konvertory, které braly data z databáze. Tyto konvertory často daný formát zcela nedodržují, takže vlastní software takto vytvořená data načte, ale balík haven si s nimi neporadí. V tom případě je potřeba načíst data do originálního softwaru (někdy stačí jeho svobodná obdoba, např. pro software SPSS program PSPP) a data uložit do formátu CSV. Někdy také pomůže data znovu uložit do nativního formátu daného softwaru – balík haven si s nimi potom poradí. Alternativně je možné vyzkoušet balík foreign. V některých případech uspěje tam, kde haven selhal.

Druhý problém spočívá v tom, že všechny tři výše zmíněné programy používají poněkud jiné datové struktury než R. Zejména se to týká “popisků dat” a kódování chybějících hodnot. Detaily rozdílů najdete ve vinětě balíku haven s názvem “Conversion semantics.” Zde se zaměříme pouze na popisky hodnot ve vektorech. Stata, SPSS a další statistické programy umožňují “přibalit” k proměnné (sloupci v tabulce) nějaké dodatečné informace. Ukázkovým příkladem může být uchovávání dotazníkových dat. Předpokládejme, že respondenti odpovídali na následující otázku:

Máte rádi zpěv ve sprše?

  1. Určitě ano
  2. Spíše ano
  3. Spíše ne
  4. Určitě ne

Samotná odpověď je typicky uložena jako číslo kódující odpověď nebo druh chybějící odpovědi (např. “irelevantní,” nebo “odmítl odpovědět” a podobně). Význam těchto číselných kódů může být popsán právě v těchto “přibalených” informacích. Ty často obsahují i samotné znění otázky. Balík haven převede při načítání dat sloupce s přibalenými informacemi do třídy labelled. Balík zároveň implementuje i základní funkce a metody pro práci s daty této třídy; další funkce jsou obsaženy v balíku labelled.

Vektor třídy labelled je možné vytvořit i uměle pomocí labelled() z balíku haven:

lvector <- labelled(c(1,1,2,3,1,4,-99), 
                    c("Určitě ano" = 1, 
                      "Spíše ano" = 2, 
                      "Spíše ne" = 3, 
                      "Určitě ne" = 4, 
                      "Odmítl odpovědět" = -99)
                    )
class(lvector)
## [1] "haven_labelled" "vctrs_vctr"     "double"

Po načtení jsou vektory této třídy součástí načtené tabulky. Zde si pro jednoduchost takovou tabulku vytvoříme ručně:

ltable <- tibble::tibble(lvector)
print(ltable)
## # A tibble: 7 × 1
##                  lvector
##                <dbl+lbl>
## 1   1 [Určitě ano]      
## 2   1 [Určitě ano]      
## 3   2 [Spíše ano]       
## 4   3 [Spíše ne]        
## 5   1 [Určitě ano]      
## 6   4 [Určitě ne]       
## 7 -99 [Odmítl odpovědět]

Číst informace z “labels” umožňují funkce val_labels() a var_label() z balíku labelled. Funkce var_labels() vrací “labels” přiřazené proměnné – tj. celému sloupci (typicky znění otázky). val_labels() vrací “labels” pro kódovací hodnoty v tabulce:

val_labels(ltable)
## $lvector
##       Určitě ano        Spíše ano         Spíše ne        Určitě ne 
##                1                2                3                4 
## Odmítl odpovědět 
##              -99

Pro třídu labelled je v R dostupné jen velmi málo metod. Proto bývá obvyklým krokem jejich konverze do jiného datové typu. Při této operaci je užitečné být opatrný. Pouhé odstranění “lables” totiž za sebou zanechá vektory celých čísel nebo tajemně kódovaných řetězců. K touto účelu slouží funkce zap_labels():

zap_labels(ltable)
## # A tibble: 7 × 1
##   lvector
##     <dbl>
## 1       1
## 2       1
## 3       2
## 4       3
## 5       1
## 6       4
## 7     -99

Lepším způsobem je konverze kódovacích hodnot na faktor. K tomu slouží funkce as_factor(), která umí převést jeden vektor i celou tabulku. Alternativně je možné popisky převést na faktor i pomocí funkce to_factor() nebo na vektor řetězců pomocí funkce to_character() z balíku labelled.

as_factor(ltable)
## # A tibble: 7 × 1
##   lvector         
##   <fct>           
## 1 Určitě ano      
## 2 Určitě ano      
## 3 Spíše ano       
## 4 Spíše ne        
## 5 Určitě ano      
## 6 Určitě ne       
## 7 Odmítl odpovědět

Podobným způsobem je možné se vyrovnat i s různě kódovanými chybějícími hodnotami, viz viněta “Conversion semantics.”

Pokud mate balik haven nainstalovany, muzete v RStudiu nacitat data z SPSS, SASu a Staty i interaktivne, kdyz v zalozce Import Dataset v tabu Environment zvolite From SPSS..., From SAS... nebo From Stata..., viz leva strana obrazku 11.3. Nastroj nema zadna zvlastni nastaveni, opet vsak vygeneruje kod, ktery muzete vlozit do sveho skriptu, viz , viz prava strana obrazku 11.3.

Načtení dat z SPSS, SAS a Stata v RStudiu.

Obrázek 11.3: Načtení dat z SPSS, SAS a Stata v RStudiu.