7

R に線形の点のセットがある場合、次のようにして点をプロットし、それらに線を当てはめ、線を表示できます。

x=c(61,610,1037,2074,3050,4087,5002,6100,7015)
y=c(0.401244, 0.844381, 1.18922, 1.93864, 2.76673, 3.52449, 4.21855, 5.04368, 5.80071)

plot(x,y)    
Estimate = lm(y ~ x)    
abline(Estimate)

ここで、次のように、対数曲線の適合のように見える一連の点がある場合、より適切です。

x=c(61,610,1037,2074,3050,4087,5002,6100,7015)        
y=c(0.974206,1.16716,1.19879,1.28192,1.30739,1.32019,1.35494,1.36941,1.37505)

次のようにして、x 値の対数に対する標準的な回帰適合を取得できることを知っています。

logEstimate = lm(y ~ log(x))

しかし、その logEstimate を通常のスケーリングに戻し、以前の線形曲線に対して曲線をプロットするにはどうすればよいでしょうか?

4

2 に答える 2

13

うーん、「以前の線形曲線に対して曲線をプロットする」という意味がよくわかりません。

d <- data.frame(x,y)  ## need to use data in a data.frame for predict()
logEstimate <- lm(y~log(x),data=d)

予測値を取得するには、次の 3 つの方法があります。

(1) 使用predict:

plot(x,y)
xvec <- seq(0,7000,length=101)
logpred <- predict(logEstimate,newdata=data.frame(x=xvec))
lines(xvec,logpred)

(2) 数値係数値を抽出します。

coef(logEstimate)
## (Intercept)      log(x) 
##  0.6183839   0.0856404 
curve(0.61838+0.08564*log(x),add=TRUE,col=2)

(3)with()魔法を使う (パラメータ推定名には括弧が含まれているため、パラメータ推定名をバッククォートで囲む必要があります)

with(as.list(coef(logEstimate)),
      curve(`(Intercept)`+`log(x)`*log(x),add=TRUE,col=4))

多分あなたが欲しいのは

est1 <- predict(lm(y~x,data=d),newdata=data.frame(x=xvec))
plot(est1,logpred)

...理由はわかりませんが...

于 2012-07-19T21:12:21.310 に答える
10

私もあなたが何を意味しているのか正確にはわかりません...しかし、私は少し違うと思いました。これらの点に 2 つのモデルを当てはめたいと思います。1 つは線形で、もう 1 つは対数です。次に、点と両方のモデルの関数形式をプロットします。そのためのコードは次のとおりです。

x=c(61,610,1037,2074,3050,4087,5002,6100,7015)
y=c(0.974206,1.16716,1.19879,1.28192,1.30739,1.32019,1.35494,1.36941,1.37505)

Estimate = lm(y ~ x)
logEstimate = lm(y ~ log(x))

plot(x,predict(Estimate),type='l',col='blue')
lines(x,predict(logEstimate),col='red')
points(x,y)

ここに画像の説明を入力


コメントの 2 番目の質問に答えて、線形回帰は常に予測変数の線形結合を返しますが、それは必ずしも直線であるとは限りません。あなたのlog変革が何を意味するのか考えてみてください。

y = log(x)

それはフィッティングと同じ

exp(y) = x

つまり、x直線的に増加すると、y指数関数的に変化します。これは明らかに「直線」ではありません。ただし、対数スケールで x 軸を変換すると、表示される線は直線になります。

于 2012-07-19T21:22:56.843 に答える