Multi-variable scatterplot in R - r

I have a data set with 12 categorical variables (I'm trying to graph measurements by month) and varying numbers of observations for each variable. A simple scatterplot isn't working and I can't figure out any other code that will let me plot my data.
Data:
June July Aug Sept Oct Nov Dec Jan Feb March April May
1 0.2315 0.8933 0.5255 0.7978 0.7581 NA 0.6729 0.7831 0.3599 0.3233 0.4901 0.2591
2 0.3030 1.0136 0.3487 1.0823 0.7639 NA 0.9925 0.7843 0.3438 0.3374 0.5919 0.2978
3 0.3850 0.5880 0.7762 0.5351 0.4139 NA 0.2131 0.7609 0.5401 0.5158 0.4427 NA
4 0.2278 0.5880 0.2531 0.6209 1.0323 NA 0.3389 0.7743 0.6315 0.5639 0.0677 NA
5 0.2374 0.7155 0.2701 0.5842 0.2598 NA NA 0.9977 1.0104 NA 0.3364 NA
6 0.2390 0.7418 0.2974 0.7259 0.2544 NA NA 0.6019 0.4063 NA 0.5175 NA
7 0.3298 0.4235 NA 0.8536 0.3954 NA NA 0.7475 0.4842 NA 0.5094 NA
8 0.3861 0.3711 NA 0.8663 0.2405 NA NA 0.7484 NA NA 0.6044 NA
9 0.2012 0.5342 NA 1.1538 1.3359 NA NA 0.3515 NA NA 0.5918 NA
10 0.2791 0.4916 NA 0.7292 1.6786 NA NA 0.3555 NA NA NA NA
11 NA 0.4715 NA 0.2570 0.6435 NA NA 0.5495 NA NA NA NA
12 NA 0.2511 NA 0.1893 0.3038 NA NA 0.3295 NA NA NA NA
13 NA 0.2627 NA 0.7264 0.2344 NA NA 0.6638 NA NA NA NA
14 NA 0.2993 NA 0.9806 0.8943 NA NA 0.7682 NA NA NA NA
15 NA 0.3847 NA 0.2676 NA NA NA 1.4591 NA NA NA NA
16 NA 0.3048 NA 1.6670 NA NA NA 0.5868 NA NA NA NA
17 NA 0.3961 NA 1.8325 NA NA NA 0.8361 NA NA NA NA
18 NA NA NA NA NA NA NA 0.8399 NA NA NA NA

Assuming your original data is called df
library(reshape2); library(ggplot2)
df <- melt(df, NULL)
ggplot(df, aes(x = rep(1:18,12), y = value, group = variable)) + geom_line(aes(col = variable))

Related

Timeseries Crossvalidation in R: using tsCV() with tslm()-Multiple model

As a reaction on :Timeseries Crossvalidation in R: using tsCV() with tslm()-Models
I tried to use it with multiple predictor variables, i made a matrix of them, but it is not working.
fcTslm <- function(y, h, xreg)
{
if(NROW(xreg) < length(y) + h)
stop("Not enough xreg data for forecasting")
X <- head(xreg, length(y))
fit <- tslm(y ~ X)
X <- subset(xreg, start=length(y)+1, end=length(y)+h)
forecast(fit, newdata=X)
}
> pred <- ts(cbind(rnorm(length(AirPassengers)),rnorm(length(AirPassengers))), start=start(AirPassengers),
+ frequency=frequency(AirPassengers))
> tsCV(AirPassengers, fcTslm, xreg=matrix(pred,ncol=2))
Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
1949 NA NA NA NA NA NA NA NA NA NA NA NA
1950 NA NA NA NA NA NA NA NA NA NA NA NA
1951 NA NA NA NA NA NA NA NA NA NA NA NA
1952 NA NA NA NA NA NA NA NA NA NA NA NA
1953 NA NA NA NA NA NA NA NA NA NA NA NA
1954 NA NA NA NA NA NA NA NA NA NA NA NA
1955 NA NA NA NA NA NA NA NA NA NA NA NA
1956 NA NA NA NA NA NA NA NA NA NA NA NA
1957 NA NA NA NA NA NA NA NA NA NA NA NA
1958 NA NA NA NA NA NA NA NA NA NA NA NA
1959 NA NA NA NA NA NA NA NA NA NA NA NA
1960 NA NA NA NA NA NA NA NA NA NA NA NA
How can i make it working?
function(y, h, xreg)
{
X <- xreg[1:length(y),]
if(NROW(xreg) < length(y) + h)
stop("Not enough xreg data for forecasting")
newX <- xreg[length(y)+(1:h),]
fit <- tslm(y ~ X)
forecast(fit, newdata=newX)
}
tsCV(AirPassengers, fcTSLM, xreg=matrix(pred,ncol=1))

Error in eval(expr, envir, enclos) : object not found when using eval

My code is as below:
Form_CharSizePorts2 <- function(main, size, var, wght, ret) {
main.cln <- main %>%
select(date, permno, exchcd, eval(parse(text=size)), eval(parse(text=var)), eval(parse(text=wght)), eval(parse(text=ret))) %>%
data.table
Bkpts.NYSE <- main.cln %>%
filter(exchcd == 1) %>%
group_by(date) %>%
summarize(var.P70 = quantile(.[[var]], probs=.7, na.rm=TRUE),
var.P30 = quantile(.[[var]], probs=.3, na.rm=TRUE),
size.Med = quantile(.[[size]], probs=.5, na.rm=TRUE))
main.rank <- main.cln %>%
merge(Bkpts.NYSE, by="date", all.x=TRUE) %>%
mutate(Size = ifelse(.[[size]]<size.Med, "Small", "Big"),
Var = ifelse(.[[var]]<var.P30, "Low", ifelse(.[[var]]>var.P70, "High", "Neutral")),
Port = paste(Size, Var, sep="."))
Ret <- main.rank %>%
group_by(date, Port) %>%
summarize(ret.port = weighted.mean(.[[ret]], .[[wght]], na.rm=TRUE)) %>%
spread(Port, ret.port) %>%
mutate(Small = (Small.High + Small.Neutral + Small.Low)/3,
Big = (Big.High + Big.Neutral + Big.Low)/3,
SMB = Small - Big,
High = (Small.High + Big.High)/2,
Low = (Small.Low + Big.Low)/2,
HML = High - Low)
return(Ret)
}
Form_FF4Ports <- function(dt) {
dt.cln <- dt %>%
group_by(permno) %>%
mutate(lag.ret.12t2 = lag(ret.12t2, 1))
output <- dt.cln %>%
group_by(date) %>%
summarize(MyMkt = weighted.mean(retadj.1mn, w=port.weight, na.rm=TRUE)) %>%
as.data.frame %>%
merge(Form_CharSizePorts2(dt.cln, "lag.ME.Jun", "lag.BM.FF", "port.weight", "retadj.1mn"),
by="date", all.x=TRUE) %>%
transmute(date, MyMkt, MySMB=SMB, MySMBS=Small, MySMBB=Big, MyHML=HML, MyHMLH=High, MyHMLL=Low) %>%
merge(Form_CharSizePorts2(dt.cln, "lag.ME.Jun", "lag.ret.12t2", "port.weight", "retadj.1mn"),
by="date", all.x=TRUE) %>%
transmute(date, MyMkt, MySMB, MySMBS, MySMBB, MyHML, MyHMLH, MyHMLL, MyUMD=HML, MyUMDU=High, MyUMDD=Low)
return(output)
}
dt.myFF4.m <- Form_FF4Ports(data.both.FF.m)
Part of my data is as below:
date permno shrcd exchcd cfacpr cfacshr shrout prc vol retx retadj.1mn me port.weight datadate
1 Dec 1925 10006 10 1 7.412625 7.260000 600 109.00 NA NA NA 65.40000 NA <NA>
2 Dec 1925 10022 10 1 9.365437 9.365437 200 56.00 NA NA NA 11.20000 NA <NA>
3 Dec 1925 10030 10 1 9.969793 9.155520 156 150.00 NA NA NA 23.40000 NA <NA>
4 Dec 1925 10057 11 1 4.000000 4.000000 500 12.25 NA NA NA 6.12500 NA <NA>
5 Dec 1925 10073 10 1 0.200000 0.200000 138 17.50 NA NA NA 2.41500 NA <NA>
6 Dec 1925 10081 10 1 1.000000 1.000000 1192 9.00 NA NA NA 10.72800 NA <NA>
7 Dec 1925 10102 10 1 18.137865 18.000000 201 109.75 NA NA NA 22.05975 NA <NA>
8 Dec 1925 10110 10 1 1.010000 1.000000 500 10.50 NA NA NA 5.25000 NA <NA>
9 Dec 1925 10129 10 1 1.000000 1.000000 270 -132.00 NA NA NA 35.64000 NA <NA>
10 Dec 1925 10137 11 1 21.842743 20.920870 613 71.75 NA NA NA 43.98275 NA <NA>
comp.count at revt ib dvc BE OpProf GrProf Cflow Inv AstChg Davis.bkeq d.shares ret.12t2 ME.Dec ME.Jun BM.FF OpIB
1 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
2 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
3 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
4 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
5 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
6 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
7 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
8 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
9 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
10 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
GrIA CFP.FF BM.m CFP.m lag.ME.Jun lag.BM.FF lag.OpIB lag.AstChg
1 NA NA NA NA NA NA NA NA
2 NA NA NA NA NA NA NA NA
3 NA NA NA NA NA NA NA NA
4 NA NA NA NA NA NA NA NA
5 NA NA NA NA NA NA NA NA
6 NA NA NA NA NA NA NA NA
7 NA NA NA NA NA NA NA NA
8 NA NA NA NA NA NA NA NA
9 NA NA NA NA NA NA NA NA
10 NA NA NA NA NA NA NA NA
When I run the rode, I got the error message Error in eval(expr, envir, enclos) : object 'lag.ME.Jun' not found.
I guess the reason could be that I used the eval(parse(text = )) function here, and the environment is not set up correctly. However, other than this function, I am not sure which approach I should use when creating a universal purpose function suitable for data with different column names.
Specifically, I would like to know how I can use my function for different data frames without having to change the column names before I use them in my function.
Your issue is discussed, and solved, in the 'Programming with dplyr' vignette.
The bottomline is instead of quoting lag.ME.Jun yourself by referring to it using "lag.ME.Jun", you should rely on enquo(lag.ME.Jun) and !!lag.ME.Jun. However, this would mean that it should be in the function call.
Your function at several other points also refers to variables that are not created in the function environment (e.g. exchcd, date), so R will currently throw errors on any dataset that does not contain these variables. In general, it is unwise for functions to rely on inputs that were not part of the function call.

Replace values occuring once in raster by NA

I have vector of values(generated from raster - Raster package - by function clump in R):
values(rc)
1 NA NA NA 2 NA 2 2 NA NA NA NA NA NA NA 2 NA 2 2 NA 2 2 NA NA NA
NA NA NA NA 2 NA NA NA NA NA 3 NA 4 NA 2 NA 2 NA 5 NA NA 3 NA NA 4
NA NA 2 NA NA NA NA NA NA NA NA 4 NA NA NA NA NA NA 6 NA 7 NA 4 NA NA
NA 8 8 NA 6 6 NA NA NA NA 4 NA NA NA NA NA NA NA NA 4 4 4 NA NA 9
NA NA NA NA 10 NA NA NA NA 4 NA 9 9 NA NA NA NA 10 NA NA NA 4 NA NA NA
9 NA NA NA NA NA NA NA NA NA 11 NA NA NA 12 NA NA NA NA
and I would like to find every value which occurs only once(so 1,5,11,10) and replace it by NA. What I would like to obtain:
values(replaced_rc)
NA NA NA NA 2 NA 2 2 NA NA NA NA NA NA NA 2 NA 2 2 NA 2 2 NA NA NA
NA NA NA NA 2 NA NA NA NA NA 3 NA 4 NA 2 NA 2 NA NA NA NA 3 NA NA 4
NA NA 2 NA NA NA NA NA NA NA NA 4 NA NA NA NA NA NA 6 NA NA NA 4 NA NA
NA 8 8 NA 6 6 NA NA NA NA 4 NA NA NA NA NA NA NA NA 4 4 4 NA NA 9
NA NA NA NA 10 NA NA NA NA 4 NA 9 9 NA NA NA NA 10 NA NA NA 4 NA NA NA
9 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
The problem is that I can easily identify raster patches by function clump. And I would like to exclude patches containing only pixel, similarly like function "sieve" in ENVI or ERDAS. Any help? Thanks a lot in advance.
Exemple from R:
library("raster")
r <- raster(ncols=12, nrows=12)
set.seed(0)
r[] <- round(runif(ncell(r))*0.7 )
plot(r)
rc <- clump(r)
replaced_rc<- ???
Using duplicated:
values(rc)[!duplicated(values(rc)) & !duplicated(values(rc),fromLast=T)] <- NA

Rearrange row order of a matrix in r

I have the following data :
as.integer(datIn$Measurement.location)
myfunctionSD <- function(mydata) { return(sd(mydata,na.rm=TRUE))}
Alltubes <- tapply(datIn$Material.loss.interval,list(as.factor(datIn$Measurement.location),as.factor(datIn$Tube.number)),myfunctionSD)
From this I get the following output table:
1 2 3 4 5 6
1 0.8710740 0.7269928 0.8151022 0.6397234 0.8670634 0.7042107
10 NA 0.8075675 NA NA NA NA
11 0.6977951 NA 1.0984465 1.1148588 1.2156506 0.9620030
12 NA 0.5986758 NA NA NA NA
13 0.8386249 NA 0.8398164 0.8833184 1.2469221 1.0070322
14 NA 0.5109903 NA NA NA NA
15 NA NA NA 0.9391486 1.3571094 0.8375686
16 NA 0.5761583 NA NA NA NA
17 NA NA NA NA 1.0100850 0.7171070
19 NA NA NA NA 0.5913518 NA
3 0.5580579 0.6106961 0.8971073 0.7046614 0.8456784 0.8001571
4 NA 0.7228325 NA NA NA NA
5 0.9318795 NA 0.8961706 0.7753733 0.5915633 1.0471933
6 NA 0.5968613 NA NA NA NA
7 0.7674944 NA 0.7196781 0.8543926 0.7778685 0.8697442
8 NA 0.6283008 NA NA NA NA
9 1.3687895 NA 0.8815196 1.1723445 1.1589998 0.8194962
How do I rearrange the row numbers in the correct numeric order, so from 1 to 19 so I can plot it correctly?
Hope someone can help me.
Something like this...
> Alltubes[sort(as.numeric(rownames(Alltubes))), ]
df2 is your data frame
df2[order(as.numeric(rownames(df2))),]
X1 X2 X3 X4 X5 X6
1 0.8710740 0.7269928 0.8151022 0.6397234 0.8670634 0.7042107
3 0.5580579 0.6106961 0.8971073 0.7046614 0.8456784 0.8001571
4 NA 0.7228325 NA NA NA NA
5 0.9318795 NA 0.8961706 0.7753733 0.5915633 1.0471933
6 NA 0.5968613 NA NA NA NA
7 0.7674944 NA 0.7196781 0.8543926 0.7778685 0.8697442
8 NA 0.6283008 NA NA NA NA
9 1.3687895 NA 0.8815196 1.1723445 1.1589998 0.8194962
10 NA 0.8075675 NA NA NA NA
11 0.6977951 NA 1.0984465 1.1148588 1.2156506 0.9620030
12 NA 0.5986758 NA NA NA NA
13 0.8386249 NA 0.8398164 0.8833184 1.2469221 1.0070322
14 NA 0.5109903 NA NA NA NA
15 NA NA NA 0.9391486 1.3571094 0.8375686
16 NA 0.5761583 NA NA NA NA
17 NA NA NA NA 1.0100850 0.7171070
19 NA NA NA NA 0.5913518 NA

What is wrong with this Reshape code?

I am trying to reshape this dataframe:
ID tag stemID spcode x y blk plotnum trt date1 dbh1 hom1 codes1 height1 canpos1 liana1 obs1 date2 dbh2 hom2 codes2 height2 canpos2 liana2 obs2 date3 dbh3 hom3 codes3 height3 canpos3 liana3 obs3 date4 dbh4 hom4 codes4 height4 canpos4 liana4 obs4 date5 dbh5 hom5 codes5 height5 canpos5 liana5 obs5 date6 dbh6 hom6 codes6 height6 canpos6 liana6 obs6 date7 dbh7 hom7 codes7 height7 canpos7 liana7 obs7 date8 dbh8 hom8 codes8 height8 canpos8 liana8 obs8 date9 dbh9 hom9 codes9 height9 canpos9 liana9 obs9
1 1 511141 acapol 21 470 NA 1 CL 1/1/1993 NA NA NA NA NA NA NA 1/1/1994 NA NA NA NA NA NA NA 1/1/1995 NA NA NA NA NA NA NA 1/1/1996 NA NA NA NA NA NA NA 1/1/1998 NA NA NA NA NA NA NA 1/1/2000 NA NA NA NA NA NA NA 1/1/2003 NA NA NA NA NA NA NA 1/1/2006 20.10000 NA NA NA NA NA NA 1/1/2009 24.20 NA NA NA NA 1 NA
2 2 1406 SUB acapol 1 153 NA 14 CONTROL 1/1/1993 40.7 NA NA NA NA 2 NA 1/1/1994 41.30000 NA NA NA NA NA NA 1/1/1995 NA NA NA NA NA NA NA 1/1/1996 NA NA NA NA NA NA NA 1/1/1998 NA NA NA NA NA NA NA 1/1/2000 NA NA NA NA NA NA NA 1/1/2003 NA NA NA NA NA NA NA 1/1/2006 NA NA NA NA NA NA NA 1/1/2009 NA NA NA NA NA NA
3 3 726 acapol 23 127 NA 10 RIL 1/1/1993 67.0 NA NA NA NA 3 NA 1/1/1994 NA NA NA NA NA NA NA 1/1/1995 NA NA NA NA NA NA NA 1/1/1996 NA NA NA NA NA NA NA 1/1/1998 NA NA NA NA NA NA NA 1/1/2000 NA NA NA NA NA NA NA 1/1/2003 NA NA NA NA NA NA NA 1/1/2006 NA NA NA NA NA NA NA 1/1/2009 NA NA NA NA NA NA
4 4 51664 aconit 22 102 NA 18 CONTROL 1/1/1993 NA NA NA NA NA NA NA 1/1/1994 NA NA NA NA NA NA NA 1/1/1995 NA NA NA NA NA NA NA 1/1/1996 NA NA NA NA NA NA NA 1/1/1998 NA NA NA NA NA NA NA 1/1/2000 NA NA NA NA NA NA NA 1/1/2003 NA NA NA NA NA NA NA 1/1/2006 10.40000 NA NA NA NA NA NA 1/1/2009 10.70 NA NA NA NA NA
5 5 5198 aconit 24 67 NA 3 CONTROL 1/1/1993 NA NA NA NA NA NA NA 1/1/1994 NA NA NA NA NA NA NA 1/1/1995 NA NA NA NA NA NA NA 1/1/1996 NA NA NA NA NA NA NA 1/1/1998 NA NA NA NA NA NA NA 1/1/2000 NA NA NA NA NA NA NA 1/1/2003 NA NA NA NA NA NA NA 1/1/2006 10.50000 NA NA NA NA NA NA 1/1/2009 10.70 NA NA NA NA NA
Editors note: This appears to have been tab separated data but the tabs were converted to spaces and it may be difficult to import. The poster should have posted output from dput(census).
I have used this code several times, but now it is giving me a error and, although it should be a really basic thing, I can't figure it out what is missing:
census.long.coarse =
reshape(census,
varying=list(c("date1","date2","date3","date4","date5","date6","date7","date8","data9"),
c("dbh1","dbh2","dbh3","dbh4","dbh5","dbh6","dbh7","dbh8","dbh9")),
v.names = c("date","dbh"),
direction = "long",
times = c(1,2,3,4,5,6,7,8,9))
The error that I am getting is:
Error in `[.data.frame`(data, , varying[[j]][i]) :
undefined columns selected
You made a typo (data9 instead of date9). Should work:
census.long.coarse = reshape(census,
varying=list(c("date1","date2","date3","date4","date5","date6","date7","date8","date9"),
c("dbh1","dbh2","dbh3","dbh4","dbh5","dbh6","dbh7","dbh8","dbh9")),
v.names = c("date","dbh"),
direction = "long",
times = c(1,2,3,4,5,6,7,8,9))

Resources