1

多項式回帰曲線をプロットするためのコードをいくつか入手しました。以下のコードを実行してください。

 x = rnorm(20)
    y = 7*x^2 - 0.5*x + rnorm(20) 
y.0 = lm(y ~ 1)
   # We'd get the same constant by just doing mean(y), but fitting it as a
   # regression model means functions like residuals() and predict() are
   # available for use later, the same as our other models
abline(h=y.0$coefficients[1])
# Get evenly spaced points for pretty plotting of other models
d = seq(min(x),max(x),length.out=200)
# Fit polynomials of order 1 to 9
# It would be nicer if we let this run from 0 to 9, but R doesn't allow us to do a polynomial of degree 0
for (degree in 1:9) {
    fm = lm(y ~ poly(x,degree))
    # Store the results in models called y.1, y.2, through y.9
    # The assign/paste trick here is often useful for storing results
        # which do not fit well into arrays!
        # check: y.1; y.2;...
    assign(paste("y",degree,sep="."), fm)
    # Plot them, with different line types
    lines(d, predict(fm, data.frame(x=d)), lty=(degree+1))
}

    x.new = rnorm(2e4)
    y.new = 7*x.new^2 - 0.5*x.new + rnorm(2e4)
    plot(x.new,y.new,xlab="x",ylab="y",pch=24,cex=0.1,col="blue")
    curve(7*x^2-0.5*x,col="grey",add=TRUE)  # the old curve
    abline(h=y.0$coefficients[1])
    d = seq(from=min(x.new),to=max(x.new),length.out=200)
    for (degree in 1:9) {
       fm = get(paste("y",degree,sep="."))
       lines(d, predict(fm,data.frame(x=d)),lty=(degree+1))
    }
    points(x,y,col="red")

基本的に、プロットウィンドウに、さまざまな線のスタイルでプロットの最終結果が表示されます。これが私の質問です:forループを実行した後、次の線のプロットを表示するタイミングをfor手動で変更できるように、上記のループにいくつかのRコードを挿入する方法はありますか?ありがとうございました!

4

1 に答える 1

1

毎回新しいプロットを作成する場合は、を使用できますgrDevices::devAskNewPage(ask = TRUE)

単一のプロットに追加するため、を使用できますreadline。コードにエラーがあることに注意してください(abline何かをプロットした後に呼び出す必要があります)ので、を入力しplot(y)ます。

myFun <- function() {
     x = rnorm(20)
        y = 7*x^2 - 0.5*x + rnorm(20)
    y.0 = lm(y ~ 1)
    plot(y)
       # We'd get the same constant by just doing mean(y), but fitting it as a
       # regression model means functions like residuals() and predict() are
       # available for use later, the same as our other models
    abline(h=y.0$coefficients[1])
    # Get evenly spaced points for pretty plotting of other models
    d = seq(min(x),max(x),length.out=200)
    # Fit polynomials of order 1 to 9
    # It would be nicer if we let this run from 0 to 9, but R doesn't allow us to do a polynomial of degree 0
    for (degree in 1:9) {
        fm = lm(y ~ poly(x,degree))
        # Store the results in models called y.1, y.2, through y.9
        # The assign/paste trick here is often useful for storing results
            # which do not fit well into arrays!
            # check: y.1; y.2;...
        assign(paste("y",degree,sep="."), fm)
        # Plot them, with different line types
        readline('Press return to see the next line added')
        lines(d, predict(fm, data.frame(x=d)), lty=(degree+1))
    }

        x.new = rnorm(2e4)
        y.new = 7*x.new^2 - 0.5*x.new + rnorm(2e4)
        plot(x.new,y.new,xlab="x",ylab="y",pch=24,cex=0.1,col="blue")
        curve(7*x^2-0.5*x,col="grey",add=TRUE)  # the old curve
        abline(h=y.0$coefficients[1])
        d = seq(from=min(x.new),to=max(x.new),length.out=200)
        for (degree in 1:9) {
           fm = get(paste("y",degree,sep="."))
           readline('Press return to see the next line added')
           lines(d, predict(fm,data.frame(x=d)),lty=(degree+1))
        }
        points(x,y,col="red")
}
myFun()
于 2012-11-10T09:24:22.890 に答える