2016-08-26 3 views
2

私はこの問題を解決するのを助けてくれることを願っています。 x軸で2乗項(x2)を使用しています(値は0から100までです)。元のxは正と負の値を持ちます(値は-10から10になります)。 x2では3DグラフのX軸で値はすべて正の値です。 x2 = 100はx = -10^2とx = 10 ^から得られる値であり、x2 = 25はx = -5^2とx = 5^2などから来ると考える。私はグラフの「半分」しか持っていません。 1)X軸に-10から10までの元の縮尺でグラフを作成します。 2)グラフの他の半分を完成させて非線形の関係にする(すなわち、-10から0に対応する表面を完成させる。これは私が今持っているものの鏡であると仮定する)。異なる色を使用して軸とミラーグラフを変更してRの非線形面を完成させようR

enter image description here

あなたは非線形な関係をよりよく見ることができますが、私は、コードを簡素化するためにそれらをここに含まれていませんでした。

平方根が常に正であるため、負の値をプロットxに戻すことができないため、Excelでデータを複製しました。負の値を追加しました(値は-100から100になります)。もう一度Rリストを作成しました。これは解決策ではありませんが、それでもx2のスケールは同じですが、とにかく動作しません。

これは私がグラフをプロットする方法である:

データ:https://www.dropbox.com/s/fv943jf35eqtkd8/NSSH.csv?dl=0

リンク機能コード:

logexp <- function(days = 1) 
{ 
linkfun <- function(mu) qlogis(mu^(1/days)) 
linkinv <- function(eta) plogis(eta)^days 
mu.eta <- function(eta) days * plogis(eta)^(days-1) * 
    .Call("logit_mu_eta", eta, PACKAGE = "stats") 
valideta <- function(eta) TRUE 
link <- paste("logexp(", days, ")", sep="") 
structure(list(linkfun = linkfun, linkinv = linkinv, 
       mu.eta = mu.eta, valideta = valideta, name = link), 
      class = "link-glm") 
} 

3Dグラフ:

library(akima) 
x <- NSSH$reLDM 
x2<- x^2 
y <- NSSH$yr 
y2 <-y^2 
n <-NSSH$AgeDay1 
z <- NSSH$survive 
m <- glm(z~x2+y+y2+x2:y+n,family=binomial(link=logexp(NSSH$exposure))) 

# interaction 
i <- 25 
xtemp <- seq(min(x),max(x),length.out=i) 
xrange <- rep(xtemp,times=i) 
x2temp <- seq(min(0),max(100),length.out=i) 
x2range <- rep(x2temp,times=i) 
ytemp <- seq(min(y),max(y),length.out=i) 
yrange <- rep(ytemp,each=i) 
y2temp <- seq(min(y2),max(y2),length.out=i) 
y2range <- rep(y2temp,each=i) 
ntemp <- rep(mean(n),times=i) 
nrange <- rep(ntemp,times=i) 

newdata <- data.frame(x2=x2range,y=yrange,y2=y2range,n=nrange) 
zhat <- predict(m,newdata=newdata) 
NS <- zhat^27 
xyz <- interp(x2range,yrange,NS) 


quartz() 
persp(xyz, 
     theta = 35, phi = 50,col="blue", border="grey40", ticktype = "detailed", zlim=c(0,1)) -> res2 

が方法はありますI私は "ミラー"として持っている "半分"のグラフをコピーして、その部分の隣に置くことができます私はすでにxの元のスケールを使用していますか?

おかげであなたの助けのためにたくさん!

更新日:

3Dグラフは完璧です!

しかし、私は等高線図を作るために、「半分グラフ」を使用する場合には、次のようになります。 enter image description here

そして今、それはこのようになります新しいグラフで、私は次の0の周りなぜ起源だろう値0.7(赤い円内の領域)は、最初の等高線プロットと同じには見えません。あなたは何か考えていますか?それを修正することは可能ですか?再度、感謝します。

image(xyz2,col = "white") 
contour(xyz2,add=T) 

答えて

1

私はあなたがXとYの増加を作り、dim(Z)ある例外を除いて小さなことを心配する必要はありませんと思う:

enter image description here

この

は、等高線図のコードです c(length(X), length(Y))

xyz2 <- interp(sqrt(x2range), yrange, NS) # change scale before interpolate 
xyz2$x <- c(rev(xyz2$x)*-1, xyz2$x)   # reverse and combine 
xyz2$x[41] <- 1.0E-8     # because [40] = [41] = 0 (40 is interp's nx value) 
xyz2$z <- rbind(apply(xyz2$z, 2, rev), xyz2$z) # reverse and combine 

persp(xyz2,xlab="Relative laying date",ylab="Year",zlab="Nest success", 
     theta = 35, phi = 50,col="blue", border="grey40", ticktype = "detailed") 

enter image description here

[EDITED]

私はあなたの追加質問を再現することはできません。

origin <- list(x = unique(x2range), 
       y = unique(yrange), 
       z = matrix(NS, ncol=length(unique(yrange)))) 

xyz <- interp(x2range,yrange,NS)    # OP's code 

image(origin, col = "white", xlim=c(-10,10), ylim=c(7, 24)) 
contour(origin, add=T, lwd=1.5, drawlabels=F)      # no interp : black 
contour(xyz, add=T, col=2, drawlabels=F)        # OP's code : red 
contour(x=sqrt(xyz$x), y=xyz$y, z=xyz$z, add=T, col=3, drawlabels=F) # only scale change : green 
contour(xyz2, add=T, col=4, drawlabels=F)       # my code : blue 

enter image description here

+2

おかげでそれが動作ロットの@ cuttlefish44 !!! NSはtypoではないので、z値の最終的な推定は、(繁殖力を用いて)27の累乗(またはインキュベーション日)の変換を用いて行わなければならない。 – MSS

+0

あなたは投稿の更新を見てください、私は質問がありますし、多分あなたは再び、おかげで助けることができます! – MSS

+0

はい@ cuttlefish44、私はzlim 0,1を返します。私の新しい質問(私はこれについて新しい記事を書いておくべきですか?)は、値を示す等高線プロットについてです。ラインが0から近づくと、カーブ上の「うつ病」(赤い円を参照してください)最初の等高線図のように連続的に上昇します。 – MSS