viernes, 30 de septiembre de 2011

RTextTools: a machine learning library for text classification - Blog

RTextTools: a machine learning library for text classification - Blog
Un buen aporte de All, Loren Collingwood y Timothy P. Jurka, que espero poder investigar pronto.

RTextTools bundles a host of functions for performing supervised learning on your data, but what about other methods like latent Dirichlet allocation? With some help from the topicmodels package, we can get started with LDA in just five steps. Text in green can be executed within R.

Step 1: Install RTextTools + topicmodels
We begin by installing and loading RTextTools and the topicmodels package into our R workspace.

install.packages(c("RTextTools","topicmodels"))
library(RTextTools)
library(topicmodels)

Step 2: Load the Data
In this example, we will be using the bundled NYTimes dataset compiled by Amber E. Boydstun. This dataset contains headlines from front-page NYTimes articles. We will take a random sample of 1000 articles for the purposes of this tutorial.

data <- read_data(system.file("data/NYTimes.csv.gz",package="RTextTools"), type="csv")
data <- data[sample(1:3100,size=1000,replace=FALSE),]

Step 3: Create a DocumentTermMatrix
Using the create_matrix() function in RTextTools, we'll create a DocumentTermMatrix for use in the LDA() function from package topicmodels. Our text data consists of the Title and Subject columns of the NYTimes data. We will be removing numbers, stemming words, and weighting the DocumentTermMatrix by term frequency.

matrix <- create_matrix(cbind(data$Title,data$Subject), language="english", removeNumbers=TRUE, stemWords=TRUE, weighting=weightTf)

Step 4: Perform Latent Dirichlet Allocation
First we want to determine the number of topics in our data. In the case of the NYTimes dataset, the data have already been classified as a training set for supervised learning algorithms. Therefore, we can use the unique()function to determine the number of unique topic categories (k) in our data. Next, we use our matrix and this k value to generate the LDA model.

k <- length(unique(data$Topic.Code))
lda <- LDA(matrix, k)

Step 5: View the Results
Last, we can view the results by most likely term per topic, or most likely topic per document.

terms(lda)
Topic 1 "campaign" Topic 2 "kill" Topic 3 "elect" Topic 4 "china" Topic 5 "govern" Topic 6 "fight" Topic 7 "leader" Topic 8 "york" Topic 9 "isra" Topic 10 "win" Topic 11 "report" Topic 12 "plan"
Topic 13 "republican"Topic 14 "aid" Topic 15 "set" Topic 16 "clinton" Topic 17 "nation" Topic 18 "hous"
Topic 19 "iraq" Topic 20 "bush" Topic 21 "citi" Topic 22 "rais" Topic 23 "overview" Topic 24 "money"
Topic 25 "basebal" Topic 26 "court" Topic 27 "war"

topics(lda)
Output too long to display here. Try it out for yourself to see what it looks like!

Recursos disponibles de la última conferencia de usuarios de R (useR! 2011)

useR! 2011, resources for tutorials


jueves, 29 de septiembre de 2011

Estadística descriptiva (Clase 2)

###########################################################################
# Análisis de datos con R #
# 2010/2011 #
# Msc. Rosana Ferrero #
# http://statisticalecology.blogspot.com/ #
###########################################################################
# Clase 2. Estadística descriptiva
###########################################################################
# 0. Funciones de interés para manejar los datos #
# 1. Estadística descriptiva #
# a. Tablas de Frecuencia #
# b. Gráficos #
# c. Estadísticos, medidas o estimadores #
# 2. Ejemplo: datos Iris #
# 3. Otras funciones para el manejo de datos #
###########################################################################
 
###########################################################################
# 0. Funciones de interés para manejar los datos #
###########################################################################
 
########## Leer los datos
 
### La función "scan"
x<-scan()
1: 6
2: 7
3: 3
4: 4
5: 8
6: 5
7: 6
8: 2
9:
 
### La función "read.table". Producen un dataframe
data<-read.table("c:\\temp\\regression.txt",header=T)
map<-read.table("c:\\temp\\bowens.csv",header=T,sep=",")
data<-read.table(file.choose(),header=T)
## opción seq=""
#\n newline
#\r carriage return
#\t tab character
#\b backspace
#\a bell
#\f form feed
#\v vertical tab
## chequear un archivo
file.exists("c:\\temp\\Decay.txt")
## leer datos desde archivos con formato no estándar. Producen un objeto lista no un dataframe
murders<-scan("c:\\temp\\murders.txt", skip=1, what=list("","","",""))
murder.frame<-as.data.frame(murders)
murders<-read.table("c:\\temp\\murders.txt",header=T)
## leer archivos con diferentes números/valores por línea
line.number<-length(scan("c:\\temp\\rt.txt",sep="\n"))
(my.list<-sapply(0:(line.number-1),function(x) scan("c:\\temp\\rt.txt",skip=x,nlines=1,quiet=T)))
## leer líneas. Produce un objeto de clase character.
readLines("c:\\temp\\murders.txt",n=-1)
 
######## Ver ítem 4 para obtener más funciones de interés
 
###########################################################################
# 1.a. Tablas de frecuencias #
###########################################################################
 
table(rpois(100,5)) # realiza tablas de frecuencias absolutas
table(rpois(100,5))/sum(rpois(100,5)) #realiza tablas de frecuencias relativas
table(cut(rpois(100,5),3)) #para variables numéricas si queremos hacer una tabla de frecuencias absolutas agrupando los datos por intervalos
margin.table(tabla, 1 o 2 o ...) #realiza tablas marginales del objeto tabla
prop.table(tabla, 1 o 2 o ...) #tabla de frecuencias condicionadas por la dimensión indicada con 1 o 2 o... del objeto tabla
ftable(tabla) # tabla de frecuencias para 3 o más variables categóricas
 
m <- matrix(1:4,2); m
margin.table(m,1) # totales por filas
margin.table(m,2) # totales por columnas
prop.table(m,1) # porcentaje por filas
prop.table(m,2) # porcentaje por columnas
 
data(Titanic)
Titanic
ftable(Titanic) # crea tablas de contingencia llanas; x= factores o lista o tabla
ftable(Titanic, row.vars = 1:2, col.vars = "Survived")
 
tabulate(c(2,3,3,5), nbins = 10) # cuenta el número de veces que ocurre cada valor en un vector dado
 
# Tabla de frecuencias de 3 vías (3 variables)
xtabs(~A+B+C, data) # tabla de frecuencias de 3 vías
 
# Tabla de contingencia (Cross Tabulation) de 2 vías (2 variables)
library(gmodels)
CrossTable(mydata$myrowvar, mydata$mycolvar)
 
requires(stats)
with(warpbreaks, table(wool, tension)) #distribución de frecuencias simples
table(state.division, state.region)
with(airquality, table(cut(Temp, quantile(Temp)), Month)) #tabla de contingencia de 2 vías
 
#La tabla ignora los valores perdidos, para incluir los NA como una categoría para contar debemos incluir la opción exclude=NULL si la variable es un vector. Si la variable es un factor debemos crear un nuevo factor usando: newfactor <- factor(oldfactor, exclude=NULL). (Obtenido de "QuickR" -http://www.statmethods.net/stats/frequencies.html-)
 
hist(x, nclass=, breaks=seq(0,100,by=5))
#por ejemplo:
(hist(velocidades, plot=FALSE, col='14',nclass=10,ylim=c(0,10), labels=TRUE,main= 'Velocidad autom¶oviles', sub='Via el Volador', ylab='Frecuencias',xlab='Velocidad en Km/h'))
#$breaks (límites de clase)
#$counts (frecuencias absolutas)
#$intensities (frecuencias relativas)
#$mids (marcas de clase o puntos medios)
 
###########################################################################
# 1.b. Gráficos #
###########################################################################
 
x11() # activa un dispositivo gráfico
dev.off() #cierra un dispositivo gráfico
par() # selecciona ciertos parámetros gráficos que están definidos por defecto y pueden modificarse
demo(graphics) # demostración de gráficos y código de R
plot(x,y) # gráfico de dispersión: x e y son vectores
plot(x) #si x es un vector numérico realiza un gráfico de sus elementos sobre el índice, y si x es una serie temporal realiza un gráfico de x frente al tiempo
plot(f) # si f es factor realiza un gráfico de barras
plot(f, x) # si f es factor y x vector, realiza un diagrama de cajas para cada nivel del factor f
plot(hoja.datos) # realiza un gráfico de dispersión para cada pareja de variables
 
## argumentos de las funciones gráficas
#type= "n" (nada) "p" (puntos) "l" (líneas) "b" (both: punto+línea) "o" "s" "S" "h"
#xlab= ylab= (añade etiquetas a los ejes)
#main= sub= (añade título y subtítulo)
#xlim=c(,) ylim=c(,) (selecciona los límites mínimo y máximo para los ejes)
#add= T o F (solapa un gráfico con otro ya existente o no)
#col= (indicar color). ver la opción colors()
 
## otras funciones gráficas
points(x,y, pch=nº) #añade puntos definidos por las coordenadas contenidas en los vectores x e y el aspecto indicado en pch. Se puede utilizar type
abline(h=, v=) # añade líneas horizontales y/o verticales
abline(lm) o abline(a,b, lty=nº) #añade una recta y=a+b*x con el trazo indicado en lty
legend(x,y) # añade la leyenda en el punto indicado
title(main="" , sub="") #añade título y subtítulo
axis() # modifica elementos referentes a los ejes como color, tickmarks, fuentes, etc
text(x,y,etiquetas) #añade etiquetas en las posiciones marcadas por x e y
lines()
curve()
 
#gráficos simples
hist(vector, nclass, breaks, probability, plot) #histograma
mid.age<-c(2.5, 7.5, 13, 16.5, 17.5, 19, 22.5, 44.5, 70.5) ;
acc.count<-c(28, 46, 58, 20, 31, 64, 149, 316, 103) ;
age.acc<-rep(mid.age, acc.count) ; age.acc ;
brk<-c(0, 5, 10, 16, 17, 18, 20, 25, 60, 80) ; hist(age.acc, breaks=brk)
A<-hist(x); lines(c(min(A$breaks), A$mids, max(A$breaks)), c(0, A$counts, 0), type="l", col="red") #histograma con polígono de fercuencias
 
x<-seq(100, 145, by=5) ; n<-length(x) #funciónd e distribución empírica
plot(sort(x), (1: n)/n , type=”s, ylim=c(0,1))
 
qqnorm(x) #gráfico de probabilidad normal, en abscisas están los valores esperados de los cuantiles de la normal y en las ordenadas los valores de x
qqplot(x) #gráfico cuantil-cuantil, en abscisas están lso cuantiles del vector x y en ordenadas los cuantiles del vector y
 
boxplot(vector1, vector2, plot=F o T) #diagrama de cajas como vectores
boxplot(formula, data=NULL, subset, plot=F o T) # diagrama de cajas múltiple
plot(factor, vector) #diagrama de cajas para cada nivel del factor f
 
stripchart(formula o x, method="overplot" o "jitter" o "stack") #gráfico de puntos
stem(vector) #diagrama de tallo-hojas
 
plot(table()) #diagrama de barras para una variable numérica discreta
plot(factor) #diagrama de barras para una variable categórica
barplot(vector o tabla, names.args=NULL) #cada valor representa la altura de una barra que podemos etiquetar opcionalmente con names.args
barplot(matriz o tabla, beside=T (adyacentes) o F (apiladas)) #diagrama de barras múltiples apiladas o no.
pie(x,labels=names(x), col) #diagrama de sectores
 
#gráficos múltiples por ventana
par(mfrow=c(filas, columnas)) #divide la pantalla gráfica en tantas filas y columnas como se indique
split.screen()
#datos multivariantes
plot(data.frame) #realiza un gráfico de dispersión de todos los pares de variables
pairs(A) # matriz de gráficos planos, un gráfico de dispersión para cada pareja de columnas de A
coplot(a~b|c) #gráficos condicionales
persp() #representa gráficamente funciones de 2 variables
contour() #representa curvas de nivel de una función de 3 variables
image() #representa un mapa de 2 variables
matplot() #representa una matriz frente a otra por columnas
matpoints o matlines # añade puntos o líneas a un gráfico (matrices)
 
#otros
library(lattice)
xyplot(circumference ~ age, groups=Tree, data=Orange)
 
#guardar gráficos
pdf(file="f1,pdf", width=8, heigth=10)
plot(runif(10))
dev.off()
#otra forma
plot(runif(50))
dev.copy2eps() #el nombre del archivo por defecto es Rplot.eps y el formato es postcript
 
###########################################################################
# 1.c. Estadísticos simples #
###########################################################################
 
#mean Media aritmética
#mean(datos, trim=.05) Media truncada o recortada al 5%
#median El percentil 0.5: la mediana
#min El mínimo de una serie de números
#max El máximo de una serie de números
#quantile Los percentiles de una distribución
#range Mínimo y máximo de un vector
#sum Suma aritmética
#var Cuasi-Varianza y cuasi-covarianza
#var(datos)*(length(datos)-1)/length(datos) Varianza
#sd Cuasi-desviación típica
#sqrt(var(datos))*(length(datos)-1)/length(datos) Desviación típica
#sd(datos)/abs(mean(datos)) Coeficiente de Variación
#mad Desviación media de la mediana
#skewness Asimetría
#kurtosis Curtosis o apuntalamiento
#summary Resumen de estadísticas de una serie de datos
#fivenum Retorna los 5 números de Tukey (de cajas de Tukey): minimum, lower-hinge, median, upper-hinge, maximum.
#cor Correlación (admite uno o dos argumentos)
#cumsum Suma cumulativa de un vector
#prod El producto de los elementos de un vector
#sample Muestreo aleatorio (y permutaciones)
 
### Veamos algunos ejemplos:
mean(1:10) #media aritmética
exp(mean(log(abs(1:10)))) #media geométrica
1/mean(1/1:10) #media armónica
median(1:10) #mediana
quantile(1:10) #cuartiles
quantile(1:10, probs=seq(0,1, by=1/10)) #deciles
weigthed.mean()
IRQ()
range()
cor()
tapply(x,f) #para obtener resúmenes por grupos
100*sd(x)/mean(x) # CV coeficiente de variación
 
#Estadísticas simples:
x = seq(1:10)
x
# [1] 1 2 3 4 5 6 7 8 9 10
cumsum(x)
# [1] 1 3 6 10 15 21 28 36 45 55
median(x)
#[1] 5.5
 
 
###########################################################################
# 2. Ejemplo: datos Iris
###########################################################################
data(iris)
head(iris)
attach(iris)
 
table(Species)
summary(Sepal.Length) # resumen estadístico de 1 variable
summary(iris) #resumen estadístico de varias variables
tapply(Sepal.Length, Species, mean)
var(Sepal.Length)
cor(iris[1:4]) #matriz de correlaciones
 
plot(iris) #gráfico de un dataframe
plot(Sepal.Length) # gráfico de 1 variables
plot(Sepal.Length, Petal.Length) # gráfico de 2 variables; ídem plot(Petal.Length~Sepal.Length)
plot(Species[Sepal.Length>5.1]) # gráfico de 1 factor
plot(Species, Sepal.Length) # gráfico de 1 factor (diagrama de cajas)
hist(Sepal.Length) #histograma
pie(table(Species[Sepal.Length>5]))
qqline(Sepal.Length) # comparación de un vector con los valores esperados normales
qqplot(Sepal.Length, Petal.Length) # comparación de las distribuciones de dos vectores o variables
cols <- rep(c("red","blue","green"), each=50)
pich <- rep(c(21,22,23),each=50)
plot(Sepal.Length,Petal.Length, pch=pich, bg=colores)
 
 
################################################################################ # 3. Otras funciones para el manejo de datos #
################################################################################
 
######### Primer visión de los datos
worms=read.table("http://www.bio.ic.ac.uk/research/mjcraw/therbook/data/worms.txt",header=T)
attach(worms)
names(worms)
summary(worms)
#las funciones by y aggregate permiten resumir un dataframe según los niveles del factor
by(worms, Vegetation, mean)
 
## Subíndice e índices
worms[3, 5]
worms[14:19, 7]
worms[1:5, 2:3]
worms[3, ]
worms[, 3]
worms[, c(1,5)]
# Seleccionar filas aleatoriamente de un Dataframe
worms[sample(1:20,8),]
# Ordenando los Dataframes
worms[order(Slope), ]
worms[rev(order(Slope)), ]
worms[order(Vegetation, Worm.density)]
# Usar condiciones lógicas para seleccionar filas de un Dataframe
worms[Damp == T,]
worms[Worm.density > median(Worm.density) & Soil.pH < 5.2,]
worms[,sapply(worms,is.numeric)]
worms[,sapply(worms,is.factor)]
# Drop filas
worms[-(6:15),]
worms[!(Vegetation=="Grassland"),]
worms[-which(Damp==F),]
 
### Omitir filas que contengan valores perdidos
data<-read.table("c:\\temp\\worms.missing.txt",header=T)
data
na.omit(data)
new.frame<-na.exclude(data)
data[complete.cases(data),]
apply(apply(data,2,is.na),2,sum)
 
#### Usar order y unique para eliminar la pseudoreplicación
worms[rev(order(Worm.density)),][unique(Vegetation),]
 
#### Ordenar de manera compleja con direcciones mixtas
worms[order(Vegetation,-Worm.density),]
# solo podemos utilizar el signo de menos cuando ordenamos variables numéricas, si no debemos utilizar la función rank para hacer numéricos los niveles de los factores.
worms[order(-rank(Vegetation),-Worm.density),]
 
### Un dataframe con nombres en las filas en lugar de números
detach(worms)
worms=read.table("http://www.bio.ic.ac.uk/research/mjcraw/therbook/data/worms.txt",header=T)
#worms<-read.table("c:\\temp\\worms.txt",header=T,row.names=1)
worms
 
##### Crear un dataframe
x<-runif(10)
y<-letters[1:10]
z<-sample(c(rep(T,5),rep(F,5)))
new<-data.frame(y,z,x)
new
 
y<-rpois(1500,1.5)
table(y)
as.data.frame(table(y))
 
short.frame<-as.data.frame(table(y)) # expandir un dataframe
long<-as.data.frame(lapply(short.frame, function(x) rep(x, short.frame$Freq)))
long[,1]
 
##### Eliminar filas duplicadas en un Dataframe
dups<-read.table("c:\\temp\\dups.txt",header=T)
dups
unique(dups)
dups[duplicated(dups),]
 
##### Juntar dos Dataframes: Merge
lifeform=read.table("http://www.bio.ic.ac.uk/research/mjcraw/therbook/data/lifeforms.txt",header=T); lifeform
flowering=read.table("http://www.bio.ic.ac.uk/research/mjcraw/therbook/data/fltimes.txt",header=T); flowering
merge(flowering,lifeforms) #contiene solo las filas que tienen entradas completas para ambos dataframes
(both<-merge(flowering,lifeforms,all=T)) # si queremos incluir todas las especies poniendo NA donde no hay coincidencias
# cuando tenemos diferentes nombres en 2 dataframes que queremos unir:
(seeds<-read.table("c:\\temp\\seedwts.txt",header=T))
merge(both,seeds,by.x=c("Genus","species"),by.y=c("name1","name2"))
 
##### Juntar dos Dataframes: Match
herb=read.table("http://www.bio.ic.ac.uk/research/mjcraw/therbook/data/herbicides.txt",header=T)
herb
worms$hb=herb$Herbicide[match(worms$Vegetation,herb$Type)] ## agregar un herbicida recomendado
match(worms$Vegetation,herb$Type)
worms
 
##### Resumir los contenidos de un dataframe:
#summary: resume los contenidos de todas las variables
#aggregate: crea una tabla del tipo tapply
#by: crea funciones para cada nivel del factor especificado
aggregate(worms[,c(2,3,5,7)],by=list(veg=Vegetation),mean)
aggregate(worms[,c(2,3,5,7)],by=list(veg=Vegetation,d=Damp),mean)
 
x1=1:8; x2=11:18; x3=rep(c("a","i"),each=4); x4=rep(c("f","m"),4)
df=data.frame(y=x1,z=x2,age=x3,sex=x4); df
summary(df)
table(df$age,df$sex) # returns frequencies
table(df$age)
table(df$age)
 
## apply (to a matrix)
x=matrix(1:6, 2,3); x # 2 rows, 3 cols
sum(x) # 21
apply(x,1,sum) # 9 12 sum rows(1)
apply(x,2,sum) # 3, 7 11 sum cols(2)
 
## tapply (table apply)
tapply(df$y,df$age,mean) # tapply(vector,factor,function) for table apply
t=tapply(df$y,list(df$age,df$sex),mean); t
t["a","m"]; t[1,2] # 3 you can reference individual elements
 
# Unir y cortar vectores de un Dataframe
require(stats)
formula(PlantGrowth) # check the default formula
pg <- unstack(PlantGrowth) # unstack according to this formula
pg
stack(pg) # now put it back together
stack(pg, select = -ctrl) # omitting one vector
subset(x, cond) #devuelve una selección de x que cumple unas condiciones
split(x, f) #divide el vector o la hora de datos x en grupos definidos por los valores de f
cut(x, breaks, labels=T o F) # divide el rango del vector x en intervalos y codifica los elementos de x de acuerdo con el intervalo en el que caigan
Created by Pretty R at inside-R.org