4

これは私が遭遇した非常に奇妙な状況です。基本的に、累積分布関数をデータのG関数に適合させようとしています。その後、モデルと元のデータをプロットし、PDFとして出力したいと思います。コードで説明できるようにします(単にコピーして貼り付けます)。

library(spatstat)

data(swedishpines)

mydata <- swedishpines

mydata.Gest <- Gest(mydata)

Gvalues <- mydata.Gest$rs

count <- (which(Gvalues == 1))[1]

new_r <- seq(1/count, length(Gvalues)/count, by = 1/count)

GvsR_dataframe <- data.frame(G <- Gvalues, R <- new_r)

themodel <- suppressWarnings(nls(G ~ pnorm(R, mean, sd), data = GvsR_dataframe, start = list(mean=0.4, sd=0.2), trace = FALSE))

pdf(file = "ModelPlot.pdf")

plot(mydata.Gest, cbind(rs, theo) ~ new_r, lty = c(1, 2), col = c("black", "red"), xlim = c(0, max(new_r)), ylim = c(0,1), main = paste("Model-fitting for G Function \n Mean = ",as.numeric(coef(themodel)[1]),"\n Standard Deviation = ",as.numeric(coef(themodel)[2]), sep=''), ylab = "G(r)", xlab = "Distance Between Particles (r)", legend = NULL)
lines(new_r, predict(themodel), lty = 2, col = "blue")
legend("bottomright", c("CSR", "Swedish Pines", "Normal Probability \n Density Function"), lty = c(2, 4, 1, 2), col = c("red", "black", "blue"), bg = 'grey', border = 'black')

graphics.off()

上記のコードは完全に機能します。

さて、奇妙な部分です。

mydata <- swedishpinesその後、すべてのコマンドを関数としてカプセル化し、mydataこの関数への入力にすると、機能しなくなります。次のコードは、コードの最後のセグメントと同じように機能するはずですが、そうではありません。

library(spatstat)

data(swedishpines)

mydata <- swedishpines

ModelFit <- function(mydata) {

mydata.Gest <- Gest(mydata)

Gvalues <- mydata.Gest$rs

count <- (which(Gvalues == 1))[1]

new_r <- seq(1/count, length(Gvalues)/count, by = 1/count)

GvsR_dataframe <- data.frame(G <- Gvalues, R <- new_r)

themodel <- suppressWarnings(nls(G ~ pnorm(R, mean, sd), data = GvsR_dataframe, start = list(mean=0.4, sd=0.2), trace = FALSE))

pdf(file = "ModelPlot.pdf")

plot(mydata.Gest, cbind(rs, theo) ~ new_r, lty = c(1, 2), col = c("black", "red"), xlim = c(0, max(new_r)), ylim = c(0,1), main = paste("Model-fitting for G Function \n Mean = ",as.numeric(coef(themodel)[1]),"\n Standard Deviation = ",as.numeric(coef(themodel)[2]), sep=''), ylab = "G(r)", xlab = "Distance Between Particles (r)", legend = NULL)
lines(new_r, predict(themodel), lty = 2, col = "blue")
legend("bottomright", c("CSR", "Swedish Pines", "Normal Probability \n Density Function"), lty = c(2, 4, 1, 2), col = c("red", "black", "blue"), bg = 'grey', border = 'black')

graphics.off()

}

ModelFit(mydata)

次のエラーが発生します。

Error in eval(expr, envir, enclos) : object 'new_r' not found

私は非常に混乱しています。私は長い間これに取り組んできましたが、この問題の解決策を思い付くことができませんでした。PDFは出力されますが、破損していて開かない。「消える」理由はわかりませんnew_rが、そうすると、すべてのプロット操作が停止します。明らかnew_rに関数に対してローカルですがModelFit、関数内の特定の領域に対してもローカルであるように見えます。

どんな助けでも大歓迎です。

4

1 に答える 1

6

あなたはそこでたくさんの暗黙のことをやっています...私は物事をもっと明確に書くことを提案します。

具体的には、プロット式でに置き換えmydata.Gest$r <- new_rます。それは私にとってはうまくいきます。関数の内部ではなく関数の外部で機能する理由はわかりませんが、ローカルスコープの外部を調べることに依存するのは危険です。 new_rrplot(..., cbind(rs, theo) ~ r, ...)plotmydata.Gestnew_r

また、=データフレーム内の列に物を割り当てるために使用するのではなく<-

クリーンセッションから:

data.frame(x<-1:10, y<- 1:10)
ls()

data.frame(x=1:10, y=1:10)
ls()
于 2012-08-02T19:47:25.827 に答える