14

私が持っているデータ構造のタイプとそれに対して実行したい分析をエミュレートする次のスクリプトがあります。

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()

これに加えてやりたいことは、平滑化関数の 1 次導関数をt因子に対してもプロットするc('a','b')ことです。これについての提案は大歓迎です。

4

3 に答える 3

14

導関数を自分で作成する必要がありますが、それには 2 つの方法があります。グループを 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

ご覧のとおり、この方法で導関数をプロットするための点を取得します。ここから、これを両方のレベルに適用し、それらのポイントを好みのプロットに組み合わせる方法を理解します。このサンプル コードのプロットの下:

ここに画像の説明を入力

于 2011-06-15T11:58:56.040 に答える
4

これを ggplot でプロットする方法の 1 つを次に示します。もっと効率的な方法があるかもしれませんが、これは @Joris による手動計算を使用します。すべての X 値と Y 値を含む長い data.frame を作成するだけでなく、プロットを「ファセット」するための変数も提供します。

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")
于 2011-06-15T13:50:17.590 に答える