I am trying to extract the shape and scale parameters of a wind speed distribution for different sites. I can do this in a clunky way, but I was hoping to find a way using data.table or plyr. However, when I try I am met with the following: set.seed(144) weib.dist<-rweibull(10000,shape=3,scale=8) weib.test<-data.table(cbind(1:10,weib.dist)) names(weib.test)<-c('site','wind_speed') fitted<-weib.test[,fitdistr(wind_speed,'weibull'),by=site] Error in class(ans[[length(byval) + jj]]) = class(testj[[jj]]) : invalid to set the class to matrix unless the dimension attribute is of length 2 (was 0) In addition: Warning messages: 1: In dweibull(x, shape, scale, log) : NaNs produced ... 10: In dweibull(x, shape, scale, log) : NaNs produced (the warning messages are normal from what I can tell) or using plyr: set.seed(144) weib.dist<-rweibull(10000,shape=3,scale=8) weib.test.too<-data.frame(cbind(1:10,weib.dist)) names(weib.test.too)<-c('site','wind_speed') fitted<-ddply(weib.test.too,.(site),fitdistr,'weibull') Error in .fun(piece, ...) : 'x' must be a non-empty numeric vector those sound like similar errors to me, but I can't figure out how to make them go away! to prove I'm not crazy: fitdistr(weib.dist,'weibull')$estimate shape scale 2.996815 8.009757 Warning messages: 1: In dweibull(x, shape, scale, log) : NaNs produced 2: In dweibull(x, shape, scale, log) : NaNs produced 3: In dweibull(x, shape, scale, log) : NaNs produced 4: In dweibull(x, shape, scale, log) : NaNs produced Thanks Justin
On Wed, Apr 27, 2011 at 3:55 PM, Justin Haynes <jtor14 at gmail.com> wrote:> I am trying to extract the shape and scale parameters of a wind speed > distribution for different sites. ?I can do this in a clunky way, but > I was hoping to find a way using data.table or plyr. ?However, when I > try I am met with the following: > > set.seed(144) > weib.dist<-rweibull(10000,shape=3,scale=8) > weib.test<-data.table(cbind(1:10,weib.dist)) > names(weib.test)<-c('site','wind_speed') > > fitted<-weib.test[,fitdistr(wind_speed,'weibull'),by=site] > > Error in class(ans[[length(byval) + jj]]) = class(testj[[jj]]) : > ?invalid to set the class to matrix unless the dimension attribute is > of length 2 (was 0) > In addition: Warning messages: > 1: In dweibull(x, shape, scale, log) : NaNs produced > ... > 10: In dweibull(x, shape, scale, log) : NaNs produced > > (the warning messages are normal from what I can tell) > > or using plyr: > > set.seed(144) > weib.dist<-rweibull(10000,shape=3,scale=8) > weib.test.too<-data.frame(cbind(1:10,weib.dist)) > names(weib.test.too)<-c('site','wind_speed') > > fitted<-ddply(weib.test.too,.(site),fitdistr,'weibull')Well fitdistr doesn't return a data frame, so you need to do something to its output... Hadley -- Assistant Professor / Dobelman Family Junior Chair Department of Statistics / Rice University http://had.co.nz/
Hi Justin, One way of doing it is using a combination of tapply() and sapply() as follows: # data set.seed(144) weib.dist<-rweibull(10000,shape=3,scale=8) weib.test.too<-data.frame(cbind(1:10,weib.dist)) names(weib.test.too)<-c('site','wind_speed') # results require(MASS) out <- with(weib.test.too, tapply(wind_speed, site, function(x) fitdistr(x, 'weibull'))) estimates <- t(sapply(out, "[[", 1)) SDs <- t(sapply(out, "[[", 2)) estimates SDs HTH, Jorge On Wed, Apr 27, 2011 at 4:55 PM, Justin Haynes <> wrote:> I am trying to extract the shape and scale parameters of a wind speed > distribution for different sites. I can do this in a clunky way, but > I was hoping to find a way using data.table or plyr. However, when I > try I am met with the following: > > set.seed(144) > weib.dist<-rweibull(10000,shape=3,scale=8) > weib.test<-data.table(cbind(1:10,weib.dist)) > names(weib.test)<-c('site','wind_speed') > > fitted<-weib.test[,fitdistr(wind_speed,'weibull'),by=site] > > Error in class(ans[[length(byval) + jj]]) = class(testj[[jj]]) : > invalid to set the class to matrix unless the dimension attribute is > of length 2 (was 0) > In addition: Warning messages: > 1: In dweibull(x, shape, scale, log) : NaNs produced > ... > 10: In dweibull(x, shape, scale, log) : NaNs produced > > (the warning messages are normal from what I can tell) > > or using plyr: > > set.seed(144) > weib.dist<-rweibull(10000,shape=3,scale=8) > weib.test.too<-data.frame(cbind(1:10,weib.dist)) > names(weib.test.too)<-c('site','wind_speed') > > fitted<-ddply(weib.test.too,.(site),fitdistr,'weibull') > > Error in .fun(piece, ...) : 'x' must be a non-empty numeric vector > > those sound like similar errors to me, but I can't figure out how to > make them go away! > > to prove I'm not crazy: > > fitdistr(weib.dist,'weibull')$estimate > shape scale > 2.996815 8.009757 > Warning messages: > 1: In dweibull(x, shape, scale, log) : NaNs produced > 2: In dweibull(x, shape, scale, log) : NaNs produced > 3: In dweibull(x, shape, scale, log) : NaNs produced > 4: In dweibull(x, shape, scale, log) : NaNs produced > > Thanks > > Justin > > ______________________________________________ > R-help@r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide > http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. >[[alternative HTML version deleted]]
Hi: Here's one way to do this with plyr and data.table. # plyr As Hadley inferred, when using ddply(), it's convenient to write a function for a generic (sub-)data frame and have it return a data frame. Here's my function and call: f <- function(d) { require(MASS) est <- fitdistr(d$wind_speed, 'weibull')$estimate data.frame(shape = est[1], scale = est[2]) } Notice that f() takes a data frame d as input, uses the wind_speed component of d to fit the Weibull, and returns a data frame with names for the estimates.> ddply(weib.test.too, 'site', f)site shape scale 1 1 3.063853 8.049467 2 2 2.945982 8.067252 3 3 2.879392 7.999636 4 4 3.097191 8.084453 5 5 3.091117 8.012450 6 6 2.943254 7.912792 7 7 2.957455 7.947545 8 8 2.975732 7.901587 9 9 3.045563 8.061838 10 10 2.995324 8.056820 Warning messages: 1: In dweibull(x, shape, scale, log) : NaNs produced 2: In dweibull(x, shape, scale, log) : NaNs produced <snip the other eight> ## data.table In writing a function for data.table, you want a variable as input and a list as output. We therefore modify the above function slightly: g <- function(x) { require(MASS) est <- fitdistr(x, 'weibull')$estimate list(shape = est[1], scale = est[2]) } library(data.table) weib.test.dt <- data.table(weib.test.too, key = 'site')> weib.test.dt[, g(wind_speed), by = site]site shape scale [1,] 1 3.063853 8.049467 [2,] 2 2.945982 8.067252 [3,] 3 2.879392 7.999636 [4,] 4 3.097191 8.084453 [5,] 5 3.091117 8.012450 [6,] 6 2.943254 7.912792 [7,] 7 2.957455 7.947545 [8,] 8 2.975732 7.901587 [9,] 9 3.045563 8.061838 [10,] 10 2.995324 8.056820 ## <warnings snipped> HTH, Dennis On Wed, Apr 27, 2011 at 1:55 PM, Justin Haynes <jtor14 at gmail.com> wrote:> I am trying to extract the shape and scale parameters of a wind speed > distribution for different sites. ?I can do this in a clunky way, but > I was hoping to find a way using data.table or plyr. ?However, when I > try I am met with the following: > > set.seed(144) > weib.dist<-rweibull(10000,shape=3,scale=8) > weib.test<-data.table(cbind(1:10,weib.dist)) > names(weib.test)<-c('site','wind_speed') > > fitted<-weib.test[,fitdistr(wind_speed,'weibull'),by=site] > > Error in class(ans[[length(byval) + jj]]) = class(testj[[jj]]) : > ?invalid to set the class to matrix unless the dimension attribute is > of length 2 (was 0) > In addition: Warning messages: > 1: In dweibull(x, shape, scale, log) : NaNs produced > ... > 10: In dweibull(x, shape, scale, log) : NaNs produced > > (the warning messages are normal from what I can tell) > > or using plyr: > > set.seed(144) > weib.dist<-rweibull(10000,shape=3,scale=8) > weib.test.too<-data.frame(cbind(1:10,weib.dist)) > names(weib.test.too)<-c('site','wind_speed') > > fitted<-ddply(weib.test.too,.(site),fitdistr,'weibull') > > Error in .fun(piece, ...) : 'x' must be a non-empty numeric vector > > those sound like similar errors to me, but I can't figure out how to > make them go away! > > to prove I'm not crazy: > > fitdistr(weib.dist,'weibull')$estimate > ? shape ? ?scale > 2.996815 8.009757 > Warning messages: > 1: In dweibull(x, shape, scale, log) : NaNs produced > 2: In dweibull(x, shape, scale, log) : NaNs produced > 3: In dweibull(x, shape, scale, log) : NaNs produced > 4: In dweibull(x, shape, scale, log) : NaNs produced > > Thanks > > Justin > > ______________________________________________ > R-help at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. >
Reasonably Related Threads
- help error: In dweibull(x, shape, scale, log) : NaNs produzidos
- fitting truncated normal distribution
- Covariates in NLS (Multiple nonlinear regression)
- How to use results of distribution fitting for further processing?
- Ordered logistic regression in R vs in SAS