Interpolare liniară în R (Programare, R, Statistici, Interpolare)

R_Utilizator a intrebat.

Am un set de date de date reale, de exemplu, care arată astfel:

# Dataset 1 with known data
known <- data.frame(
    x = c(0:6),
    y = c(0, 10, 20, 23, 41, 39, 61)
)

plot (known$x, known$y, type="o")

Acum vreau să obțin un răspuns la întrebarea „Care ar fi valoarea Y pentru 0,3, dacă toate punctele de date intermediare din setul de date original se află pe o linie dreaptă între valorile măsurate din jur?”

 # X values of points to interpolate from known data
 aim <- c(0.3, 0.7, 2.3, 3.3, 4.3, 5.6, 5.9)

Dacă vă uitați la grafic: Vreau să obțin valorile Y, în cazul în care liniile abrupte se intersectează cu interpolarea liniară a datelor cunoscute.

abline(v = aim, col = "#ff0000")

Așadar, în cazul ideal, aș crea un „linearInterpolationModel” cu datele mele cunoscute, de ex.

model <- linearInterpol(known)

… căruia îi pot cere apoi valorile Y, de exemplu

model$getEstimation(0.3)

(care în acest caz ar trebui să dea „3”)

abline(h = 3, col = "#00ff00")

Cum pot realiza acest lucru? Manual, aș face pentru fiecare valoare ceva de genul acesta:

  1. Care este cea mai apropiată valoare X mai mică Xsmall și cea mai apropiată valoare X mai mare Xlarge decât valoarea X curentă X.
  2. Calculați poziția relativă față de valoarea X mai mică. relPos = (X - Xsmall) / (Xlarge - Xsmall)
  3. Se calculează valoarea Y preconizată Yexp = Ysmall + (relPos * (Ylarge - Ysmall))

Cel puțin pentru programul Matlab am auzit că există o funcție încorporată pentru astfel de probleme.

Mulțumesc pentru ajutor,

Sven

2 răspunsuri
IRTFM

Ai putea să te uiți la approx() și approxfun() … sau presupun că ați putea să vă potriviți cu lm pentru liniar sau lowess pentru ajustări neparametrice.

Comentarii

  • Mulțumesc. ´approx()´ face exact ceea ce căutam. Nu, am folosit plot(approx(known$x, known$y, xout=aim)). Cunoașteți o versiune 2D a lui approx? Vreau să interpolăm puncte de date într-o matrice,… –  > Por R_User.
  • Pachetul akima are o funcție interp funcție pe care am folosit-o pentru ajustarea datelor 3D pe o grilă neregulată. Aceasta produce o interpolare „liniară” în mod implicit, dar permite, de asemenea, să se specifice o ajustare spline. Dacă „matricea” dvs. de puncte este regulată, puteți vizualiza cu wireframe sau persp dar nu acceptă date neregulate. –  > Por IRTFM.
  • Dar wireframe și persp par a fi utile doar pentru trasare. Am puncte de date distanțate logaritmic. Vreau să dau date 3D funcției pe care o caut și, în plus, coordonatele x și y ale unui punct de date. Funcția ar trebui să returneze valoarea z interpolată pentru coordonatele x și y. Acest lucru pare să fie imposibil cu cele trei funcții numite. Așadar, trebuie să fac acest lucru manual? –  > Por R_User.
  • De ce nu se poate interp face acest lucru? Dacă ați dori o interpolare liniară pe o scară logaritmică, atunci ați putea, de asemenea, să transformați, să interpolați și să transformați înapoi. Dacă aveți în minte un set de date specific, atunci ați obține (ca întotdeauna) un răspuns mai bun dacă ați posta datele și o descriere completă a problemei. Aceasta pare a fi diferită de întrebarea inițială și ați putea lua în considerare postarea unei noi întrebări cu date și descriere. –  > Por IRTFM.
  • ‘loess’ poate face, de asemenea, ajustări și interpolări 2 și 3-d. –  > Por IRTFM.
Chase

Ca urmare a răspunsului lui DWin, iată cum se obțin valorile prezise folosind un model liniar.

model.lm <- lm(y ~ x, data = known)

# Use predict to estimate the values for aim.
# Note that predict expects a data.frame and the col 
# names need to match
newY <- predict(model.lm, newdata = data.frame(x = aim))

#Add the predicted points to the original plot
points(aim, newY, col = "red")

Și, bineînțeles, puteți prelua direct aceste valori previzionate:

> cbind(aim, newY)
  aim       newY
1 0.3  2.4500000
2 0.7  6.1928571
3 2.3 21.1642857
....

Comentarii

  • +1 pentru predict(), extrem de util și care nu este imediat vizibil atunci când se analizează ?lm –  > Por Brandon Bertelsen.
  • +1 pentru că ați dat exemplul pentru predict(). Această soluție face ceva ușor diferit față de ceea ce căutam eu. Aceasta realizează mai întâi o regresie liniară pentru TOATE punctele de date și calculează valorile Y pentru valorile x date pe curba de regresie. Eu căutam o regresie liniară doar între cele mai apropiate două puncte. Acest lucru se poate face cu approx(). –  > Por R_Utilizator R.