Mitt detaljerade svar är nedan, men det allmänna (dvs. verkliga) svaret på denna typ av fråga är: 1) experimentera, skruva runt, titta på data, du kan inte bryta datorn oavsett vad du gör, så . . . experimentera; eller 2) RTFM.
Här är någon R
-kod som replikerar problemet som identifierats i denna fråga, mer eller mindre:
# Detta program skrivet som svar på en korsvaliderad fråga # http://stats.stackexchange.com/questions/95939/# # Det är en undersökning av varför resultatet från lm (y_x + I (x ^ 2 )) # ser så annorlunda ut än resultatet från lm (y ~ poly (x, 2)) bibliotek (ggplot2) epsilon <- 0,25 * rnorm (100) x <- seq (från = 1, till = 5, längd. ut = 100) y <- 4 - 0,6 * x + 0,1 * x ^ 2 + epsilon # Minimum är vid x = 3, det förväntade y-värdet är4 - 0,6 * 3 + 0,1 * 3 ^ 2ggplot (data = NULL, aes ( x, y)) + geom_point () + geom_smooth (metod = "lm", formel = y ~ poly (x, 2)) sammanfattning (lm (y ~ x + I (x ^ 2))) # Ser rättighetsmätning (lm (y ~ poly (x, 2))) # Ser ut som sopor # Vad hände? # Hur ser x och x ^ 2 ut: huvud (cbind (x, x ^ 2)) # Hur ser poly (x, 2) ser ut som: head (poly (x, 2))
Den första lm
returnerar det förväntade svaret:
Ring : lm (formel = y ~ x + I (x ^ 2)) Rester: Min 1Q Median 3Q Max -0,53815 -0,13465 -0,01262 0,15369 0,61645 Koefficienter: Uppskattning Std. Fel t värde Pr (> | t |) (Intercept) 3.92734 0.15376 25.542 < 2e-16 *** x -0.53929 0.11221 -4.806 5.62e-06 *** I (x ^ 2) 0.09029 0.01843 4.900 3.84e-06 * ** --- Signif. koder: 0 '***' 0,001 '**' 0,01 '*' 0,05 '.' 0,1 '' 1 Restfel kvarvarande: 0,2241 på 97 frihetsgrader Flera R-kvadrat: 0,1985, Justerat R-kvadrat: 0,182 F-statistik: 12.01 på 2 och 97 DF, p-värde: 2.181e-05
Den andra lm
returnerar något udda:
Samtal: lm (formel = y ~ poly (x, 2)) Rester: Min 1Q Median 3Q Max
-0.53815 -0.13465 -0.01262 0.15369 0.61645 Koefficienter: Uppskattning Std. Fel t värde Pr (> | t |) (Intercept) 3.24489 0.02241 144.765 < 2e-16 *** poly (x, 2) 1 0.02853 0.22415 0.127 0.899 poly (x, 2) 2 1.09835 0.22415 4.900 3.84e-06 ** * --- Signif. koder: 0 '***' 0,001 '**' 0,01 '*' 0,05 '.' 0,1 '' 1 Restfel kvarvarande: 0,2241 på 97 frihetsgrader Flera R-kvadrat: 0,1985, Justerat R-kvadrat: 0,182 F-statistik: 12.01 på 2 och 97 DF, p-värde: 2.181e-05
Eftersom lm
är densamma i de två samtalen måste det vara argumenten för lm som är olika. Så, låt oss titta på argumenten. Uppenbarligen är y
samma. Det är de andra delarna. Låt oss titta på de första observationerna på högervariablerna i det första anropet av lm
. Returen för -huvud (cbind (x, x ^ 2)) ser ut som:
x [1,] 1.000000 1.000000 [2,] 1.040404 1.082441 [3, ] 1.080808 1.168146 [4,] 1.121212 1.257117 [5,] 1.161616 1.349352 [6,] 1.202020 1.444853
Detta är som förväntat. Första kolumnen är x och den andra kolumnen är x ^ 2 . Vad sägs om det andra samtalet av lm
, det med poly? Returen av -huvud (poly (x, 2)) ser ut som:
1 2 [1,] -0.1714816 0.2169976 [2,] -0.1680173 0.2038462 [3 ,] -0.1645531 0.1909632 [4,] -0.1610888 0.1783486 [5,] -0.1576245 0.1660025 [6,] -0.1541602 0.1539247
OK, det är verkligen annorlunda. Den första kolumnen är inte x , och den andra kolumnen är inte x ^ 2 . Så vad poly (x, 2)
gör, returnerar det inte x
och x ^ 2
. Om vi vill veta vad poly
gör kan vi börja med att läsa dess hjälpfil. Så vi säger hjälp (poly) . Beskrivningen säger:
Returnerar eller utvärderar ortogonala polynom av grad 1 till grad över den angivna uppsättningen punkter x. Dessa är alla ortogonala mot den konstanta polynomgraden 0. Alternativt kan du utvärdera råa polynomier.
Nu vet du antingen vad "ortogonala polynomier" är eller inte. Om du inte gör det, använd sedan Wikipedia eller Bing (naturligtvis inte Google för att Google är ont --- inte lika illa som Apple, naturligtvis, men fortfarande dåligt). Eller så kan du bestämma att du inte bryr dig om vad ortogonala polynom är. Du kanske märker frasen "råa polynom" och du kanske märker lite längre ner i hjälpfilen att poly har ett alternativ råkod som standard är lika med FALSE
. Dessa två överväganden kan inspirera dig att testa head (poly (x, 2, raw = TRUE))
som returnerar:
1 2 [1,] 1.000000 1.000000 [2,] 1.040404 1.082441 [3,] 1.080808 1.168146 [4,] 1.121212 1.257117 [5,] 1.161616 1.349352 [6,] 1.202020 1.444853
Upphetsad av denna upptäckt (det ser rätt ut, nu, ja?), kanske du försöker sammanfattning (lm (y ~ poly (x, 2, rå = SANT)) Detta returnerar:
Samtal: lm (formel = y ~ poly (x, 2, rå = SANT)) Rester: Min 1Q Median 3Q Max -0,53815 -0,13465 -0,01262 0,15369 0,61645 Koefficienter: Uppskattning Std. Fel t värde Pr (> | t |) (Intercept) 3.92734 0.15376 25.542 < 2e-16 *** poly (x, 2, raw = TRUE) 1 -0.53929 0.11221 -4.806 5.62e-06 *** poly (x, 2, rå = SANT) 2 0,09029 0,01843 4,900 3,84e-06 *** --- Signif. koder: 0 '***' 0,001 '**' 0,01 '*' 0,05 '.' 0,1 '' 1 Restfel kvarvarande: 0,2241 på 97 frihetsgrader Flera R-kvadrat: 0,1985, Justerat R-kvadrat: 0,182 F-statistik: 12.01 på 2 och 97 DF, p-värde: 2.181e-05
Det finns minst två nivåer i ovanstående svar. Först svarade jag på din fråga. För det andra, och mycket viktigare, illustrerade jag hur du ska gå att svara på frågor som detta själv. Varje enskild person som "vet hur man programmerar" har gått igenom en sekvens som den ovanför sextio miljoner gånger. Även människor som är så deprimerande dåliga att programmera som jag går igenom denna sekvens hela tiden. Det är normalt att koden inte fungerar. Det är normalt att missförstå vad funktioner gör. Sättet att hantera det är att skruva runt, experimentera, titta på data och RTFM. Gå ut ur "tanklöst att följa ett recept" -läge och in i "detektiv" -läge.