poniedziałek, 6 września 2010

Dodanie paru rzeczy do Sheeva #2

Doinstalowałem kilka rzeczy, które mam na Szewie #1 (Ubuntu pamięć NAND) a do tej pory nie było ich na Szewie #2 (Debian na karcie), mianowicie: 1) esniper, 2) digitemp/pomiar temperatury, 3) różne moje skrypty Perla, 4) program youtube-upload.py.

#1. Kompilowanie esnipera wymaga doinstalowania curla:


apt-get install curl
apt-get install curlftpfs

Skrypt ./configure dalej kończy się błędem, zatem:


## http://www.linuxquestions.org/questions/linux-newbie-8/libcurl-and-curl-config-problems-453166/
apt-get install libcurl3-dev libwww-curl-perl python2.4-pycurl

Teraz działa i można skompilować esnipera.

#2. Przełączyłem kabel od termometrów ze starej Szewy na nową. Oprócz zainstalowania digitemp należało dodać do katalogu /etc/udev/rules.d/, plik np. 85-ttyusb.rules, zawierający:


# relax the permissions just for ttyUSB0
KERNEL=="ttyUSB0", MODE="0666"

bo inaczej zwykły user nie ma dostępu do /dev/ttyUSB0. Teraz należy ponownie wyjąć/włożyć kabel USB. Ponieważ do tworzenia wykresu temperatury używam biblioteki perl-GD trzeba także dociągnąć:


apt-get install libgd-graph-perl

#3. Różne moje skrypty Perla (flickr/ebay) instalują ręcznie w katalogu:


/usr/local/share/perl/

Wreszcie instalują paczkę python-gdata na potrzeby skryptu youtube-upload.py do wysyłania moich filmików na YTube poprzez API:


wget http://gdata-python-client.googlecode.com/files/gdata-2.0.11.final.tar.gz

Powyższe zabiegi mają/miały na celu unifikację tego co jest na jednym i drugim komputerku... Mówiąc konkretnie chciałem żeby zamiast Ubuntu na Szewie #1 też była karta z Debianem. Ale, ale w trakcie naszły mnie wątpliwości: w sumie na cholerę? kupować jeszcze jedną kartę... Jak się pamięć zużyje to się będę martwił. A ponieważ katalogi, które nie są prawie-że-wyłącznie czytane przeniosłem poza pamięć NAND (tj. /home//var/) więc może aż tak szybko to nie nastąpi....

piątek, 3 września 2010

Dlaczego nie należy używać Excela

Arkusza kalkulacyjnego (a zwłaszcza Excela f-my Microsoft) nie należy używać do zadań bardziej skomplikowanych od podliczania budżetu domowego [McCulloughHeiser2008,Berger2007,McCullough2008] zobacz także [AlmironetAl2010,KeelingPavur2007,Nash2008,Su2008].

Literatura

AlmironetAl2010
Marcelo G. Almiron, Bruno Lopes, Alyson L. C. Oliveira, Antonio C. Medeiros, and Alejandro C. Frery. On the numerical accuracy of spreadsheets. Journal of Statistical Software, 34(4):1--29, 4 2010.
Berger2007
Roger L. Berger. Nonstandard operator precedence in excel. Computational Statistics and Data Analysis, 51(6):2788--2791, 2007.
KeelingPavur2007
Kellie B. Keeling and Robert J. Pavur. A comparative study of the reliability of nine statistical software packages. Computational Statistics and Data Analysis, 51(8):3811--3831, 2007.
McCulloughHeiser2008
B.D. McCullough and David A. Heiser. On the accuracy of statistical procedures in microsoft excel 2007. Computational Statistics and Data Analysis, 52(10):4570--4578, 2008.
McCullough2008
B.D. McCullough. Microsoft excel's not the wichmann-hill random number generators. Computational Statistics and Data Analysis, 52(10):4587--4593, 2008.
Nash2008
John C. Nash. Teaching statistics with excel 2007 and other spreadsheets. Computational Statistics and Data Analysis, 52(10):4602--4606, 2008.
Su2008
Yu-Sung Su. It s easy to produce chartjunk using microsoft excel 2007 but hard to make good graphs. Computational Statistics and Data Analysis, 52(10):4594--4601, 2008.

Powyższy spis literatury w formacie BiBTeX.

czwartek, 2 września 2010

Eksport do pliku PDF z OpenOffice Calc z poprawnym MediaBoxem

Rysunek utworzony w OO Calc kopiuję do OO Draw następnie zapisuję jako PDF. Jest prawie dobrze -- prawie bo MediaBox, czyli najmniejszy prostokąt zawierający rysunek jest zły -- OO Draw zapisuje rysunek jak całą stronę. Są dwa rozwiązania:

  1. Rysunek zapisany w OO Draw przyciąć używając do tego pdfcrop. Ten pdfcrop to skrypt w Perlu, dostępny w TeXlive i MikTeX.

  2. Zamiast do OO Draw skopiować (poprzez kopiuj/wklej) do Inkscape. Teraz zaznaczyć obiekt (with the rubber band selector) i następnie kliknąć w Właściwości Dokumentu → Dopasuj do ramki zaznaczenia. Teraz export do PDF da w rezultacie rysunek z prawidłowo przyciętym MediaBoxem. Por. też tutaj.

Próbowałem kopiuj/wklej do Infranview ale wynikowy plik PDF jest złej jakości (fonty są zamieniane na bitmapy)... Być może można to dokonfigurować.

środa, 1 września 2010

Laurent Fignon nie żyje

We wtorek 31 sierpnia 2010, zmarł na raka dwukrotny zwycięzca Tour de France (1983 i 1984) Francuz Laurent Fignon. Miał 50 lat. Ogółowi publiczności bardziej od zwycięstw w TdF znana jest jego spektakularna porażka z Gregiem LeMondem w tymże wyścigu. Spektakularna, bo zaledwie 8 sekund, przy czym decydującym był ostatni etap -- jazda na czas, na której LeMond (niespodziewanie) odrobił aż 50 s straty... Niespodziewanie, ponieważ etap miał tylko niecałe 25 km, więc przejechanie na tak krótkim dystansie aż 58 s szybciej, to był duży wyczyn. Podobno Fignon zlekceważył LeMonda, jechał z gołą głową, podczas gdy Lemond miał aerodynamiczny hełm i wąską kierownicę -- tzw. lemondkę, współcześnie praktycznie obowiązkową w próbach czasowych...

sobota, 28 sierpnia 2010

140 tys. na liczniku

Z pewnym opoźnieniem odnotowuję, że 29 lipca 2010 przekroczyłem 140,000 km przejechanych na rowerze (odkąd liczę, tj. od 1990 r.). Wiem, wiem... żadna rewelacja z punktu widzenia typowego zawodnika, co 20--30 tys. albo i lepiej przejeżdża co rok.... A ja tylko i zaledwie trochę mniej niż 7 tys...

poniedziałek, 23 sierpnia 2010

Implementacja prostej procedury ustalania trafności różnicowej

Bagozzi i Dholakia [BagozziDholakia2006] stosują następującą procedurę ustalania trafności różnicowej (discriminant validity) skali wieloczynnikowej: 1) oszacowanie bazowego modelu CFA (swobodnie korelujące ze sobą czynniki); 2) oszacowanie ograniczonego modelu CFA, tj. modelu w którym korelacja pomiędzy dwoma czynnikami skali jest ustalona jako równa 1 (co oznacza, że czynniki te de facto stanowią jeden czynnik). Oszacowanie modelu ograniczonego dla każdej pary czynników skali; 3) ustalenie czy wartość różnicy statystyk χ2 jest istotna statystycznie.

Istotność statystyki χ2 świadczy iż jakość dopasowania modelu ograniczonego (krok 2) jest istotnie gorsza od modelu bazowego (krok 1), a zatem korelacja pomiędzy parą czynników jest mniejsza od 1, czyli czynniki te się różnią... Trafność dyskryminacyjna skali jest potwierdzona jeżeli wszystkie (a przynajmniej zdecydowana większość) wartości różnic są istotne statystycznie.

Jeżeli skala składa się z n czynników, to należy oszacować (n (n-1))/2 modeli ograniczonych (np. dla n=6, jest to 15 modeli), co jest pracochłonne. Skrypt LISRELa dla modelu CFA oraz modelu ograniczonego różni się zaś od modelu bazowego tylko jednym wierszem:


VA 1 PHI(i,j)

gdzie i oraz j są numerami odpowiednich czynników. Można to wszystko zautomatyzować, w sposób następujący: 1) oblicz model bazowy; z pliku OUT Lisrela pobierz wartość statystyki χ2; 2) w pętli dla każdej pary i,j wykonaj skrypt wyznaczający model ograniczony, pobierz wartość statystyki χ2; 3) oblicz różnicę i wydrukuj...

Skrypt Perlowy wykonujący powyższe (z przykładem wykorzystania) jest tutaj.

Literatura

BagozziDholakia2006
Bagozzi, R. P., Dholakia, U. M. Open Source Software User Communities: A Study Of Participation In Linux User Groups Management Science 7/52, 2006, p. 1099--1115.

Wycieczka do Rzucewa

W sobotę pojechałem SKM do Redy. Potem już rowerem przez przez Kępę Pucką (Połchowo, Mrzezino i Zelistrzewo) do Rzucewa. Na plaży przed pałacem smród aż mdli ale byli tacy co się opalali/pływali. Ciekawe czy tak jest zawsze czy tylko ja miałem szczęście?

Z powrotem wróciłem przez dolinę Redy i Kępę Oksywską (Mosty, Pierwoszyno). Chciałem podjechać obejrzeć Torpedowaffenplatz, ale z tej strony, z której próbowałem to chyba się nie da, bo po drodze jest lotnisko...

Bardzo przyjemna trasa, w szczególności znikomy ruch samochodów ale miejscami nawierzchnia dróg kiepska. Ślad jest tutaj.

niedziela, 22 sierpnia 2010

Gpsbabel i /dev/ttyUSB0 w fedora 11

Poprawne działanie mojego skryptu My-get-GPX.sh, który służy do pobierania danych w formacie GPX z urządzeń GPS wymaga w systemie Fedora 11 ręcznego zainstalowania pakietu perla Geo::Distance oraz dopasowanie systemu według zaleceń z wiki.openstreetmap.org. Mianowicie w pliku /etc/modprobe.d/blacklist.conf umieszczamy [Nb. z mojego opisu instalacji MapSource pod wine, wynika że może się to gryźć z MapSource. Na razie się nie gryzie bo ww. MS mam na komputerze ze starszą wersją Fedory....]:


blacklist garmin_gps

oraz zmieniamy uprawnienia do urządzenia (bez tego ściągać dane może tylko root), dodając do katalogu /etc/udev/rules.d/ plik 51-garmin.rules zawierający:


SYSFS{idVendor}=="091e", SYSFS{idProduct}=="0003", MODE="0666"

Teraz należy nowe reguły załadować:


sudo udevadm control --reload-rules

Uwaga: gpsbabel widzi urządzenie jako usb:0 a nie jak poprzednio, w starszej wersji Fedory /dev/ttyUSB0. W nowej fedorze przestał też działać -- zapewne z uwagi na havoc z urządzeniami -- bt747. Szukając zamiennika doczytałem, że gpsbabel też potrafi ściągnąć dane z i-Blue 747:


gpsbabel -t -w -i mtk,erase -f /dev/ttyUSB0 -o gpx -F out.gpx

Opcja erase powoduje wyczyszczenie zawartości pamięci... Oprócz pliku .gpx dane są ściągane w formacie binarnym i zapisywane do pliku data.bin. Gpsbabel nie umie m.in. manipulować ustawieniami loggera, ale nie jest to dla mnie aż tak wielka strata, bo nigdy nic nie ustawiałem... Ciekawostką jest, że dla i-Blue 747 działa /dev/ttyUSB0 a w przypadku Legenda wspomniane usb:0. Trochę to dziwne, albo znowu czegoś nie doczytałem...

Anyway, skrypt My-get-GPX.sh obsługuje teraz zarówno Garmin Legend jak i Blue 747. Dodałem też opcję -publish, działającą w ten sposób, że po pobraniu pliku GPX jest wycinany ślad ,,z dziś'' (tj. od 6.00 do 23.00 dla bieżącej daty), który to ślad jest następnie wysyłany w odpowiednie miejsce na serwerze (np. tutaj). Reasumując: po przyjechaniu z wycieczki rowerowej wystarczy wsadzić kabel USB, włączyć urządzenie i wpisać:


My-get-GPX.sh

A reszta zrobi się sama...

czwartek, 19 sierpnia 2010

Cena postępu

W Pyrach, 25 lipca 1939 roku odbyło się spotkanie, na którym szef Polskiego Biura Szyfrów podpułkownik Gwido Langer przekazał delegacjom sojuszniczych Francji i Anglii, na których czele stali odpowiednio major Gustave Bertrand i pułkownik (komandor) Alastair Denniston całą polską wiedzę nt. maszyny szyfrującej Enigma... Kopie Enigmy przekazano wkrótce pocztą dyplomatyczną...

Tak mi się to skojarzyło jak wczoraj z mediów się dowiedziałem, iż dwie wizyty niejakiego J. Millera w Moskwie (jakby nie było, a przynajmniej nominalnie ministra), to mało żeby przywieźć głupi CDrom z kopią rejestratorów z wiadomego Tupolewa... Trzecie podejście wykonuje generał, a i to pewnie będzie mało...

sobota, 24 lipca 2010

Obliczanie AVE i CR z pliku out LISRELa

Zaproponowane przez Fornella i Larckera [HairetAl98,FornellLarcker81] rzetelność łączna (composite reliability, CR) oraz przeciętna wariancja wyodrębniona (average variance extracted, AVE) stały się często wykorzystywanymi miarami rzetelności wewnętrznej oraz trafności zbieżnej. CR obliczana jest według następującej formuły [por. także zencaroline.blogspot.com/2007/06/composite-reliability]:

CRη = (∑i ληi )2 / ( (∑i ληi )2 + ∑i var(εi))

gdzie: var(εi) = 1 - (ληi2); ληi to wektor (zestandaryzowanych) ładunków czynnikowych dla zmiennej ukrytej η.

Minimalną akceptowaną wartością CR jest 0,7

Podobny do CR jest wskaźnik przeciętnej wariancji wyodrębnionej (average variance extracted, AVE), służący do oceny trafności zbieżnej (convergent validity). Jest on obliczany według następującej formuły:

AVEη = (∑iηi )2 ) / ( ∑iηi)2 + ∑i var(εi) )

Znaczenie symboli jest identyczne, jak we wzorze określającym rzetelność łączną. Minimalną akceptowaną wartością AVE jest 0,5.

Znając zestandaryzowane wartości ładunków czynnikowych ληi policzenie CR oraz AVE jest proste. Dodanie opcji SC (completely standardized solutions) do polecenia OUTPUT spowoduje wydrukowanie zestandaryzowanych wartości ładunków czynnikowych. Poniższy skrypt obliczy na tej podstawie CR/AVE dla każdej zmiennej ukrytej:


#!/usr/bin/perl
# Computes/prints Composite Reliability (CR) and Average Variance Extracted (AVE)
# from LISREL OUT file. Measures can load on several factors
#
# (c) 2010; t.przechlewski http://pinkaccordions.homelinux.org/staff/tp/
# GPL license
#
# The formulas for CR and AVE are as follows [cf. Hair, Anderson, Tatham and Black, Multivariate Data Analysis, 5th Ed., Pearson Education, p. 637]:
# CR = (\sum standardized loading)^2 / ( (\sum standardized loading)^2 + \sum indicator measurement error ),
# AVE = (\sum (standardized loading)^2 ) / ( \sum (standardized loading)^2 + \sum indicator measurement error )
# where: indicator measurement error = 1 - loading^2
# see also: http://zencaroline.blogspot.com/2007/06/composite-reliability.html
#
# usage: perl print_cr_and_ave lisrel-output-file
#
my $scan = 0; ## flag to figure out where we are
my $initial_latent_var_no = 0;

while (<>) {
chomp;

# We are looking for the line with `Completely Standardized Solution' (CSS), which
# starts the block containing relevant data
if (/Completely Standardized Solution/) { $scan = 1 ;
print STDERR "*** Found *** $_ ***\n"; next ; }

# After CSS line we look the line with LAMBDA-* (there are up to two such lines)
if ( $scan > 0 && /LAMBDA-[XY]/ ) { $scan++;

print STDERR "*** Found *** $_ (initial: $initial_latent_var_no) ***\n";

$_ = <> ; $_ = <> ; $_ = <> ; ## eat exactly next three lines

## ok we are about to scan LAMBDA-X/Y matrix
while (<>) { chomp;

if (/^[ \t]*$/) { # exmpty line ends LAMBDA-X/Y matrix
## before reading next block store the number of latent vars from the 1st block
## first latent var number in the second block = number of vars in the previous block +1
$initial_latent_var_no += $#loadings;

print STDERR "*** Initial var number = $initial_latent_var_no ***\n";
last ; ## OK, all rows in matrix was read...
}

s/- -/xxx/g; # change `- -' to `xxx'
@loadings = split ' ', $_;

# column number = latent var number ; column `0' contains measurement variable name
for ($l=1; $l <= $#loadings; $l++) {
if ($loadings[$l] !~ /xxx/) { ## store in hash
$Loadings{$l + $initial_latent_var_no }{$loadings[0]} = $loadings[$l];
}
}

}
}
}

print STDERR "*** Latent variables = $initial_latent_var_no ***\n";

print "=======================================================\n";

### Compute/print CR i AVE ### ### ### ###

for $l (sort keys %Loadings ) {
$loadings = $sqloadings = $errors = 0;

print STDERR "*** Xi/Eta: $l ***\n";

for $m ( sort keys %{ $Loadings{ $l }} ) {
$load = $Loadings{$l}{$m};

print STDERR "$m ($l) = $load\n";

$loadings += $load ;
$sqloadings += $load * $load ;
$errors += (1 - $load * $load);
}

$cr = ($loadings * $loadings) / ( ($loadings * $loadings) + $errors ) ;
$ave = $sqloadings / ($sqloadings + $errors ) ;

printf "Xi/Eta_%2d -> CR = %6.3f AVE = %6.3f\n", $l, $cr, $ave;

}

print "=======================================================\n";

Skrypt można także pobrać tutaj.

Literatura

FornellLarcker81
Fornell, C. i Larcker, D. F. (1981). Evaluating structural equation models with unobservable variables and measurement error. Journal of Marketing Research, 18(1):39--50.
HairetAl98
Hair, J. F., Black, B., Anderson, R. E., i Tatham, R. L. (1998). Multivariate Data Analysis. Prentice Hall.