2014-09-23 50 views
0

我有以下示例以適合三階多項式到數據:R管件多項式到數據 - 困難數據在數據幀

# rm(list = ls(all = TRUE)) # clear workspace 
var2 <- c(32,64,96,118,126,144,152.5,158) 
var3 <- c(99.5,104.8,108.5,100,86,64,35.3,15) 
fit1 <- lm(var3 ~ poly(var2,3,raw=TRUE)) 
plot(var2, var3 , pch=19, ylim=c(0,150)) 
xx <- seq(30,160, length = 20) 
lines(xx, predict(fit1, data.frame(var2 = xx)), col="blue") 

這工作。不過,我有一些麻煩,適應這種方法我自己的數據在數據幀:

rm(list = ls(all = TRUE)) 
mydf <- data.frame(var2 = c(32, 64, 96, 118, 126, 144, 152.5, 158), var3 = c(99.5, 104.8, 108.5, 100, 86, 64, 35.3, 15)) 
fit2 <- lm(mydf$var3 ~ poly(mydf$var2,3,raw=TRUE)) 
xx <- seq(min(mydf$var2), max(mydf$var2), length = 10)  
plot(mydf$var2, mydf$var3 , pch=19, ylim=c(0,150)) 
lines(xx, predict(fit2, data.frame(var2 = xx)), col="blue") 

這產生xy.coords錯誤「錯誤(X,Y):‘X’和‘Y’的長度不同「我在整理時遇到了麻煩。我已經檢查過第二個代碼塊的每個部分的屬性,但仍然找不到問題。我確信我忽略了一些非常明顯的東西。

回答

0

如果您希望從模型中進行預測等操作,則應該使用data參數而不是$語法,例如,

fit2 <- lm(var3 ~ poly(var2,3,raw=TRUE), data=mydf) 
lines(xx, predict(fit2, data.frame(var2 = xx)), col="blue") 

對於它的價值,正交多項式(即忽略raw=TRUE)更數值穩定的;如果您不需要將係數解釋爲截距/線性/二次/立方趨勢爲零,那麼長遠來看,這樣做會更好。

enter image description here

+0

這完全解決了我的問題。除了我不明白爲什麼其他方式不起作用 - 也就是說,這兩個例子之間有什麼區別。感謝關於raw = TRUE – marcel 2014-09-23 12:32:01

+0

@ marcel的提示:我也想問一下到@BenBolker 。爲什麼mydf $ var3等不起作用? – rnso 2014-09-23 12:33:20

0

嘗試在XX改變長度,以8:

mydf <- data.frame(var2 = c(32, 64, 96, 118, 126, 144, 152.5, 158), var3 = c(99.5, 104.8, 108.5, 100, 86, 64, 35.3, 15)) 
fit2 <- lm(mydf$var3 ~ poly(mydf$var2,3,raw=TRUE)) 
xx <- seq(min(mydf$var2), max(mydf$var2), length = 8)  
plot(mydf$var2, mydf$var3 , pch=19, ylim=c(0,150)) 
lines(xx, predict(fit2, data.frame(var2 = xx)), col="blue") 

enter image description here

它的工作原理,雖然它不適合非常好。

+0

你的答案是有效的,但是如果OP想要使用結果插入... – 2014-09-23 12:24:24

+0

它會失敗,因爲新的座標不匹配舊的... – 2014-09-23 12:26:25

+0

是的。你的答案是完美的。我想我應該刪除我的答案。 – rnso 2014-09-23 12:28:52