주간 평균을 보존하는 인플루엔자 데이터 보간


13

편집하다

필요한 절차를 정확하게 설명 하는 논문 을 찾았습니다 . 유일한 차이점은 종이가 월간 평균을 유지하면서 월간 평균 데이터를 매일 보간한다는 것입니다. 에 접근 방식을 구현하는 데 문제가 R있습니다. 모든 힌트를 부탁드립니다.

기발한

매주 다음과 같은 카운트 데이터가 있습니다 (주당 하나의 값).

  • 의사의 상담 횟수
  • 인플루엔자 사례 수

내 목표는 보간법으로 매일 데이터 를 얻는 것입니다 (선형 또는 잘린 스플라인을 생각했습니다). 중요한 것은 매주 평균보존하고 싶다는 것입니다 . 즉 일일 보간 데이터의 평균이 이번주의 기록 된 값과 같아야합니다. 또한 보간이 매끄러 워야합니다. 발생할 수있는 한 가지 문제는 특정 주에 7 일 미만이 있다는 것입니다 (예 : 연도의 시작 또는 끝).

이 문제에 대한 조언에 감사드립니다.

고마워

1995 년에 대한 샘플 데이터 세트는 다음과 같습니다 ( 업데이트 ).

structure(list(daily.ts = structure(c(9131, 9132, 9133, 9134, 
9135, 9136, 9137, 9138, 9139, 9140, 9141, 9142, 9143, 9144, 9145, 
9146, 9147, 9148, 9149, 9150, 9151, 9152, 9153, 9154, 9155, 9156, 
9157, 9158, 9159, 9160, 9161, 9162, 9163, 9164, 9165, 9166, 9167, 
9168, 9169, 9170, 9171, 9172, 9173, 9174, 9175, 9176, 9177, 9178, 
9179, 9180, 9181, 9182, 9183, 9184, 9185, 9186, 9187, 9188, 9189, 
9190, 9191, 9192, 9193, 9194, 9195, 9196, 9197, 9198, 9199, 9200, 
9201, 9202, 9203, 9204, 9205, 9206, 9207, 9208, 9209, 9210, 9211, 
9212, 9213, 9214, 9215, 9216, 9217, 9218, 9219, 9220, 9221, 9222, 
9223, 9224, 9225, 9226, 9227, 9228, 9229, 9230, 9231, 9232, 9233, 
9234, 9235, 9236, 9237, 9238, 9239, 9240, 9241, 9242, 9243, 9244, 
9245, 9246, 9247, 9248, 9249, 9250, 9251, 9252, 9253, 9254, 9255, 
9256, 9257, 9258, 9259, 9260, 9261, 9262, 9263, 9264, 9265, 9266, 
9267, 9268, 9269, 9270, 9271, 9272, 9273, 9274, 9275, 9276, 9277, 
9278, 9279, 9280, 9281, 9282, 9283, 9284, 9285, 9286, 9287, 9288, 
9289, 9290, 9291, 9292, 9293, 9294, 9295, 9296, 9297, 9298, 9299, 
9300, 9301, 9302, 9303, 9304, 9305, 9306, 9307, 9308, 9309, 9310, 
9311, 9312, 9313, 9314, 9315, 9316, 9317, 9318, 9319, 9320, 9321, 
9322, 9323, 9324, 9325, 9326, 9327, 9328, 9329, 9330, 9331, 9332, 
9333, 9334, 9335, 9336, 9337, 9338, 9339, 9340, 9341, 9342, 9343, 
9344, 9345, 9346, 9347, 9348, 9349, 9350, 9351, 9352, 9353, 9354, 
9355, 9356, 9357, 9358, 9359, 9360, 9361, 9362, 9363, 9364, 9365, 
9366, 9367, 9368, 9369, 9370, 9371, 9372, 9373, 9374, 9375, 9376, 
9377, 9378, 9379, 9380, 9381, 9382, 9383, 9384, 9385, 9386, 9387, 
9388, 9389, 9390, 9391, 9392, 9393, 9394, 9395, 9396, 9397, 9398, 
9399, 9400, 9401, 9402, 9403, 9404, 9405, 9406, 9407, 9408, 9409, 
9410, 9411, 9412, 9413, 9414, 9415, 9416, 9417, 9418, 9419, 9420, 
9421, 9422, 9423, 9424, 9425, 9426, 9427, 9428, 9429, 9430, 9431, 
9432, 9433, 9434, 9435, 9436, 9437, 9438, 9439, 9440, 9441, 9442, 
9443, 9444, 9445, 9446, 9447, 9448, 9449, 9450, 9451, 9452, 9453, 
9454, 9455, 9456, 9457, 9458, 9459, 9460, 9461, 9462, 9463, 9464, 
9465, 9466, 9467, 9468, 9469, 9470, 9471, 9472, 9473, 9474, 9475, 
9476, 9477, 9478, 9479, 9480, 9481, 9482, 9483, 9484, 9485, 9486, 
9487, 9488, 9489, 9490, 9491, 9492, 9493, 9494, 9495), class = "Date"), 
    wdayno = c(0L, 1L, 2L, 3L, 4L, 5L, 6L, 0L, 1L, 2L, 3L, 4L, 
    5L, 6L, 0L, 1L, 2L, 3L, 4L, 5L, 6L, 0L, 1L, 2L, 3L, 4L, 5L, 
    6L, 0L, 1L, 2L, 3L, 4L, 5L, 6L, 0L, 1L, 2L, 3L, 4L, 5L, 6L, 
    0L, 1L, 2L, 3L, 4L, 5L, 6L, 0L, 1L, 2L, 3L, 4L, 5L, 6L, 0L, 
    1L, 2L, 3L, 4L, 5L, 6L, 0L, 1L, 2L, 3L, 4L, 5L, 6L, 0L, 1L, 
    2L, 3L, 4L, 5L, 6L, 0L, 1L, 2L, 3L, 4L, 5L, 6L, 0L, 1L, 2L, 
    3L, 4L, 5L, 6L, 0L, 1L, 2L, 3L, 4L, 5L, 6L, 0L, 1L, 2L, 3L, 
    4L, 5L, 6L, 0L, 1L, 2L, 3L, 4L, 5L, 6L, 0L, 1L, 2L, 3L, 4L, 
    5L, 6L, 0L, 1L, 2L, 3L, 4L, 5L, 6L, 0L, 1L, 2L, 3L, 4L, 5L, 
    6L, 0L, 1L, 2L, 3L, 4L, 5L, 6L, 0L, 1L, 2L, 3L, 4L, 5L, 6L, 
    0L, 1L, 2L, 3L, 4L, 5L, 6L, 0L, 1L, 2L, 3L, 4L, 5L, 6L, 0L, 
    1L, 2L, 3L, 4L, 5L, 6L, 0L, 1L, 2L, 3L, 4L, 5L, 6L, 0L, 1L, 
    2L, 3L, 4L, 5L, 6L, 0L, 1L, 2L, 3L, 4L, 5L, 6L, 0L, 1L, 2L, 
    3L, 4L, 5L, 6L, 0L, 1L, 2L, 3L, 4L, 5L, 6L, 0L, 1L, 2L, 3L, 
    4L, 5L, 6L, 0L, 1L, 2L, 3L, 4L, 5L, 6L, 0L, 1L, 2L, 3L, 4L, 
    5L, 6L, 0L, 1L, 2L, 3L, 4L, 5L, 6L, 0L, 1L, 2L, 3L, 4L, 5L, 
    6L, 0L, 1L, 2L, 3L, 4L, 5L, 6L, 0L, 1L, 2L, 3L, 4L, 5L, 6L, 
    0L, 1L, 2L, 3L, 4L, 5L, 6L, 0L, 1L, 2L, 3L, 4L, 5L, 6L, 0L, 
    1L, 2L, 3L, 4L, 5L, 6L, 0L, 1L, 2L, 3L, 4L, 5L, 6L, 0L, 1L, 
    2L, 3L, 4L, 5L, 6L, 0L, 1L, 2L, 3L, 4L, 5L, 6L, 0L, 1L, 2L, 
    3L, 4L, 5L, 6L, 0L, 1L, 2L, 3L, 4L, 5L, 6L, 0L, 1L, 2L, 3L, 
    4L, 5L, 6L, 0L, 1L, 2L, 3L, 4L, 5L, 6L, 0L, 1L, 2L, 3L, 4L, 
    5L, 6L, 0L, 1L, 2L, 3L, 4L, 5L, 6L, 0L, 1L, 2L, 3L, 4L, 5L, 
    6L, 0L, 1L, 2L, 3L, 4L, 5L, 6L, 0L, 1L, 2L, 3L, 4L, 5L, 6L, 
    0L, 1L, 2L, 3L, 4L, 5L, 6L, 0L), month = c(1, 1, 1, 1, 1, 
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
    1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 
    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
    3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
    4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 
    6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 
    6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 
    8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 
    8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 
    9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 
    9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 
    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 
    10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 
    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 
    11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 
    12, 12, 12, 12), year = c(1995, 1995, 1995, 1995, 1995, 1995, 
    1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 
    1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 
    1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 
    1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 
    1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 
    1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 
    1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 
    1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 
    1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 
    1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 
    1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 
    1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 
    1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 
    1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 
    1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 
    1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 
    1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 
    1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 
    1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 
    1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 
    1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 
    1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 
    1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 
    1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 
    1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 
    1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 
    1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 
    1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 
    1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 
    1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 
    1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 
    1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 
    1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 
    1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 
    1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 
    1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995), yearday = 0:364, 
    no.influ.cases = c(NA, NA, NA, 168L, NA, NA, NA, NA, NA, 
    NA, 199L, NA, NA, NA, NA, NA, NA, 214L, NA, NA, NA, NA, NA, 
    NA, 230L, NA, NA, NA, NA, NA, NA, 267L, NA, NA, NA, NA, NA, 
    NA, 373L, NA, NA, NA, NA, NA, NA, 387L, NA, NA, NA, NA, NA, 
    NA, 443L, NA, NA, NA, NA, NA, NA, 579L, NA, NA, NA, NA, NA, 
    NA, 821L, NA, NA, NA, NA, NA, NA, 1229L, NA, NA, NA, NA, 
    NA, NA, 1014L, NA, NA, NA, NA, NA, NA, 831L, NA, NA, NA, 
    NA, NA, NA, 648L, NA, NA, NA, NA, NA, NA, 257L, NA, NA, NA, 
    NA, NA, NA, 203L, NA, NA, NA, NA, NA, NA, 137L, NA, NA, NA, 
    NA, NA, NA, 78L, NA, NA, NA, NA, NA, NA, 82L, NA, NA, NA, 
    NA, NA, NA, 69L, NA, NA, NA, NA, NA, NA, 45L, NA, NA, NA, 
    NA, NA, NA, 51L, NA, NA, NA, NA, NA, NA, 45L, NA, NA, NA, 
    NA, NA, NA, 63L, NA, NA, NA, NA, NA, NA, 55L, NA, NA, NA, 
    NA, NA, NA, 54L, NA, NA, NA, NA, NA, NA, 52L, NA, NA, NA, 
    NA, NA, NA, 27L, NA, NA, NA, NA, NA, NA, 24L, NA, NA, NA, 
    NA, NA, NA, 12L, NA, NA, NA, NA, NA, NA, 10L, NA, NA, NA, 
    NA, NA, NA, 22L, NA, NA, NA, NA, NA, NA, 42L, NA, NA, NA, 
    NA, NA, NA, 32L, NA, NA, NA, NA, NA, NA, 52L, NA, NA, NA, 
    NA, NA, NA, 82L, NA, NA, NA, NA, NA, NA, 95L, NA, NA, NA, 
    NA, NA, NA, 91L, NA, NA, NA, NA, NA, NA, 104L, NA, NA, NA, 
    NA, NA, NA, 143L, NA, NA, NA, NA, NA, NA, 114L, NA, NA, NA, 
    NA, NA, NA, 100L, NA, NA, NA, NA, NA, NA, 83L, NA, NA, NA, 
    NA, NA, NA, 113L, NA, NA, NA, NA, NA, NA, 145L, NA, NA, NA, 
    NA, NA, NA, 175L, NA, NA, NA, NA, NA, NA, 222L, NA, NA, NA, 
    NA, NA, NA, 258L, NA, NA, NA, NA, NA, NA, 384L, NA, NA, NA, 
    NA, NA, NA, 755L, NA, NA, NA, NA, NA, NA, 976L, NA, NA, NA, 
    NA, NA, NA, 879L, NA, NA, NA, NA), no.consultations = c(NA, 
    NA, NA, 15093L, NA, NA, NA, NA, NA, NA, 20336L, NA, NA, NA, 
    NA, NA, NA, 20777L, NA, NA, NA, NA, NA, NA, 21108L, NA, NA, 
    NA, NA, NA, NA, 20967L, NA, NA, NA, NA, NA, NA, 20753L, NA, 
    NA, NA, NA, NA, NA, 18782L, NA, NA, NA, NA, NA, NA, 19778L, 
    NA, NA, NA, NA, NA, NA, 19223L, NA, NA, NA, NA, NA, NA, 21188L, 
    NA, NA, NA, NA, NA, NA, 22172L, NA, NA, NA, NA, NA, NA, 21965L, 
    NA, NA, NA, NA, NA, NA, 21768L, NA, NA, NA, NA, NA, NA, 21277L, 
    NA, NA, NA, NA, NA, NA, 16383L, NA, NA, NA, NA, NA, NA, 15337L, 
    NA, NA, NA, NA, NA, NA, 19179L, NA, NA, NA, NA, NA, NA, 18705L, 
    NA, NA, NA, NA, NA, NA, 19623L, NA, NA, NA, NA, NA, NA, 19363L, 
    NA, NA, NA, NA, NA, NA, 16257L, NA, NA, NA, NA, NA, NA, 19219L, 
    NA, NA, NA, NA, NA, NA, 17048L, NA, NA, NA, NA, NA, NA, 19231L, 
    NA, NA, NA, NA, NA, NA, 20023L, NA, NA, NA, NA, NA, NA, 19331L, 
    NA, NA, NA, NA, NA, NA, 18995L, NA, NA, NA, NA, NA, NA, 16571L, 
    NA, NA, NA, NA, NA, NA, 15010L, NA, NA, NA, NA, NA, NA, 13714L, 
    NA, NA, NA, NA, NA, NA, 10451L, NA, NA, NA, NA, NA, NA, 14216L, 
    NA, NA, NA, NA, NA, NA, 16800L, NA, NA, NA, NA, NA, NA, 18305L, 
    NA, NA, NA, NA, NA, NA, 18911L, NA, NA, NA, NA, NA, NA, 17812L, 
    NA, NA, NA, NA, NA, NA, 18665L, NA, NA, NA, NA, NA, NA, 18977L, 
    NA, NA, NA, NA, NA, NA, 19512L, NA, NA, NA, NA, NA, NA, 17424L, 
    NA, NA, NA, NA, NA, NA, 14464L, NA, NA, NA, NA, NA, NA, 16383L, 
    NA, NA, NA, NA, NA, NA, 19916L, NA, NA, NA, NA, NA, NA, 18255L, 
    NA, NA, NA, NA, NA, NA, 20113L, NA, NA, NA, NA, NA, NA, 20084L, 
    NA, NA, NA, NA, NA, NA, 20196L, NA, NA, NA, NA, NA, NA, 20184L, 
    NA, NA, NA, NA, NA, NA, 20261L, NA, NA, NA, NA, NA, NA, 22246L, 
    NA, NA, NA, NA, NA, NA, 23030L, NA, NA, NA, NA, NA, NA, 10487L, 
    NA, NA, NA, NA)), .Names = c("daily.ts", "wdayno", "month", 
"year", "yearday", "no.influ.cases", "no.consultations"), row.names = c(NA, 
-365L), class = "data.frame")

4
이 질문은 1 차원 버전의 영역 간 보간을 요구 하며, 이는 광산 산업에서 상당히 잘 연구됩니다. 참조 된 초록은 지정 학적 방법이 "일관성 (질량 보존 ...) 예측"을 산출한다는 점을 명시 적으로 언급합니다. 나는 이러한 접근 방식이 @Nick Cox의 반대 의견을 극복한다고 생각합니다.
whuber

@whuber 참고해 주셔서 감사합니다. 이런 종류의 문제는 지리 통계에서 잘 알려져 있습니다. 이러한 방법 R이나 다른 통계 패키지의 구현에 대해 알고 있습니까 (ArcGIS에 액세스 할 수 없음)? 구체적으로 사용 가능한 구현이 없으면 여전히 갇혀 있습니다.
COOLSerdash

2
geoRglmvariography와 support of change (공간적 상관 관계 모델 개발에 필요한)에 대해 잘 이해하고 있다면이 코드를 사용하여 수행 할 수 있다고 생각합니다 . 이 매뉴얼은 Springer Verlag에 의해 모델 기반
지리

3
그룹화 된 데이터의 세분화는 인구 통계학에서 일반적인 절차입니다. 검색어는 "Sprague interpolation"입니다. 많은 변형으로 이어질 것입니다. 단조 곡선을 보장하는 방식으로 5도 스플라인을 누적 값에 맞추면이 방법과 해당 변형이 그룹화 된 데이터를 효과적으로 재정의합니다. (1880 년 이래로 사용되어 왔습니다.) 일반적인 용어는 "영적 보간"입니다. Rob Hyndman은이 주제에 대해 다음과 같이 썼습니다. Smith, Hyndman, Wood, 인구 통계 변수 스플라인 보간 : 단 조성 문제, J. Pop. 입술 21 No. 1 (2004), 95-98.
whuber

2
귀하의 질문은 또한 한 차원에서 Dasymetric 매핑 으로 볼 수 있습니다 . 이것은 표준 인구 조사 단위와 같은 일부 집계 수준에서 측정 된 수량의 상세 맵을 생성하는 절차입니다. (적어도 1936 년으로 거슬러 올라갈 수있다 : John K. Wright, 인구 밀도 매핑 방법 : Cape Cod를 예로 든다. 지리적 검토 26 : 1 (Jan 1936), pp 103-110). 최근 접근 방식 (일부 임시 이지만 도움이되는 참고 문헌 목록이 있음)은 giscience.org/proceedings/abstracts/giscience2012_paper_179.pdf를 참조하십시오 .
whuber

답변:


8

나는 R평균 (예 : 매주, 매월 등)을 유지하면서 균일 한 간격의 점을 선형 및 스플라인으로 보간 하는 함수 를 만들었습니다 . 이 기능을 사용 na.approx하고 na.spline로부터 zoo패키지 와 반복적으로 원하는 특성을 가진 스플라인을 계산한다. 알고리즘은 이 백서에 설명되어 있습니다.

코드는 다음과 같습니다.

interpol.consmean <- function(y, period=7, max.iter=100, tol=1e-4, plot=FALSE) {

  require(zoo)

  if( plot == TRUE ) {
    require(ggplot2)
  }

  y.temp.linear <- matrix(NA, ncol=length(y), nrow=max.iter+1)
  y.temp.linear[1, ] <- y

  y.temp.spline <- y.temp.linear

  y.temp.pred.spline <- matrix(NA, ncol=length(y), nrow=max.iter)
  y.temp.pred.linear <- matrix(NA, ncol=length(y), nrow=max.iter)

  ind.actual <- which(!is.na(y))

  if ( !all(diff(ind.actual)[1]== diff(ind.actual)) ) {
    stop("\"y\" must contain an evenly spaced time series")
  }

  partial <- ifelse((length(y) - ind.actual[length(ind.actual)]) < period/2,
                    TRUE, FALSE)

  for(k in 1:max.iter) {

    y.temp.pred.linear[k,] <- na.approx(y.temp.linear[k, ], na.rm=FALSE, rule=2)
    y.temp.pred.spline[k,] <- na.spline(y.temp.spline[k, ], method="fmm")

    interpol.means.linear <- rollapply(y.temp.pred.linear[k,], width=period, mean,
                                       by=period, align="left", partial=partial) 
    interpol.means.splines <- rollapply(y.temp.pred.spline[k,], width=period, mean,
                                        by=period, align="left", partial=partial) 

    resid.linear <- y.temp.linear[k, ][ ind.actual ] - interpol.means.linear
    resid.spline <- y.temp.spline[k, ][ ind.actual ] - interpol.means.splines

    if ( max(resid.linear, na.rm=TRUE) < tol & max(resid.spline, na.rm=TRUE) < tol ){
      cat("Converged after", k, "iterations with tolerance of", tol, sep=" ")
      break
    }

    y.temp.linear[k+1, ][!is.na(y.temp.linear[k, ])] <-  resid.linear
    y.temp.spline[k+1, ][!is.na(y.temp.spline[k, ])] <-  resid.spline

  }  

  interpol.linear.final <- colSums(y.temp.pred.linear, na.rm=TRUE)
  interpol.spline.final <- colSums(y.temp.pred.spline, na.rm=TRUE)

  if ( plot == TRUE ) {

    plot.frame <- data.frame(
      y=rep(y,2)/7,
      x=rep(1:length(y),2),
      inter.values=c(interpol.linear.final, interpol.spline.final)/7,
      method=c(rep("Linear", length(y)), rep("Spline", length(y)))
    )

    p <- ggplot(data=plot.frame, aes(x=x)) +
      geom_point(aes(y=y, x=x), size=4) +
      geom_line(aes(y=inter.values, color=method), size=1) +
      ylab("y") +
      xlab("x") +
      theme(axis.title.y =element_text(vjust=0.4, size=20, angle=90)) +
      theme(axis.title.x =element_text(vjust=0, size=20, angle=0)) +
      theme(axis.text.x =element_text(size=15, colour = "black")) +
      theme(axis.text.y =element_text(size=17, colour = "black")) +
      theme(panel.background =  element_rect(fill = "grey85", colour = NA),
            panel.grid.major =  element_line(colour = "white"),
            panel.grid.minor =  element_line(colour = "grey90", size = 0.25))+
      scale_color_manual(values=c("#377EB8", "#E41A1C"), 
                         name="Interpolation method",
                         breaks=c("Linear", "Spline"),
                         labels=c("Linear", "Spline")) +
      theme(legend.position="none") +
      theme(strip.text.x = element_text(size=16)) +
      facet_wrap(~ method)

    suppressWarnings(print(p))

  }
  list(linear=interpol.linear.final, spline=interpol.spline.final)
}

질문에 주어진 예제 데이터 셋에 함수를 적용 해 봅시다 :

interpolations <- interpol.consmean(y=dat.frame$no.influ.cases, period=7,
                                    max.iter = 100, tol=1e-6, plot=TRUE)

보간

선형 및 스플라인 보간이 모두 좋아 보입니다. 주간 평균이 유지되는지 (잘린 출력) 확인하십시오.

cbind(dat.frame$no.influ.cases[!is.na(dat.frame$no.influ.cases)],
      rollapply(interpolations$linear, 7, mean, by=7, align="left", partial=F))

      [,1] [,2]
 [1,]  168  168
 [2,]  199  199
 [3,]  214  214
 [4,]  230  230
 [5,]  267  267
 [6,]  373  373
 [7,]  387  387
 [8,]  443  443
 [9,]  579  579
[10,]  821  821
[11,] 1229 1229

1
적절한 패키지를 찾아서 유지 보수 담당자에게 문의하십시오.
Spacedman

4

범위의 중간 점에서 평균을 통과하는 직선은 필요한 평균을 갖는 일일 값을 생성합니다. '매주 수를 일 수로 나누기'에 대한 Nick Cox의 마지막 의견은 gradient = 0 인 특별한 사례입니다.

그래서 우리는 이것을 조정하고 그라디언트를 선택하여 조금 더 부드럽게 만들 수 있습니다. 다음과 같은 작업을 수행하는 세 가지 R 함수가 있습니다.

interpwk <- function(x,y,delta){
  offset=-3:3
  yout=y+delta*offset
  xout=x+offset
  cbind(xout,yout)
}

get_delta <- function(x,y,pos){
  (y[pos+1]-y[pos-1])/(x[pos+1]-x[pos-1])
}

#' get slope from neighbours
interpall <- function(x,y,delta1,f=1){
  for(i in 2:(length(x)-1)){
    delta=get_delta(x,y,i)
    xyout=interpwk(x[i],y[i],delta/f)
    points(xyout)
  }
}

하루 측정 값을 데이터에 추가 한 다음 보간기를 플로팅 한 다음 보간기를 플로팅합니다.

> data$day=data$week*7
> plot(data$day,data$no.influ.cases,type="l")
> interpall(data$day,data$no.influ.cases,f=1)

선형 평균 보존 보간 기

주말에 연속성을 제한하는 또 다른 가능성은 단 하나의 자유도를 가진 시스템을 제공합니다. 즉, 첫 번째 섹션의 기울기로 완전히 정의됩니다 (다른 모든 섹션이 합쳐 져야하기 때문에). 나는 이것을 코딩하지 않았다-당신은 간다!

[약간 허름한 R 코드의 아폴로, 점을 표시하는 대신 실제로 점을 반환해야합니다.]


+1 감사합니다. 문제는 보간 된 값이 매끄럽지 않고 주 사이에 매우 갑작스러운 단계가 있다는 것입니다. 기본적으로 필요한 접근 방식을 정확하게 설명하는 논문을 포함하여 내 질문을 편집했습니다.
COOLSerdash

여기서 목적은 무엇입니까? 추정 인플루엔자 사례가 매끄럽게 변하는 이유는 무엇입니까? 보간법으로 이러한 데이터에 더 많은 구조를 추가할수록 도입 된 구조가 일부 모델링 단계에서 분리되어야합니다. "매주 데이터를 일일 데이터로 퍼핑하는 것은 도입 된 의존성에 문제를 일으켜서 악의적 인 모형 피팅 및 평가가 될 과도하게 지나치게 낙관적 인 자유도"라고 생각하지 않습니다.
닉 콕스

그러나 평균에 대한 제약은 잘못되었습니다. 여기에 표시되는 평균은 표본 평균이며 어떤 방식 으로든 통계 변동이 있습니다. 모형을 구체화 한 다음 평균을 기대 값으로하는 보간기를 사용한 다음 일일 데이터를 여러 번 대치하고 분석을 100 회 이상 수행하여이 불확실성이 결론에 어떤 영향을 미치는지 알아냅니다.
Spacedman

1
@Spacedman (질문에 대한 의견으로) 내가 언급 한 지리 통계적 API 메소드는 variogram 너겟 매개 변수의 0이 아닌 구성 요소를 사용하여 aplomb으로 (거의 유효한) 이의를 처리합니다. 지형 통계 조건부 시뮬레이션은 참조하는 여러 대치를 수행하는 제어 된 방법입니다.
whuber

2
물론. geoRglm에 대한 Diggle & Ribeiro 매뉴얼 (예 : 감비아의 말라리아 사례, 습지 등이 공변량에 근접한 경우)의 실행 예제와 거의 동일한 1 차원 상황 인 것 같습니다. 주요 합병증은 지원 변경을 처리하는 것이지만 예측에 실제로 영향을 미치지는 않습니다. 이는 주로 Variogram의 추정에 영향을 미칩니다. 일부 이론 및 유사한 예 (질병 사례의 "이항 크릭 ")는 ncbi.nlm.nih.gov/pmc/articles/PMC2995922 를 참조하십시오 .
whuber

3

n

(데이터가 카운트가 아닌 측정 이었다면 Dirichlet 모델을 통해 비율을 모델링하는 데 집중할 것이지만 약간 더 복잡합니다.)

일 수를 항상 동일하게 유지할 수는 없다는 사실을 알고 있다면, 같은 '수준'에 물건을 놓기 위해 오프셋을 사용하는 한 특별한 문제는 아닙니다.


1
내가 틀렸다면 나를 바로 잡으십시오. 그러나 이것은 문제가 뒤로 있다고 생각합니다. 매일 카운트를 매끄럽게하는 방법이 아닙니다. 매주 데이터에서 일일 수를 추측하는 방법입니다. (아마도 포스터에는 온도와 같은 다른 것에 대한 일일 데이터가 있습니다.) 그 외에도 다항식 또는 Dirichlet은 어떻습니까? 포아송처럼 보입니다.
Nick Cox

@NickCox 설명에 감사합니다. 매주 데이터가 있고 매일 다른 데이터가 있기 때문에 매일 데이터를 원합니다 (예 : 기상 변수, 사망률, 대기 오염 등).
COOLSerdash

3
내 자신의 질문은 왜 당신이 이것을하고 싶어하는지 묻는 것입니다. 위와 같이 매일 데이터가 있고 모든 것을 동일한 기준으로 원한다고 추측합니다. 그렇다면 일일 데이터를 몇 주에 걸쳐 최소, 평균, 중앙값, 최대로 줄이거 나 과학적으로 의미가있는 것을 줄이십시오. 주별 데이터를 일일 데이터로 퍼핑하면 도입 된 의존성과 지나치게 낙관적 인 자유도에 문제가 생겨서 악의적 인 모형 적합 및 평가가 될 것입니다.
Nick Cox

@Nick Cox는 절대적으로 "추측"하지만 주어진 정보에 따르면 OP가 추구 한 것 같습니다.
Glen_b-복지국 모니카

2
또 다른 보수적 인 접근 방식은 주 단위 수를 일 수로 나누는 것입니다. 실제 프로세스가 그보다 매끄러 울 것이라는 전제가 있지만 평균을 유지한다는 것을 알고 있습니다.
Nick Cox

3

추가 답변을 다른 답변으로 묶을 것입니다.

이 프로젝트의 구조가 더 명확 해지는 데 시간이 걸렸습니다. 인플루엔자가 현재 몇 가지 공변량으로 밝혀 졌다는 점을 감안할 때, 당신이하는 일이 그렇게 중요하지 않은 것으로 보이거나 적어도 이전의 일부 의견에서 표현 된 회의론을 가치있게 여기지 않습니다. 다른 모든 것이 매일 이루어지기 때문에 다른 모든 것을 몇 주로 줄이면 너무 많은 세부 사항을 버릴 수 있습니다.

질문의 원래 초점은 주별 평균이 주 평균을 유지한다는 한 (극단적 인) 답변이 매주 평균을 유지하는 보간에 남아 있습니다. 그것은 의심 할 여지없이 매력적이지 않거나 비현실적인 것처럼 보이므로, 다른 보간법은 @Spacedman이 제안한 것처럼 더 매력적이고 / 또는 대치 법으로 보인다. (이것이 일시적인 풍미로 대치 될 것인지 또는 확률 적 풍미가 첨가 된 보간인지 확실하지 않습니다.)

더 구체적인 두 가지 생각 :

  • 주간 값 (일수로 나눈 값)을 취한 다음 가중 평균으로 평활화하면 실제로 평균을 적절한 근사치로 유지합니다.

  • 인플루엔자 사례는 개수이므로 근본 또는 로그 개수를 부드럽게 한 다음 역변환하는 것이 단순히 개수를 부드럽게하는 것보다 더 효과적 일 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.