Как построить первую производную функции сглаживания? - PullRequest
13 голосов
/ 15 июня 2011

У меня есть следующий скрипт, который имитирует тип структуры данных и анализ, который я хочу выполнить на нем,

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'). Будем весьма благодарны за любые предложения, как это сделать.

Ответы [ 3 ]

12 голосов
/ 15 июня 2011

Вам придется построить производную самостоятельно, и для этого есть два возможных пути.Позвольте мне проиллюстрировать это, используя только одну группу:

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

4 голосов
/ 15 июня 2011

Вот один из подходов к построению графика с помощью 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")
1 голос
/ 13 декабря 2017

Если данные сглаживаются с использованием 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')

Любые различия в выходных данных наиболее вероятны из-за различий в сглаживании.

...