Как создать первую производную функции сглаживания?
У меня есть следующий script, который эмулирует тип структуры данных, который у меня есть, и анализ, который я хочу сделать на нем,
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')
. Любые предложения, как это сделать, будут очень признательны.
Ответы
Ответ 1
Вам нужно будет построить производную самостоятельно, и для этого есть два возможных способа. Позвольте мне проиллюстрировать, используя только одну группу:
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
Как вы можете видеть, таким образом вы получаете точки для построения производной. Вы поймете, как применить это на обоих уровнях и объединить эти точки с сюжетом, который вам нравится. Ниже графиков из этого примера кода:
![enter image description here]()
Ответ 2
Здесь один подход к построению этого с помощью ggplot. Может быть более эффективный способ сделать это, но это использует ручные вычисления, выполненные @Joris. Мы просто построим длинный data.frame со всеми значениями X и Y, а также предоставим переменную для "граней" графиков:
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")
Ответ 3
Если данные сглаживаются с использованием 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')
Любое отличие в выходе, скорее всего, связано с различиями в сглаживании.