5
, -4.32
, 1.5e-4
, etc.Inf
(Infinit), NaN
(Not a Number)"a"
, 'b'
, "paraules d'amor"
, etc. Entre cometes simples o dobles (per poder ficar apòstrofs o altres cometes dins)TRUE
i FALSE
=
c(...)
.:
seq(from, to, length, by)
rep(x, times, each)
c(0,2,4)
c("hola", "adéu", "fins ara")
c(TRUE, TRUE, FALSE)
1:10
seq(from=0, to=1, length=5)
seq(from=0, to=1, by=0.1)
rep(x=1:3, each=10)
rep(x=1:3, times=5)
rep(x=1:3, times=c(5,2,4))
...
(punts suspensius), que indiquen una quantitat indeterminada d’arguments.# Funció 'sample()' simula extraccions aleatòries d'una urna d'objectes
# Arguments:
# x: vector dels objectes de l'urna
# size: nombre d'extraccions
# replace: extraccions amb restitució dels objectes?
# prob: vector de probabilitats dels objectes (iguals per defecte)
sample(x=6, size=100, replace=TRUE, prob=NULL) # versió completa
sample(6, 100, TRUE, NULL) # versió sense noms d'argument
sample(TRUE, 6, NULL, 100) # versió equivocant l'ordre dels arguments
sample(100, 6, TRUE, NULL) # altra versió equivocant l'ordre dels arguments
sample(replace=TRUE, x=6, prob=NULL, size=100) # versió ok
nomFuncio = function(arg1, arg2, ...) {
# cos de la funció
# return(expressio) # opcional
}
nomFuncio
és el nom que es vol donar.function
és paraula reservada (per a definir la funció).arg1
seria el primer argument, arg2
el segon, i poden haver més....
indica que pot haver-hi més arguments (que no s’esperen, però que l’usuari pot passar, si fan falta)return(expressio)
: l’expressió pot ser el nom d’una variable del cos de la funció.# funció que suma alguns termes d'una sèrie geomètrica
# r^0 + r^1 + r^2 + ...
# però que es puga triar on comença i on acaba
serie.geom = function(rao=1, inici=0, fi=0) {
valors = rao^(inici:fi)
return( sum(valors) )
}
serie.geom(rao=2, inici=0, fi=3)
serie.geom(rao=2, fi=3) # observa com usa valors per defecte
serie.geom(inici=0, fi=3)
+
, -
, *
, /
, ^
, …sqrt()
, log()
, exp()
, sin()
, abs()
, … i altres<
, ==
, >
, <=
, >=
, !=
&
, |
, xor()
, !
(and, or, or exclusivo, not)ls()
sense argumentos, torna el vector de noms de les variables definides.a:b
crea vector de enters consecutius, de a
a b
.c(...)
concatena els arguments (constants i/o vectors) en un sol vector.length(x)
torna la longitud del vector argument x
.sum(...)
SUMa les components dels (vectors) arguments.prod(...)
PRODucte de les components dels (vectors) arguments.sort(x, decreasing=FALSE)
torna un vector com l’argument x
, però reordenat de manera creixent (a menys que es canvie l’argument decreasing
a TRUE
).order(x, decreasing=TRUE)
torna el vector de les “posicions” del vector x
que aconseguexien la seua ordenació (de manera creixent o decreixent, segons siga l’argument decreasing
).min(...)
torna el valor MÍNim dels arguments.max(...)
torna el valor MÀXim dels arguments.which(x)
torna el vector de “posicions” on el vector de lògics, x
, és TRUE
. Normalment x
és una comparació, i which
ens diu quines components compleixen la comparació.diff(x)
torna un vector amb les diferències (increments) de cada component respecte de l’anterior.v = 1:10
ls()
v^c(2,1)
v - 5
sqrt(v-5)
sort(c(5,-1,20,0,13,14))
order(c(5,-1,20,0,13,14))
diff(c(5,-1,20,0,13,14))
[]
amb 3 possibles sintaxis:
TRUE
) i excloure (FALSE
). Ideal per a seleccionar dades d’un vector que complisquen una condició concreta.letters # vector de lletres de l'abecedari (ja creat en R)
v = letters[1:5] # de la "a" a la "e"
v # mirem v
set.seed(2019) # per fer simulacions repetibles
# simulació de 100 lletres de "a" a "e" equiprobables
w = sample(x=v, size=100, replace=TRUE)
w # mirem les dades simulades
# quantes dades té el vector?
length(w)
# quines són les 10 primeres dades?
w[1:10]
# i si m'interessa descartar les 10 primeres dades?
w[-(1:10)]
# quantes lletres "a" n'hi ha al vector w?
w=="a" # fa comparacions, i torna TRUEs i FALSEs (100 en total)
w[w=="a"] # selecciona de w només les components dels TRUEs
length(w[w=="a"]) # finalment conta quantes n'hi ha
# quantes "vocals" n'hi ha al vector w?
w[w=="a" | w=="e"] # seleccionem les que són vocals
length(w[w=="a" | w=="e"]) # resposta a la pregunta
matrix(data, nrow, ncol, byrow=FALSE)
on:
data
: vector a organitzar en forma de matriunrow
, ncol
: nombre de files i columnes (només és necessari un dels dos, l’altre el dedueix de la llargària del vector)byrow
indica si la matriu s’emplena per files (per defecte NO)[ , ]
amb dos arguments
m1 = matrix(data=1:12, nrow=3)
m1
m2 = matrix(data=1:12, nrow=3, byrow=TRUE)
m2
m2[3,4] # element
m2[2,] # fila 2
m2[,3] # columna 3
m2[c(1,3), c(2,3)] # submatriu
data.frame(etiq1=vector1, etiq2=vector2,...)
x
al full de dades i té com a etiquetes de columna els noms V1
, V2
, …, aleshores:
length(x)
: nombre de columnes (!!!)dim(x)
: dimensions (files, columnes)names(x)
: vector amb etiquetes de columnesrow.names(x)
: vector amb etiquetes de filesstr(x)
: estructura (torna per pantalla un resum del tipus de variable que és, de les components que la formen, i una mica dels valors que conté. Val per a tot tipus de variable en R$
i [,]
):
x$V1
: dades de la columna d’etiqueta V1
x[ , "V1"]
: dades de la columna d’etiqueta V1
x[, 1]
: dades de la primera columnax[ , c("V1", "V3")]
: dades de la columna d’etiqueta V1
x[, c(1,3)]
: dades de la primera i tercera columnesx$V1[condicio]
o bé x[condicio, "V1"]
(on condicio
és una condició que compliran les dades que volem extraure)x[condicio, c("V1", "V3")]
(on condicio
és una condició que compliran les dades que volem extraure)data(mtcars) # carrega full de dades "mtcars" en R
mtcars # mirem les dades
str(mtcars) # son massa dades. és millor veure l'estructura
names(mtcars) # mirem noms de columnes
row.names(mtcars) # mirem noms de files (cada fila, un cotxe)
# dades de la columna "mpg"
mtcars$mpg
# dades de columna "mpg" però de cotxes amb 4 cilindres (columna "cyl")
mtcars$mpg[mtcars$cyl==4]
# full de dades només amb columnes "disp" i "mpg" en aquest ordre
mtcars[,c('disp', 'mpg')]
# full de dades només amb columnes "disp" i "mpg" en aquest ordre
# i amb cotxes de 4 cilindres
mtcars[mtcars$cyl==4, c('disp', 'mpg')]
list(etiq1=obj1, etiq2=obj2,...)
on etiq1
i etiq2
són etiquetes (noms sense cometes) i obj1
i obj2
són objectes de qualsevol tipus (vectors, matrius, fulls de dades, etc.)$
i [[]]
)# creem una llista simple
l1 = list(missatge="Ha funcionat", mostra=c(5.5, 10.4, 2.8), estad=4.8, facil=TRUE)
l1 # mirem la llista
l1[[2]] # accedim a la segona component
l1[["mostra"]] # accedim a la component etiquetada com "mostra"
l1$mostra # accedim a la component etiquetada com "mostra"
# un exemple de llista creada per la funció t.test() de R
contrast = t.test(x=1:10, mu=5, conf.level=0.99)
str(contrast) # mirem les etiquetes de la llista per poder accedir a elles
contrast$p.value # torna el p-valor
contrast$conf.int # torna l'interval de confiança
for()
:for(contador in vector) {
# cos del bucle
}
contador
és un nom arbitrari.in
és paraula reservada (obligatòria).vector
és un vector concret definit allí mateix (o abans).contador
que, a cada cicle del bucle, prendrà un valor del vector vector
. Exemple: for(i in 1:3) { warning("Step ", i, "!!!")}
for(i in 1:3) {
warning("Step ", i, "!!!")
}
if()
if(expressio) {
# part que es processa si expressio==TRUE
} else {
# part que es processa si expressio==FALSE
}
expressio
és un valor lògic (normalment resultat d’una comparació).else { }
és opcional.nota = 5.0
if(nota >= 5) {
warning("Aprovat!")
} else {
warning("Suspens!")
}
nota = 4.9
if(nota >= 5) {
warning("Aprovat!")
} else {
warning("Suspens!")
}
if()
, amb les següents funcions:
stop("expressio")
: termina el processament, tornant Error
amb el missatge entre cometes.warning("expressio")
: continua el processament, però escriu el missatge.stopifnot(condicio1, condicio2, ...)
, que termina el processament, tornant Error
, si no es compleix alguna de les condicions lògiques indicades.warning("Un avís per alguna cosa")
stop("Alguna cosa prohibida")
stopifnot(1<2, 1==1, 3<2, 5<7)
for
si es pot treballar directament amb el vector i les seues operacions.# versió incorrecta (no vectorial)
funcioRara = function(x) {
if(x <= 1) {
return(x^2)
} else {
return(2-x)
}
}
funcioRara(x=-1)
funcioRara(x=0)
funcioRara(x=1)
funcioRara(x=3)
funcioRara(x=c(-1,0,1,3))
#
# versió correcta (però no vectorial!!!)
funcioRara2 = function(x) {
y = numeric(length(x))
for(i in 1:length(x)) {
if(x[i] <= 1) {
y[i] = x[i]^2
} else {
y[i] = 2 - x[i]
}
}
return(y)
}
funcioRara2(x=-1)
funcioRara2(x=0)
funcioRara2(x=1)
funcioRara2(x=3)
funcioRara2(x=c(-1,0,1,3))
#
# versió correcta (i vectorial!!!)
funcioRara3 = function(x) {
y = numeric(length(x))
cond1 = (x <= 1)
cond2 = (x > 1)
x1 = x[cond1]
x2 = x[cons2]
y[cond1] = x1^2
y[cond2] = 2 - x2
return(y)
}
funcioRara3(x=-1)
funcioRara3(x=0)
funcioRara3(x=1)
funcioRara3(x=3)
funcioRara3(x=c(-1,0,1,3))
# la dibuixem
x = seq(from=-2, to=2, length=100)
y = funcioRara3(x)
plot(x=x, y=y, type='l') # per a veure la gràfica
unique()
: torna un vector amb els valors (sense repetir) que conté el vector argument.diff()
: calcula les diferències entre cada component i l’anterior del vector argumento.eval(call("nomFuncio", argument))
: produeix l’avaluació de la crida de la funció "nomFuncio"
amb l’argument argument
. Important per a manipular funcions com argument d’altres funcionsis.numeric()
, is.na()
, etc.: torna TRUE
si el vector argument és del tipus especificat en cada cas.unique(c(1,2,3,3,3,2,1,2,1))
diff(c(1,2,3,3,3,2,1,2,1))
eval(call("sum", 1:4))
is.numeric(1:3)
is.numeric(c("a", "b", "c"))
12.1. CONVERTIR DADES NUMÈRIQUES EN SIGNES: Escriu una funció num2signs()
que complisca els següents requisits:
num2signs
torna un vector de signes (\(1\)’s i \(-1\)’s) a partir d’un vector de nombres, bé siga comparant cada valor amb l’anterior, o bé cada valor amb la mediana de tots ells.x
: vector numèric.type
: per defecte valdrà "increment"
. En eixe cas es calcularán els increments x[i+1]-x[i]
, de mode que, si és positiu es produirà un valor \(1\), i si és negatiu es produirà un valor \(-1\) (si és 0 es descarta). Si es posa type="median"
, aleshores es compara cada dada amb la mediana, de mode que, si és major es produirà un valor \(1\), i si és menor es produirà un valor \(-1\) (si és igual, es descarta)x
només conté dos valors distints, s’interpretaràn ja com signes, i es torna eixe vector recodificant el major valor com \(1\) i el menor com \(-1\).type
.diff()
: torna un vector amb les diferències de cada dada respecte de l’anterior sense usar un bucle.unique()
: dóna les dades del vector sense repetir-los.length()
: compta les dades d’un vector.median()
: calcula la mediana d’un vector numèric.[ ]
: permet localitzar dades d’un vector (per posició o condició).numeric()
: crea un vector de zeros, de longitud indicada en el seu argument.# Escriu ací la teua solució
# Exemples
num2signs(x=c(1,2,3,4,3,1,5), type="increment") # 1 1 1 -1 -1 1
num2signs(x=c(3,3,7,7,7,7,7), type="increment") # -1 -1 1 1 1 1 1
num2signs(x=c(1,2,3,4,3,1,5), type="median") # -1 -1 1 -1 1
num2signs(x=c(3,3,7,7,7,3,7), type="median") # -1 -1 1 1 1 -1 1
12.2. NOMBRE DE RATXES DE UNA CADENA DE SIGNES: Escriu una funció nruns()
que complisca els següents requisits:
nruns
torna el nombre de ratxes de el seu argument.x
: vector de valors \(1\) i \(-1\).diff()
: torna un vector amb les diferències de cada dada respecte del anterior sense usar un bucle.sum()
: suma les dades de el seu vector argument.# Escriu ací la teua solució
# Exemples
nruns(x=c(1,1,1,1,1,1,1)) # 1
nruns(x=c(1,-1,-1,-1,-1,-1,-1)) # 2
nruns(x=c(-1,-1,1,-1,1,-1,-1)) # 5
12.4. LA DISTRIBUCIÓ DE PROBABILITAT DEL NOMBRE DE RATXES: Defineix en R la funció druns()
que complisca els següents requisits:
druns
torna la probabilitat del nombre de ratxes indicat en el seu argument, donades les quantitats de signes de cada tipus.x
: vector amb diversos nombres de ratxes possibles.n1
: quantitat de signes d’un tipus.n2
: quantitat de signes d’altre tipus.x
condicionat a les quantitats n1
i n2
de signes de cada tipus. Cal recordar la probabilitat de la variable aleatoria \(R\) = “nombre de ratxes”, per a un procés de dos signes, en el qual s’han observat \(n_1 \geq 1\) signes d’un tipus i \(n_2 \geq 1\) signes de l’altre tipus:
funcioRara3
).choose()
: calcula el nombre combinatori dels seus dos arguments.# Escriu ací la teua solució
# Exemples
druns(x=2:3, n1=2, n2=1) # 0.66667, 0.333333
druns(x=2:3, n1=3, n2=1) # 0.5, 0.5
druns(x=2:3, n1=4, n2=1) # 0.4, 0.6
druns(x=2:4, n1=2, n2=2) # 0.333333, 0.333333, 0.333333
druns(x=2:5, n1=3, n2=2) # 0.2, 0.3, 0.4, 0.1
druns(x=2:11, n1=10, n2=5) # 0.0006660007 0.0043290043 0.0239760240 0.0659340659 0.1438561439 0.2157842158 0.2237762238 0.1958041958 0.0839160839 0.0419580420
12.5. CONTRAST D’ALEATORIETAT PER RATXES: Implementa una funció runs.test()
que realitze el contrast d’aleatorietat (per ratxes) per a mostres petites, segons l’estructura que es proposa (usarà les funcions dels exercicis anteriors):
runs.test
torna l’estadístic “nombre de ratxes” i el seu \(p\)-valorx
: vector de nombres o signestype
: si x
és vector de nombres, pot prendre el valor "increment"
o "median"
tal i com ocorre en l’exercici de la funció num2signs()
. Si x
és vector de signes, no s’usarà aquest argument.num2signs
, nruns
i druns
).nruns()
: tornarà l’estadístic \(R\).druns
, i sumar només les que siguen menors o iguals que la de l’estadístic observat.list(R=..., p.value=...)
(on els punts suspensius han de ser completats amb alguna cosa correcta).# Escriu ací la teua solució
# Exemples
runs.test(x=c(1,2,3,4,3,1,5), type="increment") # $R=3 $p.value=0.6
runs.test(x=c(3,3,7,7,7,7,7), type="increment") # $R=2 $p.value=0.0952381
runs.test(x=c(1,2,3,4,3,1,5), type="median") # $R=4 $p.value=1
runs.test(x=c(3,3,7,7,7,3,7), type="median") # $R=4 $p.value=1
12.6. CONTRAST D’HIPÒTESIS SIMPLES: Defineix la funció simple.test()
que complisca els següents requisits:
simple.test
resol el contrast d’hipótesis simples \(\left\{ \begin{array}{ll} H_0: & f_X = f_0 \\ H_1: & f_X = f_1 \end{array} \right.\) que minimitza la combinació \(a \cdot \alpha(\delta) + b \cdot \beta(\delta)\) (de probabilitats d’errors tipus I i II), i la mostra és \(\vec{x} = (x_1, x_2, \ldots, x_n)\). El procediment òptim de contrast és "rebutjar \(H_0\) si i només si \(a \cdot f_0(\vec{x}) - b \cdot f_1(\vec{x}) < 0\)x
: vector amb la mostra de dades (\(\vec{x}\)).f0
: nom (entrecomillat) en R de la funció de densitat de probabilitat indicada en \(H_0\).f1
: nom (entrecomillat) en R de la funció de densitat de probabilitat indicada en \(H_1\).a
, b
: els pesos de la combinació lineal dels tipus d’error (\(a\) i \(b\), resp.).eval()
: servirá per a poder calcular la funció de probabilitat sobre cada dada de la mostra.prod()
: multiplica les dades de el seu argument.list(Value=..., Decision=...)
on Value
és el valor de la operación que es calcula per a prendre la decisión, i Decision
és la frase que informa de si es rechaza o no. Los punts suspensius es han de completar amb la información adecuada.# Escriu ací la teua solució
# Exemples
simple.test(x=c(0.1, 0.2, 0.3), f0="dunif", f1="dexp", a=1, b=1) # 0.4511884, "Acceptar H0"
simple.test(x=c(0.1, 0.2, 0.3), f0="dunif", f1="dexp", a=1, b=10) # -4.488116, "Rebutjar H0"
simple.test(x=c(0.1, 0.2, 0.3), f0="dunif", f1="dnorm", a=1, b=1) # 0.9407989, "Acceptar H0"
simple.test(x=c(0.1, 0.2, 0.3), f0="dunif", f1="dnorm", a=1, b=10) # 0.4079893, "Acceptar H0"