मैं पहले पैसेज समय की गणना करने के लिए पैकेज adehabitatLT का उपयोग कर रहा हूं। मैं यह नहीं समझ सकता कि इसकी गणना कैसे की जाती है। मैंने मान लिया कि अगर मैं प्रक्षेपवक्र के साथ गति की गणना करता हूं, तो 1/गति * त्रिज्या (समय 2?) की गणना करने के लिए गति का उपयोग करें, मुझे वही मान मिलना चाहिए। लेकिन मैं नहीं। एफपीटी की गणना कैसे की जाती है और मुझे क्या याद आ रहा है? फ़ंक्शन का स्रोत कोड सी में प्रतीत होता है ...

यहाँ एक खिलौना उदाहरण है। आउटपुट को देखते हुए, यह मुझे आश्चर्यचकित करता है कि क्या ट्रैज अगले बिंदु तक गति की गणना कर रहा है जबकि एफपीटी की गणना पिछले और अगले दोनों का उपयोग करके की जाती है। मैं मैन्युअल रूप से fpt के आउटपुट को कैसे दोहरा सकता हूं?

library(dplyr)
library(adehabitatLT)

radii <- seq(1, 2, 1)

sub <- structure(list(DateTime = structure(c(1497961320, 1497961670, 
1497961833, 1497961975, 1497962075, 1497962211, 1497962417, 1497962584, 
1497962857, 1497963033, 1497963498, 1497963692, 1497963844, 1497963964, 
1497964142, 1497964703, 1497964823, 1497965165, 1497965317, 1497965436, 
1497965610, 1497965776, 1497965923), class = c("POSIXct", "POSIXt"
), tzone = "PST8PDT"), Easting = c(549550.463222071, 549616.446682493, 
549624.93893591, 549621.287381029, 549634.852043099, 549653.472247283, 
549706.355849625, 549752.824737699, 549805.695860071, 549809.742959711, 
549822.329239614, 549850.767478972, 549870.082191359, 549878.454496366, 
549842.209234682, 549810.803726788, 549810.817539391, 549811.560290745, 
549811.995877951, 549785.99096682, 549697.447940334, 549634.423314139, 
549590.138532179), Northing = c(5393845.268479, 5393848.51944054, 
5393886.83599659, 5393933.60504873, 5393964.18478323, 5393997.25495826, 
5394000.39111759, 5393980.0146384, 5393959.69535379, 5394001.19661814, 
5394050.66656145, 5393988.99899494, 5394001.73248796, 5394011.92310602, 
5394057.73545498, 5393997.75985148, 5393996.20363397, 5393995.43205644, 
5393996.10292559, 5393999.20718151, 5393975.85546091, 5393962.73581927, 
5393902.53644517), Burst = c("1", "1", "1", "1", "1", "1", "1", 
"1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", 
"1", "1", "1")), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, 
-23L))

प्रक्षेपवक्र और fpt . की गणना करें

L1.traj <- as.ltraj(data.frame(sub$Easting, sub$Northing), sub$DateTime, 
    id = 1, burst = sub$Burst,
    proj4string = CRS("+proj=utm +zone=11 +ellps=WGS84"))

L1.fpt <- fpt(L1.traj, radii, unit = "seconds")
L1.fpt <- as.data.frame(L1.fpt[[1]])

temp <- ld(L1.traj) %>%
    mutate(DateTime = date) %>%
    dplyr:::select(DateTime, dist, dt) %>%
    # time to pass a radius of 1 m and a diameter of 2 m
    mutate(TimeRadius1 = dt/dist * 1,
        TimeDiameter1 = TimeRadius1 * 2) %>%
    cbind(L1.fpt)

त्रिज्या/व्यास को पार करने और एफपीटी के आउटपुट के बीच एक सभ्य (और असंगत) अंतर है।

r
0
user2602640 9 अक्टूबर 2018, 13:42

1 उत्तर

सबसे बढ़िया उत्तर

जब आपको यह पता लगाने की आवश्यकता होती है कि R फ़ंक्शन कैसे काम करता है, लेकिन यह वास्तव में C (या C++ या Fortran...) GitHub पर स्रोत का केवल-पढ़ने के लिए दर्पण। उदाहरण के लिए, यदि मैं Google

adehabitatLT cran github

पहली हिट है यह "CRAN R पैकेज रिपॉजिटरी का केवल-ईड मिरर। adehabitatLT"। फिर आप परिकलन tests.c में पा सकते हैं fptt फ़ंक्शन जिसे fipati फ़ंक्शन द्वारा बुलाया जाता है, जिसे fipatir फ़ंक्शन द्वारा बुलाया जाता है जिसे R से बुलाया जाता है, और यदि आपको लगता है कि उनकी गणना में कुछ गड़बड़ है, तो आप स्वयं निर्णय ले सकते हैं; यहां बताया गया है कि वे इसकी गणना कैसे करते हैं:

/* compute the FPT for ONE relocation */
void fptt(double *x, double *y, double *t, int pos, double radius, double *fptto, int nlo)
{
    /* Declaration */
    int ok, pos2, naar, naav, na;
    double di, dt, dt2, di2, fptar, fptav;

    ok = 0;
    di = 0;
    di2 = 0;
    dt = 0;
    dt2 = 0;
    naar = 1;
    naav = 1;
    fptar = 0;
    fptav = 0;


    /* Search of the first loc outside the circle (before) */
    pos2 = pos;
    while (ok == 0) {
    pos2 = pos2 - 1;
    if (pos2 > 0) {
        dtmp(x[pos2], x[pos], y[pos2], y[pos], &di);
        if (di >= radius)
        ok = 1;
    } else {
        ok = 1;
        naar = 0;
    }
    }

    /* computes the linear approximation */
    if (naar > 0) {
    dt = fabs(t[pos] - t[pos2]);
    dt2 = fabs(t[pos] - t[(pos2+1)]);
    dtmp(x[(pos2+1)], x[pos], y[(pos2+1)], y[pos], &di2);
    fptar = dt2 + ( (dt - dt2) * (radius - di2) / (di - di2) );
    }


    /* Search of the first loc outside the circle (after) */
    pos2 = pos;
    ok = 0;
    while (ok == 0) {
    pos2 = pos2 + 1;
    if (pos2 <= nlo) {
        dtmp(x[pos2], x[pos], y[pos2], y[pos], &di);
        if (di >= radius)
        ok = 1;
    } else {
        ok = 1;
        naav = 0;
    }
    }

    /* Computes linear approximation */
    if (naav > 0) {
    dt = fabs(t[pos2] - t[pos]);
    dt2 = fabs(t[(pos2-1)] - t[pos]);
    dtmp(x[(pos2-1)], x[pos], y[(pos2-1)], y[pos], &di2);
    fptav = dt2 + ( (dt - dt2) * (radius - di2) / (di - di2) );
    }

    na = naar * naav;
    if (na > 0) {
    *fptto = fptar + fptav;
    } else {
    *fptto = -1;
    }

}
1
duckmayr 9 अक्टूबर 2018, 10:55