Академический Документы
Профессиональный Документы
Культура Документы
# Configuración de RStudio.
# Introducción a R
2 + 2 # o
mean(c(1,4,7,3,2)) # o incluso
help(mean)
resultado + 1
resultado
Resultado # y
Help(mean)
# Librerías de R
library(psych)
help(psych)
# pueden ver una descripción de todas las nuevas funciones que ahora
están disponibles.
# Además de funciones, esta librería incluye bases de datos que
podemos ocupar como
# ejemplos. El comando
personalidad = epi.bfi
View(personalidad)
help(epi.bfi)
with (personalidad,
plot(bfext,bfopen))
# El gráfico que aparece en "Plots" muestra que en general las
personas más extrovertidas
# tienen también mayores puntajes de apertura a la experiencia.
with (personalidad,
plot(bfext,bfopen))
estudio2012 = read.csv(file.choose(),
header = TRUE) # abrir archivo alumnos2012.csv
# Un detalle técnico...
# El comando
names(estudio2012)
head(estudio2012)
# Ok, una de las primeras cosas que debiéramos hacer cuando abrimos
una base de datos
# es revisar los descriptivos para cada una de las variables. Más allá
de ser una primera
# mirada a los resultados del estudio, esto permite identificar
cualquier error en la
# digitación o en la construcción de la base de datos.
describe(estudio2012)
table(estudio2012$sitsent)
# Descriptivos.
mean(estudio2012$insom1, na.rm=TRUE)
help(with)
insomnio = with(estudio2012,
data.frame(insom1, insom2, insom3, insom4, insom5))
describe(insomnio)
sd(estudio2012$insom1, na.rm=TRUE)
median(estudio2012$insom1, na.rm=TRUE)
summary(insomnio)
describe(estudio2012$insom1)
table(estudio2012$insom1)
help(table)
barplot(table(estudio2012$insom1))
estudio2012$insom = with(insomnio,
(insom1 + insom2 + insom3 + insom4 +
insom5)/5)
describe(estudio2012$insom)
table(estudio2012$insom)
hist(estudio2012$insom)
hist(estudio2012$insom1)
barplot(table(estudio2012$insom1))
# Abajo les copio un comando para el mismo gráfico, pero con mejor
presentación.
# Como ven, indentar y poner comentarios es más útil cuando los
comandos son más largos.
barplot(colMeans(insomnio, na.rm=TRUE),
main="Promedios itemes escala insomnio", # título principal
boxplot(insomnio)
boxplot(insomnio,
main="Itemes escala insomnio",
ylab="Grado de acuerdo",
names=c("Item 1", "Item 2", "Item 3", "Item 4", "Item 5"),
col=rainbow(5, alpha = .3)
)
table(estudio2012$genero)
table(estudio2012$sitsent)
# Todo esto significa que tenemos que hacer algo de trabajo antes de
poder ocupar estas
# variables para nuestros análisis. Por ejemplo, si hacemos un gráfico
de barras para
# situación sentimental, nos encontramos con un par de problemas:
barplot(table(estudio2012$sitsent))
# 1. Hay una barra extra con la persona que prefirió no contestar esta
pregunta.
# 2. El acento de "relación" es reemplazado por un punto en el
gráfico.
levels(estudio2012$sitsent)
estudio2012$sitsentf = factor(estudio2012$sitsent,
# El comando
estudio2012$sitsentf
table(estudio2012$sitsentf)
# La base de datos,
names(estudio2012)
table(estudio2012$genero)
estudio2012$generof = factor(estudio2012$genero,
levels=c("Femenino","Masculino"),
labels=c("Mujer","Hombre"))
table(estudio2012$generof)
table(estudio2012$orienpol)
estudio2012$orienpolf = factor(estudio2012$orienpol,
levels=c("Izquierda","Centro
Izquierda","Centro",
"Centro Derecha","Derecha"))
table(estudio2012$orienpolf)
# Descripción de la muestra.
# Una de las cosas más simples que podemos querer hacer con este tipo
de variables
# es describir la cantidad de personas que pertenecen a cada grupo,
por ejemplo
# a través de gráficos de barra
barplot(table(estudio2012$orienpolf),
col=rainbow(30, alpha=.6))
pie(table(estudio2012$sitsentf),
main="Situacion sentimental estudiantes 2012",
col=c("powderblue", "whitesmoke","skyblue2"),
radius = 1)
table(estudio2012$sitsentf,estudio2012$generof)
# ?Cómo podemos graficar esto? Una buena opción es ocupar nuevamente
un gráfico
# de barras.
barplot(table(estudio2012$sitsentf, estudio2012$generof),
legend=TRUE, # agrega automáticamente una leyenda
col=heat.colors(3, alpha=.6)
)
# Para hacer que cada grupo tenga una barra, hay que ocupar el
argumento "beside".
barplot(table(estudio2012$sitsentf, estudio2012$generof),
legend=TRUE,
col=heat.colors(3, alpha=.6),
beside=TRUE # esta opción hace que cada grupo tenga una barra
)
boxplot(insom1~sitsentf, data=estudio2012,
main="Problemas de insomnio en relaciones complicadas",
ylab="Insomnio",
col=heat.colors(3,alpha=.6))
tapply(estudio2012$insom1,
list(estudio2012$sitsentf, estudio2012$generof), mean,
na.rm=TRUE)
# Esta vez vamos a asignar esta tabla a un objeto para simplificar los
comandos
# siguientes. Como es un objeto temporal, le vamos a poner "x". Si
tuviera un uso
# más permanente sería mejor ponerle un nombre más descriptivo.
x = tapply(estudio2012$insom1,
list(estudio2012$sitsentf, estudio2012$generof), mean,
na.rm=TRUE)
barplot(x,
beside=TRUE)
barplot(x,
legend=TRUE,
args.legend=list(x=8, y=-1, horiz=TRUE),
# ?Sin este argumento la leyenda tapa los datos!
beside=TRUE,
main="Insomnio segun genero y situacion sentimental",
ylab="Insomnio",
col=heat.colors(3,alpha=.6),
ylim=c(1,7),
xpd=F)
with(estudio2012,
interaction.plot(generof, sitsentf, insom1))
with(estudio2012,
interaction.plot(generof, sitsentf, insom1,
ylim=c(1,7),
lty = 1,
col=c("red","blue","darkgreen"),
main="Insomnio segun genero y situacion
sentimental",
ylab="Insomnio",
xlab=""))
summary(estudio2012$desconf4)
with(estudio2012,
interaction.plot(generof, sitsentf, desconf4,
ylim=c(1,7)))
with(estudio2012,
interaction.plot(generof, sitsentf, desconf4,
ylim=c(1,7),
table(estudio2012$sitsentf, estudio2012$generof)
estudio2012$ansev = with(estudio2012,
(ansev3+ansev4+ansev5)/3)
plot(estudio2012$ansev, estudio2012$insom,
main="Relacion entre ansiedad ante evaluaciones e insomnio",
col="cadetblue4",
xlab="Ansiedad ante evaluaciones",
ylab="Insomnio"
)
cor(estudio2012$ansev, estudio2012$insom,
use = "pairwise.complete.obs" # necesario cuando hay NAs
)
abline(lm(estudio2012$insom~estudio2012$ansev),
col="firebrick")
# Otra opción es dibujar una linea que se ajuste a los datos, pero no
forzar
# que sea una linea recta. supsmu() es una buena función para hacer
esto.
lines(supsmu(estudio2012$ansev, estudio2012$insom,
bass=2), # de 0 a 10, controla el nivel de "smoothness"
de la linea
col="royalblue1")
library(lattice)
# La función xyplot() de lattice funciona con la misma sintaxis que
lm(): y~x,
# pero además permite separar por grupos ocupando el signo | (en mi
computador,
# esto es alt+1).
xyplot(insom~ansev|generof, estudio2012)
# Primero tenemos que hacer un objeto con los colores que vamos a
ocupar:
colores = c("red","blue")
colores
levels(estudio2012$generof)
# muestra los valores que puede tener la variable generof. El primer
elemento es "Mujer",
# y el segundo elemento es "Hombre".
# Ok, no importa por qué funciona. Lo que importa es que podemos hacer
el siguiente
# gráfico de dispersión:
plot(estudio2012$ansev, estudio2012$insom,
main="Relacion entre ansiedad ante evaluaciones e insomnio",
col=colores[estudio2012$generof], # Magia
# También podemos incluir una línea para cada grupo. Esto requiere
ocupar solamente
# a los participantes hombres o mujeres según corresponda.
estudio2012[52,]
estudio2012[,2]
estudio2012[86,2]
# Pero los números de fila y columna también pueden ser expresiones
lógicas,
# lo que nos permite seleccionar parte de la base de datos según
alguna condición,
# por ejemplo que los participantes sean hombres:
estudio2012[estudio2012$generof=="Hombre", ]
with(estudio2012[estudio2012$generof=="Mujer", ], # Selecciona
únicamente a las mujeres
abline(lm(insom~ansev),
col=colores[1]) # Selecciona el primer color de la
lista
)
with(estudio2012[estudio2012$generof=="Hombre", ], # Selecciona
únicamente a los hombres
abline(lm(insom~ansev),
col=colores[2]) # Selecciona el segundo color de la
lista
)
# Matriz de correlaciones.
library(psych)
personalidad = epi.bfi
bf = with(personalidad,
data.frame(bfagree, bfcon, bfext, bfneur, bfopen))
plot(bf)
# Si quieren ver la tabla de correlaciones en la consola, pueden
ejecutar:
cor(bf)
round(cor(bf),
2)
pairs.panels(bf)
plot(personalidad)
cor(personalidad)
cor.plot(cor(personalidad))
with(estudio2012,
alpha(cbind(insom1, insom2, insom4, insom5)))
# Calculo de escalas:
estudio2012$insom = with(estudio2012,
rowMeans(cbind(insom1, insom2, insom4,
insom5),
na.rm=TRUE))
summary(estudio2012$insom)
x = cor(with(estudio2012,
cbind(ansev1, ansev2, ansev3, ansev4, ansev5)),
use = "pairwise.complete.obs")
cor.plot(x)
alpha(with(estudio2012,
cbind(ansev1, ansev2, ansev3, ansev4, ansev5)))
estudio2012$ansev = with(estudio2012,
rowMeans(cbind(ansev1, ansev2, ansev3,
ansev4, ansev5),
na.rm=TRUE))
summary(estudio2012$ansev)
# Análisis factorial
fa.parallel(insomnio)
plot(fa(insomnio,2))
# Los ítems 1 y 2 se relacionan fuertemente con el primer factor
(MR1), y los
# ítems 4 y 5 se relacionan fuertemente con el segundo factor (MR2).
El ítem 3 está
# más relacionado con el primer factor (.41) que con el segundo (-
.09).
# ?qué significa esto? Significa que la escala mide dos cosas, que de
hecho
# son perfectamente comprensibles al leer los ítems:
# Problemas de insomnio:
alpha(with(estudio2012,
cbind(insom1, insom2, insom3)))
# El alpha es .78.
estudio2012$insom = with(estudio2012,
rowMeans(cbind(insom1, insom2, insom3),
na.rm=TRUE))
summary(estudio2012$insom)
alpha(with(estudio2012,
cbind(insom4, insom5)))
estudio2012$cinsom = with(estudio2012,
rowMeans(cbind(insom4, insom5),
na.rm=TRUE))
summary(estudio2012$cinsom)
fa.parallel(with(estudio2012,
cbind(ansev1, ansev2, ansev3, ansev4, ansev5)))
x = fa(with(estudio2012,
cbind(ansev1, ansev2, ansev3, ansev4, ansev5)),2)
plot(x)
alpha(with(estudio2012,
cbind(ansev3, ansev4, ansev5)))
alpha(with(estudio2012,
cbind(ansev1, ansev2)))
estudio2012$ansev = with(estudio2012,
rowMeans(cbind(ansev3, ansev4, ansev5),
na.rm=TRUE))
summary(estudio2012$ansev)
# Itemes invertidos.
tolsex = with(estudio2012,
data.frame(tolsex1, tolsex2, tolsex3, tolsex4, tolsex5))
fa.parallel(tolsex)
fa(tolsex)
plot(fa(tolsex))
alpha(tolsex)
# Antes de promediar los ítems, en todo caso, tenemos que invertir los
valores
# de tolsex5! Lo más fácil es hacerlo directamente con la fórmula:
estudio2012$tolsex5i = 7 + 1 - estudio2012$tolsex5
summary(estudio2012$tolsex5i)
# Ahora podemos calcular la escala, donde un mayor puntaje va a
reflejar un menor
# nivel de tolerancia hacia la diversidad sexual. Por lo tanto, vamos
a aprovechar
# de cambiarle el nombre a "intolsex" (mayor puntaje mayor
intolerancia)
estudio2012$intolsex = with(estudio2012,
rowMeans(cbind(tolsex2, tolsex3, tolsex4,
tolsex5i),
na.rm=TRUE))
summary(estudio2012$intolsex)
# Chi-cuadrado
# Relaciones entre variables categóricas.
table(estudio2012$sitsentf)
table(estudio2012$sitsentf, estudio2012$generof)
table(estudio2012$sitsentf, estudio2012$generof)
chisq.test(table(estudio2012$sitsentf, estudio2012$generof))
table(estudio2012$sitsentf, estudio2012$generof,
exclude="Es complicado")
x2 = chisq.test(table(estudio2012$sitsentf, estudio2012$generof,
exclude="Es complicado"))
x2
x2$observed
x2$expected
help(chisq.test)
# Prueba t
t.test(estudio2012$intolsex)
t.test(estudio2012$intolsex, mu=4)
# Obviamente, la probabilidad es tremendamente baja (p < 2.2e-16; eso
son 16 ceros
# después de la coma).
error.bars(with(estudio2012,
cbind(ansev1, ansev2, ansev3, ansev4, ansev5)),
ylim=c(1,7))
# Este gráfico puede ser una forma útil de comparar los niveles de
diferentes variables
# considerando información de estadística inferencial, pero es
importante destacar
# que no es una prueba de hipótesis estadísticas. Son estimaciones
independientes
# del promedio poblacional en cada ítem.
t.test(estudio2012$intolsex~estudio2012$generof)
table(estudio2012$orienpolf, estudio2012$generof)
t.test(estudio2012$intolsex~estudio2012$generof,
var.equal=TRUE)
t.test(estudio2012$intolsex~estudio2012$generof,
alternative="greater")
with(estudio2012,
describe(data.frame(abor1, abor2, abor3, abor4, abor5)))
t.test(estudio2012$abor1, estudio2012$abor2,
paired=TRUE)
# ANOVA Simple
# comparación de los promedios poblacionales de múltiples grupos.
# intui1 Muchas veces tengo muy claro la decisión que voy a tomar,
aunque
# no podría explicar por qué.
# intui2 A veces siento que puedo predecir lo que va a pasar antes de
que suceda,
# como por ejemplo que me llamar? alguien.???
# intui3 Siento que puedo sabercómo es una persona casi
inmediatamente, incluso
# antes de conversar con ella.
# intui4 Si en una prueba o examen de alternativas no me acuerdo de la
materia,
# muchas veces puedo elegir de forma intuitiva, porque "algo"
me dice que
# es la respuesta correcta.
# intui5 Para cosas realmente importantes, confío más en mis
sentimientos e intuición
# que en argumentos racionales.
alpha(with(estudio2012,
data.frame(intui1, intui2, intui3, intui4, intui5)))
table(estudio2012$zodiaco)
estudio2012$zodiacof = factor(estudio2012$zodiaco,
levels=c("Acuario (21 Enero - 19
Febrero)",
"Piscis (20 Febrero - 20
Marzo)",
"Aries (21 Marzo - 20 Abril)",
"Tauro (21 Abril - 20 Mayo)",
"Géminis (21 Mayo - 20 Junio)",
"Cáncer (21 Junio - 22 Julio)",
"Leo (23 Julio - 22 Agosto)",
"Virgo (23 Agosto - 22
Septiembre)",
"Libra (23 Septiembre - 23
Octubre)",
"Escorpión (24 Octubre - 21
Noviembre)",
"Sagitario (22 Noviembre - 21
Diciembre)",
"Capricornio (22 Diciembre - 20
Enero)"),
labels=c("Acuario",
"Piscis",
"Aries",
"Tauro",
"Geminis",
"Cancer",
"Leo",
"Virgo",
"Libra",
"Escorpion",
"Sagitario",
"Capricornio"))
barplot(table(estudio2012$zodiacof))
# Ejecutar simplemente,
aov(intui~zodiacof, data=estudio2012)
summary(aov)
boxplot(intui~zodiacof, data=estudio2012)
# Los participantes del signo Cáncer son los que reportan mayores
niveles de intuición,
# lo que es consistente con la descripción entregada en
# http://www.astrology-online.com/cancer.htm
table(estudio2012$mencion)
# Dado que desgraciadamente hay muy pocas personas que reportan estar
interesados
# en psicología comunitaria o psicología de la salud, vamos a sacarlos
del análisis.
estudio2012$mencionf = factor(estudio2012$mencion,
levels=c("Clínica",
"Educacional",
"Laboral/Organizacional"),
labels=c("Clinica",
"Educacional",
"Laboral/Organizacional"))
boxplot(intui~mencionf, data=estudio2012)
# parece indicar que las personas que quieren tomar psicología
organizacional
# reportan un menor nivel de intuición. Para evaluar qué grupos
presentan diferencias
# estadísticamente significativas es necesario hacer un test de Tukey,
ocupando la
# función TukeyHSD(), que requiere el resultado de un análisis de
varianza.
TukeyHSD(aov)
# Uno de los supuestos del ANOVA es que las varianzas de los grupos
son iguales.
# Para evaluar si se cumple este supuesto, pueden hacer una prueba de
levene ocupando
# la función levene.test() de la librería lawstat:
install.packages("lawstat")
library(lawstat)
levene.test(estudio2012$intui, estudio2012$mencionf)
help(levene.test)
oneway.test(intui~mencionf, data=estudio2012)
summary.lm(aov)
# ANOVA Factorial
# Relación entre una variable numérica y múltiples variables
categóricas.
with(estudio2012,
interaction.plot(generof, mencionf, intui))
model.tables(aov, "means")
TukeyHSD(aov)
summary.lm(aov)
# ANCOVA
cor(estudio2012$insom, estudio2012$cinsom,
use = "pairwise.complete.obs")
cor.test(estudio2012$insom, estudio2012$cinsom)
# Al igual que en una prueba t (de hecho esto es una prueba t) podemos
hacer una
# hipótesis unilateral o bilateral. En caso de que tengan una
hipótesis unilateral,
# simplemente tienen que agregar alternative="greater" (o "less") a la
función
# cor.test(). En general esto no es necesario. Simplemente pueden
reportar la mitad
# de p cuando el contraste es unilateral.
cor.test(estudio2012$insom, estudio2012$cinsom,
alternative="greater")
# Correlación parcial
# Primero, para simplificar las cosas, vamos a crear una nueva base de
datos incluyendo
# Únicamente las variables insom, ansev y cinsom; que vamos a llamar
corpar.
corpar = with(estudio2012,
data.frame(insom, ansev, cinsom))
corpar = corpar[complete.cases(corpar), ]
# Ahora que tenemos una base de datos que no tiene ningún NA,
corpar
# Regresión
# La confiabilidad es buena,
alpha(with(estudio2012,
data.frame(streu1, streu2, streu3, streu4, streu5)))
estudio2012$streu = with(estudio2012,
rowMeans(data.frame(streu1, streu2, streu3,
streu4, streu5),
na.rm=TRUE))
summary(estudio2012$streu)
lm = lm(insom~streu, data=estudio2012)
summary(lm)
datosz = with(estudio2012,
rescale(cbind(insom, streu), mean = 0, sd = 1))
install.packages("QuantPsyc")
library(QuantPsyc)
lm.beta(lm) # Entrega los coeficientes estandarizados.
# Regesión múltiple
# Para hacer una regresión múltiple, simplemente hay que agregar otros
predictores
# ocupando + (a no ser que quieran evaluar también la interacción
entre dos predictores).
lm = lm(insom~streu+ansev+intui, data=estudio2012)
summary(lm)
install.packages("QuantPsyc")
library(QuantPsyc)
estudio2012$streuc = meanCenter(estudio2012$streu)
estudio2012$cinsomc = meanCenter(estudio2012$cinsom)
lm = lm(insom~streuc*cinsomc, data=estudio2012)
summary(lm)
help(QuantPsyc)
help(moderate.lm) # Para moderación en regresiones.
help(proximal.med) # Para cálculo de efectos indirectos (mediación)
# Regresiones y ANOVA
# El output de
summary(lm)
# Lo que hemos revisado debiera ser más que suficiente para la mayoría
de los análisis
# que se realizan típicamente en psicología. Los anexos incluyen un
poco más de
# información en caso de que alguna vez la necesiten.
# ANEXOS
# Otras funciones útiles:
help(merge)
plot(lm)
install.packages("lavaan")
??lavaan
install.packages("lme4")
??lmer