我有以下脚本模仿我拥有的数据结构类型以及我想对其进行的分析,
library(ggplot2)
library(reshape2)
n <- 10
df <- data.frame(t=seq(n)*0.1, a =sort(rnorm(n)), b =sort(rnorm(n)),
a.1=sort(rnorm(n)), b.1=sort(rnorm(n)),
a.2=sort(rnorm(n)), b.2=sort(rnorm(n)))
head(df)
mdf <- melt(df, id=c('t'))
## head(mdf)
levels(mdf$variable) <- rep(c('a','b'),3)
g <- ggplot(mdf,aes(t,value,group=variable,colour=variable))
g +
stat_smooth(method='lm', formula = y ~ ns(x,3)) +
geom_point() +
facet_wrap(~variable) +
opts()
除此之外我想做的是绘制平滑函数对t
的一阶导数以及因子c('a','b')
。任何建议如何解决这个问题将不胜感激。
答案 0 :(得分:12)
你必须自己构建衍生物,并且有两种可能的方法。让我用一个小组来说明:
require(splines) #thx @Chase for the notice
lmdf <- mdf[mdf$variable=="b",]
model <- lm(value~ns(t,3),data=lmdf)
然后,您可以根据预测值将导数定义为diff(Y)/diff(X)
,就像区分离散函数一样。如果你拿到足够的X点,这是一个非常好的近似值。
X <- data.frame(t=seq(0.1,1.0,length=100) ) # make an ordered sequence
Y <- predict(model,newdata=X) # calculate predictions for that sequence
plot(X$t,Y,type="l",main="Original fit") #check
dY <- diff(Y)/diff(X$t) # the derivative of your function
dX <- rowMeans(embed(X$t,2)) # centers the X values for plotting
plot(dX,dY,type="l",main="Derivative") #check
正如您所看到的,这样您就可以获得绘制衍生物的点数。你会从这里弄清楚如何将这个应用到两个级别并将这些点组合到你喜欢的情节。在此示例代码的图表下方:
答案 1 :(得分:4)
这是用ggplot绘制这个的一种方法。可能有一种更有效的方法,但这使用@Joris完成的手动计算。我们将简单地构造一个包含所有X和Y值的long data.frame,同时还提供一个变量来“facet”图:
require(ggplot2)
originalData <- data.frame(X = X$t, Y, type = "Original")
derivativeData <- data.frame(X = dX, Y = dY, type = "Derivative")
plotData <- rbind(originalData, derivativeData)
ggplot(plotData, aes(X,Y)) +
geom_line() +
facet_wrap(~type, scales = "free_y")
答案 2 :(得分:1)
如果使用smooth.spline
对数据进行平滑处理,则可以使用deriv
中的参数predict
指定预测数据的导数。关注@ Joris的解决方案
lmdf <- mdf[mdf$variable == "b",]
model <- smooth.spline(x = lmdf$t, y = lmdf$value)
Y <- predict(model, x = seq(0.1,1.0,length=100), deriv = 1) # first derivative
plot(Y$x[, 1], Y$y[, 1], type = 'l')
输出中的任何差异很可能是由于平滑的差异造成的。