สำหรับอนุกรมเรขาคณิต อัตราส่วนของค่าที่ต่อเนื่องกันจะเป็นค่าคงที่ ดังนั้นการคูณอัตราส่วนนั้นด้วยค่าปัจจุบันจะได้ค่าถัดไป
เพื่อตรวจสอบว่าอนุกรมเป็นเรขาคณิตหรือไม่ เราสามารถหาอัตราส่วนของคู่ค่าแต่ละคู่ที่ต่อเนื่องกันในอนุกรมนั้น และหากอัตราส่วนเหล่านั้นเท่ากันทั้งหมด แสดงว่าอนุกรมนั้นเป็นเรขาคณิต เนื่องจากนั่นเทียบเท่ากับการตรวจสอบว่าความแปรปรวนเป็นศูนย์หรือไม่ เราจึงทำได้ง่ายๆ โดยใช้ var
เนื่องจากเลขคณิตทศนิยมไม่แม่นยำ เราจึงตรวจสอบว่าความแปรปรวนน้อยกว่า eps
หรือไม่
โปรดทราบว่า is.geo
ส่งคืน NA สำหรับชุดข้อมูลความยาว 1 หรือ 2 และ nextValue
ส่งคืน NA หาก is.geo
ไม่ส่งคืน TRUE
nextValue <- function(x) {
if (!isTRUE(is.geo(x))) NA
else {
y <- tail(x, 2)
y[2]^2 / y[1]
}
}
is.geo <- function(x, eps = 1e-5) var(x[-1] / x[-length(x)]) < eps
ทดสอบ
การใช้ m
ที่กำหนดไว้ในหมายเหตุในตอนท้ายทำให้เราสามารถผนวกค่าถัดไปเป็นคอลัมน์ใหม่ได้:
cbind(m, apply(m, 1, nextValue))
ให้:
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,] 1 2 4 8 16 32 64 128
[2,] 2 4 8 16 32 64 128 256
[3,] 3 6 12 24 48 96 192 384
[4,] 1 3 9 27 81 243 729 2187
[5,] 2 6 18 54 162 486 1458 4374
[6,] 3 9 27 81 243 729 2187 6561
นอกจากนี้เรายังสามารถทดสอบแต่ละแถวของ m
เพื่อตรวจสอบว่าเป็นเรขาคณิตหรือไม่:
apply(m, 1, is.geo)
## [1] TRUE TRUE TRUE TRUE TRUE TRUE
is.geo(c(1, 2, 4, 12))
## [1] FALSE
ใช้ lm
ถ้าตามวิธีของลิงค์ที่แสดงในคำถามหมายถึงการใช้ lm
เราก็สามารถใช้ lm
ได้ ถ้าอนุกรมนั้นเป็นบวกอย่างเคร่งครัด โดยสังเกตว่า log
ของอนุกรมเรขาคณิตนั้นเป็นเลขคณิต ดังนั้น เราจึงสามารถใส่บันทึกของอนุกรมให้เป็น 1 ได้ 2, 3, ... . ถ้าค่าคงเหลือเป็นศูนย์ซึ่งเกิดขึ้นเมื่อความเบี่ยงเบนเป็นศูนย์ ก็จะเป็นไปตามนี้
fit <- function(x) {
ix <- seq_along(x)
lm(log(x) ~ ix)
}
nextValue2 <- function(x) {
if (!isTRUE(is.geo2(x))) NA
else exp( predict(fit(x), list(ix = length(x) + 1)) )
}
is.geo2 <- function(x, eps = 1.e-5) {
if (length(x) <= 2) NA
else deviance(fit(x)) < eps
}
บันทึก
m <- matrix(c(1L, 2L, 3L, 1L, 2L, 3L, 2L, 4L, 6L, 3L, 6L, 9L, 4L,
8L, 12L, 9L, 18L, 27L, 8L, 16L, 24L, 27L, 54L, 81L, 16L, 32L,
48L, 81L, 162L, 243L, 32L, 64L, 96L, 243L, 486L, 729L, 64L, 128L,
192L, 729L, 1458L, 2187L), 6)
person
G. Grothendieck
schedule
25.08.2019