This continues my posts from co-teaching quantitative methods at the University of Manitoba.

#Start by setting your workspace and bringing in your data,

#and checking to make sure the variables are imported correctly

#with numbers as numeric, categories as factors, etc.

setwd("C:\\Username\\Dropbox\\")

#Your directory here.

#Or use the menu...

#Session>Set Working Directory>To Source File Location [or you can choose the directory]

#Import your data.

titmouse<- read.table(file="blog_banding_data.csv", header=TRUE, sep=",")

str(titmouse) #shows the data types; always do this check.

#############################

##Exploratory data analysis##

#############################

#First, eyeball for weird values

View(titmouse) #You can also click on the dataframe in the environment panel.

#Check to see that all values filled correctly.

#Missing data: NA vs. NaN vs. Inf.

?NA #Missing data

?NaN #'Not a number', more complex. Help file discusses +/- Inf as well.

#Inf usually encountered in calculations (such as for log transformations).

hist(titmouse) #Can't just use this plotting function on a data frame.

#Use titmouse$[columnyouwant] to plot an individual variable.

hist(titmouse$crestlength) #This gives the default axes and title.

hist(titmouse$crestlength,

xlab="Crest length (mm)", #label the x-axis with units

main="") #Empty the main title

hist(titmouse[titmouse$indexsum==0,"crestlength"], #select rows where indexsum=0 and column is crestlength

xlab="Crest length (mm)",

main="Tufted Titmouse")

par(mfrow=c(1,3)) #par does lots of things to the plotting region.

#Here we tell it to do one row and three columns.

hist(titmouse[titmouse$indexsum==0,"crestlength"], #select rows where indexsum=0 and column is crestlength

xlab="Crest length (mm)",

main="Tufted Titmouse")

hist(titmouse[titmouse$indexsum>0&titmouse$indexsum<6,"crestlength"], #select rows where indexsum=0 and column is crestlength

xlab="Crest length (mm)",

main="Hybrid titmouse")

hist(titmouse[titmouse$indexsum==6,"crestlength"], #select rows where indexsum=0 and column is crestlength

xlab="Crest length (mm)",

main="Black-crested Titmouse")

par(mfrow=c(1,1)) #set it back to a 1 row, 1 column plot.

#Boxplots

boxplot(titmouse$crestlength) #no axes! This is terrible!

boxplot(titmouse$crestlength,

ylab="Crest length (mm)",

xlab="All the titmice")

par(mfrow=c(2,1)) #two rows, one column for the plots.

boxplot(titmouse[titmouse$indexsum==0,"crestlength"])

boxplot(titmouse[titmouse$indexsum==6,"crestlength"])

#looks funky.

par(mfrow=c(1,2))

boxplot(titmouse[titmouse$indexsum==0,"crestlength"],

xlab="Tufted Titmouse",

ylab="Crest length (mm)")

boxplot(titmouse[titmouse$indexsum==6,"crestlength"],

xlab="Black-crested Titmouse",

ylab="Crest length (mm)",

lty="solid")

#Much nicer!

par(mfrow=c(1,1)) #Reset par back to one column, one row plotting region.

#Let's do some categories like last time.

titmouse$species<-titmouse$indexsum # create a new column with indexsum data copied.

#Always copy your column or dataframe when doing something big like this.

#While it won't mess up your original file (this is only in your R session),

#it will save you trouble from having to reimport your file if you mess things up.

titmouse$species<-sub(0,"Tufted",titmouse$species)

titmouse$species<-sub(6,"Black-crested",titmouse$species)

titmouse[titmouse$species>0&titmouse$species<6,]$species = "hybrid"

plot(y=titmouse$crestlength, x=titmouse$species)

#Errors! Why?

#It doesn't like x as "chr" or character. You have to have it as a factor.

plot(y=titmouse$crestlength, x=titmouse$state) #Test it with a factor.

titmouse$species<-as.factor(titmouse$species) #Convert desired variable to a factor.

plot(y=titmouse$crestlength, x=titmouse$species) #It works, and plot also makes boxplots.

plot(titmouse$crestlength~titmouse$species) #This does the same thing and introduces R's formula notation, which you will need for many statistical functions.

#Scatterplots. Plot is very flexible and also does scatterplots if your two variables are continuous.

plot(x=titmouse$taillength, y=titmouse$crestlength)

plot(titmouse$crestlength~titmouse$taillength) #same as previous, formula notation.

plot(crestlength~taillength, data=titmouse) #same as previous, but referencing the dataframe in the data argument.

#(Each bit between the commas is an "argument" in the function. So this is a plot function,

#with a formula argument, and a data argument. We can add the axis label arguments too.

#So, make it have nice axis labels.

plot(crestlength~taillength,

data=titmouse,

xlab="Tail length (mm)",

ylab="Crest length (mm)")

#Get subsets of data.

plot(crestlength~taillength,

data=titmouse[titmouse$species=="Tufted",],

xlab="Tail length (mm)",

ylab="Crest length (mm)")

#You can combine or elaborate these plots, too, by adding points.

points(crestlength~taillength,

data=titmouse[titmouse$species=="Black-crested",],

xlab="Tail length (mm)",

ylab="Crest length (mm)",

pch=21, #choose the type of point. ?pch shows all the possible values.

bg="black") #choose the fill color.

#Default R colors are shown in a pdf here.

colours()

colors() #These will list off the names (also shown in the pdf).

#There are also ways to set exact colors.

points(crestlength~taillength,

data=titmouse[titmouse$species=="hybrid",],

xlab="Tail length (mm)",

ylab="Crest length (mm)",

pch=2, #Another example of a symbol

col=rgb(red=200,green=30,blue=30,

maxColorValue=255)) #example of using rgb() function to generate color.

?par #"Color Specification" (near the end of the file) discusses other ways change color,

#including default and custom palettes.

#Draw some arbitrary lines in an empty plot.

plot(x=0,

y=0,

type="n", #no symbols drawn

pch=NULL,

xlim=c(0,1),

ylim=c(0,1))

#These are arbitrary values to demonstrate line drawing capabilities.

abline(h=0.5, v=0.25) #give horizontal line or vertical line, can do these separately as well.

abline(a=0, b=0.25,

lty="dashed")

#give slope and intercept, in the formula for a straight line: y=bx+a.

#Then give the line type (lty=). ?par lists the possible types.

#How to combine or elaborate these plots, say to get the boxplot with the histogram in the textbook.

#This code is adapted from here.

#Here we use par() to adjust the plot again, but remember to save the defaults first.

pardefault <- par(no.readonly = T)

#From this link (which contains other variations as well)

par(fig=c(0,0.8,0,0.8)) #Here par is used to adjust the plot area.

hist(titmouse$crestlength,

xlab="Crest length (mm)",

main="") #an empty main title

par(fig=c(0,0.8,0.55,1), new=TRUE)

boxplot(titmouse$crestlength,

horizontal=TRUE,

axes=FALSE)

#Add to a scatterplot

par(fig=c(0,0.8,0,0.8))

plot(crestlength~taillength,

data=titmouse,

xlab="Tail length (mm)",

ylab="Crest length (mm)",

pch=21,

bg="gray",

col="black")

par(fig=c(0.65,1,0,0.8),new=TRUE)

boxplot(titmouse$crestlength, axes=FALSE)

par(fig=c(0,0.8,0.55,1), new=TRUE)

boxplot(titmouse$taillength,

horizontal=TRUE,

axes=FALSE)

par(pardefault) #reset the default plotting parameters.

#############################

####Graphical diagnostics####

#############################

#Residuals, influence, outliers, and Q-Q plots.

#To get some residuals we'll run a simple linear regression model.

bill.wing.reg<-lm(titmouse$billlength~titmouse$wingchordr)

#Note the use of the formula here again... y~x.

summary(bill.wing.reg) #Get some basic data from it.

plot(bill.wing.reg)

#look at residuals vs. predicted ("Fitted") values for homoscedascity.

#The first plot puts row numbers or label numbers on outliers.

#The second plot is the Q-Q plot.

#The third is standardized residuals (not discussed in lecture).

#The fourth plots Cook's distance. Dashed red lines show the boundary of 0.5 Cook's D.

#Get residuals to do additional plots.

rawres<-residuals(bill.wing.reg) #raw residuals

stres<-rstudent(bill.wing.reg) #studentized residuals

#Plot residual vs. independent variable.

plot(rawres~na.omit(titmouse$wingchordr))

#we use na.omit because lm automatically removed NAs.

#Plot residuals in a histogram.

hist(rawres)

#Plot the data with the regression line.

plot(titmouse$billlength~titmouse$wingchordr)

abline(bill.wing.reg)

#Cook's distance

#Help says, "Cases which are influential with

#respect to any of these measures are marked with an asterisk."

im<-influence.measures(bill.wing.reg) #Cook's D is cook.d column.

str(im) #new format... a list.

im[1] #lists are accessed via the level of the list.

im[2] #is it an outlier by the measures in the table?

cookd<-im[[1]][,"cook.d"] #get column "cook.d" from the first item in the list.

plot(cookd, type="h",

main="Observations",

ylab="Cook's D",

xlab="Index (=row number)")

abline(h=4/length(cookd), col="gray")

#This gets us a plot of Cook's D similar to the one SAS generates (shown in Nicky's lecture).

#Q-Q plot for just a raw variable.

qqnorm(titmouse$billlength)

qqline(titmouse$billlength)

#If you want to transform data,

#here's how (though none of our example data need it).

#Create a new column with an appropriate name.

titmouse$lncrestlength<-log(titmouse$crestlength)

#BEWARE! R uses log() for the natural logarithm. You must use log10() if you want base 10 logarithms.

#If you have a variable with a zero, you need to add a small constant first.

(titmouse$lnindexsum<-log(titmouse$indexsum+0.001))

#If you don't, you'll get Inf for any zero values.

(log(titmouse$indexsum))

#We'll go into more transformations in a later lab.

#############################

####Tests for normality, ####

####skewness, and kurtosis###

#############################

#Time to install a package.

#Click on "Packages" tab and then "Install".

#Install package "moments" from the CRAN repository (will only work with internet connection).

library(moments) #invoke the library

skewness(titmouse$crestlength, na.rm=TRUE)

kurtosis(titmouse$crestlength, na.rm=TRUE)

shapiro.test(titmouse$crestlength)

library(e1071)

#An error message about masking similarly named functions appears.

#This tells us we know that we are using e1071's functions now.

kurtosis(titmouse$crestlength,

na.rm=TRUE,

type=2)

skewness(titmouse$crestlength,

na.rm=TRUE,

type=2)

#This one provides more options, gives the algorithms in help,

#and can be compared with SAS. Let's use this library and remove the 'moments' library.

detach("package:moments")

#Now make some plots

hist(titmouse$crestlength, prob=TRUE,

xlab="Crest length for titmice",

ylim=c(0,0.3))

lines(density(na.omit(titmouse$crestlength)))

#Add the normal distribution for your mean/sd.

curve(dnorm(x,

mean=mean(titmouse$crestlength, na.rm=TRUE),

sd=sd(titmouse$crestlength, na.rm=TRUE)),

lty="dashed",

col="red",

add=TRUE)

#For the residuals

skewness(stres, type=2) #Let's use the studentized residuals for fun.

kurtosis(stres, type=2) #make sure type=2 if you want to compare to SAS.

shapiro.test(stres)

hist(stres, prob=TRUE,

breaks=10, #change the number of histogram bars if you want, see how it changes the graph

main="Studentized residuals",

xlab="Wing vs. bill residuals",

ylim=c(0,0.5)) #This lengthens the y-axis so our density lines won't get cut off in next step.

lines(density(stres)) #Adds the kernel density function of your data.

#Add the normal distribution for your mean/sd.

curve(dnorm(x,

mean=mean(stres),

sd=sd(stres)),

lty="dashed",

col="red",

add=TRUE)

##############################

###Testing for collinearity###

######(i.e. correlation)######

##############################

#How to test for correlation in the data.

cor(x=titmouse$crestlength,

y=titmouse$indexsum,

use="pairwise.complete.obs", #another different way of getting rid of NAs

method="pearson")

cor.test(x=titmouse$crestlength,

y=titmouse$indexsum,

na.action=na.rm,

method="pearson") #other methods are available, see the help file.

#Correlate more than one at a time, though you only get the correlation coefficient.

cor(titmouse[,c("wingchordr","taillength","crestlength","billlength")],

use="pairwise.complete.obs")

##############################

######Saving your plots#######

##############################

#Can use RStudio's export feature.

#Easier for reproducibility to just directly save into preferred format.

#Set width, height, etc. FOR ANY PLOT THAT YOU MAY HAVE TO RE-DO!

#Examples: publication, dissertation, thesis, reports, anything where having

#similarly formatted figures are important

#(so later fixes don't show up as different).

#I used the instructions from a previous blog post, so I won't repeat that here.

#and checking to make sure the variables are imported correctly

#with numbers as numeric, categories as factors, etc.

setwd("C:\\Username\\Dropbox\\")

#Your directory here.

#Or use the menu...

#Session>Set Working Directory>To Source File Location [or you can choose the directory]

#Import your data.

titmouse<- read.table(file="blog_banding_data.csv", header=TRUE, sep=",")

str(titmouse) #shows the data types; always do this check.

#############################

##Exploratory data analysis##

#############################

#First, eyeball for weird values

View(titmouse) #You can also click on the dataframe in the environment panel.

#Check to see that all values filled correctly.

#Missing data: NA vs. NaN vs. Inf.

?NA #Missing data

?NaN #'Not a number', more complex. Help file discusses +/- Inf as well.

#Inf usually encountered in calculations (such as for log transformations).

hist(titmouse) #Can't just use this plotting function on a data frame.

#Use titmouse$[columnyouwant] to plot an individual variable.

hist(titmouse$crestlength) #This gives the default axes and title.

hist(titmouse$crestlength,

xlab="Crest length (mm)", #label the x-axis with units

main="") #Empty the main title

hist(titmouse[titmouse$indexsum==0,"crestlength"], #select rows where indexsum=0 and column is crestlength

xlab="Crest length (mm)",

main="Tufted Titmouse")

par(mfrow=c(1,3)) #par does lots of things to the plotting region.

#Here we tell it to do one row and three columns.

hist(titmouse[titmouse$indexsum==0,"crestlength"], #select rows where indexsum=0 and column is crestlength

xlab="Crest length (mm)",

main="Tufted Titmouse")

hist(titmouse[titmouse$indexsum>0&titmouse$indexsum<6,"crestlength"], #select rows where indexsum=0 and column is crestlength

xlab="Crest length (mm)",

main="Hybrid titmouse")

hist(titmouse[titmouse$indexsum==6,"crestlength"], #select rows where indexsum=0 and column is crestlength

xlab="Crest length (mm)",

main="Black-crested Titmouse")

par(mfrow=c(1,1)) #set it back to a 1 row, 1 column plot.

#Boxplots

boxplot(titmouse$crestlength) #no axes! This is terrible!

boxplot(titmouse$crestlength,

ylab="Crest length (mm)",

xlab="All the titmice")

par(mfrow=c(2,1)) #two rows, one column for the plots.

boxplot(titmouse[titmouse$indexsum==0,"crestlength"])

boxplot(titmouse[titmouse$indexsum==6,"crestlength"])

#looks funky.

par(mfrow=c(1,2))

boxplot(titmouse[titmouse$indexsum==0,"crestlength"],

xlab="Tufted Titmouse",

ylab="Crest length (mm)")

boxplot(titmouse[titmouse$indexsum==6,"crestlength"],

xlab="Black-crested Titmouse",

ylab="Crest length (mm)",

lty="solid")

#Much nicer!

par(mfrow=c(1,1)) #Reset par back to one column, one row plotting region.

#Let's do some categories like last time.

titmouse$species<-titmouse$indexsum # create a new column with indexsum data copied.

#Always copy your column or dataframe when doing something big like this.

#While it won't mess up your original file (this is only in your R session),

#it will save you trouble from having to reimport your file if you mess things up.

titmouse$species<-sub(0,"Tufted",titmouse$species)

titmouse$species<-sub(6,"Black-crested",titmouse$species)

titmouse[titmouse$species>0&titmouse$species<6,]$species = "hybrid"

plot(y=titmouse$crestlength, x=titmouse$species)

#Errors! Why?

#It doesn't like x as "chr" or character. You have to have it as a factor.

plot(y=titmouse$crestlength, x=titmouse$state) #Test it with a factor.

titmouse$species<-as.factor(titmouse$species) #Convert desired variable to a factor.

plot(y=titmouse$crestlength, x=titmouse$species) #It works, and plot also makes boxplots.

plot(titmouse$crestlength~titmouse$species) #This does the same thing and introduces R's formula notation, which you will need for many statistical functions.

#Scatterplots. Plot is very flexible and also does scatterplots if your two variables are continuous.

plot(x=titmouse$taillength, y=titmouse$crestlength)

plot(titmouse$crestlength~titmouse$taillength) #same as previous, formula notation.

plot(crestlength~taillength, data=titmouse) #same as previous, but referencing the dataframe in the data argument.

#(Each bit between the commas is an "argument" in the function. So this is a plot function,

#with a formula argument, and a data argument. We can add the axis label arguments too.

#So, make it have nice axis labels.

plot(crestlength~taillength,

data=titmouse,

xlab="Tail length (mm)",

ylab="Crest length (mm)")

#Get subsets of data.

plot(crestlength~taillength,

data=titmouse[titmouse$species=="Tufted",],

xlab="Tail length (mm)",

ylab="Crest length (mm)")

#You can combine or elaborate these plots, too, by adding points.

points(crestlength~taillength,

data=titmouse[titmouse$species=="Black-crested",],

xlab="Tail length (mm)",

ylab="Crest length (mm)",

pch=21, #choose the type of point. ?pch shows all the possible values.

bg="black") #choose the fill color.

#Default R colors are shown in a pdf here.

colours()

colors() #These will list off the names (also shown in the pdf).

#There are also ways to set exact colors.

points(crestlength~taillength,

data=titmouse[titmouse$species=="hybrid",],

xlab="Tail length (mm)",

ylab="Crest length (mm)",

pch=2, #Another example of a symbol

col=rgb(red=200,green=30,blue=30,

maxColorValue=255)) #example of using rgb() function to generate color.

?par #"Color Specification" (near the end of the file) discusses other ways change color,

#including default and custom palettes.

#Draw some arbitrary lines in an empty plot.

plot(x=0,

y=0,

type="n", #no symbols drawn

pch=NULL,

xlim=c(0,1),

ylim=c(0,1))

#These are arbitrary values to demonstrate line drawing capabilities.

abline(h=0.5, v=0.25) #give horizontal line or vertical line, can do these separately as well.

abline(a=0, b=0.25,

lty="dashed")

#give slope and intercept, in the formula for a straight line: y=bx+a.

#Then give the line type (lty=). ?par lists the possible types.

#How to combine or elaborate these plots, say to get the boxplot with the histogram in the textbook.

#This code is adapted from here.

#Here we use par() to adjust the plot again, but remember to save the defaults first.

pardefault <- par(no.readonly = T)

#From this link (which contains other variations as well)

par(fig=c(0,0.8,0,0.8)) #Here par is used to adjust the plot area.

hist(titmouse$crestlength,

xlab="Crest length (mm)",

main="") #an empty main title

par(fig=c(0,0.8,0.55,1), new=TRUE)

boxplot(titmouse$crestlength,

horizontal=TRUE,

axes=FALSE)

#Add to a scatterplot

par(fig=c(0,0.8,0,0.8))

plot(crestlength~taillength,

data=titmouse,

xlab="Tail length (mm)",

ylab="Crest length (mm)",

pch=21,

bg="gray",

col="black")

par(fig=c(0.65,1,0,0.8),new=TRUE)

boxplot(titmouse$crestlength, axes=FALSE)

par(fig=c(0,0.8,0.55,1), new=TRUE)

boxplot(titmouse$taillength,

horizontal=TRUE,

axes=FALSE)

par(pardefault) #reset the default plotting parameters.

#############################

####Graphical diagnostics####

#############################

#Residuals, influence, outliers, and Q-Q plots.

#To get some residuals we'll run a simple linear regression model.

bill.wing.reg<-lm(titmouse$billlength~titmouse$wingchordr)

#Note the use of the formula here again... y~x.

summary(bill.wing.reg) #Get some basic data from it.

plot(bill.wing.reg)

#look at residuals vs. predicted ("Fitted") values for homoscedascity.

#The first plot puts row numbers or label numbers on outliers.

#The second plot is the Q-Q plot.

#The third is standardized residuals (not discussed in lecture).

#The fourth plots Cook's distance. Dashed red lines show the boundary of 0.5 Cook's D.

#Get residuals to do additional plots.

rawres<-residuals(bill.wing.reg) #raw residuals

stres<-rstudent(bill.wing.reg) #studentized residuals

#Plot residual vs. independent variable.

plot(rawres~na.omit(titmouse$wingchordr))

#we use na.omit because lm automatically removed NAs.

#Plot residuals in a histogram.

hist(rawres)

#Plot the data with the regression line.

plot(titmouse$billlength~titmouse$wingchordr)

abline(bill.wing.reg)

#Cook's distance

#Help says, "Cases which are influential with

#respect to any of these measures are marked with an asterisk."

im<-influence.measures(bill.wing.reg) #Cook's D is cook.d column.

str(im) #new format... a list.

im[1] #lists are accessed via the level of the list.

im[2] #is it an outlier by the measures in the table?

cookd<-im[[1]][,"cook.d"] #get column "cook.d" from the first item in the list.

plot(cookd, type="h",

main="Observations",

ylab="Cook's D",

xlab="Index (=row number)")

abline(h=4/length(cookd), col="gray")

#This gets us a plot of Cook's D similar to the one SAS generates (shown in Nicky's lecture).

#Q-Q plot for just a raw variable.

qqnorm(titmouse$billlength)

qqline(titmouse$billlength)

#If you want to transform data,

#here's how (though none of our example data need it).

#Create a new column with an appropriate name.

titmouse$lncrestlength<-log(titmouse$crestlength)

#BEWARE! R uses log() for the natural logarithm. You must use log10() if you want base 10 logarithms.

#If you have a variable with a zero, you need to add a small constant first.

(titmouse$lnindexsum<-log(titmouse$indexsum+0.001))

#If you don't, you'll get Inf for any zero values.

(log(titmouse$indexsum))

#We'll go into more transformations in a later lab.

#############################

####Tests for normality, ####

####skewness, and kurtosis###

#############################

#Time to install a package.

#Click on "Packages" tab and then "Install".

#Install package "moments" from the CRAN repository (will only work with internet connection).

library(moments) #invoke the library

skewness(titmouse$crestlength, na.rm=TRUE)

kurtosis(titmouse$crestlength, na.rm=TRUE)

shapiro.test(titmouse$crestlength)

library(e1071)

#An error message about masking similarly named functions appears.

#This tells us we know that we are using e1071's functions now.

kurtosis(titmouse$crestlength,

na.rm=TRUE,

type=2)

skewness(titmouse$crestlength,

na.rm=TRUE,

type=2)

#This one provides more options, gives the algorithms in help,

#and can be compared with SAS. Let's use this library and remove the 'moments' library.

detach("package:moments")

#Now make some plots

hist(titmouse$crestlength, prob=TRUE,

xlab="Crest length for titmice",

ylim=c(0,0.3))

lines(density(na.omit(titmouse$crestlength)))

#Add the normal distribution for your mean/sd.

curve(dnorm(x,

mean=mean(titmouse$crestlength, na.rm=TRUE),

sd=sd(titmouse$crestlength, na.rm=TRUE)),

lty="dashed",

col="red",

add=TRUE)

#For the residuals

skewness(stres, type=2) #Let's use the studentized residuals for fun.

kurtosis(stres, type=2) #make sure type=2 if you want to compare to SAS.

shapiro.test(stres)

hist(stres, prob=TRUE,

breaks=10, #change the number of histogram bars if you want, see how it changes the graph

main="Studentized residuals",

xlab="Wing vs. bill residuals",

ylim=c(0,0.5)) #This lengthens the y-axis so our density lines won't get cut off in next step.

lines(density(stres)) #Adds the kernel density function of your data.

#Add the normal distribution for your mean/sd.

curve(dnorm(x,

mean=mean(stres),

sd=sd(stres)),

lty="dashed",

col="red",

add=TRUE)

##############################

###Testing for collinearity###

######(i.e. correlation)######

##############################

#How to test for correlation in the data.

cor(x=titmouse$crestlength,

y=titmouse$indexsum,

use="pairwise.complete.obs", #another different way of getting rid of NAs

method="pearson")

cor.test(x=titmouse$crestlength,

y=titmouse$indexsum,

na.action=na.rm,

method="pearson") #other methods are available, see the help file.

#Correlate more than one at a time, though you only get the correlation coefficient.

cor(titmouse[,c("wingchordr","taillength","crestlength","billlength")],

use="pairwise.complete.obs")

##############################

######Saving your plots#######

##############################

#Can use RStudio's export feature.

#Easier for reproducibility to just directly save into preferred format.

#Set width, height, etc. FOR ANY PLOT THAT YOU MAY HAVE TO RE-DO!

#Examples: publication, dissertation, thesis, reports, anything where having

#similarly formatted figures are important

#(so later fixes don't show up as different).

#I used the instructions from a previous blog post, so I won't repeat that here.

## No comments:

## Post a Comment

Comments and suggestions welcome.